KickJava   Java API By Example, From Geeks To Geeks.

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


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.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 /**
32  * @version $Revision: 1.5 $
33  */

34 public class TablePager extends TemplateRenderer {
35     public final static String JavaDoc SHOW_RANGE = "showRange";
36     public final static String JavaDoc RANGE = "range";
37     public final static String JavaDoc PARAMETER = "parameter";
38
39     final private static String JavaDoc HANDLER = "handler";
40     public final static String JavaDoc TOTAL_PAGES = "totalPages";
41     public final static String JavaDoc CURRENT_PAGE = "currentPage";
42     public final static String JavaDoc FIRST_ITEM = "firstItem";
43     public final static String JavaDoc LAST_ITEM = "lastItem";
44     public final static String JavaDoc CURRENT_ITEM_NUMBER = "currentItem";
45
46     public final static String JavaDoc FAILED = "failed";
47
48     protected final static String JavaDoc PRE_FRAGMENT = "pre";
49     protected final static String JavaDoc POST_FRAGMENT = "post";
50     protected final static String JavaDoc FIRST_FRAGMENT = "first";
51     protected final static String JavaDoc FIRST_SELECTED_FRAGMENT = "first selected";
52     protected final static String JavaDoc LAST_FRAGMENT = "last";
53     protected final static String JavaDoc LAST_SELECTED_FRAGMENT = "last selected";
54     protected final static String JavaDoc PREVIOUS_FRAGMENT = "previous";
55     protected final static String JavaDoc PREVIOUS_DISABLED_FRAGMENT = "previous disabled";
56     protected final static String JavaDoc NEXT_FRAGMENT = "next";
57     protected final static String JavaDoc NEXT_DISABLED_FRAGMENT = "next disabled";
58     protected final static String JavaDoc PAGE_FRAGMENT = "page";
59     protected final static String JavaDoc SELECTED_PAGE_FRAGMENT = "page selected";
60     protected final static String JavaDoc PAGE_SEPARATOR_FRAGMENT = "page separator";
61     protected final static String JavaDoc 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 JavaDoc[] { 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 JavaDoc parameters, Context context) throws Exception JavaDoc {
78         Map JavaDoc 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 JavaDoc handlerUrl = ProcessorManager.getInstance().process(ProcessorManager.URL, TableHandler.URL, context).toString();
82         String JavaDoc id = parameters.get(TableHandler.ID).toString();
83         String JavaDoc 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 JavaDoc 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 JavaDoc(lastItem)));
101         result.addResultEntry(CURRENT_PAGE, new NumberValue(new Integer JavaDoc(currentPage)));
102         result.addResultEntry(TOTAL_PAGES, new NumberValue(new Integer JavaDoc(totalPages)));
103         boolean hasNext = false, hasPrevious = false;
104         if (itemsPerPage > 0) {
105             hasNext = (currentPosition + itemsPerPage < length);
106             hasPrevious = (currentPosition > 0);
107         }
108         StringBuffer JavaDoc buffer = new StringBuffer JavaDoc();
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 JavaDoc(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 JavaDoc handlerUrl, String JavaDoc storeName, String JavaDoc id, Map JavaDoc parameters, Map JavaDoc parameter) throws IOException JavaDoc {
178         parameters.put(TableHandler.TARGET_POSITION, new NumberValue(new Integer JavaDoc(i)));
179         StringBuffer JavaDoc handlerBuffer = new StringBuffer JavaDoc(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 JavaDoc j = parameter.entrySet().iterator(); j.hasNext(); ) {
183             Map.Entry JavaDoc entry = (Map.Entry JavaDoc)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 JavaDoc(i+1)));
192         parameters.put(LAST_ITEM, new NumberValue(new Integer JavaDoc(lastItem)));
193     }
194     
195     public void configure(StreamableValue config) throws ConfigurationException {
196         super.configure(config);
197         // remove fragment parameter
198
List JavaDoc parameterList = new ArrayList JavaDoc();
199         parameterList.add(new ParameterDescriptor(PARAMETER, new ParameterMessage("tablePager/parameter"), MapValueDescriptor.ANY, new MapValue(new HashMap JavaDoc())));
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 JavaDoc(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