1 2 3 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 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 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 (hasVar ) { 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 87 private void doCollection(TagPluginContext ctxt) { 88 89 ctxt.generateImport("java.util.*"); 90 generateIterators(ctxt); 91 92 String itemsV = ctxt.getTemporaryVariableName(); 93 ctxt.generateJavaSource("Object " + itemsV + "= "); 94 ctxt.generateAttribute("items"); 95 ctxt.generateJavaSource(";"); 96 97 String 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 iterV = ctxt.getTemporaryVariableName(); 120 ctxt.generateJavaSource("Iterator " + iterV + " = null;"); 121 ctxt.generateJavaSource("if (" + itemsV + " instanceof Object[])"); 123 ctxt.generateJavaSource(iterV + "=toIterator((Object[])" + itemsV + ");"); 124 ctxt.generateJavaSource("else if (" + itemsV + " instanceof boolean[])"); 126 ctxt.generateJavaSource(iterV + "=toIterator((boolean[])" + itemsV + ");"); 127 ctxt.generateJavaSource("else if (" + itemsV + " instanceof byte[])"); 129 ctxt.generateJavaSource(iterV + "=toIterator((byte[])" + itemsV + ");"); 130 ctxt.generateJavaSource("else if (" + itemsV + " instanceof char[])"); 132 ctxt.generateJavaSource(iterV + "=toIterator((char[])" + itemsV + ");"); 133 ctxt.generateJavaSource("else if (" + itemsV + " instanceof short[])"); 135 ctxt.generateJavaSource(iterV + "=toIterator((short[])" + itemsV + ");"); 136 ctxt.generateJavaSource("else if (" + itemsV + " instanceof int[])"); 138 ctxt.generateJavaSource(iterV + "=toIterator((int[])" + itemsV + ");"); 139 ctxt.generateJavaSource("else if (" + itemsV + " instanceof long[])"); 141 ctxt.generateJavaSource(iterV + "=toIterator((long[])" + itemsV + ");"); 142 ctxt.generateJavaSource("else if (" + itemsV + " instanceof float[])"); 144 ctxt.generateJavaSource(iterV + "=toIterator((float[])" + itemsV + ");"); 145 ctxt.generateJavaSource("else if (" + itemsV + " instanceof double[])"); 147 ctxt.generateJavaSource(iterV + "=toIterator((double[])" + itemsV + ");"); 148 149 ctxt.generateJavaSource("else if (" + itemsV + " instanceof Collection)"); 151 ctxt.generateJavaSource(iterV + "=((Collection)" + itemsV + ").iterator();"); 152 153 ctxt.generateJavaSource("else if (" + itemsV + " instanceof Iterator)"); 155 ctxt.generateJavaSource(iterV + "=(Iterator)" + itemsV + ";"); 156 157 ctxt.generateJavaSource("else if (" + itemsV + " instanceof Enumeration)"); 159 ctxt.generateJavaSource(iterV + "=toIterator((Enumeration)" + itemsV + ");"); 160 161 ctxt.generateJavaSource("else if (" + itemsV + " instanceof Map)"); 163 ctxt.generateJavaSource(iterV + "=((Map)" + itemsV + ").entrySet().iterator();"); 164 165 if (hasBegin) { 166 String 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 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("}"); } 207 208 211 private void generateIterators(TagPluginContext ctxt) { 212 213 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 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 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 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 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 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 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 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 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 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 |