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