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.struts.faces.application;
23
24
25 import java.io.IOException;
26 import javax.faces.FactoryFinder;
27 import javax.faces.application.ViewHandler;
28 import javax.faces.component.UICommand;
29 import javax.faces.component.UIComponent;
30 import javax.faces.context.FacesContext;
31 import javax.faces.context.FacesContextFactory;
32 import javax.faces.event.ActionEvent;
33 import javax.faces.lifecycle.Lifecycle;
34 import javax.faces.lifecycle.LifecycleFactory;
35 import javax.servlet.ServletException;
36 import javax.servlet.http.HttpServletRequest;
37 import javax.servlet.http.HttpServletResponse;
38 import org.apache.commons.logging.Log;
39 import org.apache.commons.logging.LogFactory;
40 import org.apache.struts.Globals;
41 import org.apache.struts.action.Action;
42 import org.apache.struts.action.ActionForm;
43 import org.apache.struts.action.ActionForward;
44 import org.apache.struts.action.ActionMapping;
45 import org.apache.struts.action.RequestProcessor;
46 import org.apache.struts.action.InvalidCancelException;
47 import org.apache.struts.config.FormBeanConfig;
48 import org.apache.struts.config.ForwardConfig;
49 import org.apache.struts.faces.Constants;
50 import org.apache.struts.faces.component.FormComponent;
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 public class FacesRequestProcessor extends RequestProcessor {
66
67
68
69
70
71
72
73
74 protected static Log log = LogFactory.getLog(FacesRequestProcessor.class);
75
76
77
78
79
80 public static final String LIFECYCLE_ID_ATTR = "javax.faces.LIFECYCLE_ID";
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99 protected void doForward(String uri,
100 HttpServletRequest request,
101 HttpServletResponse response)
102 throws IOException, ServletException {
103
104 if (log.isDebugEnabled()) {
105 log.debug("doForward(" + uri + ")");
106 }
107
108
109 request.removeAttribute(Constants.ACTION_EVENT_KEY);
110
111
112 if (isStrutsRequest(uri)) {
113 if (response.isCommitted()) {
114 if (log.isTraceEnabled()) {
115 log.trace(" super.doInclude(" + uri + ")");
116 }
117 super.doInclude(uri, request, response);
118 } else {
119 if (log.isTraceEnabled()) {
120 log.trace(" super.doForward(" + uri + ")");
121 }
122 super.doForward(uri, request, response);
123 }
124 return;
125 }
126
127
128 LifecycleFactory lf = (LifecycleFactory)
129 FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
130 Lifecycle lifecycle =
131 lf.getLifecycle(getLifecycleId());
132 boolean created = false;
133 FacesContext context = FacesContext.getCurrentInstance();
134 if (context == null) {
135 if (log.isTraceEnabled()) {
136 log.trace(" Creating new FacesContext for '" + uri + "'");
137 }
138 created = true;
139 FacesContextFactory fcf = (FacesContextFactory)
140 FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
141 context = fcf.getFacesContext(servlet.getServletContext(),
142 request, response, lifecycle);
143 }
144
145
146 ViewHandler vh = context.getApplication().getViewHandler();
147 if (log.isTraceEnabled()) {
148 log.trace(" Creating new view for '" + uri + "'");
149 }
150 context.setViewRoot(vh.createView(context, uri));
151
152
153 if (log.isTraceEnabled()) {
154 log.trace(" Rendering view for '" + uri + "'");
155 }
156 try {
157 lifecycle.render(context);
158 } finally {
159 if (created) {
160 if (log.isTraceEnabled()) {
161 log.trace(" Releasing context for '" + uri + "'");
162 }
163 context.release();
164 } else {
165 if (log.isTraceEnabled()) {
166 log.trace(" Rendering completed");
167 }
168 }
169 }
170
171 }
172
173
174
175 protected Action processActionCreate(HttpServletRequest request,
176 HttpServletResponse response,
177 ActionMapping mapping)
178 throws IOException {
179
180 if (log.isTraceEnabled()) {
181 log.trace("Performing standard action create");
182 }
183 Action result = super.processActionCreate(request, response, mapping);
184 if (log.isDebugEnabled()) {
185 log.debug("Standard action create returned " +
186 result.getClass().getName() + " instance");
187 }
188 return (result);
189
190 }
191
192
193
194 protected ActionForm processActionForm(HttpServletRequest request,
195 HttpServletResponse response,
196 ActionMapping mapping) {
197 if (log.isTraceEnabled()) {
198 log.trace("Performing standard action form processing");
199 String attribute = mapping.getAttribute();
200 if (attribute != null) {
201 String name = mapping.getName();
202 FormBeanConfig fbc = moduleConfig.findFormBeanConfig(name);
203 if (fbc != null) {
204 if ("request".equals(mapping.getScope())) {
205 log.trace(" Bean in request scope = " +
206 request.getAttribute(attribute));
207 } else {
208 log.trace(" Bean in session scope = " +
209 request.getSession().getAttribute(attribute));
210 }
211 } else {
212 log.trace(" No FormBeanConfig for '" + name + "'");
213 }
214 } else {
215 log.trace(" No form bean for this action");
216 }
217 }
218 ActionForm result =
219 super.processActionForm(request, response, mapping);
220 if (log.isDebugEnabled()) {
221 log.debug("Standard action form returned " +
222 result);
223 }
224 return (result);
225
226
227 }
228
229
230
231 protected ActionForward processActionPerform(HttpServletRequest request,
232 HttpServletResponse response,
233 Action action,
234 ActionForm form,
235 ActionMapping mapping)
236 throws IOException, ServletException {
237
238 if (log.isTraceEnabled()) {
239 log.trace("Performing standard action perform");
240 }
241 ActionForward result =
242 super.processActionPerform(request, response, action,
243 form, mapping);
244 if (log.isDebugEnabled()) {
245 log.debug("Standard action perform returned " +
246 (result == null ? "NULL" :
247 result.getPath()) + " forward path");
248 }
249 return (result);
250
251 }
252
253
254
255 protected boolean processForward(HttpServletRequest request,
256 HttpServletResponse response,
257 ActionMapping mapping)
258 throws IOException, ServletException {
259
260 if (log.isTraceEnabled()) {
261 log.trace("Performing standard forward handling");
262 }
263 boolean result = super.processForward
264 (request, response, mapping);
265 if (log.isDebugEnabled()) {
266 log.debug("Standard forward handling returned " + result);
267 }
268 return (result);
269
270 }
271
272
273
274 protected void processForwardConfig(HttpServletRequest request,
275 HttpServletResponse response,
276 ForwardConfig forward)
277 throws IOException, ServletException {
278
279 if (log.isTraceEnabled()) {
280 log.trace("Performing standard forward config handling");
281 }
282 super.processForwardConfig(request, response, forward);
283 if (log.isDebugEnabled()) {
284 log.debug("Standard forward config handling completed");
285 }
286
287 }
288
289
290
291 protected boolean processInclude(HttpServletRequest request,
292 HttpServletResponse response,
293 ActionMapping mapping)
294 throws IOException, ServletException {
295
296 if (log.isTraceEnabled()) {
297 log.trace("Performing standard include handling");
298 }
299 boolean result = super.processInclude
300 (request, response, mapping);
301 if (log.isDebugEnabled()) {
302 log.debug("Standard include handling returned " + result);
303 }
304 return (result);
305
306 }
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321 protected String processPath(HttpServletRequest request,
322 HttpServletResponse response)
323 throws IOException {
324
325
326 ActionEvent event = (ActionEvent)
327 request.getAttribute(Constants.ACTION_EVENT_KEY);
328
329
330 if (event == null) {
331 if (log.isTraceEnabled()) {
332 log.trace("Performing standard processPath() processing");
333 }
334 return (super.processPath(request, response));
335 }
336
337
338 UIComponent component = event.getComponent();
339 if (log.isTraceEnabled()) {
340 log.trace("Locating form parent for command component " +
341 event.getComponent());
342 }
343 while (!(component instanceof FormComponent)) {
344 component = component.getParent();
345 if (component == null) {
346 log.warn("Command component was not nested in a Struts form!");
347 return (null);
348 }
349 }
350 if (log.isDebugEnabled()) {
351 log.debug("Returning selected path of '" +
352 ((FormComponent) component).getAction() + "'");
353 }
354 return (((FormComponent) component).getAction());
355
356 }
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374 protected void processPopulate(HttpServletRequest request,
375 HttpServletResponse response,
376 ActionForm form,
377 ActionMapping mapping)
378 throws ServletException {
379
380
381 ActionEvent event = (ActionEvent)
382 request.getAttribute(Constants.ACTION_EVENT_KEY);
383
384
385 if (event == null) {
386 if (log.isTraceEnabled()) {
387 log.trace("Performing standard processPopulate() processing");
388 }
389 super.processPopulate(request, response, form, mapping);
390 return;
391 }
392
393
394
395 if (log.isTraceEnabled()) {
396 log.trace("Faces request, so no processPopulate() processing");
397 }
398 UIComponent source = event.getComponent();
399 if (source instanceof UICommand) {
400 if ("cancel".equals(((UICommand) source).getId())) {
401 if (log.isTraceEnabled()) {
402 log.trace("Faces request with cancel button pressed");
403 }
404 request.setAttribute(Globals.CANCEL_KEY, Boolean.TRUE);
405 }
406 }
407
408 }
409
410
411
412 protected boolean processValidate(HttpServletRequest request,
413 HttpServletResponse response,
414 ActionForm form,
415 ActionMapping mapping)
416 throws IOException, ServletException, InvalidCancelException {
417
418 if (log.isTraceEnabled()) {
419 log.trace("Performing standard validation");
420 }
421 boolean result = super.processValidate
422 (request, response, form, mapping);
423 if (log.isDebugEnabled()) {
424 log.debug("Standard validation processing returned " + result);
425 }
426 return (result);
427
428 }
429
430
431
432
433
434
435
436
437 private String getLifecycleId()
438 {
439 String lifecycleId = this.servlet.getServletContext().getInitParameter(LIFECYCLE_ID_ATTR);
440 return lifecycleId != null ? lifecycleId : LifecycleFactory.DEFAULT_LIFECYCLE;
441 }
442
443
444
445
446
447
448
449 private boolean isStrutsRequest(String uri) {
450
451 int question = uri.indexOf("?");
452 if (question >= 0) {
453 uri = uri.substring(0, question);
454 }
455 String mapping = (String)
456 servlet.getServletContext().getAttribute(Globals.SERVLET_KEY);
457 if (mapping == null) {
458 return (false);
459 } else if (mapping.startsWith("*.")) {
460 return (uri.endsWith(mapping.substring(1)));
461 } else if (mapping.endsWith("/*")) {
462 return (uri.startsWith(mapping.substring(0, mapping.length() - 2)));
463 } else {
464 return (false);
465 }
466
467 }
468
469
470 }