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 @Override
81 protected Object getDefaultStrategy(ApplicationContext context, Class strategyInterface) throws BeansException {
82 if (strategyInterface.equals(LocaleResolver.class)) {
83 return super.createDefaultStrategy(context, MagnoliaLocaleResolver.class);
84 }
85 return super.getDefaultStrategy(context, strategyInterface);
86 }
87
88 @Override
89 protected void postProcessWebApplicationContext(ConfigurableWebApplicationContext wac) {
90 wac.addBeanFactoryPostProcessor(this);
91 }
92
93 @Override
94 public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
95
96 Assert.isInstanceOf(BeanDefinitionRegistry.class, beanFactory);
97
98 BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
99
100 beanFactory.addBeanPostProcessor(new BlossomDispatcherAwareBeanPostProcessor(this));
101
102 BeanFactoryUtils.registerBeanIfMissing(beanFactory, registry, TemplateExporter.class);
103 BeanFactoryUtils.registerBeanIfMissing(beanFactory, registry, DialogExporter.class);
104 BeanFactoryUtils.registerBeanIfMissing(beanFactory, registry, AnnotatedVirtualURIMappingExporter.class);
105 BeanFactoryUtils.registerBeanIfMissing(beanFactory, registry, VirtualURIMappingExporter.class);
106 }
107
108 @Override
109 protected WebApplicationContext initWebApplicationContext() throws BeansException {
110 WebApplicationContext wac = super.initWebApplicationContext();
111 wac.publishEvent(new BlossomDispatcherInitializedEvent(this));
112 return wac;
113 }
114
115 @Override
116 public void forward(String path, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
117
118 String contextPath = request.getContextPath();
119
120 request = new ForwardRequestWrapper(request, contextPath + path, contextPath, path, null);
121
122 MgnlContext.push(request, response);
123 try {
124 super.service(request, response);
125 } finally {
126 MgnlContext.pop();
127 }
128 }
129
130 @Override
131 public void include(String path, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
132
133 String contextPath = request.getContextPath();
134
135 request = new IncludeRequestWrapper(request, contextPath + path, contextPath, path, null, request.getQueryString());
136
137 MgnlContext.push(request, response);
138 try {
139 super.service(request, response);
140 } finally {
141 MgnlContext.pop();
142 }
143 }
144
145 @Override
146 public ModelAndView executeChain(HandlerExecutionChain mappedHandler, HttpServletRequest request, HttpServletResponse response) throws Exception {
147
148
149
150
151 HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();
152 if (interceptors != null) {
153 for (int i = 0; i < interceptors.length; i++) {
154 HandlerInterceptor interceptor = interceptors[i];
155 if (!interceptor.preHandle(request, response, mappedHandler.getHandler())) {
156 return null;
157 }
158 }
159 }
160
161
162 HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
163 ModelAndView mv = ha.handle(request, response, mappedHandler.getHandler());
164
165
166 if (mv != null && !mv.hasView()) {
167 mv.setViewName(getDefaultViewName(request));
168 }
169
170
171 if (interceptors != null) {
172 for (int i = interceptors.length - 1; i >= 0; i--) {
173 HandlerInterceptor interceptor = interceptors[i];
174 interceptor.postHandle(request, response, mappedHandler.getHandler(), mv);
175 }
176 }
177
178 if (mv != null && !mv.wasCleared()) {
179
180
181
182 LocaleResolver localeResolver = (LocaleResolver) request.getAttribute(LOCALE_RESOLVER_ATTRIBUTE);
183
184
185 Locale locale = localeResolver.resolveLocale(request);
186 response.setLocale(locale);
187
188 View view;
189 if (mv.isReference()) {
190
191 view = resolveViewName(mv.getViewName(), mv.getModel(), locale, request);
192 if (view == null) {
193 throw new ServletException(
194 "Could not resolve view with name '" + mv.getViewName() + "' in servlet with name '" +
195 getServletName() + "'");
196 }
197 }
198 else {
199
200 view = mv.getView();
201 if (view == null) {
202 throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
203 "View object in servlet with name '" + getServletName() + "'");
204 }
205 }
206
207 mv.setView(view);
208 }
209
210 return mv;
211 }
212 }