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.context;
35
36 import info.magnolia.cms.beans.runtime.MultipartForm;
37 import info.magnolia.cms.core.AggregationState;
38 import info.magnolia.objectfactory.Components;
39
40 import java.io.IOException;
41 import java.io.Writer;
42 import java.util.Enumeration;
43 import java.util.HashMap;
44 import java.util.Map;
45 import java.util.Stack;
46
47 import javax.servlet.ServletContext;
48 import javax.servlet.ServletException;
49 import javax.servlet.ServletRequest;
50 import javax.servlet.http.HttpServletRequest;
51 import javax.servlet.http.HttpServletResponse;
52 import javax.servlet.http.HttpSession;
53 import javax.servlet.jsp.PageContext;
54
55
56
57
58
59 public abstract class WebContextImpl extends UserContextImpl implements WebContext {
60 private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(WebContextImpl.class);
61
62 private HttpServletRequest request;
63
64 private HttpServletResponse response;
65
66 private ServletContext servletContext;
67
68
69
70
71 private PageContext pageContext;
72
73 protected AggregationState aggregationState;
74
75 private Stack<HttpServletResponse> responseStack = new Stack<HttpServletResponse>();
76
77 private Stack<HttpServletRequest> requestStack = new Stack<HttpServletRequest>();
78
79
80
81
82 public WebContextImpl() {
83 log.debug("new WebContextImpl() {}", this);
84 }
85
86 @Override
87 public void init(HttpServletRequest request, HttpServletResponse response, ServletContext servletContext) {
88 this.request = request;
89 this.response = response;
90 this.servletContext = servletContext;
91
92
93 setAttributeStrategy(new RequestAttributeStrategy(this));
94 setRepositoryStrategy(createRepositoryStrategy());
95 }
96
97 private DefaultRepositoryStrategy createRepositoryStrategy() {
98 return Components.newInstance(DefaultRepositoryStrategy.class, this);
99 }
100
101 @Override
102 public AggregationState getAggregationState() {
103 if (aggregationState == null) {
104 aggregationState = newAggregationState();
105 }
106 return aggregationState;
107 }
108
109
110
111
112 protected abstract AggregationState newAggregationState();
113
114
115
116
117 @Override
118 public void resetAggregationState() {
119 getAggregationState().resetURIs();
120 }
121
122
123
124
125
126
127 @Override
128 public MultipartForm getPostedForm() {
129 return (MultipartForm) getAttribute(MultipartForm.REQUEST_ATTRIBUTE_NAME, LOCAL_SCOPE);
130 }
131
132
133
134
135
136
137 @Override
138 public String getParameter(String name) {
139 return this.request.getParameter(name);
140 }
141
142
143
144
145
146
147 @Override
148 public String[] getParameterValues(String name) {
149 return this.request.getParameterValues(name);
150 }
151
152
153
154
155
156
157
158 @Override
159 public Map<String, String> getParameters() {
160 Map<String, String> map = new HashMap<String, String>();
161 Enumeration<String> paramEnum = this.request.getParameterNames();
162 while (paramEnum.hasMoreElements()) {
163 final String name = paramEnum.nextElement();
164 map.put(name, this.request.getParameter(name));
165 }
166 return map;
167 }
168
169
170
171
172
173
174 @Override
175 public HttpServletRequest getRequest() {
176 return this.request;
177 }
178
179 @Override
180 public HttpServletResponse getResponse() {
181 return response;
182 }
183
184 @Override
185 public String getContextPath() {
186 return this.request.getContextPath();
187 }
188
189
190
191
192
193 @Override
194 public void include(final String path, final Writer out) throws ServletException, IOException {
195 try {
196 final ServletRequest requestToUse = this.getRequest();
197 final HttpServletResponse responseToUse = response;
198 final WriterResponseWrapper wrappedResponse = new WriterResponseWrapper(responseToUse, out);
199
200 requestToUse.getRequestDispatcher(path).include(requestToUse, wrappedResponse);
201 } catch (ServletException e) {
202 throw new RuntimeException(e);
203 } catch (IOException e) {
204 throw new RuntimeException(e);
205 }
206 }
207
208
209
210
211 @Override
212 public PageContext getPageContext() {
213 return pageContext;
214 }
215
216
217
218
219 @Override
220 public void setPageContext(PageContext pageContext) {
221 this.pageContext = pageContext;
222 }
223
224
225
226
227 @Override
228 public ServletContext getServletContext() {
229 return servletContext;
230 }
231
232 public void login() {
233 setRepositoryStrategy(createRepositoryStrategy());
234 }
235
236
237
238
239
240
241 @Override
242 public void logout() {
243 releaseJCRSessions();
244 super.logout();
245
246 HttpSession session = this.request.getSession(false);
247 if (session != null) {
248 session.invalidate();
249 }
250 }
251
252
253
254
255 @Override
256 public void release() {
257 releaseJCRSessions();
258 this.request = null;
259 this.response = null;
260 }
261
262 protected void releaseJCRSessions() {
263 getRepositoryStrategy().release();
264 }
265
266
267
268
269 @Override
270 public void pop() {
271 request = requestStack.pop();
272 response = responseStack.pop();
273 }
274
275
276
277
278 @Override
279 public void push(HttpServletRequest request, HttpServletResponse response) {
280 requestStack.push(this.request);
281 this.request = request;
282 responseStack.push(this.response);
283 this.response = response;
284 }
285 }