1 package org.apache.slide.projector.processor.table; 2 3 import java.io.IOException ; 4 import java.util.ArrayList ; 5 import java.util.HashMap ; 6 import java.util.Iterator ; 7 import java.util.List ; 8 import java.util.Map ; 9 10 import org.apache.slide.projector.ConfigurationException; 11 import org.apache.slide.projector.Context; 12 import org.apache.slide.projector.Result; 13 import org.apache.slide.projector.Store; 14 import org.apache.slide.projector.descriptor.BooleanValueDescriptor; 15 import org.apache.slide.projector.descriptor.MapValueDescriptor; 16 import org.apache.slide.projector.descriptor.NumberValueDescriptor; 17 import org.apache.slide.projector.descriptor.ParameterDescriptor; 18 import org.apache.slide.projector.descriptor.StateDescriptor; 19 import org.apache.slide.projector.descriptor.StringValueDescriptor; 20 import org.apache.slide.projector.engine.ProcessorManager; 21 import org.apache.slide.projector.i18n.ParameterMessage; 22 import org.apache.slide.projector.processor.TemplateRenderer; 23 import org.apache.slide.projector.util.StoreHelper; 24 import org.apache.slide.projector.value.BooleanValue; 25 import org.apache.slide.projector.value.MapValue; 26 import org.apache.slide.projector.value.NumberValue; 27 import org.apache.slide.projector.value.PrintableValue; 28 import org.apache.slide.projector.value.StreamableValue; 29 import org.apache.slide.projector.value.StringValue; 30 31 34 public class TablePager extends TemplateRenderer { 35 public final static String SHOW_RANGE = "showRange"; 36 public final static String RANGE = "range"; 37 public final static String PARAMETER = "parameter"; 38 39 final private static String HANDLER = "handler"; 40 public final static String TOTAL_PAGES = "totalPages"; 41 public final static String CURRENT_PAGE = "currentPage"; 42 public final static String FIRST_ITEM = "firstItem"; 43 public final static String LAST_ITEM = "lastItem"; 44 public final static String CURRENT_ITEM_NUMBER = "currentItem"; 45 46 public final static String FAILED = "failed"; 47 48 protected final static String PRE_FRAGMENT = "pre"; 49 protected final static String POST_FRAGMENT = "post"; 50 protected final static String FIRST_FRAGMENT = "first"; 51 protected final static String FIRST_SELECTED_FRAGMENT = "first selected"; 52 protected final static String LAST_FRAGMENT = "last"; 53 protected final static String LAST_SELECTED_FRAGMENT = "last selected"; 54 protected final static String PREVIOUS_FRAGMENT = "previous"; 55 protected final static String PREVIOUS_DISABLED_FRAGMENT = "previous disabled"; 56 protected final static String NEXT_FRAGMENT = "next"; 57 protected final static String NEXT_DISABLED_FRAGMENT = "next disabled"; 58 protected final static String PAGE_FRAGMENT = "page"; 59 protected final static String SELECTED_PAGE_FRAGMENT = "page selected"; 60 protected final static String PAGE_SEPARATOR_FRAGMENT = "page separator"; 61 protected final static String ETC_FRAGMENT = "etc..."; 62 63 final private static int IN = 0; 64 final private static int OUT = 1; 65 final private static int BORDER = 2; 66 67 private Template pre, post, first, firstSelected, last, lastSelected; 68 private Template previous, previousDisabled, next, nextDisabled, page, selectedPage, pageSeparator, etc; 69 70 private ParameterDescriptor []parameterDescriptors; 71 72 public TablePager() { 73 setOptionalFragments(new String [] { PRE_FRAGMENT, POST_FRAGMENT, FIRST_FRAGMENT, FIRST_SELECTED_FRAGMENT, LAST_FRAGMENT, LAST_SELECTED_FRAGMENT, PREVIOUS_FRAGMENT, PREVIOUS_DISABLED_FRAGMENT, NEXT_FRAGMENT, NEXT_DISABLED_FRAGMENT, 74 PAGE_FRAGMENT, PAGE_SEPARATOR_FRAGMENT, SELECTED_PAGE_FRAGMENT, ETC_FRAGMENT }); 75 } 76 77 public Result process(Map parameters, Context context) throws Exception { 78 Map parameter = ((MapValue)parameters.get(PARAMETER)).getMap(); 79 boolean showRange = ((BooleanValue)parameters.get(SHOW_RANGE)).booleanValue(); 80 int range = ((NumberValue)parameters.get(RANGE)).getNumber().intValue(); 81 String handlerUrl = ProcessorManager.getInstance().process(ProcessorManager.URL, TableHandler.URL, context).toString(); 82 String id = parameters.get(TableHandler.ID).toString(); 83 String storeName = parameters.get(TableHandler.STORE).toString(); 84 Store store = context.getStore(StoreHelper.getStoreByName(storeName)); 85 MapValue idResource = (MapValue)store.get(id); 86 if ( idResource == null ) return new Result(FAILED); 87 Map state = idResource.getMap(); 88 int itemsPerPage = ((NumberValue)state.get(TableMapRenderer.ITEMS_PER_PAGE)).getNumber().intValue(); 89 if (itemsPerPage <= 0) { 90 return new Result(FAILED); 91 } 92 Result result = new Result(StateDescriptor.OK); 93 NumberValue firstItem = ((NumberValue)state.get(TableHandler.CURRENT_POSITION)); 94 int currentPosition = firstItem.getNumber().intValue(); 95 int currentPage = currentPosition / itemsPerPage; 96 int length = ((NumberValue)state.get(TableMapRenderer.LENGTH)).getNumber().intValue(); 97 int totalPages = (int)Math.floor((double)length / ((double)itemsPerPage) + 1); 98 int lastItem = Math.min(currentPosition + itemsPerPage, length); 99 result.addResultEntry(FIRST_ITEM, firstItem); 100 result.addResultEntry(LAST_ITEM, new NumberValue(new Integer (lastItem))); 101 result.addResultEntry(CURRENT_PAGE, new NumberValue(new Integer (currentPage))); 102 result.addResultEntry(TOTAL_PAGES, new NumberValue(new Integer (totalPages))); 103 boolean hasNext = false, hasPrevious = false; 104 if (itemsPerPage > 0) { 105 hasNext = (currentPosition + itemsPerPage < length); 106 hasPrevious = (currentPosition > 0); 107 } 108 StringBuffer buffer = new StringBuffer (); 109 if (pre != null) pre.evaluate(buffer, parameters); 110 createHandler(0, itemsPerPage, handlerUrl, storeName, id, parameters, parameter); 111 if ( firstSelected != null && !hasPrevious ) { 112 firstSelected.evaluate(buffer, parameters); 113 } else if ( first != null) { 114 first.evaluate(buffer, parameters); 115 } 116 createHandler(Math.max(0, currentPosition - itemsPerPage), itemsPerPage, handlerUrl, storeName, id, parameters, parameter); 117 if (hasPrevious) { 118 if ( previous != null) previous.evaluate(buffer, parameters); 119 } else { 120 if ( previousDisabled != null) previousDisabled.evaluate(buffer, parameters); 121 } 122 int step = itemsPerPage > 0 ? itemsPerPage : 1; 123 boolean first = true; 124 lastItem = 0; 125 int itemsInRange = range * step; 126 int lowerBorder = currentPosition - itemsInRange; 127 int upperBorder = currentPosition + itemsInRange; 128 int i = 0; 129 for (; i < length; i += step) { 130 lastItem = i; 131 parameters.put(CURRENT_PAGE, new NumberValue(new Integer (i / itemsPerPage + 1))); 132 createHandler(i, Math.min(i+itemsPerPage, length), handlerUrl, storeName, id, parameters, parameter); 133 int rangeState = IN; 134 if (showRange && (i < lowerBorder || i > upperBorder)) rangeState = OUT; 135 if (showRange && (i == lowerBorder || i == upperBorder)) rangeState = BORDER; 136 boolean pagingTemplate = false; 137 Template templateToUse = null; 138 if (i == currentPosition && selectedPage != null) { 139 pagingTemplate = true; 140 templateToUse = selectedPage; 141 } else if (rangeState == IN && page != null) { 142 pagingTemplate = true; 143 templateToUse = page; 144 } else if (rangeState == IN) { 145 pagingTemplate = true; 146 templateToUse = page; 147 } else if (rangeState == BORDER) { 148 templateToUse = etc; 149 } 150 if (templateToUse != null ) { 151 if (pagingTemplate) { 152 if (!first) { 153 if (pageSeparator != null) pageSeparator.evaluate(buffer, parameters); 154 } 155 first = false; 156 } 157 templateToUse.evaluate(buffer, parameters); 158 } 159 } 160 createHandler(currentPosition + itemsPerPage, itemsPerPage, handlerUrl, storeName, id, parameters, parameter); 161 if (hasNext) { 162 if ( next != null) next.evaluate(buffer, parameters); 163 } else { 164 if ( nextDisabled != null) nextDisabled.evaluate(buffer, parameters); 165 } 166 createHandler(i-itemsPerPage, length, handlerUrl, storeName, id, parameters, parameter); 167 if ( lastSelected != null && !hasNext ) { 168 lastSelected.evaluate(buffer, parameters); 169 } else if ( last != null) { 170 last.evaluate(buffer, parameters); 171 } 172 if ( post != null) post.evaluate(buffer, parameters); 173 result.addResultEntry(OUTPUT, new StringValue(buffer.toString())); 174 return result; 175 } 176 177 protected void createHandler(int i, int lastItem, String handlerUrl, String storeName, String id, Map parameters, Map parameter) throws IOException { 178 parameters.put(TableHandler.TARGET_POSITION, new NumberValue(new Integer (i))); 179 StringBuffer handlerBuffer = new StringBuffer (128); 180 handlerBuffer.append(handlerUrl).append('?').append(TableHandler.TARGET_POSITION).append('=').append(i). 181 append('&').append(TableHandler.STORE).append('=').append(storeName).append('&').append(TableHandler.ID).append('=').append(id); 182 for ( Iterator j = parameter.entrySet().iterator(); j.hasNext(); ) { 183 Map.Entry entry = (Map.Entry )j.next(); 184 if ( entry.getValue() instanceof PrintableValue ) { 185 handlerBuffer.append('&').append(entry.getKey()).append('='); 186 ((PrintableValue)entry.getValue()).print(handlerBuffer); 187 } 188 189 } 190 parameters.put(HANDLER, new StringValue(handlerBuffer.toString())); 191 parameters.put(FIRST_ITEM, new NumberValue(new Integer (i+1))); 192 parameters.put(LAST_ITEM, new NumberValue(new Integer (lastItem))); 193 } 194 195 public void configure(StreamableValue config) throws ConfigurationException { 196 super.configure(config); 197 List parameterList = new ArrayList (); 199 parameterList.add(new ParameterDescriptor(PARAMETER, new ParameterMessage("tablePager/parameter"), MapValueDescriptor.ANY, new MapValue(new HashMap ()))); 200 parameterList.add(new ParameterDescriptor(SHOW_RANGE, new ParameterMessage("tablePager/showRange"), new BooleanValueDescriptor(), BooleanValue.FALSE)); 201 parameterList.add(new ParameterDescriptor(RANGE, new ParameterMessage("tablePager/range"), new NumberValueDescriptor(), new NumberValue(new Integer (0)))); 202 parameterList.add(new ParameterDescriptor(TableHandler.ID, new ParameterMessage("tableRenderer/id"), new StringValueDescriptor(), new StringValue("table"))); 203 parameterList.add(new ParameterDescriptor(TableHandler.STORE, new ParameterMessage("tableRenderer/store"), new StringValueDescriptor(Store.stores), new StringValue(Store.stores[Store.SESSION]))); 204 parameterDescriptors = (ParameterDescriptor[])parameterList.toArray(new ParameterDescriptor[parameterList.size()]); 205 206 pre = getOptionalFragment(PRE_FRAGMENT); 207 post = getOptionalFragment(POST_FRAGMENT); 208 first = getOptionalFragment(FIRST_FRAGMENT); 209 firstSelected = getOptionalFragment(FIRST_SELECTED_FRAGMENT); 210 last = getOptionalFragment(LAST_FRAGMENT); 211 lastSelected = getOptionalFragment(LAST_SELECTED_FRAGMENT); 212 previous = getOptionalFragment(PREVIOUS_FRAGMENT); 213 previousDisabled = getOptionalFragment(PREVIOUS_DISABLED_FRAGMENT); 214 next = getOptionalFragment(NEXT_FRAGMENT); 215 nextDisabled = getOptionalFragment(NEXT_DISABLED_FRAGMENT); 216 page = getOptionalFragment(PAGE_FRAGMENT); 217 pageSeparator = getOptionalFragment(PAGE_SEPARATOR_FRAGMENT); 218 selectedPage = getOptionalFragment(SELECTED_PAGE_FRAGMENT); 219 etc = getOptionalFragment(ETC_FRAGMENT); 220 } 221 222 public ParameterDescriptor[] getParameterDescriptors() { 223 return parameterDescriptors; 224 } 225 } 226 | Popular Tags |