KickJava   Java API By Example, From Geeks To Geeks.

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


1
2
3 /*
4  * The contents of this file are subject to the terms
5  * of the Common Development and Distribution License
6  * (the "License"). You may not use this file except
7  * in compliance with the License.
8  *
9  * You can obtain a copy of the license at
10  * glassfish/bootstrap/legal/CDDLv1.0.txt or
11  * https://glassfish.dev.java.net/public/CDDLv1.0.html.
12  * See the License for the specific language governing
13  * permissions and limitations under the License.
14  *
15  * When distributing Covered Code, include this CDDL
16  * HEADER in each file and include the License file at
17  * glassfish/bootstrap/legal/CDDLv1.0.txt. If applicable,
18  * add the following below this CDDL HEADER, with the
19  * fields enclosed by brackets "[]" replaced with your
20  * own identifying information: Portions Copyright [yyyy]
21  * [name of copyright owner]
22  *
23  * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
24  *
25  * Portions Copyright Apache Software Foundation.
26  */

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

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

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