1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.seasar.cubby.unit;
18
19 import java.io.IOException;
20 import java.util.Arrays;
21 import java.util.Iterator;
22
23 import javax.servlet.Filter;
24 import javax.servlet.FilterChain;
25 import javax.servlet.FilterConfig;
26 import javax.servlet.ServletContext;
27 import javax.servlet.ServletException;
28 import javax.servlet.ServletRequest;
29 import javax.servlet.ServletResponse;
30 import javax.servlet.http.HttpServletRequest;
31 import javax.servlet.http.HttpServletRequestWrapper;
32 import javax.servlet.http.HttpServletResponse;
33
34 import org.seasar.cubby.CubbyConstants;
35 import org.seasar.cubby.action.ActionContext;
36 import org.seasar.cubby.action.ActionResult;
37 import org.seasar.cubby.filter.CubbyFilter;
38 import org.seasar.cubby.internal.plugin.PluginManager;
39 import org.seasar.cubby.plugin.AbstractPlugin;
40 import org.seasar.cubby.plugin.ActionResultInvocation;
41 import org.seasar.cubby.plugin.PluginRegistry;
42
43
44
45
46
47
48
49 public class CubbyRunner {
50
51
52 private static PluginManager pluginManager = new PluginManager(
53 PluginRegistry.getInstance());
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 public static ActionResult processAction(final HttpServletRequest request,
74 final HttpServletResponse response, final Filter... filters)
75 throws Exception {
76 final ServletContext servletContext = new MockServletContext();
77 return processAction(servletContext, request, response, filters);
78 }
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100 public static ActionResult processAction(
101 final ServletContext servletContext,
102 final HttpServletRequest request,
103 final HttpServletResponse response, final Filter... filters)
104 throws Exception {
105 return doProcess(false, servletContext, request, response, filters);
106 }
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127 public static ActionResult processActionAndExecuteActionResult(
128 final HttpServletRequest request,
129 final HttpServletResponse response, final Filter... filters)
130 throws Exception {
131 final ServletContext servletContext = new MockServletContext();
132 return processActionAndExecuteActionResult(servletContext, request,
133 response, filters);
134 }
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157 public static ActionResult processActionAndExecuteActionResult(
158 final ServletContext servletContext,
159 final HttpServletRequest request,
160 final HttpServletResponse response, final Filter... filters)
161 throws Exception {
162 return doProcess(true, servletContext, request, response, filters);
163 }
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183 private static ActionResult doProcess(final boolean executeActionResult,
184 final ServletContext servletContext,
185 final HttpServletRequest request,
186 final HttpServletResponse response, final Filter... filters)
187 throws Exception {
188 final FilterConfig filterConfig = new MockFilterConfig(servletContext);
189 for (final Filter filter : filters) {
190 filter.init(filterConfig);
191 }
192
193 try {
194 final CubbyRunnerPlugin cubbyRunnerPlugin = new CubbyRunnerPlugin();
195 final PluginRegistry pluginRegistry = PluginRegistry.getInstance();
196 pluginRegistry.register(cubbyRunnerPlugin);
197
198 pluginManager.init(servletContext);
199 CubbyRunnerHttpServletRequestWrapper requestWrapper = new CubbyRunnerHttpServletRequestWrapper(
200 request);
201 final ActionInvokeFilterChain chain = new ActionInvokeFilterChain(
202 filters);
203 chain.doFilter(requestWrapper, response);
204
205 final ActionResult actionResult = cubbyRunnerPlugin
206 .getActionResult();
207 if (executeActionResult) {
208 final ActionContext actionContext = requestWrapper
209 .getActionContext();
210 actionResult.execute(actionContext, requestWrapper, response);
211 }
212 return actionResult;
213 } finally {
214 pluginManager.destroy();
215 for (final Filter filter : filters) {
216 filter.destroy();
217 }
218 }
219 }
220
221 static class ActionInvokeFilterChain implements FilterChain {
222
223 private final Iterator<Filter> iterator;
224
225 public ActionInvokeFilterChain(final Filter... filters) {
226 this.iterator = Arrays.asList(filters).iterator();
227 }
228
229 public void doFilter(final ServletRequest request,
230 final ServletResponse response) throws IOException,
231 ServletException {
232 if (iterator.hasNext()) {
233 final Filter filter = iterator.next();
234 filter.doFilter(request, response, this);
235 } else {
236 try {
237 invoke((HttpServletRequest) request,
238 (HttpServletResponse) response);
239 } catch (final Exception e) {
240 throw new ServletException(e);
241 }
242 }
243 }
244
245 private void invoke(final HttpServletRequest request,
246 final HttpServletResponse response) throws Exception {
247 final CubbyFilter cubbyFilter = new CubbyFilter();
248 cubbyFilter.doFilter(request, response, this);
249 }
250
251 }
252
253 static class CubbyRunnerPlugin extends AbstractPlugin {
254
255 private ActionResult actionResult;
256
257 @Override
258 public void invokeActionResult(ActionResultInvocation invocation)
259 throws Exception {
260 this.actionResult = invocation.getActionResult();
261 }
262
263 public ActionResult getActionResult() {
264 return actionResult;
265 }
266
267 }
268
269 static class CubbyRunnerHttpServletRequestWrapper extends
270 HttpServletRequestWrapper {
271
272 private ActionContext actionContext;
273
274 public CubbyRunnerHttpServletRequestWrapper(HttpServletRequest request) {
275 super(request);
276 }
277
278 @Override
279 public void setAttribute(String name, Object o) {
280 if (CubbyConstants.ATTR_ACTION_CONTEXT.equals(name)) {
281 this.actionContext = (ActionContext) o;
282 }
283 super.setAttribute(name, o);
284 }
285
286 public ActionContext getActionContext() {
287 return actionContext;
288 }
289
290 }
291
292 }