KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > slide > projector > processor > table > TableMapRenderer


1 package org.apache.slide.projector.processor.table;
2
3 import java.util.ArrayList JavaDoc;
4 import java.util.Arrays JavaDoc;
5 import java.util.Comparator JavaDoc;
6 import java.util.HashMap JavaDoc;
7 import java.util.Iterator JavaDoc;
8 import java.util.List JavaDoc;
9 import java.util.Map JavaDoc;
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 JavaDoc HEADER_FRAGMENT = "header";
36     final protected static String JavaDoc FOOTER_FRAGMENT = "footer";
37     final protected static String JavaDoc FIRST_FRAGMENT = "first";
38     final protected static String JavaDoc LAST_FRAGMENT = "last";
39     final protected static String JavaDoc EVEN_FRAGMENT = "even";
40     final protected static String JavaDoc DEFAULT_FRAGMENT = "default";
41     final protected static String JavaDoc EMPTY_FRAGMENT = "empty";
42
43     final static String JavaDoc OFFSET = "offset";
44     final static String JavaDoc ITEMS_PER_PAGE = "itemsPerPage";
45
46     final static String JavaDoc 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 JavaDoc[] repeatedFragments;
58
59     public TableMapRenderer() {
60         setRequiredFragments(new String JavaDoc[] { DEFAULT_FRAGMENT });
61         setOptionalFragments(new String JavaDoc[] { EMPTY_FRAGMENT, HEADER_FRAGMENT, FOOTER_FRAGMENT, FIRST_FRAGMENT, LAST_FRAGMENT, EVEN_FRAGMENT });
62         setRepeatedFragments(new String JavaDoc[] { 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         // remove fragment parameter
69
List JavaDoc parameterDescriptorList = new ArrayList JavaDoc();
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                     // check if entry descriptor is caused by repeated fragments
75
List JavaDoc entryDescriptors = ((MapValueDescriptor)descriptor.getValueDescriptor()).getEntryDescriptors();
76                     for ( Iterator JavaDoc 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 JavaDoc(0))));
90         parameterDescriptorList.add(new ParameterDescriptor(ITEMS_PER_PAGE, new ParameterMessage("tableRenderer/length"), new NumberValueDescriptor(), new NumberValue(new Integer JavaDoc(-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 JavaDoc[] {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 JavaDoc parameter, Context context) throws Exception JavaDoc {
111         StringBuffer JavaDoc buffer = new StringBuffer JavaDoc(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 JavaDoc sortedBy = null, order = null;
118         if ( sortedByParameter != NullValue.NULL ) sortedBy = sortedByParameter.toString();
119         if ( orderParameter != NullValue.NULL ) order = orderParameter.toString();
120         String JavaDoc 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 JavaDoc tableMap;
124         if ( idResource == null) {
125             tableMap = new HashMap JavaDoc();
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         // sort table
140
if ( sortedBy != null && order != null ) {
141             Comparator JavaDoc 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 JavaDoc(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                 // Enable the use of input parameters to provide default values for optional row parameters
164
Map JavaDoc rowParameter = new HashMap JavaDoc();
165                 rowParameter.putAll(parameter);
166                 Map JavaDoc repeatedParameter = ((MapValue)input.getArray()[i+offset]).getMap();
167                 for ( Iterator JavaDoc j = repeatedParameter.entrySet().iterator(); j.hasNext(); ) {
168                     Map.Entry JavaDoc entry = (Map.Entry JavaDoc)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 JavaDoc[] repeatedFragments) {
193         this.repeatedFragments = repeatedFragments;
194     }
195
196     protected boolean repeatedParameterDescriptor(ParameterDescriptor entryDescriptor) {
197         List JavaDoc parameterDescriptors = getTemplateParameterDescriptor(repeatedFragments);
198         if ( parameterDescriptors.contains(entryDescriptor) ) {
199             return true;
200         }
201         return false;
202     }
203
204     protected class RowComparator implements Comparator JavaDoc {
205         private String JavaDoc sortBy, order;
206         
207         public RowComparator(String JavaDoc sortBy, String JavaDoc order) {
208             this.sortBy = sortBy;
209             this.order = order;
210         }
211
212         public int compare(Object JavaDoc o1, Object JavaDoc o2) {
213             Map JavaDoc map1 = ((MapValue)o1).getMap();
214             Map JavaDoc map2 = ((MapValue)o2).getMap();
215             Object JavaDoc v1 = map1.get(sortBy);
216             Object JavaDoc v2 = map2.get(sortBy);
217             int comparison = 0;
218             if ( v1 instanceof Comparable JavaDoc ) {
219                 comparison = ((Comparable JavaDoc)v1).compareTo(v2);
220                 if ( order.equals(TableHandler.ASCENDING) ) {
221                     comparison = -comparison;
222                 }
223             }
224             return comparison;
225         }
226     }
227 }
Popular Tags