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 import org.apache.struts2.jasper.tagplugins.jstl.Util;
24
25 public class Set implements TagPlugin {
26
27 public void doTag(TagPluginContext ctxt) {
28
29
30 boolean hasValue = false, hasVar = false, hasScope = false,
31 hasTarget = false;
32
33
34 String strScope;
35
36 int iScope;
37
38
39 hasValue = ctxt.isAttributeSpecified("value");
40 hasVar = ctxt.isAttributeSpecified("var");
41 hasScope = ctxt.isAttributeSpecified("scope");
42 hasTarget = ctxt.isAttributeSpecified("target");
43
44
45 String resultName = ctxt.getTemporaryVariableName();
46 String targetName = ctxt.getTemporaryVariableName();
47 String propertyName = ctxt.getTemporaryVariableName();
48
49
50 ctxt.generateJavaSource("Object " + resultName + " = null;");
51 if (hasValue) {
52 ctxt.generateJavaSource(resultName + " = ");
53 ctxt.generateAttribute("value");
54 ctxt.generateJavaSource(";");
55 } else {
56 ctxt.dontUseTagPlugin();
57 return;
58 }
59
60
61 if (hasScope) {
62 strScope = ctxt.getConstantAttribute("scope");
63 } else {
64 strScope = "page";
65 }
66
67
68 iScope = Util.getScope(strScope);
69
70
71 if (hasVar) {
72 String strVar = ctxt.getConstantAttribute("var");
73 ctxt.generateJavaSource("if(null != " + resultName + "){");
74 ctxt.generateJavaSource(" pageContext.setAttribute(\"" + strVar + "\"," + resultName + "," + iScope + ");");
75 ctxt.generateJavaSource("} else {");
76 if (hasScope) {
77 ctxt.generateJavaSource(" pageContext.removeAttribute(\"" + strVar + "\"," + iScope + ");");
78 } else {
79 ctxt.generateJavaSource(" pageContext.removeAttribute(\"" + strVar + "\");");
80 }
81 ctxt.generateJavaSource("}");
82
83
84 } else if (hasTarget) {
85
86
87 String pdName = ctxt.getTemporaryVariableName();
88 String successFlagName = ctxt.getTemporaryVariableName();
89 String index = ctxt.getTemporaryVariableName();
90 String methodName = ctxt.getTemporaryVariableName();
91
92
93 ctxt.generateJavaSource("String " + propertyName + " = null;");
94 ctxt.generateJavaSource("if(");
95 ctxt.generateAttribute("property");
96 ctxt.generateJavaSource(" != null){");
97 ctxt.generateJavaSource(" " + propertyName + " = (");
98 ctxt.generateAttribute("property");
99 ctxt.generateJavaSource(").toString();");
100 ctxt.generateJavaSource("}");
101
102
103 ctxt.generateJavaSource("Object " + targetName + " = ");
104 ctxt.generateAttribute("target");
105 ctxt.generateJavaSource(";");
106
107
108 ctxt.generateJavaSource("if(" + targetName + " != null){");
109
110
111 ctxt.generateJavaSource(" if(" + targetName + " instanceof java.util.Map){");
112 ctxt.generateJavaSource(" if(null != " + resultName + "){");
113 ctxt.generateJavaSource(" ((java.util.Map) " + targetName + ").put(" + propertyName + "," + resultName + ");");
114 ctxt.generateJavaSource(" }else{");
115 ctxt.generateJavaSource(" ((java.util.Map) " + targetName + ").remove(" + propertyName + ");");
116 ctxt.generateJavaSource(" }");
117
118
119 ctxt.generateJavaSource(" }else{");
120 ctxt.generateJavaSource(" try{");
121
122
123 ctxt.generateJavaSource(" java.beans.PropertyDescriptor " + pdName + "[] = java.beans.Introspector.getBeanInfo(" + targetName + ".getClass()).getPropertyDescriptors();");
124
125
126 ctxt.generateJavaSource(" boolean " + successFlagName + " = false;");
127
128
129 ctxt.generateJavaSource(" for(int " + index + "=0;" + index + "<" + pdName + ".length;" + index + "++){");
130 ctxt.generateJavaSource(" if(" + pdName + "[" + index + "].getName().equals(" + propertyName + ")){");
131
132
133 ctxt.generateJavaSource(" java.lang.reflect.Method " + methodName + " = " + pdName + "[" + index + "].getWriteMethod();");
134 ctxt.generateJavaSource(" if(null == " + methodName + "){");
135 ctxt.generateJavaSource(" throw new JspException(\"No setter method in <set> for property \"+" + propertyName + ");");
136 ctxt.generateJavaSource(" }");
137
138
139 ctxt.generateJavaSource(" if(" + resultName + " != null){");
140 ctxt.generateJavaSource(" " + methodName + ".invoke(" + targetName + ", new Object[]{(" + methodName + ".getParameterTypes()[0]).cast(" + resultName + ")});");
141 ctxt.generateJavaSource(" }else{");
142 ctxt.generateJavaSource(" " + methodName + ".invoke(" + targetName + ", new Object[]{null});");
143 ctxt.generateJavaSource(" }");
144 ctxt.generateJavaSource(" " + successFlagName + " = true;");
145 ctxt.generateJavaSource(" }");
146 ctxt.generateJavaSource(" }");
147 ctxt.generateJavaSource(" if(!" + successFlagName + "){");
148 ctxt.generateJavaSource(" throw new JspException(\"Invalid property in <set>:\"+" + propertyName + ");");
149 ctxt.generateJavaSource(" }");
150 ctxt.generateJavaSource(" }");
151
152
153 ctxt.generateJavaSource(" catch (IllegalAccessException ex) {");
154 ctxt.generateJavaSource(" throw new JspException(ex);");
155 ctxt.generateJavaSource(" } catch (java.beans.IntrospectionException ex) {");
156 ctxt.generateJavaSource(" throw new JspException(ex);");
157 ctxt.generateJavaSource(" } catch (java.lang.reflect.InvocationTargetException ex) {");
158 ctxt.generateJavaSource(" throw new JspException(ex);");
159 ctxt.generateJavaSource(" }");
160 ctxt.generateJavaSource(" }");
161 ctxt.generateJavaSource("}else{");
162 ctxt.generateJavaSource(" throw new JspException();");
163 ctxt.generateJavaSource("}");
164 }
165 }
166
167 }