1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.module.blossom.preexecution;
35
36 import javax.servlet.http.HttpServletRequest;
37 import javax.servlet.http.HttpServletResponse;
38
39 import org.springframework.web.servlet.HandlerAdapter;
40 import org.springframework.web.servlet.HandlerExecutionChain;
41 import org.springframework.web.servlet.HandlerInterceptor;
42 import org.springframework.web.servlet.ModelAndView;
43 import org.springframework.web.servlet.mvc.Controller;
44
45 import info.magnolia.module.blossom.dispatcher.BlossomDispatcher;
46 import info.magnolia.module.blossom.render.RenderContext;
47 import info.magnolia.module.blossom.template.BlossomRenderable;
48
49
50
51
52
53
54 public class ModelAndViewGrabbingController implements Controller {
55
56 private PreexecutionContext preexecutionContext;
57 private HandlerExecutionChain handlerExecutionChain;
58 private DirectRenderingVoter directRenderingVoter;
59
60 public ModelAndViewGrabbingController(PreexecutionContext preexecutionContext, HandlerExecutionChain handlerExecutionChain, DirectRenderingVoter directRenderingVoter) {
61 this.preexecutionContext = preexecutionContext;
62 this.handlerExecutionChain = handlerExecutionChain;
63 this.directRenderingVoter = directRenderingVoter;
64 }
65
66 @Override
67 public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
68
69 ModelAndView mv = executeChain(handlerExecutionChain, request, response);
70
71
72 if (mv == null) {
73 return null;
74 }
75
76
77 if (directRenderingVoter.renderDirectly(mv, request, response)) {
78 return mv;
79 }
80
81
82 preexecutionContext.setModelAndView(mv);
83
84
85 return null;
86 }
87
88 private ModelAndView executeChain(HandlerExecutionChain mappedHandler, HttpServletRequest request, HttpServletResponse response) throws Exception {
89
90
91 HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();
92 if (interceptors != null) {
93 for (int i = 0; i < interceptors.length; i++) {
94 HandlerInterceptor interceptor = interceptors[i];
95 if (!interceptor.preHandle(request, response, mappedHandler.getHandler())) {
96 return null;
97 }
98 }
99 }
100
101
102 BlossomRenderable renderable = (BlossomRenderable) RenderContext.get().getRenderingContext().getRenderableDefinition();
103 BlossomDispatcher dispatcher = renderable.getDispatcher();
104 HandlerAdapter ha = dispatcher.getHandlerAdapter(mappedHandler.getHandler());
105 ModelAndView mv = ha.handle(request, response, mappedHandler.getHandler());
106
107
108 if (interceptors != null) {
109 for (int i = interceptors.length - 1; i >= 0; i--) {
110 HandlerInterceptor interceptor = interceptors[i];
111 interceptor.postHandle(request, response, mappedHandler.getHandler(), mv);
112 }
113 }
114
115 return mv;
116 }
117 }