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 javax.servlet.ServletException;
38 import javax.servlet.http.HttpServletRequest;
39 import javax.servlet.http.HttpServletResponse;
40
41 import org.springframework.beans.BeansException;
42 import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
43 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
44 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
45 import org.springframework.context.ApplicationContext;
46 import org.springframework.util.Assert;
47 import org.springframework.web.context.ConfigurableWebApplicationContext;
48 import org.springframework.web.context.WebApplicationContext;
49 import org.springframework.web.servlet.DispatcherServlet;
50 import org.springframework.web.servlet.HandlerAdapter;
51 import org.springframework.web.servlet.LocaleResolver;
52
53 import info.magnolia.context.MgnlContext;
54 import info.magnolia.module.blossom.context.MagnoliaLocaleResolver;
55 import info.magnolia.module.blossom.dialog.DialogExporter;
56 import info.magnolia.module.blossom.dispatcher.BlossomDispatcher;
57 import info.magnolia.module.blossom.dispatcher.BlossomDispatcherAwareBeanPostProcessor;
58 import info.magnolia.module.blossom.dispatcher.BlossomDispatcherInitializedEvent;
59 import info.magnolia.module.blossom.support.BeanFactoryUtils;
60 import info.magnolia.module.blossom.support.ForwardRequestWrapper;
61 import info.magnolia.module.blossom.support.IncludeRequestWrapper;
62 import info.magnolia.module.blossom.template.TemplateExporter;
63 import info.magnolia.module.blossom.urimapping.AnnotatedVirtualURIMappingExporter;
64 import info.magnolia.module.blossom.urimapping.VirtualURIMappingExporter;
65
66
67
68
69
70
71
72 public class BlossomDispatcherServlet extends DispatcherServlet implements BlossomDispatcher, BeanFactoryPostProcessor {
73
74 @Override
75 protected Object getDefaultStrategy(ApplicationContext context, Class strategyInterface) throws BeansException {
76 if (strategyInterface.equals(LocaleResolver.class)) {
77 return super.createDefaultStrategy(context, MagnoliaLocaleResolver.class);
78 }
79 return super.getDefaultStrategy(context, strategyInterface);
80 }
81
82 @Override
83 protected void postProcessWebApplicationContext(ConfigurableWebApplicationContext wac) {
84 wac.addBeanFactoryPostProcessor(this);
85 }
86
87 @Override
88 public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
89
90 Assert.isInstanceOf(BeanDefinitionRegistry.class, beanFactory);
91
92 BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
93
94 beanFactory.addBeanPostProcessor(new BlossomDispatcherAwareBeanPostProcessor(this));
95
96 BeanFactoryUtils.registerBeanIfMissing(beanFactory, registry, TemplateExporter.class);
97 BeanFactoryUtils.registerBeanIfMissing(beanFactory, registry, DialogExporter.class);
98 BeanFactoryUtils.registerBeanIfMissing(beanFactory, registry, AnnotatedVirtualURIMappingExporter.class);
99 BeanFactoryUtils.registerBeanIfMissing(beanFactory, registry, VirtualURIMappingExporter.class);
100 }
101
102 @Override
103 protected WebApplicationContext initWebApplicationContext() throws BeansException {
104 WebApplicationContext wac = super.initWebApplicationContext();
105 wac.publishEvent(new BlossomDispatcherInitializedEvent(this));
106 return wac;
107 }
108
109 @Override
110 public HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
111 return super.getHandlerAdapter(handler);
112 }
113
114 @Override
115 public void forward(String path, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
116
117 String contextPath = request.getContextPath();
118
119 request = new ForwardRequestWrapper(request, contextPath + path, contextPath, path, null);
120
121 MgnlContext.push(request, response);
122 try {
123 super.service(request, response);
124 } finally {
125 MgnlContext.pop();
126 }
127 }
128
129 @Override
130 public void include(String path, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
131
132 String contextPath = request.getContextPath();
133
134 request = new IncludeRequestWrapper(request, contextPath + path, contextPath, path, null, request.getQueryString());
135
136 MgnlContext.push(request, response);
137 try {
138 super.service(request, response);
139 } finally {
140 MgnlContext.pop();
141 }
142 }
143 }