1 package org.apache.slide.projector.processor.table; 2 3 import java.util.ArrayList ; 4 import java.util.Arrays ; 5 import java.util.Comparator ; 6 import java.util.HashMap ; 7 import java.util.Iterator ; 8 import java.util.List ; 9 import java.util.Map ; 10 11 import org.apache.slide.projector.ConfigurationException; 12 import org.apache.slide.projector.Context; 13 import org.apache.slide.projector.ProcessException; 14 import org.apache.slide.projector.Result; 15 import org.apache.slide.projector.Store; 16 import org.apache.slide.projector.descriptor.ArrayValueDescriptor; 17 import org.apache.slide.projector.descriptor.MapValueDescriptor; 18 import org.apache.slide.projector.descriptor.NumberValueDescriptor; 19 import org.apache.slide.projector.descriptor.ParameterDescriptor; 20 import org.apache.slide.projector.descriptor.StringValueDescriptor; 21 import org.apache.slide.projector.i18n.ErrorMessage; 22 import org.apache.slide.projector.i18n.ParameterMessage; 23 import org.apache.slide.projector.processor.SimpleProcessor; 24 import org.apache.slide.projector.processor.TemplateMapRenderer; 25 import org.apache.slide.projector.util.StoreHelper; 26 import org.apache.slide.projector.value.ArrayValue; 27 import org.apache.slide.projector.value.MapValue; 28 import org.apache.slide.projector.value.NullValue; 29 import org.apache.slide.projector.value.NumberValue; 30 import org.apache.slide.projector.value.StreamableValue; 31 import org.apache.slide.projector.value.StringValue; 32 import org.apache.slide.projector.value.Value; 33 34 public class TableMapRenderer extends TemplateMapRenderer { 35 final protected static String HEADER_FRAGMENT = "header"; 36 final protected static String FOOTER_FRAGMENT = "footer"; 37 final protected static String FIRST_FRAGMENT = "first"; 38 final protected static String LAST_FRAGMENT = "last"; 39 final protected static String EVEN_FRAGMENT = "even"; 40 final protected static String DEFAULT_FRAGMENT = "default"; 41 final protected static String EMPTY_FRAGMENT = "empty"; 42 43 final static String OFFSET = "offset"; 44 final static String ITEMS_PER_PAGE = "itemsPerPage"; 45 46 final static String LENGTH = "length"; 47 48 protected Template headerTemplate; 49 protected Template footerTemplate; 50 protected Template firstTemplate; 51 protected Template lastTemplate; 52 protected Template evenTemplate; 53 protected Template defaultTemplate; 54 protected Template emptyTemplate; 55 56 private ParameterDescriptor []parameterDescriptors; 57 private String [] repeatedFragments; 58 59 public TableMapRenderer() { 60 setRequiredFragments(new String [] { DEFAULT_FRAGMENT }); 61 setOptionalFragments(new String [] { EMPTY_FRAGMENT, HEADER_FRAGMENT, FOOTER_FRAGMENT, FIRST_FRAGMENT, LAST_FRAGMENT, EVEN_FRAGMENT }); 62 setRepeatedFragments(new String [] { FIRST_FRAGMENT, LAST_FRAGMENT, DEFAULT_FRAGMENT, EVEN_FRAGMENT }); 63 } 64 65 public void configure(StreamableValue config) throws ConfigurationException { 66 super.configure(config); 67 ParameterDescriptor []parentParameterDescriptors = super.getParameterDescriptors(); 68 List parameterDescriptorList = new ArrayList (); 70 for ( int i = 0; i < parentParameterDescriptors.length; i++ ) { 71 ParameterDescriptor descriptor = parentParameterDescriptors[i]; 72 if ( descriptor.getName() != FRAGMENT ) { 73 if ( descriptor.getName().equals(SimpleProcessor.INPUT) ) { 74 List entryDescriptors = ((MapValueDescriptor)descriptor.getValueDescriptor()).getEntryDescriptors(); 76 for ( Iterator j = entryDescriptors.iterator(); j.hasNext(); ) { 77 ParameterDescriptor entryDescriptor = (ParameterDescriptor)j.next(); 78 if ( !repeatedParameterDescriptor(entryDescriptor) ) { 79 parameterDescriptorList.add(entryDescriptor); 80 j.remove(); 81 } 82 } 83 parameterDescriptorList.add(new ParameterDescriptor(SimpleProcessor.INPUT, new ParameterMessage("tableMapRenderer/input"), new ArrayValueDescriptor(parentParameterDescriptors[i].getValueDescriptor()))); 84 } else { 85 parameterDescriptorList.add(descriptor); 86 } 87 } 88 } 89 parameterDescriptorList.add(new ParameterDescriptor(OFFSET, new ParameterMessage("tableRenderer/offset"), new NumberValueDescriptor(), new NumberValue(new Integer (0)))); 90 parameterDescriptorList.add(new ParameterDescriptor(ITEMS_PER_PAGE, new ParameterMessage("tableRenderer/length"), new NumberValueDescriptor(), new NumberValue(new Integer (-10)))); 91 parameterDescriptorList.add(new ParameterDescriptor(TableHandler.ID, new ParameterMessage("tableRenderer/id"), new StringValueDescriptor(), new StringValue("table"))); 92 parameterDescriptorList.add(new ParameterDescriptor(TableHandler.STORE, new ParameterMessage("tableRenderer/store"), new StringValueDescriptor(Store.stores), new StringValue(Store.stores[Store.SESSION]))); 93 parameterDescriptorList.add(new ParameterDescriptor(TableHandler.SORTED_BY, new ParameterMessage("tableHandler/sortedBy"), new StringValueDescriptor(), NullValue.NULL)); 94 parameterDescriptorList.add(new ParameterDescriptor(TableHandler.ORDER, new ParameterMessage("tableHandler/order"), new StringValueDescriptor(new String [] {TableHandler.ASCENDING, TableHandler.DESCENDING}), NullValue.NULL)); 95 parameterDescriptors = (ParameterDescriptor[] )parameterDescriptorList.toArray(new ParameterDescriptor[parameterDescriptorList.size()]); 96 97 headerTemplate = getOptionalFragment(HEADER_FRAGMENT); 98 footerTemplate = getOptionalFragment(FOOTER_FRAGMENT); 99 firstTemplate = getOptionalFragment(FIRST_FRAGMENT); 100 lastTemplate = getOptionalFragment(LAST_FRAGMENT); 101 evenTemplate = getOptionalFragment(EVEN_FRAGMENT); 102 emptyTemplate = getOptionalFragment(EMPTY_FRAGMENT); 103 try { 104 defaultTemplate = getRequiredFragment(DEFAULT_FRAGMENT); 105 } catch ( ProcessException exception ) { 106 throw new ConfigurationException(new ErrorMessage("tableRenderer/fragmentsMissing"), exception); 107 } 108 } 109 110 public Result process(Map parameter, Context context) throws Exception { 111 StringBuffer buffer = new StringBuffer (1024); 112 ArrayValue input = (ArrayValue)parameter.get(SimpleProcessor.INPUT); 113 NumberValue offsetResource = (NumberValue)parameter.get(OFFSET); 114 NumberValue itemsPerPageResource = (NumberValue)parameter.get(ITEMS_PER_PAGE); 115 Value sortedByParameter = (Value)parameter.get(TableHandler.SORTED_BY); 116 Value orderParameter = (Value)parameter.get(TableHandler.ORDER); 117 String sortedBy = null, order = null; 118 if ( sortedByParameter != NullValue.NULL ) sortedBy = sortedByParameter.toString(); 119 if ( orderParameter != NullValue.NULL ) order = orderParameter.toString(); 120 String id = parameter.get(TableHandler.ID).toString(); 121 Store store = context.getStore(StoreHelper.getStoreByName(parameter.get(TableHandler.STORE).toString())); 122 MapValue idResource = (MapValue)store.get(id); 123 Map tableMap; 124 if ( idResource == null) { 125 tableMap = new HashMap (); 126 MapValue tableState = new MapValue(tableMap); 127 store.put(id, tableState); 128 } else { 129 tableMap = idResource.getMap(); 130 NumberValue offset = (NumberValue)idResource.getMap().get(TableHandler.CURRENT_POSITION); 131 if ( offset != null ) offsetResource = offset; 132 NumberValue itemsPerPage = (NumberValue)idResource.getMap().get(ITEMS_PER_PAGE); 133 if ( itemsPerPage != null ) itemsPerPageResource = itemsPerPage; 134 Value sortedByValue = (Value)idResource.getMap().get(TableHandler.SORTED_BY); 135 if ( sortedByValue != null && sortedByValue != NullValue.NULL ) sortedBy = sortedByValue.toString(); 136 Value orderValue = (Value)idResource.getMap().get(TableHandler.ORDER); 137 if ( orderValue != null && orderValue != NullValue.NULL ) order = orderValue.toString(); 138 } 139 if ( sortedBy != null && order != null ) { 141 Comparator comparator = new RowComparator(sortedBy, order); 142 Arrays.sort(input.getArray(), comparator); 143 } 144 tableMap.put(TableHandler.CURRENT_POSITION, offsetResource); 145 tableMap.put(ITEMS_PER_PAGE, itemsPerPageResource); 146 int offset = offsetResource.getNumber().intValue(); 147 int length = itemsPerPageResource.getNumber().intValue(); 148 parameter.remove(OFFSET); 149 parameter.remove(ITEMS_PER_PAGE); 150 int maxIndex = input.getArray().length; 151 tableMap.put(LENGTH, new NumberValue(new Integer (maxIndex))); 152 offset = Math.min(offset, maxIndex); 153 if ( length > 0 ) { 154 length = Math.min(length, maxIndex-offset); 155 } else { 156 length = maxIndex-offset; 157 } 158 if ( maxIndex == 0 ) { 159 if ( emptyTemplate != null ) emptyTemplate.evaluate(buffer, parameter); 160 } else { 161 if ( headerTemplate != null ) headerTemplate.evaluate(buffer, parameter); 162 for ( int i = 0; i < length; i++ ) { 163 Map rowParameter = new HashMap (); 165 rowParameter.putAll(parameter); 166 Map repeatedParameter = ((MapValue)input.getArray()[i+offset]).getMap(); 167 for ( Iterator j = repeatedParameter.entrySet().iterator(); j.hasNext(); ) { 168 Map.Entry entry = (Map.Entry )j.next(); 169 if ( !(entry.getValue() instanceof NullValue) ) { 170 rowParameter.put(entry.getKey(), entry.getValue()); 171 } 172 } 173 if ( i == 0 && firstTemplate != null ) { 174 firstTemplate.evaluate(buffer, rowParameter); 175 } else if ( i == length -1 && lastTemplate != null ) { 176 lastTemplate.evaluate(buffer, rowParameter); 177 } else if ( evenTemplate != null && i%2 == 0 ) { 178 evenTemplate.evaluate(buffer, rowParameter); 179 } else { 180 defaultTemplate.evaluate(buffer, rowParameter); 181 } 182 } 183 if ( footerTemplate != null ) footerTemplate.evaluate(buffer, parameter); 184 } 185 return new Result(OK, OUTPUT, new StringValue(buffer.toString(), defaultTemplate.getContentType(), false )); 186 } 187 188 public ParameterDescriptor[] getParameterDescriptors() { 189 return parameterDescriptors; 190 } 191 192 public void setRepeatedFragments(String [] repeatedFragments) { 193 this.repeatedFragments = repeatedFragments; 194 } 195 196 protected boolean repeatedParameterDescriptor(ParameterDescriptor entryDescriptor) { 197 List parameterDescriptors = getTemplateParameterDescriptor(repeatedFragments); 198 if ( parameterDescriptors.contains(entryDescriptor) ) { 199 return true; 200 } 201 return false; 202 } 203 204 protected class RowComparator implements Comparator { 205 private String sortBy, order; 206 207 public RowComparator(String sortBy, String order) { 208 this.sortBy = sortBy; 209 this.order = order; 210 } 211 212 public int compare(Object o1, Object o2) { 213 Map map1 = ((MapValue)o1).getMap(); 214 Map map2 = ((MapValue)o2).getMap(); 215 Object v1 = map1.get(sortBy); 216 Object v2 = map2.get(sortBy); 217 int comparison = 0; 218 if ( v1 instanceof Comparable ) { 219 comparison = ((Comparable )v1).compareTo(v2); 220 if ( order.equals(TableHandler.ASCENDING) ) { 221 comparison = -comparison; 222 } 223 } 224 return comparison; 225 } 226 } 227 } | Popular Tags |