1 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 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 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 (hasVar ) { 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 78 private void doCollection(TagPluginContext ctxt) { 79 80 ctxt.generateImport("java.util.*"); 81 generateIterators(ctxt); 82 83 String itemsV = ctxt.getTemporaryVariableName(); 84 ctxt.generateJavaSource("Object " + itemsV + "= "); 85 ctxt.generateAttribute("items"); 86 ctxt.generateJavaSource(";"); 87 88 String 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 iterV = ctxt.getTemporaryVariableName(); 111 ctxt.generateJavaSource("Iterator " + iterV + " = null;"); 112 ctxt.generateJavaSource("if (" + itemsV + " instanceof Object[])"); 114 ctxt.generateJavaSource(iterV + "=toIterator((Object[])" + itemsV + ");"); 115 ctxt.generateJavaSource("else if (" + itemsV + " instanceof boolean[])"); 117 ctxt.generateJavaSource(iterV + "=toIterator((boolean[])" + itemsV + ");"); 118 ctxt.generateJavaSource("else if (" + itemsV + " instanceof byte[])"); 120 ctxt.generateJavaSource(iterV + "=toIterator((byte[])" + itemsV + ");"); 121 ctxt.generateJavaSource("else if (" + itemsV + " instanceof char[])"); 123 ctxt.generateJavaSource(iterV + "=toIterator((char[])" + itemsV + ");"); 124 ctxt.generateJavaSource("else if (" + itemsV + " instanceof short[])"); 126 ctxt.generateJavaSource(iterV + "=toIterator((short[])" + itemsV + ");"); 127 ctxt.generateJavaSource("else if (" + itemsV + " instanceof int[])"); 129 ctxt.generateJavaSource(iterV + "=toIterator((int[])" + itemsV + ");"); 130 ctxt.generateJavaSource("else if (" + itemsV + " instanceof long[])"); 132 ctxt.generateJavaSource(iterV + "=toIterator((long[])" + itemsV + ");"); 133 ctxt.generateJavaSource("else if (" + itemsV + " instanceof float[])"); 135 ctxt.generateJavaSource(iterV + "=toIterator((float[])" + itemsV + ");"); 136 ctxt.generateJavaSource("else if (" + itemsV + " instanceof double[])"); 138 ctxt.generateJavaSource(iterV + "=toIterator((double[])" + itemsV + ");"); 139 140 ctxt.generateJavaSource("else if (" + itemsV + " instanceof Collection)"); 142 ctxt.generateJavaSource(iterV + "=((Collection)" + itemsV + ").iterator();"); 143 144 ctxt.generateJavaSource("else if (" + itemsV + " instanceof Iterator)"); 146 ctxt.generateJavaSource(iterV + "=(Iterator)" + itemsV + ";"); 147 148 ctxt.generateJavaSource("else if (" + itemsV + " instanceof Enumeration)"); 150 ctxt.generateJavaSource(iterV + "=toIterator((Enumeration)" + itemsV + ");"); 151 152 ctxt.generateJavaSource("else if (" + itemsV + " instanceof Map)"); 154 ctxt.generateJavaSource(iterV + "=((Map)" + itemsV + ").entrySet().iterator();"); 155 156 if (hasBegin) { 157 String 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 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("}"); } 198 199 202 private void generateIterators(TagPluginContext ctxt) { 203 204 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 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 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 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 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 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 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 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 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 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 |