1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.apache.struts2.sitemesh;
23
24 import java.io.IOException;
25 import java.io.PrintWriter;
26
27 import javax.servlet.ServletContext;
28 import javax.servlet.ServletException;
29 import javax.servlet.http.HttpServletRequest;
30 import javax.servlet.http.HttpServletResponse;
31
32 import org.apache.struts2.views.velocity.VelocityManager;
33 import org.apache.velocity.Template;
34 import org.apache.velocity.context.Context;
35
36 import com.opensymphony.module.sitemesh.Decorator;
37 import com.opensymphony.module.sitemesh.HTMLPage;
38 import com.opensymphony.module.sitemesh.Page;
39 import com.opensymphony.xwork2.ActionContext;
40 import com.opensymphony.xwork2.inject.Inject;
41 import com.opensymphony.xwork2.util.logging.Logger;
42 import com.opensymphony.xwork2.util.logging.LoggerFactory;
43
44
45 /***
46 * Applies Velocity-based decorators
47 *
48 */
49 public class VelocityPageFilter extends TemplatePageFilter {
50 private static final Logger LOG = LoggerFactory.getLogger(VelocityPageFilter.class);
51
52 private static VelocityManager velocityManager;
53
54 @Inject(required=false)
55 public static void setVelocityManager(VelocityManager mgr) {
56 velocityManager = mgr;
57 }
58
59 /***
60 * Applies the decorator, using the relevent contexts
61 *
62 * @param page The page
63 * @param decorator The decorator
64 * @param req The servlet request
65 * @param res The servlet response
66 * @param servletContext The servlet context
67 * @param ctx The action context for this request, populated with the server state
68 */
69 protected void applyDecorator(Page page, Decorator decorator,
70 HttpServletRequest req, HttpServletResponse res,
71 ServletContext servletContext, ActionContext ctx)
72 throws ServletException, IOException {
73
74 if (velocityManager == null) {
75 throw new ServletException("Missing freemarker dependency");
76 }
77
78 try {
79
80
81 velocityManager.init(servletContext);
82
83
84 String encoding = getEncoding();
85
86
87 Template template = velocityManager.getVelocityEngine().getTemplate(decorator.getPage(), encoding);
88 Context context = velocityManager.createContext(ctx.getValueStack(), req, res);
89
90
91 context.put("page", page);
92 if (page instanceof HTMLPage) {
93 HTMLPage htmlPage = ((HTMLPage) page);
94 context.put("head", htmlPage.getHead());
95 }
96 context.put("title",page.getTitle());
97 context.put("body",page.getBody());
98
99
100 PrintWriter writer = res.getWriter();
101 template.merge(context, writer);
102 writer.flush();
103 } catch (Exception e) {
104 String msg = "Error applying decorator: " + e.getMessage();
105 LOG.error(msg, e);
106 throw new ServletException(msg, e);
107 }
108 }
109 }