1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.struts2.sitemesh;
22
23 import java.io.IOException;
24
25 import javax.servlet.FilterConfig;
26 import javax.servlet.ServletContext;
27 import javax.servlet.ServletException;
28 import javax.servlet.http.HttpServletRequest;
29 import javax.servlet.http.HttpServletResponse;
30
31 import org.apache.struts2.ServletActionContext;
32 import org.apache.struts2.StrutsConstants;
33 import org.apache.struts2.dispatcher.Dispatcher;
34
35 import com.opensymphony.module.sitemesh.Decorator;
36 import com.opensymphony.module.sitemesh.Page;
37 import com.opensymphony.module.sitemesh.filter.PageFilter;
38 import com.opensymphony.xwork2.ActionContext;
39 import com.opensymphony.xwork2.ActionEventListener;
40 import com.opensymphony.xwork2.ActionInvocation;
41 import com.opensymphony.xwork2.ActionProxy;
42 import com.opensymphony.xwork2.ActionSupport;
43 import com.opensymphony.xwork2.Result;
44 import com.opensymphony.xwork2.inject.Inject;
45 import com.opensymphony.xwork2.interceptor.PreResultListener;
46 import com.opensymphony.xwork2.util.OgnlValueStack;
47
48 /***
49 * An abstract template page filter that sets up the proper contexts for
50 * template processing.
51 *
52 */
53 public abstract class TemplatePageFilter extends PageFilter {
54
55 private FilterConfig filterConfig;
56
57 private static String customEncoding;
58
59 @Inject(StrutsConstants.STRUTS_I18N_ENCODING)
60 public static void setCustomEncoding(String enc) {
61 customEncoding = enc;
62 }
63
64 public void init(FilterConfig filterConfig) {
65 super.init(filterConfig);
66 this.filterConfig = filterConfig;
67 }
68
69 /***
70 * Applies the decorator, using the relevent contexts
71 *
72 * @param page The page
73 * @param decorator The decorator
74 * @param req The servlet request
75 * @param res The servlet response
76 * @param servletContext The servlet context
77 * @param ctx The action context for this request, populated with the server state
78 */
79 protected abstract void applyDecorator(Page page, Decorator decorator,
80 HttpServletRequest req, HttpServletResponse res,
81 ServletContext servletContext, ActionContext ctx)
82 throws ServletException, IOException;
83
84 /***
85 * Applies the decorator, creating the relevent contexts and delegating to
86 * the extended applyDecorator().
87 *
88 * @param page The page
89 * @param decorator The decorator
90 * @param req The servlet request
91 * @param res The servlet response
92 */
93 protected void applyDecorator(Page page, Decorator decorator,
94 HttpServletRequest req, HttpServletResponse res)
95 throws ServletException, IOException {
96
97 ServletContext servletContext = filterConfig.getServletContext();
98 ActionContext ctx = ServletActionContext.getActionContext(req);
99 if (ctx == null) {
100
101 OgnlValueStack vs = new OgnlValueStack();
102 vs.getContext().putAll(Dispatcher.getInstance().createContextMap(req, res, null, servletContext));
103 ctx = new ActionContext(vs.getContext());
104 if (ctx.getActionInvocation() == null) {
105
106 ActionSupport action = new ActionSupport();
107 vs.push(action);
108 ctx.setActionInvocation(new DummyActionInvocation(action));
109 }
110 }
111
112
113 applyDecorator(page, decorator, req, res, servletContext, ctx);
114 }
115
116
117 /***
118 * Gets the L18N encoding of the system. The default is UTF-8.
119 */
120 protected String getEncoding() {
121 String encoding = customEncoding;
122 if (encoding == null) {
123 encoding = System.getProperty("file.encoding");
124 }
125 if (encoding == null) {
126 encoding = "UTF-8";
127 }
128 return encoding;
129 }
130
131 static class DummyActionInvocation implements ActionInvocation {
132
133 private static final long serialVersionUID = -4808072199157363028L;
134
135 ActionSupport action;
136
137 public DummyActionInvocation(ActionSupport action) {
138 this.action = action;
139 }
140
141 public Object getAction() {
142 return action;
143 }
144
145 public boolean isExecuted() {
146 return false;
147 }
148
149 public ActionContext getInvocationContext() {
150 return null;
151 }
152
153 public ActionProxy getProxy() {
154 return null;
155 }
156
157 public Result getResult() throws Exception {
158 return null;
159 }
160
161 public String getResultCode() {
162 return null;
163 }
164
165 public void setResultCode(String resultCode) {
166 }
167
168 public OgnlValueStack getStack() {
169 return null;
170 }
171
172 public void addPreResultListener(PreResultListener listener) {
173 }
174
175 public String invoke() throws Exception {
176 return null;
177 }
178
179 public String invokeActionOnly() throws Exception {
180 return null;
181 }
182
183 public void setActionEventListener(ActionEventListener listener) {
184 }
185 }
186 }