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.render;
35
36 import java.io.IOException;
37 import java.util.Locale;
38
39 import javax.servlet.ServletException;
40 import javax.servlet.http.HttpServletRequest;
41 import javax.servlet.http.HttpServletResponse;
42
43 import org.springframework.beans.BeansException;
44 import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
45 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
46 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
47 import org.springframework.context.ApplicationContext;
48 import org.springframework.util.Assert;
49 import org.springframework.web.context.ConfigurableWebApplicationContext;
50 import org.springframework.web.context.WebApplicationContext;
51 import org.springframework.web.servlet.DispatcherServlet;
52 import org.springframework.web.servlet.HandlerAdapter;
53 import org.springframework.web.servlet.HandlerExecutionChain;
54 import org.springframework.web.servlet.HandlerInterceptor;
55 import org.springframework.web.servlet.LocaleResolver;
56 import org.springframework.web.servlet.ModelAndView;
57 import org.springframework.web.servlet.View;
58
59 import info.magnolia.context.MgnlContext;
60 import info.magnolia.module.blossom.context.MagnoliaLocaleResolver;
61 import info.magnolia.module.blossom.dialog.DialogExporter;
62 import info.magnolia.module.blossom.dispatcher.BlossomDispatcher;
63 import info.magnolia.module.blossom.dispatcher.BlossomDispatcherAwareBeanPostProcessor;
64 import info.magnolia.module.blossom.dispatcher.BlossomDispatcherInitializedEvent;
65 import info.magnolia.module.blossom.support.BeanFactoryUtils;
66 import info.magnolia.module.blossom.support.ForwardRequestWrapper;
67 import info.magnolia.module.blossom.support.IncludeRequestWrapper;
68 import info.magnolia.module.blossom.template.TemplateExporter;
69 import info.magnolia.module.blossom.urimapping.AnnotatedVirtualURIMappingExporter;
70 import info.magnolia.module.blossom.urimapping.VirtualURIMappingExporter;
71
72
73
74
75
76
77
78 public class BlossomDispatcherServlet extends DispatcherServlet implements BlossomDispatcher, BeanFactoryPostProcessor {
79
80 public BlossomDispatcherServlet() {
81 super();
82 }
83
84 public BlossomDispatcherServlet(WebApplicationContext webApplicationContext) {
85 super(webApplicationContext);
86 }
87
88 @Override
89 protected Object getDefaultStrategy(ApplicationContext context, Class strategyInterface) throws BeansException {
90 if (strategyInterface.equals(LocaleResolver.class)) {
91 return super.createDefaultStrategy(context, MagnoliaLocaleResolver.class);
92 }
93 return super.getDefaultStrategy(context, strategyInterface);
94 }
95
96 @Override
97 protected void postProcessWebApplicationContext(ConfigurableWebApplicationContext wac) {
98 wac.addBeanFactoryPostProcessor(this);
99 }
100
101 @Override
102 public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
103
104 Assert.isInstanceOf(BeanDefinitionRegistry.class, beanFactory);
105
106 BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
107
108 beanFactory.addBeanPostProcessor(new BlossomDispatcherAwareBeanPostProcessor(this));
109
110 BeanFactoryUtils.registerBeanIfMissing(beanFactory, registry, TemplateExporter.class);
111 BeanFactoryUtils.registerBeanIfMissing(beanFactory, registry, DialogExporter.class);
112 BeanFactoryUtils.registerBeanIfMissing(beanFactory, registry, AnnotatedVirtualURIMappingExporter.class);
113 BeanFactoryUtils.registerBeanIfMissing(beanFactory, registry, VirtualURIMappingExporter.class);
114 }
115
116 @Override
117 protected void onRefresh(ApplicationContext context) {
118 super.onRefresh(context);
119 context.publishEvent(new BlossomDispatcherInitializedEvent(this));
120 }
121
122 @Override
123 public void forward(String path, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
124
125 String contextPath = request.getContextPath();
126
127 ForwardRequestWrapperper.html#ForwardRequestWrapper">ForwardRequestWrapper forwardRequestWrapper = new ForwardRequestWrapper(request, contextPath + path, contextPath, path, null);
128
129 MgnlContext.push(forwardRequestWrapper, response);
130 try {
131 super.service(forwardRequestWrapper, response);
132 } finally {
133 forwardRequestWrapper.restore();
134 MgnlContext.pop();
135 }
136 }
137
138 @Override
139 public void include(String path, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
140
141 String contextPath = request.getContextPath();
142
143 IncludeRequestWrapperper.html#IncludeRequestWrapper">IncludeRequestWrapper includeRequestWrapper = new IncludeRequestWrapper(request, contextPath + path, contextPath, path, null, request.getQueryString());
144
145 MgnlContext.push(includeRequestWrapper, response);
146 try {
147 super.service(includeRequestWrapper, response);
148 } finally {
149 includeRequestWrapper.restore();
150 MgnlContext.pop();
151 }
152 }
153
154 @Override
155 public ModelAndView executeChain(HandlerExecutionChain mappedHandler, HttpServletRequest request, HttpServletResponse response) throws Exception {
156
157
158
159
160 HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();
161 if (interceptors != null) {
162 for (int i = 0; i < interceptors.length; i++) {
163 HandlerInterceptor interceptor = interceptors[i];
164 if (!interceptor.preHandle(request, response, mappedHandler.getHandler())) {
165 return null;
166 }
167 }
168 }
169
170
171 HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
172 ModelAndView mv = ha.handle(request, response, mappedHandler.getHandler());
173
174
175 if (mv != null && !mv.hasView()) {
176 mv.setViewName(getDefaultViewName(request));
177 }
178
179
180 if (interceptors != null) {
181 for (int i = interceptors.length - 1; i >= 0; i--) {
182 HandlerInterceptor interceptor = interceptors[i];
183 interceptor.postHandle(request, response, mappedHandler.getHandler(), mv);
184 }
185 }
186
187 if (mv != null && !mv.wasCleared()) {
188
189
190
191 LocaleResolver localeResolver = (LocaleResolver) request.getAttribute(LOCALE_RESOLVER_ATTRIBUTE);
192
193
194 Locale locale = localeResolver.resolveLocale(request);
195 response.setLocale(locale);
196
197 View view;
198 if (mv.isReference()) {
199
200 view = resolveViewName(mv.getViewName(), mv.getModel(), locale, request);
201 if (view == null) {
202 throw new ServletException(
203 "Could not resolve view with name '" + mv.getViewName() + "' in servlet with name '" +
204 getServletName() + "'");
205 }
206 }
207 else {
208
209 view = mv.getView();
210 if (view == null) {
211 throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
212 "View object in servlet with name '" + getServletName() + "'");
213 }
214 }
215
216 mv.setView(view);
217 }
218
219 return mv;
220 }
221 }