KickJava   Java API By Example, From Geeks To Geeks.

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


1 package org.apache.slide.projector.processor.table;
2
3 import java.io.IOException JavaDoc;
4 import java.util.ArrayList JavaDoc;
5 import java.util.HashMap JavaDoc;
6 import java.util.Iterator JavaDoc;
7 import java.util.List JavaDoc;
8 import java.util.Map JavaDoc;
9
10 import org.apache.slide.projector.ConfigurationException;
11 import org.apache.slide.projector.Context;
12 import org.apache.slide.projector.ProcessException;
13 import org.apache.slide.projector.Processor;
14 import org.apache.slide.projector.Result;
15 import org.apache.slide.projector.Store;
16 import org.apache.slide.projector.URI;
17 import org.apache.slide.projector.descriptor.AnyValueDescriptor;
18 import org.apache.slide.projector.descriptor.ArrayValueDescriptor;
19 import org.apache.slide.projector.descriptor.BooleanValueDescriptor;
20 import org.apache.slide.projector.descriptor.MapValueDescriptor;
21 import org.apache.slide.projector.descriptor.ParameterDescriptor;
22 import org.apache.slide.projector.descriptor.StringValueDescriptor;
23 import org.apache.slide.projector.descriptor.URIValueDescriptor;
24 import org.apache.slide.projector.engine.ProcessorManager;
25 import org.apache.slide.projector.i18n.ErrorMessage;
26 import org.apache.slide.projector.i18n.ParameterMessage;
27 import org.apache.slide.projector.processor.SimpleProcessor;
28 import org.apache.slide.projector.util.StoreHelper;
29 import org.apache.slide.projector.value.ArrayValue;
30 import org.apache.slide.projector.value.BooleanValue;
31 import org.apache.slide.projector.value.MapValue;
32 import org.apache.slide.projector.value.NullValue;
33 import org.apache.slide.projector.value.PrintableValue;
34 import org.apache.slide.projector.value.StreamableValue;
35 import org.apache.slide.projector.value.StringValue;
36 import org.apache.slide.projector.value.Value;
37
38 /**
39  * @version $Revision: 1.4 $
40  */

41
42 public class TableGenerator extends TableMapRenderer {
43     final static String JavaDoc PARAMETER = "parameter";
44
45     final private static String JavaDoc COLUMN_FRAGMENT = "column";
46     final private static String JavaDoc HEADER_COLUMN_FRAGMENT = "header column";
47     final private static String JavaDoc COLLAPSED_COLUMN_FRAGMENT = "collapsed column";
48     final private static String JavaDoc COLLAPSED_HEADER_COLUMN_FRAGMENT = "collapsed header column";
49     final private static String JavaDoc ASCENDING_HEADER_COLUMN_FRAGMENT = "ascending header column";
50     final private static String JavaDoc DESCENDING_HEADER_COLUMN_FRAGMENT = "descending header column";
51
52     final private static String JavaDoc COLUMNS_PARAMETER = "columns";
53     final private static String JavaDoc RESIZABLE = "resizable";
54     final private static String JavaDoc SORTABLE = "sortable";
55     final private static String JavaDoc HEADER = "header";
56     final private static String JavaDoc KEY = "key";
57     final private static String JavaDoc VALUE = "value";
58     final private static String JavaDoc NAME = "name";
59     final private static String JavaDoc PROCESSOR = "processor";
60     final private static String JavaDoc PARAMETERS = "parameters";
61     final private static String JavaDoc RESULT = "result";
62     final private static String JavaDoc REPLACE_COLUMN = "replaceColumn";
63     
64     final private static String JavaDoc HEADERS = "headers";
65     final private static String JavaDoc COLUMNS = "columns";
66
67     final private static String JavaDoc SORTABLE_HANDLER = "sortableHandler";
68     final private static String JavaDoc RESIZABLE_HANDLER = "resizableHandler";
69
70     private Template columnTemplate, collapsedColumnTemplate, headerColumnTemplate, collapsedHeaderColumnTemplate;
71     private Template ascendingHeaderColumnTemplate, descendingHeaderColumnTemplate;
72     
73     private ParameterDescriptor []parameterDescriptors;
74
75     public TableGenerator() {
76         setRequiredFragments(new String JavaDoc[] { DEFAULT_FRAGMENT, COLUMN_FRAGMENT, HEADER_COLUMN_FRAGMENT });
77         setOptionalFragments(new String JavaDoc[] { COLLAPSED_HEADER_COLUMN_FRAGMENT, COLLAPSED_COLUMN_FRAGMENT, ASCENDING_HEADER_COLUMN_FRAGMENT, DESCENDING_HEADER_COLUMN_FRAGMENT, EMPTY_FRAGMENT, HEADER_FRAGMENT, FOOTER_FRAGMENT, FIRST_FRAGMENT, LAST_FRAGMENT, EVEN_FRAGMENT });
78         setRepeatedFragments(new String JavaDoc[] { FIRST_FRAGMENT, LAST_FRAGMENT, DEFAULT_FRAGMENT, EVEN_FRAGMENT });
79         ignoreUndefinedFragments(false);
80     }
81
82     public void configure(StreamableValue config) throws ConfigurationException {
83         super.configure(config);
84         ParameterDescriptor []parentParameterDescriptors = super.getParameterDescriptors();
85         // remove fragment parameter
86
List JavaDoc parameterDescriptorList = new ArrayList JavaDoc();
87         for ( int i = 0; i < parentParameterDescriptors.length; i++ ) {
88             parameterDescriptorList.add(parentParameterDescriptors[i]);
89         }
90         List JavaDoc headerParameterDescriptors = getTemplateParameterDescriptor(new String JavaDoc[] { HEADER_COLUMN_FRAGMENT, COLLAPSED_HEADER_COLUMN_FRAGMENT });
91         headerParameterDescriptors.add(new ParameterDescriptor(HEADER, new ParameterMessage("tableGenerator/parameter/columns/header"), new StringValueDescriptor(), StringValue.EMPTY));
92         headerParameterDescriptors.add(new ParameterDescriptor(VALUE, new ParameterMessage("tableGenerator/parameter/columns/value"), new AnyValueDescriptor(), NullValue.NULL));
93         headerParameterDescriptors.add(new ParameterDescriptor(KEY, new ParameterMessage("tableGenerator/parameter/columns/key"), new StringValueDescriptor()));
94         headerParameterDescriptors.add(new ParameterDescriptor(NAME, new ParameterMessage("tableGenerator/parameter/columns/name"), new StringValueDescriptor(), new StringValue(VALUE)));
95         headerParameterDescriptors.add(new ParameterDescriptor(REPLACE_COLUMN, new ParameterMessage("tableGenerator/parameter/columns/replaceColumn"), new BooleanValueDescriptor(), BooleanValue.FALSE));
96         headerParameterDescriptors.add(new ParameterDescriptor(RESIZABLE, new ParameterMessage("tableGenerator/parameter/columns/resizable"), new BooleanValueDescriptor(), BooleanValue.FALSE));
97         headerParameterDescriptors.add(new ParameterDescriptor(SORTABLE, new ParameterMessage("tableGenerator/parameter/columns/sortable"), new BooleanValueDescriptor(), BooleanValue.FALSE));
98         headerParameterDescriptors.add(new ParameterDescriptor(PROCESSOR, new ParameterMessage("tableGenerator/parameter/columns/processor"), new URIValueDescriptor(), NullValue.NULL));
99         headerParameterDescriptors.add(new ParameterDescriptor(PARAMETERS, new ParameterMessage("tableGenerator/parameter/columns/parameters"), MapValueDescriptor.ANY, NullValue.NULL));
100         headerParameterDescriptors.add(new ParameterDescriptor(RESULT, new ParameterMessage("tableGenerator/parameter/columns/result"), new StringValueDescriptor(), NullValue.NULL));
101         parameterDescriptorList.add(new ParameterDescriptor(COLUMNS_PARAMETER, new ParameterMessage("tableGenerator/parameter/columns"),
102                 new ArrayValueDescriptor(new MapValueDescriptor((ParameterDescriptor [])headerParameterDescriptors.toArray(new ParameterDescriptor[headerParameterDescriptors.size()])))));
103         parameterDescriptorList.add(new ParameterDescriptor(PARAMETER, new ParameterMessage("tableGenerator/parameter/parameter"), MapValueDescriptor.ANY, new MapValue(new HashMap JavaDoc())));
104         parameterDescriptors = (ParameterDescriptor[] )parameterDescriptorList.toArray(new ParameterDescriptor[parameterDescriptorList.size()]);
105         collapsedColumnTemplate = getOptionalFragment(COLLAPSED_COLUMN_FRAGMENT);
106         collapsedHeaderColumnTemplate = getOptionalFragment(COLLAPSED_HEADER_COLUMN_FRAGMENT);
107         ascendingHeaderColumnTemplate = getOptionalFragment(ASCENDING_HEADER_COLUMN_FRAGMENT);
108         descendingHeaderColumnTemplate = getOptionalFragment(DESCENDING_HEADER_COLUMN_FRAGMENT);
109         try {
110             columnTemplate = getRequiredFragment(COLUMN_FRAGMENT);
111             headerColumnTemplate = getRequiredFragment(HEADER_COLUMN_FRAGMENT);
112         } catch ( ProcessException exception ) {
113             throw new ConfigurationException(new ErrorMessage("tableRenderer/fragmentsMissing"), exception);
114         }
115     }
116
117     public Result process(Map JavaDoc parameter, Context context) throws Exception JavaDoc {
118         Map JavaDoc parameters = ((MapValue)parameter.get(PARAMETER)).getMap();
119         String JavaDoc handlerUrl = ProcessorManager.getInstance().process(ProcessorManager.URL, TableHandler.URL, context).toString();
120         String JavaDoc id = parameter.get(TableHandler.ID).toString();
121         String JavaDoc storeName = parameter.get(TableHandler.STORE).toString();
122         Store store = context.getStore(StoreHelper.getStoreByName(storeName));
123         Map JavaDoc tableMap;
124         MapValue idResource = (MapValue)store.get(id);
125         String JavaDoc sortedBy = null, order = null;
126         Map JavaDoc size = null;
127         if ( idResource == null) {
128             tableMap = new HashMap JavaDoc();
129             MapValue tableState = new MapValue(tableMap);
130             store.put(id, tableState);
131         } else {
132             tableMap = idResource.getMap();
133             Value sortedByValue = (Value)idResource.getMap().get(TableHandler.SORTED_BY);
134             if ( sortedByValue != null && sortedByValue != NullValue.NULL ) sortedBy = sortedByValue.toString();
135             Value orderValue = (Value)idResource.getMap().get(TableHandler.ORDER);
136             if ( orderValue != null && orderValue != NullValue.NULL ) order = orderValue.toString();
137             Value sizeValue = (Value)idResource.getMap().get(TableHandler.SIZE);
138             if ( sizeValue != null && sizeValue != NullValue.NULL ) size = ((MapValue)sizeValue).getMap();
139         }
140         // create headers and columns and call super...
141
StringBuffer JavaDoc headersBuffer = new StringBuffer JavaDoc(1024);
142         Value []columns = ((ArrayValue)parameter.get(COLUMNS_PARAMETER)).getArray();
143         for ( int i = 0; i < columns.length; i++ ) {
144             Map JavaDoc columnMap = ((MapValue)columns[i]).getMap();
145             boolean sortable = ((BooleanValue)columnMap.get(SORTABLE)).booleanValue();
146             if ( ascendingHeaderColumnTemplate == null || descendingHeaderColumnTemplate == null ) sortable = false;
147             boolean resizable = ((BooleanValue)columnMap.get(RESIZABLE)).booleanValue();
148             Value header = (Value)columnMap.get(HEADER);
149             Map JavaDoc columnHeaderParameters = new HashMap JavaDoc();
150             columnHeaderParameters.putAll(parameter);
151             columnHeaderParameters.putAll(columnMap);
152             Template template = headerColumnTemplate;
153             String JavaDoc key = columnMap.get(KEY).toString();
154             template = headerColumnTemplate;
155             if ( resizable && collapsedColumnTemplate != null && collapsedHeaderColumnTemplate != null ) {
156                 if ( size != null && TableHandler.COLLAPSED.equals(size.get(key))) {
157                     createResizableHandler(key, TableHandler.EXPAND, handlerUrl, storeName, id, columnHeaderParameters, parameters);
158                     template = collapsedHeaderColumnTemplate;
159                 } else {
160                     createResizableHandler(key, TableHandler.COLLAPSE, handlerUrl, storeName, id, columnHeaderParameters, parameters);
161                 }
162             }
163             if ( sortable && template != collapsedHeaderColumnTemplate ) {
164                 String JavaDoc requestedOrder = TableHandler.ASCENDING;
165                 if ( sortedBy != null && sortedBy.equals(key) ) {
166                     if ( order.equals(TableHandler.ASCENDING) ) {
167                         template = ascendingHeaderColumnTemplate;
168                         requestedOrder = TableHandler.DESCENDING;
169                     } else {
170                         template = descendingHeaderColumnTemplate;
171                         requestedOrder = TableHandler.ASCENDING;
172                     }
173                 }
174                 createSortableHandler(key, requestedOrder, handlerUrl, storeName, id, columnHeaderParameters, parameters);
175             }
176             template.evaluate(headersBuffer, columnHeaderParameters);
177         }
178         parameter.put(HEADERS, new StringValue(headersBuffer.toString()));
179         Value []input = ((ArrayValue)parameter.get(SimpleProcessor.INPUT)).getArray();
180         for ( int i = 0; i < input.length; i++ ) {
181             StringBuffer JavaDoc columnsBuffer = new StringBuffer JavaDoc(1024);
182             Map JavaDoc inputParameter = ((MapValue)input[i]).getMap();
183             for ( int j = 0; j < columns.length; j++ ) {
184                 Map JavaDoc columnMap = ((MapValue)columns[j]).getMap();
185                 boolean replaceColumn = ((BooleanValue)columnMap.get(REPLACE_COLUMN)).booleanValue();
186                 Value processorUri = (Value)columnMap.get(PROCESSOR);
187                 Map JavaDoc columnParameters = new HashMap JavaDoc();
188                 columnParameters.putAll(parameter);
189                 String JavaDoc key = columnMap.get(KEY).toString();
190                 String JavaDoc name = columnMap.get(NAME).toString();
191                 Object JavaDoc value = columnMap.get(VALUE);
192                 if ( value == null || value == NullValue.NULL ) {
193                     value = inputParameter.get(key);
194                 }
195                 columnParameters.put(name, value);
196                 if ( processorUri != NullValue.NULL ) {
197                     Processor processor = ProcessorManager.getInstance().getProcessor((URI)processorUri);
198                     Value processorParameters = (Value)columnMap.get(PARAMETERS);
199                     if ( processorParameters instanceof MapValue ) {
200                         columnParameters.putAll(((MapValue)processorParameters).getMap());
201                     }
202                     Result processorResult = ProcessorManager.process(processor, columnParameters, context);
203                     String JavaDoc resultKey = columnMap.get(RESULT).toString();
204                     Value resultEntry = (Value)processorResult.getResultEntries().get(resultKey);
205                     if ( resultEntry instanceof PrintableValue ) {
206                         if ( replaceColumn ) {
207                             ((PrintableValue)resultEntry).print(columnsBuffer);
208                         } else {
209                             StringBuffer JavaDoc resultBuffer = new StringBuffer JavaDoc();
210                             ((PrintableValue)resultEntry).print(resultBuffer);
211                             columnParameters.put(VALUE, new StringValue(resultBuffer.toString()));
212                         }
213                     }
214                 }
215                 if ( !replaceColumn ) {
216                     Template template = columnTemplate;
217                     if ( size != null && TableHandler.COLLAPSED.equals(size.get(key))) {
218                         template = collapsedColumnTemplate;
219                     }
220                     template.evaluate(columnsBuffer, columnParameters);
221                 }
222             }
223             inputParameter.put(COLUMNS, new StringValue(columnsBuffer.toString()));
224         }
225         return super.process(parameter, context);
226     }
227
228     public ParameterDescriptor[] getParameterDescriptors() {
229         return parameterDescriptors;
230     }
231     
232     protected void createSortableHandler(String JavaDoc column, String JavaDoc requestedOrder, String JavaDoc handlerUrl, String JavaDoc storeName, String JavaDoc id, Map JavaDoc parameters, Map JavaDoc parameter) throws IOException JavaDoc {
233         StringBuffer JavaDoc handlerBuffer = new StringBuffer JavaDoc(128);
234         handlerBuffer.append(handlerUrl).append('?').append(TableHandler.STORE).append('=').append(storeName).append('&').append(TableHandler.ID).append('=').append(id).
235         append('&').append(TableHandler.SORTED_BY).append('=').append(column).append('&').append(TableHandler.ORDER).append('=').append(requestedOrder);
236         for ( Iterator JavaDoc j = parameter.entrySet().iterator(); j.hasNext(); ) {
237             Map.Entry JavaDoc entry = (Map.Entry JavaDoc)j.next();
238             if ( entry.getValue() instanceof PrintableValue ) {
239                 handlerBuffer.append('&').append(entry.getKey()).append('=');
240                 ((PrintableValue)entry.getValue()).print(handlerBuffer);
241             }
242         }
243         parameters.put(SORTABLE_HANDLER, new StringValue(handlerBuffer.toString()));
244     }
245     
246     protected void createResizableHandler(String JavaDoc column, String JavaDoc requestedSize, String JavaDoc handlerUrl, String JavaDoc storeName, String JavaDoc id, Map JavaDoc parameters, Map JavaDoc parameter) throws IOException JavaDoc {
247         StringBuffer JavaDoc handlerBuffer = new StringBuffer JavaDoc(128);
248         handlerBuffer.append(handlerUrl).append('?').append(TableHandler.STORE).append('=').append(storeName).append('&').append(TableHandler.ID).append('=').append(id).
249         append('&').append(requestedSize).append('=').append(column);
250         for ( Iterator JavaDoc j = parameter.entrySet().iterator(); j.hasNext(); ) {
251             Map.Entry JavaDoc entry = (Map.Entry JavaDoc)j.next();
252             if ( entry.getValue() instanceof PrintableValue ) {
253                 handlerBuffer.append('&').append(entry.getKey()).append('=');
254                 ((PrintableValue)entry.getValue()).print(handlerBuffer);
255             }
256         }
257         parameters.put(RESIZABLE_HANDLER, new StringValue(handlerBuffer.toString()));
258     }
259 }
Popular Tags