1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.web.portlet;
18
19 import java.io.IOException;
20 import java.util.ArrayList;
21 import java.util.Collections;
22 import java.util.Enumeration;
23 import java.util.Iterator;
24 import java.util.LinkedList;
25 import java.util.List;
26 import java.util.Map;
27 import java.util.Properties;
28 import javax.portlet.ActionRequest;
29 import javax.portlet.ActionResponse;
30 import javax.portlet.EventRequest;
31 import javax.portlet.EventResponse;
32 import javax.portlet.MimeResponse;
33 import javax.portlet.PortletException;
34 import javax.portlet.PortletRequest;
35 import javax.portlet.PortletRequestDispatcher;
36 import javax.portlet.PortletResponse;
37 import javax.portlet.PortletSession;
38 import javax.portlet.RenderRequest;
39 import javax.portlet.RenderResponse;
40 import javax.portlet.ResourceRequest;
41 import javax.portlet.ResourceResponse;
42 import javax.portlet.StateAwareResponse;
43
44 import org.apache.commons.logging.Log;
45 import org.apache.commons.logging.LogFactory;
46
47 import org.springframework.beans.factory.BeanFactoryUtils;
48 import org.springframework.beans.factory.BeanInitializationException;
49 import org.springframework.beans.factory.NoSuchBeanDefinitionException;
50 import org.springframework.context.ApplicationContext;
51 import org.springframework.core.OrderComparator;
52 import org.springframework.core.io.ClassPathResource;
53 import org.springframework.core.io.support.PropertiesLoaderUtils;
54 import org.springframework.core.style.StylerUtils;
55 import org.springframework.util.ClassUtils;
56 import org.springframework.util.StringUtils;
57 import org.springframework.web.multipart.MultipartException;
58 import org.springframework.web.portlet.multipart.MultipartActionRequest;
59 import org.springframework.web.portlet.multipart.PortletMultipartResolver;
60 import org.springframework.web.servlet.View;
61 import org.springframework.web.servlet.ViewRendererServlet;
62 import org.springframework.web.servlet.ViewResolver;
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133 public class DispatcherPortlet extends FrameworkPortlet {
134
135
136
137
138 public static final String MULTIPART_RESOLVER_BEAN_NAME = "portletMultipartResolver";
139
140
141
142
143
144
145 public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
146
147
148
149
150
151
152 public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
153
154
155
156
157
158
159 public static final String HANDLER_EXCEPTION_RESOLVER_BEAN_NAME = "handlerExceptionResolver";
160
161
162
163
164 public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
165
166
167
168
169
170
171 public static final String DEFAULT_VIEW_RENDERER_URL = "/WEB-INF/servlet/view";
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187 public static final String ACTION_EXCEPTION_SESSION_ATTRIBUTE =
188 DispatcherPortlet.class.getName() + ".ACTION_EXCEPTION";
189
190
191
192
193
194 public static final String ACTION_EXCEPTION_RENDER_PARAMETER = "actionException";
195
196
197
198
199 public static final String PAGE_NOT_FOUND_LOG_CATEGORY = "org.springframework.web.portlet.PageNotFound";
200
201
202
203
204
205 private static final String DEFAULT_STRATEGIES_PATH = "DispatcherPortlet.properties";
206
207
208
209
210
211 protected static final Log pageNotFoundLogger = LogFactory.getLog(PAGE_NOT_FOUND_LOG_CATEGORY);
212
213 private static final Properties defaultStrategies;
214
215 static {
216
217
218
219 try {
220 ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, DispatcherPortlet.class);
221 defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
222 }
223 catch (IOException ex) {
224 throw new IllegalStateException("Could not load 'DispatcherPortlet.properties': " + ex.getMessage());
225 }
226 }
227
228
229
230 private boolean detectAllHandlerMappings = true;
231
232
233 private boolean detectAllHandlerAdapters = true;
234
235
236 private boolean detectAllHandlerExceptionResolvers = true;
237
238
239 private boolean detectAllViewResolvers = true;
240
241
242 private boolean forwardActionException = true;
243
244
245 private boolean forwardEventException = false;
246
247
248 private String viewRendererUrl = DEFAULT_VIEW_RENDERER_URL;
249
250
251
252 private PortletMultipartResolver multipartResolver;
253
254
255 private List<HandlerMapping> handlerMappings;
256
257
258 private List<HandlerAdapter> handlerAdapters;
259
260
261 private List<HandlerExceptionResolver> handlerExceptionResolvers;
262
263
264 private List<ViewResolver> viewResolvers;
265
266
267
268
269
270
271
272
273
274 public void setDetectAllHandlerMappings(boolean detectAllHandlerMappings) {
275 this.detectAllHandlerMappings = detectAllHandlerMappings;
276 }
277
278
279
280
281
282
283
284
285 public void setDetectAllHandlerAdapters(boolean detectAllHandlerAdapters) {
286 this.detectAllHandlerAdapters = detectAllHandlerAdapters;
287 }
288
289
290
291
292
293
294
295
296 public void setDetectAllHandlerExceptionResolvers(boolean detectAllHandlerExceptionResolvers) {
297 this.detectAllHandlerExceptionResolvers = detectAllHandlerExceptionResolvers;
298 }
299
300
301
302
303
304
305
306
307 public void setDetectAllViewResolvers(boolean detectAllViewResolvers) {
308 this.detectAllViewResolvers = detectAllViewResolvers;
309 }
310
311
312
313
314
315
316
317
318 public void setForwardActionException(boolean forwardActionException) {
319 this.forwardActionException = forwardActionException;
320 }
321
322
323
324
325
326
327
328
329 public void setForwardEventException(boolean forwardEventException) {
330 this.forwardEventException = forwardEventException;
331 }
332
333
334
335
336
337 public void setViewRendererUrl(String viewRendererUrl) {
338 this.viewRendererUrl = viewRendererUrl;
339 }
340
341
342
343
344
345 @Override
346 public void onRefresh(ApplicationContext context) {
347 initStrategies(context);
348 }
349
350
351
352
353
354
355 protected void initStrategies(ApplicationContext context) {
356 initMultipartResolver(context);
357 initHandlerMappings(context);
358 initHandlerAdapters(context);
359 initHandlerExceptionResolvers(context);
360 initViewResolvers(context);
361 }
362
363
364
365
366
367
368 private void initMultipartResolver(ApplicationContext context) {
369 try {
370 this.multipartResolver = context.getBean(MULTIPART_RESOLVER_BEAN_NAME, PortletMultipartResolver.class);
371 if (logger.isDebugEnabled()) {
372 logger.debug("Using MultipartResolver [" + this.multipartResolver + "]");
373 }
374 }
375 catch (NoSuchBeanDefinitionException ex) {
376
377 this.multipartResolver = null;
378 if (logger.isDebugEnabled()) {
379 logger.debug("Unable to locate PortletMultipartResolver with name '" + MULTIPART_RESOLVER_BEAN_NAME +
380 "': no multipart request handling provided");
381 }
382 }
383 }
384
385
386
387
388
389
390 private void initHandlerMappings(ApplicationContext context) {
391 this.handlerMappings = null;
392
393 if (this.detectAllHandlerMappings) {
394
395 Map<String, HandlerMapping> matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(
396 context, HandlerMapping.class, true, false);
397 if (!matchingBeans.isEmpty()) {
398 this.handlerMappings = new ArrayList<HandlerMapping>(matchingBeans.values());
399
400 OrderComparator.sort(this.handlerMappings);
401 }
402 }
403 else {
404 try {
405 HandlerMapping hm = context.getBean(HANDLER_MAPPING_BEAN_NAME, HandlerMapping.class);
406 this.handlerMappings = Collections.singletonList(hm);
407 }
408 catch (NoSuchBeanDefinitionException ex) {
409
410 }
411 }
412
413
414
415 if (this.handlerMappings == null) {
416 this.handlerMappings = getDefaultStrategies(context, HandlerMapping.class);
417 if (logger.isDebugEnabled()) {
418 logger.debug("No HandlerMappings found in portlet '" + getPortletName() + "': using default");
419 }
420 }
421 }
422
423
424
425
426
427
428 private void initHandlerAdapters(ApplicationContext context) {
429 this.handlerAdapters = null;
430
431 if (this.detectAllHandlerAdapters) {
432
433 Map<String, HandlerAdapter> matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(
434 context, HandlerAdapter.class, true, false);
435 if (!matchingBeans.isEmpty()) {
436 this.handlerAdapters = new ArrayList<HandlerAdapter>(matchingBeans.values());
437
438 OrderComparator.sort(this.handlerAdapters);
439 }
440 }
441 else {
442 try {
443 HandlerAdapter ha = context.getBean(HANDLER_ADAPTER_BEAN_NAME, HandlerAdapter.class);
444 this.handlerAdapters = Collections.singletonList(ha);
445 }
446 catch (NoSuchBeanDefinitionException ex) {
447
448 }
449 }
450
451
452
453 if (this.handlerAdapters == null) {
454 this.handlerAdapters = getDefaultStrategies(context, HandlerAdapter.class);
455 if (logger.isDebugEnabled()) {
456 logger.debug("No HandlerAdapters found in portlet '" + getPortletName() + "': using default");
457 }
458 }
459 }
460
461
462
463
464
465
466 private void initHandlerExceptionResolvers(ApplicationContext context) {
467 this.handlerExceptionResolvers = null;
468
469 if (this.detectAllHandlerExceptionResolvers) {
470
471 Map<String, HandlerExceptionResolver> matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(
472 context, HandlerExceptionResolver.class, true, false);
473 if (!matchingBeans.isEmpty()) {
474 this.handlerExceptionResolvers = new ArrayList<HandlerExceptionResolver>(matchingBeans.values());
475
476 OrderComparator.sort(this.handlerExceptionResolvers);
477 }
478 }
479 else {
480 try {
481 HandlerExceptionResolver her = context.getBean(
482 HANDLER_EXCEPTION_RESOLVER_BEAN_NAME, HandlerExceptionResolver.class);
483 this.handlerExceptionResolvers = Collections.singletonList(her);
484 }
485 catch (NoSuchBeanDefinitionException ex) {
486
487 }
488 }
489
490
491
492 if (this.handlerExceptionResolvers == null) {
493 this.handlerExceptionResolvers = getDefaultStrategies(context, HandlerExceptionResolver.class);
494 if (logger.isDebugEnabled()) {
495 logger.debug("No HandlerExceptionResolvers found in portlet '" + getPortletName() + "': using default");
496 }
497 }
498 }
499
500
501
502
503
504
505 private void initViewResolvers(ApplicationContext context) {
506 this.viewResolvers = null;
507
508 if (this.detectAllViewResolvers) {
509
510 Map<String, ViewResolver> matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(
511 context, ViewResolver.class, true, false);
512 if (!matchingBeans.isEmpty()) {
513 this.viewResolvers = new ArrayList<ViewResolver>(matchingBeans.values());
514
515 OrderComparator.sort(this.viewResolvers);
516 }
517 }
518 else {
519 try {
520 ViewResolver vr = context.getBean(VIEW_RESOLVER_BEAN_NAME, ViewResolver.class);
521 this.viewResolvers = Collections.singletonList(vr);
522 }
523 catch (NoSuchBeanDefinitionException ex) {
524
525 }
526 }
527
528
529
530 if (this.viewResolvers == null) {
531 this.viewResolvers = getDefaultStrategies(context, ViewResolver.class);
532 if (logger.isDebugEnabled()) {
533 logger.debug("No ViewResolvers found in portlet '" + getPortletName() + "': using default");
534 }
535 }
536 }
537
538
539
540
541
542
543
544
545
546
547
548 protected <T> T getDefaultStrategy(ApplicationContext context, Class<T> strategyInterface) {
549 List<T> strategies = getDefaultStrategies(context, strategyInterface);
550 if (strategies.size() != 1) {
551 throw new BeanInitializationException(
552 "DispatcherPortlet needs exactly 1 strategy for interface [" + strategyInterface.getName() + "]");
553 }
554 return strategies.get(0);
555 }
556
557
558
559
560
561
562
563
564
565
566
567 @SuppressWarnings("unchecked")
568 protected <T> List<T> getDefaultStrategies(ApplicationContext context, Class<T> strategyInterface) {
569 String key = strategyInterface.getName();
570 String value = defaultStrategies.getProperty(key);
571 if (value != null) {
572 String[] classNames = StringUtils.commaDelimitedListToStringArray(value);
573 List<T> strategies = new ArrayList<T>(classNames.length);
574 for (String className : classNames) {
575 try {
576 Class<?> clazz = ClassUtils.forName(className, DispatcherPortlet.class.getClassLoader());
577 Object strategy = createDefaultStrategy(context, clazz);
578 strategies.add((T) strategy);
579 }
580 catch (ClassNotFoundException ex) {
581 throw new BeanInitializationException(
582 "Could not find DispatcherPortlet's default strategy class [" + className +
583 "] for interface [" + key + "]", ex);
584 }
585 catch (LinkageError err) {
586 throw new BeanInitializationException(
587 "Error loading DispatcherPortlet's default strategy class [" + className +
588 "] for interface [" + key + "]: problem with class file or dependent class", err);
589 }
590 }
591 return strategies;
592 }
593 else {
594 return new LinkedList<T>();
595 }
596 }
597
598
599
600
601
602
603
604
605
606
607 protected Object createDefaultStrategy(ApplicationContext context, Class<?> clazz) {
608 return context.getAutowireCapableBeanFactory().createBean(clazz);
609 }
610
611
612
613
614
615
616
617 public PortletMultipartResolver getMultipartResolver() {
618 return this.multipartResolver;
619 }
620
621
622
623
624
625
626
627
628
629
630
631 @Override
632 protected void doActionService(ActionRequest request, ActionResponse response) throws Exception {
633 if (logger.isDebugEnabled()) {
634 logger.debug("DispatcherPortlet with name '" + getPortletName() + "' received action request");
635 }
636
637 ActionRequest processedRequest = request;
638 HandlerExecutionChain mappedHandler = null;
639 int interceptorIndex = -1;
640
641 try {
642 processedRequest = checkMultipart(request);
643
644
645 mappedHandler = getHandler(processedRequest);
646 if (mappedHandler == null || mappedHandler.getHandler() == null) {
647 noHandlerFound(processedRequest, response);
648 return;
649 }
650
651
652 HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();
653 if (interceptors != null) {
654 for (int i = 0; i < interceptors.length; i++) {
655 HandlerInterceptor interceptor = interceptors[i];
656 if (!interceptor.preHandleAction(processedRequest, response, mappedHandler.getHandler())) {
657 triggerAfterActionCompletion(mappedHandler, interceptorIndex, processedRequest, response, null);
658 return;
659 }
660 interceptorIndex = i;
661 }
662 }
663
664
665 HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
666 ha.handleAction(processedRequest, response, mappedHandler.getHandler());
667
668
669 triggerAfterActionCompletion(mappedHandler, interceptorIndex, processedRequest, response, null);
670 }
671
672 catch (Exception ex) {
673
674 triggerAfterActionCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex);
675
676 if (this.forwardActionException) {
677 try {
678 exposeActionException(request, response, ex);
679 logger.debug("Caught exception during action phase - forwarding to render phase", ex);
680 }
681 catch (IllegalStateException ex2) {
682
683 throw ex;
684 }
685 }
686 else {
687 throw ex;
688 }
689 }
690 catch (Error err) {
691 PortletException ex =
692 new PortletException("Error occured during request processing: " + err.getMessage(), err);
693
694 triggerAfterActionCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex);
695 throw ex;
696 }
697
698 finally {
699
700 if (processedRequest instanceof MultipartActionRequest && processedRequest != request) {
701 this.multipartResolver.cleanupMultipart((MultipartActionRequest) processedRequest);
702 }
703 }
704 }
705
706
707
708
709
710
711
712
713
714
715 @Override
716 protected void doRenderService(RenderRequest request, RenderResponse response) throws Exception {
717 if (logger.isDebugEnabled()) {
718 logger.debug("DispatcherPortlet with name '" + getPortletName() + "' received render request");
719 }
720
721 HandlerExecutionChain mappedHandler = null;
722 int interceptorIndex = -1;
723
724 try {
725 ModelAndView mv;
726 try {
727
728 mappedHandler = getHandler(request);
729 if (mappedHandler == null || mappedHandler.getHandler() == null) {
730 noHandlerFound(request, response);
731 return;
732 }
733
734
735 HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();
736 if (interceptors != null) {
737 for (int i = 0; i < interceptors.length; i++) {
738 HandlerInterceptor interceptor = interceptors[i];
739 if (!interceptor.preHandleRender(request, response, mappedHandler.getHandler())) {
740 triggerAfterRenderCompletion(mappedHandler, interceptorIndex, request, response, null);
741 return;
742 }
743 interceptorIndex = i;
744 }
745 }
746
747
748 PortletSession session = request.getPortletSession(false);
749 if (session != null) {
750 if (request.getParameter(ACTION_EXCEPTION_RENDER_PARAMETER) != null) {
751 Exception ex = (Exception) session.getAttribute(ACTION_EXCEPTION_SESSION_ATTRIBUTE);
752 if (ex != null) {
753 logger.debug("Render phase found exception caught during action phase - rethrowing it");
754 throw ex;
755 }
756 }
757 else {
758 session.removeAttribute(ACTION_EXCEPTION_SESSION_ATTRIBUTE);
759 }
760 }
761
762
763 HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
764 mv = ha.handleRender(request, response, mappedHandler.getHandler());
765
766
767 if (interceptors != null) {
768 for (int i = interceptors.length - 1; i >= 0; i--) {
769 HandlerInterceptor interceptor = interceptors[i];
770 interceptor.postHandleRender(request, response, mappedHandler.getHandler(), mv);
771 }
772 }
773 }
774 catch (ModelAndViewDefiningException ex) {
775 logger.debug("ModelAndViewDefiningException encountered", ex);
776 mv = ex.getModelAndView();
777 }
778 catch (Exception ex) {
779 Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
780 mv = processHandlerException(request, response, handler, ex);
781 }
782
783
784 if (mv != null && !mv.isEmpty()) {
785 render(mv, request, response);
786 }
787 else {
788 if (logger.isDebugEnabled()) {
789 logger.debug("Null ModelAndView returned to DispatcherPortlet with name '" +
790 getPortletName() + "': assuming HandlerAdapter completed request handling");
791 }
792 }
793
794
795 triggerAfterRenderCompletion(mappedHandler, interceptorIndex, request, response, null);
796 }
797
798 catch (Exception ex) {
799
800 triggerAfterRenderCompletion(mappedHandler, interceptorIndex, request, response, ex);
801 throw ex;
802 }
803 catch (Error err) {
804 PortletException ex =
805 new PortletException("Error occured during request processing: " + err.getMessage(), err);
806
807 triggerAfterRenderCompletion(mappedHandler, interceptorIndex, request, response, ex);
808 throw ex;
809 }
810 }
811
812
813
814
815
816
817
818
819
820
821 @Override
822 protected void doResourceService(ResourceRequest request, ResourceResponse response) throws Exception {
823 if (logger.isDebugEnabled()) {
824 logger.debug("DispatcherPortlet with name '" + getPortletName() + "' received resource request");
825 }
826
827 HandlerExecutionChain mappedHandler = null;
828 int interceptorIndex = -1;
829
830 try {
831 ModelAndView mv;
832 try {
833
834 mappedHandler = getHandler(request);
835 if (mappedHandler == null || mappedHandler.getHandler() == null) {
836 noHandlerFound(request, response);
837 return;
838 }
839
840
841 HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();
842 if (interceptors != null) {
843 for (int i = 0; i < interceptors.length; i++) {
844 HandlerInterceptor interceptor = interceptors[i];
845 if (!interceptor.preHandleResource(request, response, mappedHandler.getHandler())) {
846 triggerAfterResourceCompletion(mappedHandler, interceptorIndex, request, response, null);
847 return;
848 }
849 interceptorIndex = i;
850 }
851 }
852
853
854 HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
855 mv = ha.handleResource(request, response, mappedHandler.getHandler());
856
857
858 if (interceptors != null) {
859 for (int i = interceptors.length - 1; i >= 0; i--) {
860 HandlerInterceptor interceptor = interceptors[i];
861 interceptor.postHandleResource(request, response, mappedHandler.getHandler(), mv);
862 }
863 }
864 }
865 catch (ModelAndViewDefiningException ex) {
866 logger.debug("ModelAndViewDefiningException encountered", ex);
867 mv = ex.getModelAndView();
868 }
869 catch (Exception ex) {
870 Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
871 mv = processHandlerException(request, response, handler, ex);
872 }
873
874
875 if (mv != null && !mv.isEmpty()) {
876 render(mv, request, response);
877 }
878 else {
879 if (logger.isDebugEnabled()) {
880 logger.debug("Null ModelAndView returned to DispatcherPortlet with name '" +
881 getPortletName() + "': assuming HandlerAdapter completed request handling");
882 }
883 }
884
885
886 triggerAfterResourceCompletion(mappedHandler, interceptorIndex, request, response, null);
887 }
888
889 catch (Exception ex) {
890
891 triggerAfterResourceCompletion(mappedHandler, interceptorIndex, request, response, ex);
892 throw ex;
893 }
894 catch (Error err) {
895 PortletException ex =
896 new PortletException("Error occured during request processing: " + err.getMessage(), err);
897
898 triggerAfterResourceCompletion(mappedHandler, interceptorIndex, request, response, ex);
899 throw ex;
900 }
901 }
902
903
904
905
906
907
908
909
910
911
912 @Override
913 protected void doEventService(EventRequest request, EventResponse response) throws Exception {
914 if (logger.isDebugEnabled()) {
915 logger.debug("DispatcherPortlet with name '" + getPortletName() + "' received action request");
916 }
917
918 HandlerExecutionChain mappedHandler = null;
919 int interceptorIndex = -1;
920
921 try {
922
923 mappedHandler = getHandler(request);
924 if (mappedHandler == null || mappedHandler.getHandler() == null) {
925 noHandlerFound(request, response);
926 return;
927 }
928
929
930 HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();
931 if (interceptors != null) {
932 for (int i = 0; i < interceptors.length; i++) {
933 HandlerInterceptor interceptor = interceptors[i];
934 if (!interceptor.preHandleEvent(request, response, mappedHandler.getHandler())) {
935 triggerAfterEventCompletion(mappedHandler, interceptorIndex, request, response, null);
936 return;
937 }
938 interceptorIndex = i;
939 }
940 }
941
942
943 HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
944 ha.handleEvent(request, response, mappedHandler.getHandler());
945
946
947 triggerAfterEventCompletion(mappedHandler, interceptorIndex, request, response, null);
948 }
949
950 catch (Exception ex) {
951
952 triggerAfterEventCompletion(mappedHandler, interceptorIndex, request, response, ex);
953
954 if (this.forwardEventException) {
955 try {
956 exposeActionException(request, response, ex);
957 logger.debug("Caught exception during event phase - forwarding to render phase", ex);
958 }
959 catch (IllegalStateException ex2) {
960
961 throw ex;
962 }
963 }
964 else {
965 throw ex;
966 }
967 }
968 catch (Error err) {
969 PortletException ex =
970 new PortletException("Error occured during request processing: " + err.getMessage(), err);
971
972 triggerAfterEventCompletion(mappedHandler, interceptorIndex, request, response, ex);
973 throw ex;
974 }
975 }
976
977
978
979
980
981
982
983
984 protected ActionRequest checkMultipart(ActionRequest request) throws MultipartException {
985 if (this.multipartResolver != null && this.multipartResolver.isMultipart(request)) {
986 if (request instanceof MultipartActionRequest) {
987 logger.debug("Request is already a MultipartActionRequest - probably in a forward");
988 }
989 else {
990 return this.multipartResolver.resolveMultipart(request);
991 }
992 }
993
994 return request;
995 }
996
997
998
999
1000
1001
1002
1003 protected HandlerExecutionChain getHandler(PortletRequest request) throws Exception {
1004 for (HandlerMapping hm : this.handlerMappings) {
1005 if (logger.isDebugEnabled()) {
1006 logger.debug(
1007 "Testing handler map [" + hm + "] in DispatcherPortlet with name '" + getPortletName() + "'");
1008 }
1009 HandlerExecutionChain handler = hm.getHandler(request);
1010 if (handler != null) {
1011 return handler;
1012 }
1013 }
1014 return null;
1015 }
1016
1017
1018
1019
1020
1021
1022
1023 protected void noHandlerFound(PortletRequest request, PortletResponse response) throws Exception {
1024 if (pageNotFoundLogger.isWarnEnabled()) {
1025 pageNotFoundLogger.warn("No handler found for current request " +
1026 "in DispatcherPortlet with name '" + getPortletName() +
1027 "', mode '" + request.getPortletMode() +
1028 "', phase '" + request.getAttribute(PortletRequest.LIFECYCLE_PHASE) +
1029 "', parameters " + StylerUtils.style(request.getParameterMap()));
1030 }
1031 throw new NoHandlerFoundException("No handler found for portlet request", request);
1032 }
1033
1034
1035
1036
1037
1038
1039
1040 protected HandlerAdapter getHandlerAdapter(Object handler) throws PortletException {
1041 for (HandlerAdapter ha : this.handlerAdapters) {
1042 if (logger.isDebugEnabled()) {
1043 logger.debug("Testing handler adapter [" + ha + "]");
1044 }
1045 if (ha.supports(handler)) {
1046 return ha;
1047 }
1048 }
1049 throw new PortletException("No adapter for handler [" + handler +
1050 "]: Does your handler implement a supported interface like Controller?");
1051 }
1052
1053
1054
1055
1056
1057
1058
1059 protected void exposeActionException(PortletRequest request, StateAwareResponse response, Exception ex) {
1060
1061 Enumeration<String> paramNames = request.getParameterNames();
1062 while (paramNames.hasMoreElements()) {
1063 String paramName = paramNames.nextElement();
1064 String[] paramValues = request.getParameterValues(paramName);
1065 if (paramValues != null && !response.getRenderParameterMap().containsKey(paramName)) {
1066 response.setRenderParameter(paramName, paramValues);
1067 }
1068 }
1069 response.setRenderParameter(ACTION_EXCEPTION_RENDER_PARAMETER, ex.toString());
1070 request.getPortletSession().setAttribute(ACTION_EXCEPTION_SESSION_ATTRIBUTE, ex);
1071 }
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082 protected void render(ModelAndView mv, PortletRequest request, MimeResponse response) throws Exception {
1083 View view;
1084 if (mv.isReference()) {
1085
1086 view = resolveViewName(mv.getViewName(), mv.getModelInternal(), request);
1087 if (view == null) {
1088 throw new PortletException("Could not resolve view with name '" + mv.getViewName() +
1089 "' in portlet with name '" + getPortletName() + "'");
1090 }
1091 }
1092 else {
1093
1094 Object viewObject = mv.getView();
1095 if (viewObject == null) {
1096 throw new PortletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
1097 "View object in portlet with name '" + getPortletName() + "'");
1098 }
1099 if (!(viewObject instanceof View)) {
1100 throw new PortletException(
1101 "View object [" + viewObject + "] is not an instance of [org.springframework.web.servlet.View] - " +
1102 "DispatcherPortlet does not support any other view types");
1103 }
1104 view = (View) viewObject;
1105 }
1106
1107
1108
1109
1110 if (response.getContentType() != null) {
1111 if (logger.isDebugEnabled()) {
1112 logger.debug("Portlet response content type already set to [" + response.getContentType() + "]");
1113 }
1114 }
1115 else {
1116
1117 String contentType = view.getContentType();
1118 if (contentType != null) {
1119 if (logger.isDebugEnabled()) {
1120 logger.debug("Setting portlet response content type to view-determined type [" + contentType + "]");
1121 }
1122 response.setContentType(contentType);
1123 }
1124 }
1125
1126 doRender(view, mv.getModelInternal(), request, response);
1127 }
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142 protected View resolveViewName(String viewName, Map<String, ?> model, PortletRequest request) throws Exception {
1143 for (ViewResolver viewResolver : this.viewResolvers) {
1144 View view = viewResolver.resolveViewName(viewName, request.getLocale());
1145 if (view != null) {
1146 return view;
1147 }
1148 }
1149 return null;
1150 }
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162 protected void doRender(View view, Map<String, ?> model, PortletRequest request, MimeResponse response) throws Exception {
1163
1164 request.setAttribute(ViewRendererServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE, getPortletApplicationContext());
1165
1166
1167 request.setAttribute(ViewRendererServlet.VIEW_ATTRIBUTE, view);
1168 request.setAttribute(ViewRendererServlet.MODEL_ATTRIBUTE, model);
1169
1170
1171 doDispatch(getPortletContext().getRequestDispatcher(this.viewRendererUrl), request, response);
1172 }
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183 protected void doDispatch(PortletRequestDispatcher dispatcher, PortletRequest request, MimeResponse response)
1184 throws Exception {
1185
1186
1187
1188
1189 if (PortletRequest.RESOURCE_PHASE.equals(request.getAttribute(PortletRequest.LIFECYCLE_PHASE)) &&
1190 !dispatcher.getClass().getName().startsWith("com.liferay")) {
1191 dispatcher.forward(request, response);
1192 }
1193 else {
1194 dispatcher.include(request, response);
1195 }
1196 }
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209 protected ModelAndView processHandlerException(
1210 RenderRequest request, RenderResponse response, Object handler, Exception ex)
1211 throws Exception {
1212
1213 ModelAndView exMv = null;
1214 for (Iterator<HandlerExceptionResolver> it = this.handlerExceptionResolvers.iterator(); exMv == null && it.hasNext();) {
1215 HandlerExceptionResolver resolver = it.next();
1216 exMv = resolver.resolveException(request, response, handler, ex);
1217 }
1218 if (exMv != null) {
1219 if (logger.isDebugEnabled()) {
1220 logger.debug("HandlerExceptionResolver returned ModelAndView [" + exMv + "] for exception");
1221 }
1222 logger.warn("Handler execution resulted in exception - forwarding to resolved error view", ex);
1223 return exMv;
1224 }
1225 else {
1226 throw ex;
1227 }
1228 }
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240 protected ModelAndView processHandlerException(
1241 ResourceRequest request, ResourceResponse response, Object handler, Exception ex)
1242 throws Exception {
1243
1244 ModelAndView exMv = null;
1245 for (Iterator<HandlerExceptionResolver> it = this.handlerExceptionResolvers.iterator(); exMv == null && it.hasNext();) {
1246 HandlerExceptionResolver resolver = it.next();
1247 exMv = resolver.resolveException(request, response, handler, ex);
1248 }
1249 if (exMv != null) {
1250 if (logger.isDebugEnabled()) {
1251 logger.debug("HandlerExceptionResolver returned ModelAndView [" + exMv + "] for exception");
1252 }
1253 logger.warn("Handler execution resulted in exception - forwarding to resolved error view", ex);
1254 return exMv;
1255 }
1256 else {
1257 throw ex;
1258 }
1259 }
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270 private void triggerAfterActionCompletion(HandlerExecutionChain mappedHandler, int interceptorIndex,
1271 ActionRequest request, ActionResponse response, Exception ex)
1272 throws Exception {
1273
1274
1275 if (mappedHandler != null) {
1276 HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();
1277 if (interceptors != null) {
1278 for (int i = interceptorIndex; i >= 0; i--) {
1279 HandlerInterceptor interceptor = interceptors[i];
1280 try {
1281 interceptor.afterActionCompletion(request, response, mappedHandler.getHandler(), ex);
1282 }
1283 catch (Throwable ex2) {
1284 logger.error("HandlerInterceptor.afterCompletion threw exception", ex2);
1285 }
1286 }
1287 }
1288 }
1289 }
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300 private void triggerAfterRenderCompletion(HandlerExecutionChain mappedHandler, int interceptorIndex,
1301 RenderRequest request, RenderResponse response, Exception ex)
1302 throws Exception {
1303
1304
1305 if (mappedHandler != null) {
1306 HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();
1307 if (interceptors != null) {
1308 for (int i = interceptorIndex; i >= 0; i--) {
1309 HandlerInterceptor interceptor = interceptors[i];
1310 try {
1311 interceptor.afterRenderCompletion(request, response, mappedHandler.getHandler(), ex);
1312 }
1313 catch (Throwable ex2) {
1314 logger.error("HandlerInterceptor.afterCompletion threw exception", ex2);
1315 }
1316 }
1317 }
1318 }
1319 }
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330 private void triggerAfterResourceCompletion(HandlerExecutionChain mappedHandler, int interceptorIndex,
1331 ResourceRequest request, ResourceResponse response, Exception ex)
1332 throws Exception {
1333
1334
1335 if (mappedHandler != null) {
1336 HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();
1337 if (interceptors != null) {
1338 for (int i = interceptorIndex; i >= 0; i--) {
1339 HandlerInterceptor interceptor = interceptors[i];
1340 try {
1341 interceptor.afterResourceCompletion(request, response, mappedHandler.getHandler(), ex);
1342 }
1343 catch (Throwable ex2) {
1344 logger.error("HandlerInterceptor.afterCompletion threw exception", ex2);
1345 }
1346 }
1347 }
1348 }
1349 }
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360 private void triggerAfterEventCompletion(HandlerExecutionChain mappedHandler, int interceptorIndex,
1361 EventRequest request, EventResponse response, Exception ex)
1362 throws Exception {
1363
1364
1365 if (mappedHandler != null) {
1366 HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();
1367 if (interceptors != null) {
1368 for (int i = interceptorIndex; i >= 0; i--) {
1369 HandlerInterceptor interceptor = interceptors[i];
1370 try {
1371 interceptor.afterEventCompletion(request, response, mappedHandler.getHandler(), ex);
1372 }
1373 catch (Throwable ex2) {
1374 logger.error("HandlerInterceptor.afterCompletion threw exception", ex2);
1375 }
1376 }
1377 }
1378 }
1379 }
1380
1381 }