1 package org.apache.velocity.tools.view;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.IOException;
23 import java.io.PrintWriter;
24 import java.io.StringWriter;
25 import java.io.Writer;
26 import javax.servlet.ServletConfig;
27 import javax.servlet.ServletContext;
28 import javax.servlet.ServletException;
29 import javax.servlet.http.HttpServlet;
30 import javax.servlet.http.HttpServletRequest;
31 import javax.servlet.http.HttpServletResponse;
32 import org.apache.commons.lang.StringEscapeUtils;
33 import org.apache.velocity.Template;
34 import org.apache.velocity.context.Context;
35 import org.apache.velocity.exception.MethodInvocationException;
36 import org.apache.velocity.exception.ResourceNotFoundException;
37 import org.apache.velocity.runtime.log.Log;
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102 public class VelocityViewServlet extends HttpServlet
103 {
104 public static final String BUFFER_OUTPUT_PARAM =
105 "org.apache.velocity.tools.bufferOutput";
106 private static final long serialVersionUID = -3329444102562079189L;
107
108 private transient VelocityView view;
109 private boolean bufferOutput = false;
110
111
112
113
114
115
116
117 public void init(ServletConfig config) throws ServletException
118 {
119 super.init(config);
120
121
122 getVelocityView();
123
124 String buffer = findInitParameter(config, BUFFER_OUTPUT_PARAM);
125 if (buffer != null && buffer.equals("true"))
126 {
127 this.bufferOutput = true;
128 getLog().debug("VelocityViewServlet will buffer mergeTemplate output.");
129 }
130 }
131
132
133
134
135
136
137 protected String findInitParameter(ServletConfig config, String key)
138 {
139
140 String param = config.getInitParameter(key);
141
142 if (param == null || param.length() == 0)
143 {
144
145 ServletContext servletContext = config.getServletContext();
146 param = servletContext.getInitParameter(key);
147 }
148 return param;
149 }
150
151 protected VelocityView getVelocityView()
152 {
153 if (this.view == null)
154 {
155 setVelocityView(ServletUtils.getVelocityView(getServletConfig()));
156 assert (this.view != null);
157 }
158 return this.view;
159 }
160
161 protected void setVelocityView(VelocityView view)
162 {
163 this.view = view;
164 }
165
166 protected String getVelocityProperty(String name, String alternate)
167 {
168 return getVelocityView().getProperty(name, alternate);
169 }
170
171 protected Log getLog()
172 {
173 return getVelocityView().getLog();
174 }
175
176
177
178
179 public void doGet(HttpServletRequest request, HttpServletResponse response)
180 throws ServletException, IOException
181 {
182 doRequest(request, response);
183 }
184
185
186
187
188
189 public void doPost(HttpServletRequest request, HttpServletResponse response)
190 throws ServletException, IOException
191 {
192 doRequest(request, response);
193 }
194
195
196
197
198
199
200
201
202 protected void doRequest(HttpServletRequest request, HttpServletResponse response)
203 throws IOException
204 {
205 Context context = null;
206 try
207 {
208
209 context = createContext(request, response);
210
211
212 fillContext(context, request);
213
214 setContentType(request, response);
215
216
217 Template template = handleRequest(request, response, context);
218
219
220 mergeTemplate(template, context, response);
221 } catch (IOException e) {
222 error(request, response, e);
223 throw e;
224 }
225 catch (ResourceNotFoundException e)
226 {
227 manageResourceNotFound(request, response, e);
228 }
229 catch (RuntimeException e)
230 {
231 error(request, response, e);
232 throw e;
233 }
234 finally
235 {
236 requestCleanup(request, response, context);
237 }
238 }
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253 protected Template handleRequest(HttpServletRequest request,
254 HttpServletResponse response,
255 Context ctx)
256 {
257 return getTemplate(request, response);
258 }
259
260 protected Context createContext(HttpServletRequest request,
261 HttpServletResponse response)
262 {
263 return getVelocityView().createContext(request, response);
264 }
265
266 protected void fillContext(Context context, HttpServletRequest request)
267 {
268
269 }
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287 protected void setContentType(HttpServletRequest request,
288 HttpServletResponse response)
289 {
290 response.setContentType(getVelocityView().getDefaultContentType());
291 }
292
293 protected Template getTemplate(HttpServletRequest request,
294 HttpServletResponse response)
295 {
296 return getVelocityView().getTemplate(request, response);
297 }
298
299 protected Template getTemplate(String name)
300 {
301 return getVelocityView().getTemplate(name);
302 }
303
304 protected void mergeTemplate(Template template, Context context,
305 HttpServletResponse response)
306 throws IOException
307 {
308 Writer writer;
309 if (this.bufferOutput)
310 {
311 writer = new StringWriter();
312 }
313 else
314 {
315 writer = response.getWriter();
316 }
317
318 getVelocityView().merge(template, context, writer);
319
320 if (this.bufferOutput)
321 {
322 response.getWriter().write(writer.toString());
323 }
324 }
325
326
327
328
329
330
331
332
333
334
335
336 protected void error(HttpServletRequest request,
337 HttpServletResponse response,
338 Throwable e)
339 {
340 if (!response.isCommitted())
341 {
342 return;
343 }
344
345 try
346 {
347 String path = ServletUtils.getPath(request);
348 getLog().error("Error processing a template for path '" + path + "'", e);
349 StringBuilder html = new StringBuilder();
350 html.append("<html>\n");
351 html.append("<head><title>Error</title></head>\n");
352 html.append("<body>\n");
353 html.append("<h2>VelocityView : Error processing a template for path '");
354 html.append(path);
355 html.append("'</h2>\n");
356
357 Throwable cause = e;
358
359 String why = cause.getMessage();
360 if (why != null && why.length() > 0)
361 {
362 html.append(StringEscapeUtils.escapeHtml(why));
363 html.append("\n<br>\n");
364 }
365
366
367
368
369 if (cause instanceof MethodInvocationException)
370 {
371
372 cause = ((MethodInvocationException)cause).getWrappedThrowable();
373 }
374
375 StringWriter sw = new StringWriter();
376 cause.printStackTrace(new PrintWriter(sw));
377
378 html.append("<pre>\n");
379 html.append(StringEscapeUtils.escapeHtml(sw.toString()));
380 html.append("</pre>\n");
381 html.append("</body>\n");
382 html.append("</html>");
383 response.getWriter().write(html.toString());
384 }
385 catch (Exception e2)
386 {
387
388
389
390 String msg = "Exception while printing error screen";
391 getLog().error(msg, e2);
392 throw new RuntimeException(msg, e);
393 }
394 }
395
396
397
398
399
400
401
402
403
404
405 protected void manageResourceNotFound(HttpServletRequest request,
406 HttpServletResponse response, ResourceNotFoundException e)
407 throws IOException
408 {
409 String path = ServletUtils.getPath(request);
410 if (getLog().isDebugEnabled())
411 {
412 getLog().debug("Resource not found for path '" + path + "'", e);
413 }
414 String message = e.getMessage();
415 if (!response.isCommitted() && path != null &&
416 message != null && message.contains("'" + path + "'"))
417 {
418 response.sendError(HttpServletResponse.SC_NOT_FOUND, path);
419 }
420 else
421 {
422 error(request, response, e);
423 throw e;
424 }
425 }
426
427
428
429
430
431
432
433
434
435
436 protected void requestCleanup(HttpServletRequest request,
437 HttpServletResponse response,
438 Context context)
439 {
440 }
441
442 }