KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > jasper > tagplugins > jstl > core > ForEach


1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements. See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License. You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */

17
18
19 package org.apache.jasper.tagplugins.jstl.core;
20
21 import org.apache.jasper.compiler.tagplugin.*;
22
23 public final class ForEach implements TagPlugin {
24     
25     private boolean hasVar, hasBegin, hasEnd, hasStep;
26     
27     public void doTag(TagPluginContext ctxt) {
28         
29         String JavaDoc index = null;
30         
31         boolean hasVarStatus = ctxt.isAttributeSpecified("varStatus");
32         if (hasVarStatus) {
33             ctxt.dontUseTagPlugin();
34             return;
35         }
36         
37         hasVar = ctxt.isAttributeSpecified("var");
38         hasBegin = ctxt.isAttributeSpecified("begin");
39         hasEnd = ctxt.isAttributeSpecified("end");
40         hasStep = ctxt.isAttributeSpecified("step");
41         
42         boolean hasItems = ctxt.isAttributeSpecified("items");
43         if (hasItems) {
44             doCollection(ctxt);
45             return;
46         }
47         
48         // We must have a begin and end attributes
49
index = ctxt.getTemporaryVariableName();
50         ctxt.generateJavaSource("for (int " + index + " = ");
51         ctxt.generateAttribute("begin");
52         ctxt.generateJavaSource("; " + index + " <= ");
53         ctxt.generateAttribute("end");
54         if (hasStep) {
55             ctxt.generateJavaSource("; " + index + "+=");
56             ctxt.generateAttribute("step");
57             ctxt.generateJavaSource(") {");
58         }
59         else {
60             ctxt.generateJavaSource("; " + index + "++) {");
61         }
62         
63         // If var is specified and the body contains an EL, then sycn
64
// the var attribute
65
if (hasVar /* && ctxt.hasEL() */) {
66             ctxt.generateJavaSource("_jspx_page_context.setAttribute(");
67             ctxt.generateAttribute("var");
68             ctxt.generateJavaSource(", String.valueOf(" + index + "));");
69         }
70         ctxt.generateBody();
71         ctxt.generateJavaSource("}");
72     }
73     
74     /**
75      * Generate codes for Collections
76      * The pseudo code is:
77      */

78     private void doCollection(TagPluginContext ctxt) {
79         
80         ctxt.generateImport("java.util.*");
81         generateIterators(ctxt);
82         
83         String JavaDoc itemsV = ctxt.getTemporaryVariableName();
84         ctxt.generateJavaSource("Object " + itemsV + "= ");
85         ctxt.generateAttribute("items");
86         ctxt.generateJavaSource(";");
87         
88         String JavaDoc indexV=null, beginV=null, endV=null, stepV=null;
89         if (hasBegin) {
90             beginV = ctxt.getTemporaryVariableName();
91             ctxt.generateJavaSource("int " + beginV + " = ");
92             ctxt.generateAttribute("begin");
93             ctxt.generateJavaSource(";");
94         }
95         if (hasEnd) {
96             indexV = ctxt.getTemporaryVariableName();
97             ctxt.generateJavaSource("int " + indexV + " = 0;");
98             endV = ctxt.getTemporaryVariableName();
99             ctxt.generateJavaSource("int " + endV + " = ");
100             ctxt.generateAttribute("end");
101             ctxt.generateJavaSource(";");
102         }
103         if (hasStep) {
104             stepV = ctxt.getTemporaryVariableName();
105             ctxt.generateJavaSource("int " + stepV + " = ");
106             ctxt.generateAttribute("step");
107             ctxt.generateJavaSource(";");
108         }
109         
110         String JavaDoc iterV = ctxt.getTemporaryVariableName();
111         ctxt.generateJavaSource("Iterator " + iterV + " = null;");
112         // Object[]
113
ctxt.generateJavaSource("if (" + itemsV + " instanceof Object[])");
114         ctxt.generateJavaSource(iterV + "=toIterator((Object[])" + itemsV + ");");
115         // boolean[]
116
ctxt.generateJavaSource("else if (" + itemsV + " instanceof boolean[])");
117         ctxt.generateJavaSource(iterV + "=toIterator((boolean[])" + itemsV + ");");
118         // byte[]
119
ctxt.generateJavaSource("else if (" + itemsV + " instanceof byte[])");
120         ctxt.generateJavaSource(iterV + "=toIterator((byte[])" + itemsV + ");");
121         // char[]
122
ctxt.generateJavaSource("else if (" + itemsV + " instanceof char[])");
123         ctxt.generateJavaSource(iterV + "=toIterator((char[])" + itemsV + ");");
124         // short[]
125
ctxt.generateJavaSource("else if (" + itemsV + " instanceof short[])");
126         ctxt.generateJavaSource(iterV + "=toIterator((short[])" + itemsV + ");");
127         // int[]
128
ctxt.generateJavaSource("else if (" + itemsV + " instanceof int[])");
129         ctxt.generateJavaSource(iterV + "=toIterator((int[])" + itemsV + ");");
130         // long[]
131
ctxt.generateJavaSource("else if (" + itemsV + " instanceof long[])");
132         ctxt.generateJavaSource(iterV + "=toIterator((long[])" + itemsV + ");");
133         // float[]
134
ctxt.generateJavaSource("else if (" + itemsV + " instanceof float[])");
135         ctxt.generateJavaSource(iterV + "=toIterator((float[])" + itemsV + ");");
136         // double[]
137
ctxt.generateJavaSource("else if (" + itemsV + " instanceof double[])");
138         ctxt.generateJavaSource(iterV + "=toIterator((double[])" + itemsV + ");");
139         
140         // Collection
141
ctxt.generateJavaSource("else if (" + itemsV + " instanceof Collection)");
142         ctxt.generateJavaSource(iterV + "=((Collection)" + itemsV + ").iterator();");
143         
144         // Iterator
145
ctxt.generateJavaSource("else if (" + itemsV + " instanceof Iterator)");
146         ctxt.generateJavaSource(iterV + "=(Iterator)" + itemsV + ";");
147         
148         // Enumeration
149
ctxt.generateJavaSource("else if (" + itemsV + " instanceof Enumeration)");
150         ctxt.generateJavaSource(iterV + "=toIterator((Enumeration)" + itemsV + ");");
151         
152         // Map
153
ctxt.generateJavaSource("else if (" + itemsV + " instanceof Map)");
154         ctxt.generateJavaSource(iterV + "=((Map)" + itemsV + ").entrySet().iterator();");
155         
156         if (hasBegin) {
157             String JavaDoc tV = ctxt.getTemporaryVariableName();
158             ctxt.generateJavaSource("for (int " + tV + "=" + beginV + ";" +
159                     tV + ">0 && " + iterV + ".hasNext(); " +
160                     tV + "--)");
161             ctxt.generateJavaSource(iterV + ".next();");
162         }
163         
164         ctxt.generateJavaSource("while (" + iterV + ".hasNext()){");
165         if (hasVar) {
166             ctxt.generateJavaSource("_jspx_page_context.setAttribute(");
167             ctxt.generateAttribute("var");
168             ctxt.generateJavaSource(", " + iterV + ".next());");
169         }
170         
171         ctxt.generateBody();
172         
173         if (hasStep) {
174             String JavaDoc tV = ctxt.getTemporaryVariableName();
175             ctxt.generateJavaSource("for (int " + tV + "=" + stepV + "-1;" +
176                     tV + ">0 && " + iterV + ".hasNext(); " +
177                     tV + "--)");
178             ctxt.generateJavaSource(iterV + ".next();");
179         }
180         if (hasEnd) {
181             if (hasStep) {
182                 ctxt.generateJavaSource(indexV + "+=" + stepV + ";");
183             }
184             else {
185                 ctxt.generateJavaSource(indexV + "++;");
186             }
187             if (hasBegin) {
188                 ctxt.generateJavaSource("if(" + beginV + "+" + indexV +
189                         ">"+ endV + ")");
190             }
191             else {
192                 ctxt.generateJavaSource("if(" + indexV + ">" + endV + ")");
193             }
194             ctxt.generateJavaSource("break;");
195         }
196         ctxt.generateJavaSource("}"); // while
197
}
198     
199     /**
200      * Generate iterators for data types supported in items
201      */

202     private void generateIterators(TagPluginContext ctxt) {
203         
204         // Object[]
205
ctxt.generateDeclaration("ObjectArrayIterator",
206                 "private Iterator toIterator(final Object[] a){\n" +
207                 " return (new Iterator() {\n" +
208                 " int index=0;\n" +
209                 " public boolean hasNext() {\n" +
210                 " return index < a.length;}\n" +
211                 " public Object next() {\n" +
212                 " return a[index++];}\n" +
213                 " public void remove() {}\n" +
214                 " });\n" +
215                 "}"
216         );
217         
218         // boolean[]
219
ctxt.generateDeclaration("booleanArrayIterator",
220                 "private Iterator toIterator(final boolean[] a){\n" +
221                 " return (new Iterator() {\n" +
222                 " int index=0;\n" +
223                 " public boolean hasNext() {\n" +
224                 " return index < a.length;}\n" +
225                 " public Object next() {\n" +
226                 " return new Boolean(a[index++]);}\n" +
227                 " public void remove() {}\n" +
228                 " });\n" +
229                 "}"
230         );
231         
232         // byte[]
233
ctxt.generateDeclaration("byteArrayIterator",
234                 "private Iterator toIterator(final byte[] a){\n" +
235                 " return (new Iterator() {\n" +
236                 " int index=0;\n" +
237                 " public boolean hasNext() {\n" +
238                 " return index < a.length;}\n" +
239                 " public Object next() {\n" +
240                 " return new Byte(a[index++]);}\n" +
241                 " public void remove() {}\n" +
242                 " });\n" +
243                 "}"
244         );
245         
246         // char[]
247
ctxt.generateDeclaration("charArrayIterator",
248                 "private Iterator toIterator(final char[] a){\n" +
249                 " return (new Iterator() {\n" +
250                 " int index=0;\n" +
251                 " public boolean hasNext() {\n" +
252                 " return index < a.length;}\n" +
253                 " public Object next() {\n" +
254                 " return new Character(a[index++]);}\n" +
255                 " public void remove() {}\n" +
256                 " });\n" +
257                 "}"
258         );
259         
260         // short[]
261
ctxt.generateDeclaration("shortArrayIterator",
262                 "private Iterator toIterator(final short[] a){\n" +
263                 " return (new Iterator() {\n" +
264                 " int index=0;\n" +
265                 " public boolean hasNext() {\n" +
266                 " return index < a.length;}\n" +
267                 " public Object next() {\n" +
268                 " return new Short(a[index++]);}\n" +
269                 " public void remove() {}\n" +
270                 " });\n" +
271                 "}"
272         );
273         
274         // int[]
275
ctxt.generateDeclaration("intArrayIterator",
276                 "private Iterator toIterator(final int[] a){\n" +
277                 " return (new Iterator() {\n" +
278                 " int index=0;\n" +
279                 " public boolean hasNext() {\n" +
280                 " return index < a.length;}\n" +
281                 " public Object next() {\n" +
282                 " return new Integer(a[index++]);}\n" +
283                 " public void remove() {}\n" +
284                 " });\n" +
285                 "}"
286         );
287         
288         // long[]
289
ctxt.generateDeclaration("longArrayIterator",
290                 "private Iterator toIterator(final long[] a){\n" +
291                 " return (new Iterator() {\n" +
292                 " int index=0;\n" +
293                 " public boolean hasNext() {\n" +
294                 " return index < a.length;}\n" +
295                 " public Object next() {\n" +
296                 " return new Long(a[index++]);}\n" +
297                 " public void remove() {}\n" +
298                 " });\n" +
299                 "}"
300         );
301         
302         // float[]
303
ctxt.generateDeclaration("floatArrayIterator",
304                 "private Iterator toIterator(final float[] a){\n" +
305                 " return (new Iterator() {\n" +
306                 " int index=0;\n" +
307                 " public boolean hasNext() {\n" +
308                 " return index < a.length;}\n" +
309                 " public Object next() {\n" +
310                 " return new Float(a[index++]);}\n" +
311                 " public void remove() {}\n" +
312                 " });\n" +
313                 "}"
314         );
315         
316         // double[]
317
ctxt.generateDeclaration("doubleArrayIterator",
318                 "private Iterator toIterator(final double[] a){\n" +
319                 " return (new Iterator() {\n" +
320                 " int index=0;\n" +
321                 " public boolean hasNext() {\n" +
322                 " return index < a.length;}\n" +
323                 " public Object next() {\n" +
324                 " return new Double(a[index++]);}\n" +
325                 " public void remove() {}\n" +
326                 " });\n" +
327                 "}"
328         );
329         
330         // Enumeration
331
ctxt.generateDeclaration("enumIterator",
332                 "private Iterator toIterator(final Enumeration e){\n" +
333                 " return (new Iterator() {\n" +
334                 " public boolean hasNext() {\n" +
335                 " return e.hasMoreElements();}\n" +
336                 " public Object next() {\n" +
337                 " return e.nextElement();}\n" +
338                 " public void remove() {}\n" +
339                 " });\n" +
340                 "}"
341         );
342         
343     }
344 }
345
Popular Tags