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.admincentral;
35
36 import static info.magnolia.cms.util.RequestDispatchUtil.REDIRECT_PREFIX;
37 import static java.util.stream.Collectors.toList;
38
39 import info.magnolia.cms.util.RequestDispatchUtil;
40 import info.magnolia.cms.util.ServletUtil;
41 import info.magnolia.event.EventBus;
42 import info.magnolia.event.SystemEventBus;
43 import info.magnolia.objectfactory.ComponentProvider;
44 import info.magnolia.objectfactory.Components;
45 import info.magnolia.ui.framework.ioc.MagnoliaUiGuiceComponentProviderFactory;
46 import info.magnolia.ui.framework.ioc.SessionStore;
47
48 import java.io.IOException;
49 import java.util.List;
50
51 import javax.inject.Inject;
52 import javax.servlet.ServletException;
53 import javax.servlet.http.HttpServletRequest;
54 import javax.servlet.http.HttpServletResponse;
55
56 import org.slf4j.Logger;
57 import org.slf4j.LoggerFactory;
58
59 import com.google.inject.name.Names;
60 import com.vaadin.server.DeploymentConfiguration;
61 import com.vaadin.server.RequestHandler;
62 import com.vaadin.server.ServiceException;
63 import com.vaadin.server.VaadinRequest;
64 import com.vaadin.server.VaadinResponse;
65 import com.vaadin.server.VaadinServlet;
66 import com.vaadin.server.VaadinServletRequest;
67 import com.vaadin.server.VaadinServletResponse;
68 import com.vaadin.server.VaadinServletService;
69 import com.vaadin.server.VaadinSession;
70 import com.vaadin.server.communication.ServletBootstrapHandler;
71
72
73
74
75
76
77
78
79
80
81
82
83 public class AdmincentralServlet extends VaadinServlet {
84 private static final Logger log = LoggerFactory.getLogger(AdmincentralServlet.class);
85
86 private final MagnoliaUiGuiceComponentProviderFactory componentProviderFactory;
87 private ComponentProvider componentProvider;
88
89 @Inject
90 public AdmincentralServlet(MagnoliaUiGuiceComponentProviderFactory componentProviderFactory) {
91 this.componentProviderFactory = componentProviderFactory;
92 }
93
94 @Override
95 protected void servletInitialized() throws ServletException {
96 super.servletInitialized();
97 this.componentProvider = componentProviderFactory.create();
98
99 EventBus systemEventBus = Components.getComponentWithAnnotation(EventBus.class, Names.named(SystemEventBus.NAME));
100 getServletContext().setAttribute("componentProvider", componentProvider);
101
102 getService().addSessionInitListener(event -> {
103 VaadinSession session = event.getSession();
104 session.setAttribute(SessionStore.class, new SessionStore(session, systemEventBus));
105 session.addUIProvider(componentProvider.newInstance(ResurfaceUIProvider.class));
106 });
107 }
108
109 @Override
110 protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
111 try {
112 Components.pushProvider(componentProvider);
113 super.service(request, response);
114 } catch (Exception e) {
115 log.error("An internal error has occurred in the AdmincentralServlet.", e);
116 } finally {
117 Components.popProvider();
118 }
119 }
120
121 @Override
122 protected VaadinServletService createServletService(DeploymentConfiguration deploymentConfiguration) throws ServiceException {
123 VaadinServletService service = new VaadinServletService(this, deploymentConfiguration) {
124 @Override
125 protected List<RequestHandler> createRequestHandlers() throws ServiceException {
126 List<RequestHandler> handlers = super.createRequestHandlers();
127 return handlers.stream()
128 .map(requestHandler -> {
129
130 if (requestHandler instanceof ServletBootstrapHandler) {
131 return new JsessionidFriendlyBootstrapHandler();
132 }
133 return requestHandler;
134 })
135 .collect(toList());
136 }
137 };
138 service.init();
139 return service;
140 }
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159 static class JsessionidFriendlyBootstrapHandler extends ServletBootstrapHandler {
160 @Override
161 public boolean synchronizedHandleRequest(VaadinSession session, VaadinRequest request, VaadinResponse response) throws IOException {
162 if (request instanceof HttpServletRequest) {
163
164 HttpServletRequest httpRequest = (HttpServletRequest) request;
165
166
167
168
169 if (httpRequest.isRequestedSessionIdFromCookie() && httpRequest.getRequestURI().contains(";jsessionid")) {
170 String redirectUri = ServletUtil.stripPathParameters(httpRequest.getRequestURI());
171 return RequestDispatchUtil.dispatch(REDIRECT_PREFIX + redirectUri, ((VaadinServletRequest) request).getHttpServletRequest(), (VaadinServletResponse) response);
172 }
173 }
174
175 return super.synchronizedHandleRequest(session, request, response);
176 }
177
178 @Override
179 protected String getServiceUrl(BootstrapContext context) {
180 return ServletUtil.getOriginalRequestURI(((VaadinServletRequest) context.getRequest()).getHttpServletRequest());
181 }
182 }
183 }