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 info.magnolia.context.MgnlContext;
37 import info.magnolia.context.WebContext;
38 import info.magnolia.module.blossom.context.MagnoliaLocaleResolver;
39 import info.magnolia.module.blossom.dialog.DialogExporter;
40 import info.magnolia.module.blossom.dispatcher.BlossomDispatcher;
41 import info.magnolia.module.blossom.dispatcher.BlossomDispatcherAwareBeanPostProcessor;
42 import info.magnolia.module.blossom.paragraph.ParagraphExporter;
43 import info.magnolia.module.blossom.support.ForwardRequestWrapper;
44 import info.magnolia.module.blossom.support.IncludeRequestWrapper;
45 import info.magnolia.module.blossom.template.TemplateExporter;
46 import info.magnolia.module.blossom.urimapping.AnnotatedVirtualURIMappingExporter;
47 import info.magnolia.module.blossom.urimapping.VirtualURIMappingExporter;
48 import org.springframework.beans.BeansException;
49 import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
50 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
51 import org.springframework.context.ApplicationContext;
52 import org.springframework.web.context.ConfigurableWebApplicationContext;
53 import org.springframework.web.servlet.DispatcherServlet;
54 import org.springframework.web.servlet.HandlerAdapter;
55 import org.springframework.web.servlet.LocaleResolver;
56 import org.springframework.web.util.WebUtils;
57
58 import javax.servlet.ServletException;
59 import javax.servlet.http.HttpServletRequest;
60 import javax.servlet.http.HttpServletResponse;
61 import java.io.IOException;
62
63
64
65
66
67
68
69 public class BlossomDispatcherServlet extends DispatcherServlet implements BlossomDispatcher {
70
71 @Override
72 protected Object getDefaultStrategy(ApplicationContext context, Class strategyInterface) throws BeansException {
73 if (strategyInterface.equals(LocaleResolver.class))
74 return super.createDefaultStrategy(context, MagnoliaLocaleResolver.class);
75 return super.getDefaultStrategy(context, strategyInterface);
76 }
77
78 @Override
79 protected void postProcessWebApplicationContext(final ConfigurableWebApplicationContext wac) {
80 wac.addBeanFactoryPostProcessor(new BeanFactoryPostProcessor() {
81 public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
82 beanFactory.addBeanPostProcessor(new BlossomDispatcherAwareBeanPostProcessor(BlossomDispatcherServlet.this));
83 beanFactory.addBeanPostProcessor(new ParagraphExporter(BlossomDispatcherServlet.this));
84 beanFactory.addBeanPostProcessor(new TemplateExporter(BlossomDispatcherServlet.this));
85 }
86 });
87 }
88
89 @Override
90 protected void onRefresh(ApplicationContext context) throws BeansException {
91 super.onRefresh(context);
92 context.getAutowireCapableBeanFactory().createBean(DialogExporter.class);
93 context.getAutowireCapableBeanFactory().createBean(AnnotatedVirtualURIMappingExporter.class);
94 context.getAutowireCapableBeanFactory().createBean(VirtualURIMappingExporter.class);
95 }
96
97 @Override
98 public HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
99 return super.getHandlerAdapter(handler);
100 }
101
102 public void dispatch(String handlerPath) throws IOException, ServletException {
103
104 WebContext webContext = MgnlContext.getWebContext();
105 HttpServletRequest request = webContext.getRequest();
106 HttpServletResponse response = webContext.getResponse();
107
108 String contextPath = request.getContextPath();
109
110 if (WebUtils.isIncludeRequest(request)) {
111 request = new IncludeRequestWrapper(request, contextPath + handlerPath, contextPath, handlerPath, null, request.getQueryString());
112 } else {
113 request = new ForwardRequestWrapper(request, contextPath + handlerPath, contextPath, handlerPath, null);
114 }
115
116 MgnlContext.push(request, response);
117 try {
118 super.service(request, response);
119 } finally {
120 MgnlContext.pop();
121 }
122 }
123 }