1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.context.servlet;
20
21 import java.io.IOException;
22 import java.io.InputStream;
23 import java.net.MalformedURLException;
24 import java.net.URL;
25 import java.security.Principal;
26 import java.util.Iterator;
27 import java.util.Locale;
28 import java.util.Map;
29 import java.util.Set;
30
31 import javax.faces.FacesException;
32 import javax.faces.context.ExternalContext;
33 import javax.faces.context.FacesContext;
34 import javax.servlet.RequestDispatcher;
35 import javax.servlet.ServletContext;
36 import javax.servlet.ServletException;
37 import javax.servlet.ServletRequest;
38 import javax.servlet.ServletResponse;
39 import javax.servlet.http.HttpServletRequest;
40 import javax.servlet.http.HttpServletResponse;
41
42 import org.apache.myfaces.context.ReleaseableExternalContext;
43 import org.apache.myfaces.util.EnumerationIterator;
44
45
46
47
48
49
50
51
52 public final class ServletExternalContextImpl extends ExternalContext implements ReleaseableExternalContext
53 {
54 private static final String INIT_PARAMETER_MAP_ATTRIBUTE = InitParameterMap.class.getName();
55
56 private ServletContext _servletContext;
57 private ServletRequest _servletRequest;
58 private ServletResponse _servletResponse;
59 private Map<String, Object> _applicationMap;
60 private Map<String, Object> _sessionMap;
61 private Map<String, Object> _requestMap;
62 private Map<String, String> _requestParameterMap;
63 private Map<String, String[]> _requestParameterValuesMap;
64 private Map<String, String> _requestHeaderMap;
65 private Map<String, String[]> _requestHeaderValuesMap;
66 private Map _requestCookieMap;
67 private Map<String, String> _initParameterMap;
68 private HttpServletRequest _httpServletRequest;
69 private String _requestServletPath;
70 private String _requestPathInfo;
71
72 public ServletExternalContextImpl(final ServletContext servletContext, final ServletRequest servletRequest,
73 final ServletResponse servletResponse)
74 {
75 _servletContext = servletContext;
76 _servletRequest = servletRequest;
77 _servletResponse = servletResponse;
78 _applicationMap = null;
79 _sessionMap = null;
80 _requestMap = null;
81 _requestParameterMap = null;
82 _requestParameterValuesMap = null;
83 _requestHeaderMap = null;
84 _requestHeaderValuesMap = null;
85 _requestCookieMap = null;
86 _initParameterMap = null;
87 _httpServletRequest = isHttpServletRequest(servletRequest) ? (HttpServletRequest) servletRequest : null;
88
89 if (_httpServletRequest != null)
90 {
91
92
93
94 _requestServletPath = _httpServletRequest.getServletPath();
95 _requestPathInfo = _httpServletRequest.getPathInfo();
96 }
97 }
98
99 public void release()
100 {
101 _servletContext = null;
102 _servletRequest = null;
103 _servletResponse = null;
104 _applicationMap = null;
105 _sessionMap = null;
106 _requestMap = null;
107 _requestParameterMap = null;
108 _requestParameterValuesMap = null;
109 _requestHeaderMap = null;
110 _requestHeaderValuesMap = null;
111 _requestCookieMap = null;
112 _initParameterMap = null;
113 _httpServletRequest = null;
114 }
115
116 @Override
117 public Object getSession(boolean create)
118 {
119 checkHttpServletRequest();
120 return ((HttpServletRequest) _servletRequest).getSession(create);
121 }
122
123 @Override
124 public Object getContext()
125 {
126 return _servletContext;
127 }
128
129 @Override
130 public Object getRequest()
131 {
132 return _servletRequest;
133 }
134
135 @Override
136 public Object getResponse()
137 {
138 return _servletResponse;
139 }
140
141 @Override
142 public String getResponseContentType()
143 {
144 return _servletResponse.getContentType();
145 }
146
147 @Override
148 public Map<String, Object> getApplicationMap()
149 {
150 if (_applicationMap == null)
151 {
152 _applicationMap = new ApplicationMap(_servletContext);
153 }
154 return _applicationMap;
155 }
156
157 @Override
158 public Map<String, Object> getSessionMap()
159 {
160 if (_sessionMap == null)
161 {
162 checkHttpServletRequest();
163 _sessionMap = new SessionMap(_httpServletRequest);
164 }
165 return _sessionMap;
166 }
167
168 @Override
169 public Map<String, Object> getRequestMap()
170 {
171 if (_requestMap == null)
172 {
173 _requestMap = new RequestMap(_servletRequest);
174 }
175 return _requestMap;
176 }
177
178 @Override
179 public Map<String, String> getRequestParameterMap()
180 {
181 if (_requestParameterMap == null)
182 {
183 _requestParameterMap = new RequestParameterMap(_servletRequest);
184 }
185 return _requestParameterMap;
186 }
187
188 @Override
189 public Map<String, String[]> getRequestParameterValuesMap()
190 {
191 if (_requestParameterValuesMap == null)
192 {
193 _requestParameterValuesMap = new RequestParameterValuesMap(_servletRequest);
194 }
195 return _requestParameterValuesMap;
196 }
197
198 @Override
199 @SuppressWarnings("unchecked")
200 public Iterator<String> getRequestParameterNames()
201 {
202 return new EnumerationIterator(_servletRequest.getParameterNames());
203 }
204
205 @Override
206 public Map<String, String> getRequestHeaderMap()
207 {
208 if (_requestHeaderMap == null)
209 {
210 checkHttpServletRequest();
211 _requestHeaderMap = new RequestHeaderMap(_httpServletRequest);
212 }
213 return _requestHeaderMap;
214 }
215
216 @Override
217 public Map<String, String[]> getRequestHeaderValuesMap()
218 {
219 if (_requestHeaderValuesMap == null)
220 {
221 checkHttpServletRequest();
222 _requestHeaderValuesMap = new RequestHeaderValuesMap(_httpServletRequest);
223 }
224 return _requestHeaderValuesMap;
225 }
226
227 @Override
228 @SuppressWarnings("unchecked")
229 public Map<String, Object> getRequestCookieMap()
230 {
231 if (_requestCookieMap == null)
232 {
233 checkHttpServletRequest();
234 _requestCookieMap = new CookieMap(_httpServletRequest);
235 }
236 return _requestCookieMap;
237 }
238
239 @Override
240 public Locale getRequestLocale()
241 {
242 return _servletRequest.getLocale();
243 }
244
245 @Override
246 public String getRequestPathInfo()
247 {
248 checkHttpServletRequest();
249
250
251 return _requestPathInfo;
252 }
253
254 @Override
255 public String getRequestContentType()
256 {
257 return _servletRequest.getContentType();
258 }
259
260 @Override
261 public String getRequestContextPath()
262 {
263 checkHttpServletRequest();
264 return _httpServletRequest.getContextPath();
265 }
266
267 @Override
268 public String getInitParameter(final String s)
269 {
270 return _servletContext.getInitParameter(s);
271 }
272
273 @Override
274 @SuppressWarnings("unchecked")
275 public Map<String, String> getInitParameterMap()
276 {
277 if (_initParameterMap == null)
278 {
279
280 if ((_initParameterMap = (Map<String, String>) _servletContext.getAttribute(INIT_PARAMETER_MAP_ATTRIBUTE)) == null)
281 {
282 _initParameterMap = new InitParameterMap(_servletContext);
283 _servletContext.setAttribute(INIT_PARAMETER_MAP_ATTRIBUTE, _initParameterMap);
284 }
285 }
286 return _initParameterMap;
287 }
288
289 @Override
290 @SuppressWarnings("unchecked")
291 public Set<String> getResourcePaths(final String path)
292 {
293 checkNull(path, "path");
294 return _servletContext.getResourcePaths(path);
295 }
296
297 @Override
298 public InputStream getResourceAsStream(final String path)
299 {
300 checkNull(path, "path");
301 return _servletContext.getResourceAsStream(path);
302 }
303
304 @Override
305 public String encodeActionURL(final String url)
306 {
307 checkNull(url, "url");
308 checkHttpServletRequest();
309 return ((HttpServletResponse) _servletResponse).encodeURL(url);
310 }
311
312 @Override
313 public String encodeResourceURL(final String url)
314 {
315 checkNull(url, "url");
316 checkHttpServletRequest();
317 return ((HttpServletResponse) _servletResponse).encodeURL(url);
318 }
319
320 @Override
321 public String encodeNamespace(final String s)
322 {
323 return s;
324 }
325
326 @Override
327 public void dispatch(final String requestURI) throws IOException, FacesException
328 {
329 RequestDispatcher requestDispatcher = _servletRequest.getRequestDispatcher(requestURI);
330
331
332 if (requestDispatcher == null)
333 {
334 ((HttpServletResponse) _servletResponse).sendError(HttpServletResponse.SC_NOT_FOUND);
335
336 return;
337 }
338
339 try
340 {
341 requestDispatcher.forward(_servletRequest, _servletResponse);
342 }
343 catch (ServletException e)
344 {
345 if (e.getMessage() != null)
346 {
347 throw new FacesException(e.getMessage(), e);
348 }
349
350 throw new FacesException(e);
351
352 }
353 }
354
355 @Override
356 public String getRequestServletPath()
357 {
358 checkHttpServletRequest();
359
360
361 return _requestServletPath;
362 }
363
364 @Override
365 public String getAuthType()
366 {
367 checkHttpServletRequest();
368 return _httpServletRequest.getAuthType();
369 }
370
371 @Override
372 public String getRemoteUser()
373 {
374 checkHttpServletRequest();
375 return _httpServletRequest.getRemoteUser();
376 }
377
378 @Override
379 public boolean isUserInRole(final String role)
380 {
381 checkNull(role, "role");
382 checkHttpServletRequest();
383 return _httpServletRequest.isUserInRole(role);
384 }
385
386 @Override
387 public Principal getUserPrincipal()
388 {
389 checkHttpServletRequest();
390 return _httpServletRequest.getUserPrincipal();
391 }
392
393 @Override
394 public void log(final String message)
395 {
396 checkNull(message, "message");
397 _servletContext.log(message);
398 }
399
400 @Override
401 public void log(final String message, final Throwable exception)
402 {
403 checkNull(message, "message");
404 checkNull(exception, "exception");
405 _servletContext.log(message, exception);
406 }
407
408 @Override
409 public void redirect(final String url) throws IOException
410 {
411 if (_servletResponse instanceof HttpServletResponse)
412 {
413 ((HttpServletResponse) _servletResponse).sendRedirect(url);
414 FacesContext.getCurrentInstance().responseComplete();
415 }
416 else
417 {
418 throw new IllegalArgumentException("Only HttpServletResponse supported");
419 }
420 }
421
422 @SuppressWarnings("unchecked")
423 public Iterator<Locale> getRequestLocales()
424 {
425 checkHttpServletRequest();
426 return new EnumerationIterator(_httpServletRequest.getLocales());
427 }
428
429 @Override
430 public URL getResource(final String path) throws MalformedURLException
431 {
432 checkNull(path, "path");
433 return _servletContext.getResource(path);
434 }
435
436
437
438
439
440 @Override
441 public void setRequest(final java.lang.Object request)
442 {
443 this._servletRequest = (ServletRequest) request;
444 this._httpServletRequest = isHttpServletRequest(_servletRequest) ? (HttpServletRequest) _servletRequest : null;
445 this._httpServletRequest = isHttpServletRequest(_servletRequest) ? (HttpServletRequest) _servletRequest : null;
446 this._requestHeaderMap = null;
447 this._requestHeaderValuesMap = null;
448 this._requestMap = null;
449 this._requestParameterMap = null;
450 this._requestParameterValuesMap = null;
451 this._sessionMap = null;
452 }
453
454
455
456
457
458
459 @Override
460 public void setRequestCharacterEncoding(final java.lang.String encoding) throws java.io.UnsupportedEncodingException
461 {
462
463 this._servletRequest.setCharacterEncoding(encoding);
464
465 }
466
467
468
469
470 @Override
471 public String getRequestCharacterEncoding()
472 {
473 return _servletRequest.getCharacterEncoding();
474 }
475
476
477
478
479 @Override
480 public String getResponseCharacterEncoding()
481 {
482 return _servletResponse.getCharacterEncoding();
483 }
484
485
486
487
488
489 @Override
490 public void setResponse(final java.lang.Object response)
491 {
492 this._servletResponse = (ServletResponse) response;
493 }
494
495
496
497
498
499 @Override
500 public void setResponseCharacterEncoding(final java.lang.String encoding)
501 {
502 this._servletResponse.setCharacterEncoding(encoding);
503 }
504
505 private void checkNull(final Object o, final String param)
506 {
507 if (o == null)
508 {
509 throw new NullPointerException(param + " can not be null.");
510 }
511 }
512
513 private void checkHttpServletRequest()
514 {
515 if (_httpServletRequest == null)
516 {
517 throw new UnsupportedOperationException("Only HttpServletRequest supported");
518 }
519 }
520
521 private boolean isHttpServletRequest(final ServletRequest servletRequest)
522 {
523 return servletRequest instanceof HttpServletRequest;
524 }
525
526 }