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
38 import org.springframework.beans.BeansException;
39 import org.springframework.beans.factory.InitializingBean;
40 import org.springframework.context.ApplicationContext;
41 import org.springframework.context.ApplicationContextAware;
42 import org.springframework.web.servlet.HandlerExecutionChain;
43 import org.springframework.web.servlet.HandlerMapping;
44 import org.springframework.web.servlet.handler.AbstractUrlHandlerMapping;
45 import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping;
46 import org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping;
47
48 import info.magnolia.context.MgnlContext;
49 import info.magnolia.module.blossom.dispatcher.BlossomDispatcher;
50 import info.magnolia.module.blossom.dispatcher.BlossomDispatcherAware;
51
52
53
54
55
56
57
58 public class BlossomHandlerMapping implements HandlerMapping, InitializingBean, ApplicationContextAware, BlossomDispatcherAware {
59
60 private ApplicationContext applicationContext;
61 private AbstractUrlHandlerMapping[] targetHandlerMappings;
62 private DirectRenderingVoter directRenderingVoter;
63 private BlossomDispatcher dispatcher;
64
65 public AbstractUrlHandlerMapping[] getTargetHandlerMappings() {
66 return targetHandlerMappings;
67 }
68
69 public void setTargetHandlerMapping(AbstractUrlHandlerMapping targetHandlerMapping) {
70 this.targetHandlerMappings = new AbstractUrlHandlerMapping[]{targetHandlerMapping};
71 }
72
73 public void setTargetHandlerMappings(AbstractUrlHandlerMapping[] targetHandlerMappings) {
74 this.targetHandlerMappings = targetHandlerMappings;
75 }
76
77 public DirectRenderingVoter getDirectRenderingPolicy() {
78 return directRenderingVoter;
79 }
80
81 public void setDirectRenderingPolicy(DirectRenderingVoter directRenderingVoter) {
82 this.directRenderingVoter = directRenderingVoter;
83 }
84
85 @Override
86 public HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
87
88 PreexecutionContext preexecutionContext = PreexecutionContextHolder.get(request);
89
90
91 if (preexecutionContext == null) {
92 return getTargetHandler(request);
93 }
94
95
96 String localUuid = MgnlContext.getAggregationState().getCurrentContentNode().getIdentifier();
97 if (!preexecutionContext.getUuid().equals(localUuid)) {
98 return getTargetHandler(request);
99 }
100
101
102 if (preexecutionContext.isModelAndViewSet()) {
103 return new HandlerExecutionChain(new ModelAndViewReuseController(preexecutionContext));
104 }
105
106
107
108
109 HandlerExecutionChain executionChain = getTargetHandler(request);
110 if (executionChain == null) {
111 return null;
112 }
113
114
115 return new HandlerExecutionChain(new ModelAndViewGrabbingController(preexecutionContext, executionChain, directRenderingVoter, dispatcher));
116 }
117
118 private HandlerExecutionChain getTargetHandler(HttpServletRequest request) throws Exception {
119 for (AbstractUrlHandlerMapping targetHandlerMapping : targetHandlerMappings) {
120 HandlerExecutionChain executionChain = targetHandlerMapping.getHandler(request);
121 if (executionChain != null) {
122 return executionChain;
123 }
124 }
125 return null;
126 }
127
128 @Override
129 public void afterPropertiesSet() throws Exception {
130
131 if (directRenderingVoter == null) {
132 directRenderingVoter = new DefaultDirectRenderingVoter();
133 }
134
135 if (targetHandlerMappings == null) {
136 this.targetHandlerMappings = new AbstractUrlHandlerMapping[2];
137 this.targetHandlerMappings[0] = (AbstractUrlHandlerMapping) applicationContext.getAutowireCapableBeanFactory().createBean(BeanNameUrlHandlerMapping.class);
138 DefaultAnnotationHandlerMapping defaultAnnotationHandlerMapping = (DefaultAnnotationHandlerMapping) applicationContext.getAutowireCapableBeanFactory().createBean(DefaultAnnotationHandlerMapping.class);
139 defaultAnnotationHandlerMapping.setUseDefaultSuffixPattern(false);
140 this.targetHandlerMappings[1] = defaultAnnotationHandlerMapping;
141 }
142 }
143
144 @Override
145 public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
146 this.applicationContext = applicationContext;
147 }
148
149 @Override
150 public void setBlossomDispatcher(BlossomDispatcher dispatcher) {
151 this.dispatcher = dispatcher;
152 }
153 }