1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.struts2.jasper.tagplugins.jstl.core;
20
21 import org.apache.struts2.jasper.compiler.tagplugin.TagPlugin;
22 import org.apache.struts2.jasper.compiler.tagplugin.TagPluginContext;
23
24 public class ForTokens implements TagPlugin {
25
26 public void doTag(TagPluginContext ctxt) {
27 boolean hasVar, hasVarStatus, hasBegin, hasEnd, hasStep;
28
29
30 hasVar = ctxt.isAttributeSpecified("var");
31 hasVarStatus = ctxt.isAttributeSpecified("varStatus");
32 hasBegin = ctxt.isAttributeSpecified("begin");
33 hasEnd = ctxt.isAttributeSpecified("end");
34 hasStep = ctxt.isAttributeSpecified("step");
35
36 if (hasVarStatus) {
37 ctxt.dontUseTagPlugin();
38 return;
39 }
40
41
42 String itemsName = ctxt.getTemporaryVariableName();
43 String delimsName = ctxt.getTemporaryVariableName();
44 String stName = ctxt.getTemporaryVariableName();
45 String beginName = ctxt.getTemporaryVariableName();
46 String endName = ctxt.getTemporaryVariableName();
47 String stepName = ctxt.getTemporaryVariableName();
48 String index = ctxt.getTemporaryVariableName();
49 String temp = ctxt.getTemporaryVariableName();
50 String tokensCountName = ctxt.getTemporaryVariableName();
51
52
53 ctxt.generateJavaSource("String " + itemsName + " = (String)");
54 ctxt.generateAttribute("items");
55 ctxt.generateJavaSource(";");
56
57
58 ctxt.generateJavaSource("String " + delimsName + " = (String)");
59 ctxt.generateAttribute("delims");
60 ctxt.generateJavaSource(";");
61
62
63 ctxt.generateJavaSource("java.util.StringTokenizer " + stName + " = " +
64 "new java.util.StringTokenizer(" + itemsName + ", " + delimsName + ");");
65
66
67
68 ctxt.generateJavaSource("int " + tokensCountName + " = " + stName + ".countTokens();");
69 if (hasBegin) {
70 ctxt.generateJavaSource("int " + beginName + " = ");
71 ctxt.generateAttribute("begin");
72 ctxt.generateJavaSource(";");
73 ctxt.generateJavaSource("for(int " + index + " = 0; " + index + " < " + beginName + " && " + stName + ".hasMoreTokens(); " + index + "++, " + stName + ".nextToken()){}");
74 } else {
75 ctxt.generateJavaSource("int " + beginName + " = 0;");
76 }
77
78
79
80
81 if (hasEnd) {
82 ctxt.generateJavaSource("int " + endName + " = 0;");
83 ctxt.generateJavaSource("if((" + tokensCountName + " - 1) < ");
84 ctxt.generateAttribute("end");
85 ctxt.generateJavaSource("){");
86 ctxt.generateJavaSource(" " + endName + " = " + tokensCountName + " - 1;");
87 ctxt.generateJavaSource("}else{");
88 ctxt.generateJavaSource(" " + endName + " = ");
89 ctxt.generateAttribute("end");
90 ctxt.generateJavaSource(";}");
91 } else {
92 ctxt.generateJavaSource("int " + endName + " = " + tokensCountName + " - 1;");
93 }
94
95
96
97 if (hasStep) {
98 ctxt.generateJavaSource("int " + stepName + " = ");
99 ctxt.generateAttribute("step");
100 ctxt.generateJavaSource(";");
101 } else {
102 ctxt.generateJavaSource("int " + stepName + " = 1;");
103 }
104
105
106 ctxt.generateJavaSource("for(int " + index + " = " + beginName + "; " + index + " <= " + endName + "; " + index + "++){");
107 ctxt.generateJavaSource(" String " + temp + " = " + stName + ".nextToken();");
108 ctxt.generateJavaSource(" if(((" + index + " - " + beginName + ") % " + stepName + ") == 0){");
109
110 if (hasVar) {
111 String strVar = ctxt.getConstantAttribute("var");
112 ctxt.generateJavaSource(" pageContext.setAttribute(\"" + strVar + "\", " + temp + ");");
113 }
114 ctxt.generateBody();
115 ctxt.generateJavaSource(" }");
116 ctxt.generateJavaSource("}");
117 }
118
119 }