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 Import implements TagPlugin {
26
27 public void doTag(TagPluginContext ctxt) {
28 boolean hasContext, hasVar, hasScope, hasVarReader, hasCharEncoding;
29
30
31 hasContext = ctxt.isAttributeSpecified("context");
32 hasVar = ctxt.isAttributeSpecified("var");
33 hasScope = ctxt.isAttributeSpecified("scope");
34 hasVarReader = ctxt.isAttributeSpecified("varReader");
35 hasCharEncoding = ctxt.isAttributeSpecified("charEncoding");
36
37
38 String urlName = ctxt.getTemporaryVariableName();
39 String contextName = ctxt.getTemporaryVariableName();
40 String iauName = ctxt.getTemporaryVariableName();
41 String urlObjName = ctxt.getTemporaryVariableName();
42 String ucName = ctxt.getTemporaryVariableName();
43 String inputStreamName = ctxt.getTemporaryVariableName();
44 String tempReaderName = ctxt.getTemporaryVariableName();
45 String tempReaderName2 = ctxt.getTemporaryVariableName();
46 String charSetName = ctxt.getTemporaryVariableName();
47 String charEncodingName = ctxt.getTemporaryVariableName();
48 String contentTypeName = ctxt.getTemporaryVariableName();
49 String varReaderName = ctxt.getTemporaryVariableName();
50 String servletContextName = ctxt.getTemporaryVariableName();
51 String servletPathName = ctxt.getTemporaryVariableName();
52 String requestDispatcherName = ctxt.getTemporaryVariableName();
53 String irwName = ctxt.getTemporaryVariableName();
54 String brName = ctxt.getTemporaryVariableName();
55 String sbName = ctxt.getTemporaryVariableName();
56 String tempStringName = ctxt.getTemporaryVariableName();
57
58
59 ctxt.generateJavaSource("boolean " + iauName + ";");
60
61
62 ctxt.generateJavaSource("String " + urlName + " = ");
63 ctxt.generateAttribute("url");
64 ctxt.generateJavaSource(";");
65
66
67 ctxt.generateJavaSource("if(" + urlName + " == null || " + urlName + ".equals(\"\")){");
68 ctxt.generateJavaSource(" throw new JspTagException(\"The //\"url//\" attribute " +
69 "illegally evaluated to //\"null//\" or //\"//\" in <import>\");");
70 ctxt.generateJavaSource("}");
71
72
73 ctxt.generateJavaSource(iauName + " = " +
74 "org.apache.struts2.jasper.tagplugins.jstl.Util.isAbsoluteUrl(" + urlName + ");");
75
76
77 if (hasContext) {
78
79 ctxt.generateJavaSource("String " + contextName + " = ");
80 ctxt.generateAttribute("context");
81 ctxt.generateJavaSource(";");
82
83 ctxt.generateJavaSource("if((!" + contextName + ".startsWith(\"/\")) " +
84 "|| (!" + urlName + ".startsWith(\"/\"))){");
85 ctxt.generateJavaSource(" throw new JspTagException" +
86 "(\"In URL tags, when the //\"context//\" attribute is specified, " +
87 "values of both //\"context//\" and //\"url//\" must start with //\"///\".\");");
88 ctxt.generateJavaSource("}");
89
90 }
91
92
93 ctxt.generateJavaSource("String " + charSetName + " = null;");
94
95
96 if (hasCharEncoding) {
97
98
99 ctxt.generateJavaSource("String " + charEncodingName + " = ");
100 ctxt.generateAttribute("charEncoding");
101 ctxt.generateJavaSource(";");
102
103
104 ctxt.generateJavaSource("if(null != " + charEncodingName + " " +
105 "&& !" + charEncodingName + ".equals(\"\")){");
106 ctxt.generateJavaSource(" " + charSetName + " = "
107 + charEncodingName + ";");
108 ctxt.generateJavaSource("}");
109 }
110
111
112 ctxt.generateJavaSource("if(!" + iauName + "){");
113 ctxt.generateJavaSource(" if(!" + urlName + ".startsWith(\"/\")){");
114 ctxt.generateJavaSource(" String " + servletPathName + " = " +
115 "((HttpServletRequest)pageContext.getRequest()).getServletPath();");
116 ctxt.generateJavaSource(" " + urlName + " = "
117 + servletPathName + ".substring(0," + servletPathName + ".lastIndexOf('/')) + '/' + " + urlName + ";");
118 ctxt.generateJavaSource(" }");
119 ctxt.generateJavaSource("}");
120
121
122 if (hasVarReader) {
123
124
125 ctxt.generateJavaSource("String " + varReaderName + " = ");
126 ctxt.generateAttribute("varReader");
127 ctxt.generateJavaSource(";");
128
129
130 ctxt.generateJavaSource("if(" + iauName + "){");
131
132
133 ctxt.generateJavaSource(" java.net.URL " + urlObjName + " = new java.net.URL(" + urlName + ");");
134 ctxt.generateJavaSource(" java.net.URLConnection " + ucName + " = "
135 + urlObjName + ".openConnection();");
136 ctxt.generateJavaSource(" java.io.InputStream " + inputStreamName + " = "
137 + ucName + ".getInputStream();");
138
139 ctxt.generateJavaSource(" if(" + charSetName + " == null){");
140 ctxt.generateJavaSource(" String " + contentTypeName + " = "
141 + ucName + ".getContentType();");
142 ctxt.generateJavaSource(" if(null != " + contentTypeName + "){");
143 ctxt.generateJavaSource(" " + charSetName + " = " +
144 "org.apache.struts2.jasper.tagplugins.jstl.Util.getContentTypeAttribute(" + contentTypeName + ", \"charset\");");
145 ctxt.generateJavaSource(" if(" + charSetName + " == null) "
146 + charSetName + " = org.apache.struts2.jasper.tagplugins.jstl.Util.DEFAULT_ENCODING;");
147 ctxt.generateJavaSource(" }else{");
148 ctxt.generateJavaSource(" " + charSetName + " = org.apache.struts2.jasper.tagplugins.jstl.Util.DEFAULT_ENCODING;");
149 ctxt.generateJavaSource(" }");
150 ctxt.generateJavaSource(" }");
151
152 if (!hasCharEncoding) {
153 ctxt.generateJavaSource(" String " + contentTypeName + " = " + ucName + ".getContentType();");
154 }
155
156
157 ctxt.generateJavaSource(" java.io.Reader " + tempReaderName + " = null;");
158
159
160 ctxt.generateJavaSource(" try{");
161 ctxt.generateJavaSource(" " + tempReaderName + " = new java.io.InputStreamReader(" + inputStreamName + ", " + charSetName + ");");
162 ctxt.generateJavaSource(" }catch(Exception ex){");
163 ctxt.generateJavaSource(" " + tempReaderName + " = new java.io.InputStreamReader(" + inputStreamName + ", org.apache.struts2.jasper.tagplugins.jstl.Util.DEFAULT_ENCODING);");
164 ctxt.generateJavaSource(" }");
165
166
167 ctxt.generateJavaSource(" if(" + ucName + " instanceof java.net.HttpURLConnection){");
168 ctxt.generateJavaSource(" int status = ((java.net.HttpURLConnection) " + ucName + ").getResponseCode();");
169 ctxt.generateJavaSource(" if(status < 200 || status > 299){");
170 ctxt.generateJavaSource(" throw new JspTagException(status + \" \" + " + urlName + ");");
171 ctxt.generateJavaSource(" }");
172 ctxt.generateJavaSource(" }");
173
174
175 ctxt.generateJavaSource(" pageContext.setAttribute(" + varReaderName + ", " + tempReaderName + ");");
176
177
178 ctxt.generateJavaSource("}else{");
179
180
181 ctxt.generateJavaSource(" if (!(pageContext.getRequest() instanceof HttpServletRequest " +
182 "&& pageContext.getResponse() instanceof HttpServletResponse)){");
183 ctxt.generateJavaSource(" throw new JspTagException(\"Relative <import> from non-HTTP request not allowed\");");
184 ctxt.generateJavaSource(" }");
185
186
187 ctxt.generateJavaSource(" ServletContext " + servletContextName + " = null;");
188 if (hasContext) {
189 ctxt.generateJavaSource(" if(null != " + contextName + "){");
190 ctxt.generateJavaSource(" " + servletContextName + " = pageContext.getServletContext().getContext(" + contextName + ");");
191 ctxt.generateJavaSource(" }else{");
192 ctxt.generateJavaSource(" " + servletContextName + " = pageContext.getServletContext();");
193 ctxt.generateJavaSource(" }");
194 } else {
195 ctxt.generateJavaSource(" " + servletContextName + " = pageContext.getServletContext();");
196 }
197
198
199 ctxt.generateJavaSource(" if(" + servletContextName + " == null){");
200 if (hasContext) {
201 ctxt.generateJavaSource(" throw new JspTagException(\"Unable to get RequestDispatcher for Context: //\" \"+" + contextName + "+\" //\" and URL: //\" \" +" + urlName + "+ \" //\". Verify values and/or enable cross context access.\");");
202 } else {
203 ctxt.generateJavaSource(" throw new JspTagException(\"Unable to get RequestDispatcher for URL: //\" \" +" + urlName + "+ \" //\". Verify values and/or enable cross context access.\");");
204 }
205 ctxt.generateJavaSource(" }");
206
207
208 ctxt.generateJavaSource(" RequestDispatcher " + requestDispatcherName + " = " + servletContextName + ".getRequestDispatcher(org.apache.struts2.jasper.tagplugins.jstl.Util.stripSession(" + urlName + "));");
209 ctxt.generateJavaSource(" if(" + requestDispatcherName + " == null) throw new JspTagException(org.apache.struts2.jasper.tagplugins.jstl.Util.stripSession(" + urlName + "));");
210
211
212 ctxt.generateJavaSource(" org.apache.struts2.jasper.tagplugins.jstl.Util.ImportResponseWrapper " + irwName + " = new org.apache.struts2.jasper.tagplugins.jstl.Util.ImportResponseWrapper((HttpServletResponse) pageContext.getResponse());");
213 ctxt.generateJavaSource(" if(" + charSetName + " == null){");
214 ctxt.generateJavaSource(" " + charSetName + " = org.apache.struts2.jasper.tagplugins.jstl.Util.DEFAULT_ENCODING;");
215 ctxt.generateJavaSource(" }");
216 ctxt.generateJavaSource(" " + irwName + ".setCharEncoding(" + charSetName + ");");
217 ctxt.generateJavaSource(" try{");
218 ctxt.generateJavaSource(" " + requestDispatcherName + ".include(pageContext.getRequest(), " + irwName + ");");
219 ctxt.generateJavaSource(" }catch(java.io.IOException ex){");
220 ctxt.generateJavaSource(" throw new JspException(ex);");
221 ctxt.generateJavaSource(" }catch(RuntimeException ex){");
222 ctxt.generateJavaSource(" throw new JspException(ex);");
223 ctxt.generateJavaSource(" }catch(ServletException ex){");
224 ctxt.generateJavaSource(" Throwable rc = ex.getRootCause();");
225 ctxt.generateJavaSource(" if (rc == null)");
226 ctxt.generateJavaSource(" throw new JspException(ex);");
227 ctxt.generateJavaSource(" else");
228 ctxt.generateJavaSource(" throw new JspException(rc);");
229 ctxt.generateJavaSource(" }");
230
231
232 ctxt.generateJavaSource(" if(" + irwName + ".getStatus() < 200 || " + irwName + ".getStatus() > 299){");
233 ctxt.generateJavaSource(" throw new JspTagException(" + irwName + ".getStatus()+\" \" + org.apache.struts2.jasper.tagplugins.jstl.Util.stripSession(" + urlName + "));");
234 ctxt.generateJavaSource(" }");
235
236
237 ctxt.generateJavaSource(" java.io.Reader " + tempReaderName + " = new java.io.StringReader(" + irwName + ".getString());");
238 ctxt.generateJavaSource(" pageContext.setAttribute(" + varReaderName + ", " + tempReaderName + ");");
239
240 ctxt.generateJavaSource("}");
241
242
243 ctxt.generateBody();
244
245
246 ctxt.generateJavaSource("java.io.Reader " + tempReaderName2 + " = (java.io.Reader)pageContext.getAttribute(" + varReaderName + ");");
247 ctxt.generateJavaSource("if(" + tempReaderName2 + " != null) " + tempReaderName2 + ".close();");
248 ctxt.generateJavaSource("pageContext.removeAttribute(" + varReaderName + ",1);");
249 }
250
251
252 else {
253
254 ctxt.generateJavaSource("pageContext.setAttribute(\"url_without_param\"," + urlName + ");");
255 ctxt.generateBody();
256 ctxt.generateJavaSource(urlName + " = (String)pageContext.getAttribute(\"url_without_param\");");
257 ctxt.generateJavaSource("pageContext.removeAttribute(\"url_without_param\");");
258 String strScope = "page";
259 if (hasScope) {
260 strScope = ctxt.getConstantAttribute("scope");
261 }
262 int iScope = Util.getScope(strScope);
263
264 ctxt.generateJavaSource("String " + tempStringName + " = null;");
265
266 ctxt.generateJavaSource("if(" + iauName + "){");
267
268
269 ctxt.generateJavaSource(" java.net.URL " + urlObjName + " = new java.net.URL(" + urlName + ");");
270 ctxt.generateJavaSource(" java.net.URLConnection " + ucName + " = " + urlObjName + ".openConnection();");
271 ctxt.generateJavaSource(" java.io.InputStream " + inputStreamName + " = " + ucName + ".getInputStream();");
272 ctxt.generateJavaSource(" java.io.Reader " + tempReaderName + " = null;");
273
274 ctxt.generateJavaSource(" if(" + charSetName + " == null){");
275 ctxt.generateJavaSource(" String " + contentTypeName + " = "
276 + ucName + ".getContentType();");
277 ctxt.generateJavaSource(" if(null != " + contentTypeName + "){");
278 ctxt.generateJavaSource(" " + charSetName + " = " +
279 "org.apache.struts2.jasper.tagplugins.jstl.Util.getContentTypeAttribute(" + contentTypeName + ", \"charset\");");
280 ctxt.generateJavaSource(" if(" + charSetName + " == null) "
281 + charSetName + " = org.apache.struts2.jasper.tagplugins.jstl.Util.DEFAULT_ENCODING;");
282 ctxt.generateJavaSource(" }else{");
283 ctxt.generateJavaSource(" " + charSetName + " = org.apache.struts2.jasper.tagplugins.jstl.Util.DEFAULT_ENCODING;");
284 ctxt.generateJavaSource(" }");
285 ctxt.generateJavaSource(" }");
286
287 ctxt.generateJavaSource(" try{");
288 ctxt.generateJavaSource(" " + tempReaderName + " = new java.io.InputStreamReader(" + inputStreamName + "," + charSetName + ");");
289 ctxt.generateJavaSource(" }catch(Exception ex){");
290
291 ctxt.generateJavaSource(" " + tempReaderName + " = new java.io.InputStreamReader(" + inputStreamName + ",org.apache.struts2.jasper.tagplugins.jstl.Util.DEFAULT_ENCODING);");
292 ctxt.generateJavaSource(" }");
293
294
295 ctxt.generateJavaSource(" if(" + ucName + " instanceof java.net.HttpURLConnection){");
296 ctxt.generateJavaSource(" int status = ((java.net.HttpURLConnection) " + ucName + ").getResponseCode();");
297 ctxt.generateJavaSource(" if(status < 200 || status > 299){");
298 ctxt.generateJavaSource(" throw new JspTagException(status + \" \" + " + urlName + ");");
299 ctxt.generateJavaSource(" }");
300 ctxt.generateJavaSource(" }");
301
302 ctxt.generateJavaSource(" java.io.BufferedReader " + brName + " = new java.io.BufferedReader(" + tempReaderName + ");");
303 ctxt.generateJavaSource(" StringBuffer " + sbName + " = new StringBuffer();");
304 String index = ctxt.getTemporaryVariableName();
305 ctxt.generateJavaSource(" int " + index + ";");
306 ctxt.generateJavaSource(" while((" + index + " = " + brName + ".read()) != -1) " + sbName + ".append((char)" + index + ");");
307 ctxt.generateJavaSource(" " + tempStringName + " = " + sbName + ".toString();");
308
309 ctxt.generateJavaSource("}else{");
310
311
312 ctxt.generateJavaSource(" if (!(pageContext.getRequest() instanceof HttpServletRequest " +
313 "&& pageContext.getResponse() instanceof HttpServletResponse)){");
314 ctxt.generateJavaSource(" throw new JspTagException(\"Relative <import> from non-HTTP request not allowed\");");
315 ctxt.generateJavaSource(" }");
316
317
318 ctxt.generateJavaSource(" ServletContext " + servletContextName + " = null;");
319 if (hasContext) {
320 ctxt.generateJavaSource(" if(null != " + contextName + "){");
321 ctxt.generateJavaSource(" " + servletContextName + " = pageContext.getServletContext().getContext(" + contextName + ");");
322 ctxt.generateJavaSource(" }else{");
323 ctxt.generateJavaSource(" " + servletContextName + " = pageContext.getServletContext();");
324 ctxt.generateJavaSource(" }");
325 } else {
326 ctxt.generateJavaSource(" " + servletContextName + " = pageContext.getServletContext();");
327 }
328
329
330 ctxt.generateJavaSource(" if(" + servletContextName + " == null){");
331 if (hasContext) {
332 ctxt.generateJavaSource(" throw new JspTagException(\"Unable to get RequestDispatcher for Context: //\" \" +" + contextName + "+ \" //\" and URL: //\" \" +" + urlName + "+ \" //\". Verify values and/or enable cross context access.\");");
333 } else {
334 ctxt.generateJavaSource(" throw new JspTagException(\"Unable to get RequestDispatcher for URL: //\" \" +" + urlName + "+ \" //\". Verify values and/or enable cross context access.\");");
335 }
336 ctxt.generateJavaSource(" }");
337
338
339 ctxt.generateJavaSource(" RequestDispatcher " + requestDispatcherName + " = " + servletContextName + ".getRequestDispatcher(org.apache.struts2.jasper.tagplugins.jstl.Util.stripSession(" + urlName + "));");
340 ctxt.generateJavaSource(" if(" + requestDispatcherName + " == null) throw new JspTagException(org.apache.struts2.jasper.tagplugins.jstl.Util.stripSession(" + urlName + "));");
341
342
343 ctxt.generateJavaSource(" org.apache.struts2.jasper.tagplugins.jstl.Util.ImportResponseWrapper " + irwName + " = new org.apache.struts2.jasper.tagplugins.jstl.Util.ImportResponseWrapper((HttpServletResponse) pageContext.getResponse());");
344 ctxt.generateJavaSource(" if(" + charSetName + " == null){");
345 ctxt.generateJavaSource(" " + charSetName + " = org.apache.struts2.jasper.tagplugins.jstl.Util.DEFAULT_ENCODING;");
346 ctxt.generateJavaSource(" }");
347 ctxt.generateJavaSource(" " + irwName + ".setCharEncoding(" + charSetName + ");");
348 ctxt.generateJavaSource(" try{");
349 ctxt.generateJavaSource(" " + requestDispatcherName + ".include(pageContext.getRequest(), " + irwName + ");");
350 ctxt.generateJavaSource(" }catch(java.io.IOException ex){");
351 ctxt.generateJavaSource(" throw new JspException(ex);");
352 ctxt.generateJavaSource(" }catch(RuntimeException ex){");
353 ctxt.generateJavaSource(" throw new JspException(ex);");
354 ctxt.generateJavaSource(" }catch(ServletException ex){");
355 ctxt.generateJavaSource(" Throwable rc = ex.getRootCause();");
356 ctxt.generateJavaSource(" if (rc == null)");
357 ctxt.generateJavaSource(" throw new JspException(ex);");
358 ctxt.generateJavaSource(" else");
359 ctxt.generateJavaSource(" throw new JspException(rc);");
360 ctxt.generateJavaSource(" }");
361
362
363 ctxt.generateJavaSource(" if(" + irwName + ".getStatus() < 200 || " + irwName + ".getStatus() > 299){");
364 ctxt.generateJavaSource(" throw new JspTagException(" + irwName + ".getStatus()+\" \" + org.apache.struts2.jasper.tagplugins.jstl.Util.stripSession(" + urlName + "));");
365 ctxt.generateJavaSource(" }");
366
367 ctxt.generateJavaSource(" " + tempStringName + " = " + irwName + ".getString();");
368
369 ctxt.generateJavaSource("}");
370
371 if (hasVar) {
372 String strVar = ctxt.getConstantAttribute("var");
373 ctxt.generateJavaSource("pageContext.setAttribute(\"" + strVar + "\"," + tempStringName + "," + iScope + ");");
374 } else {
375 ctxt.generateJavaSource("pageContext.getOut().print(" + tempStringName + ");");
376 }
377 }
378 }
379
380
381 }