View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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   * Implements the external context for servlet request. JSF 1.2, 6.1.3
47   * 
48   * @author Manfred Geiler (latest modification by $Author: lu4242 $)
49   * @author Anton Koinov
50   * @version $Revision: 1057820 $ $Date: 2011-01-11 14:33:21 -0500 (Tue, 11 Jan 2011) $
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              // HACK: MultipartWrapper scrambles the servletPath for some reason in Tomcat 4.1.29 embedded in JBoss
92              // 3.2.3!?
93              // (this was reported by frederic.auge [frederic.auge@laposte.net])
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         // return (_httpServletRequest).getPathInfo();
250         // HACK: see constructor
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             // We cache it as an attribute in ServletContext itself (is this circular reference a problem?)
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         // If there is no dispatcher, send NOT_FOUND
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         // return (_httpServletRequest).getServletPath();
360         // HACK: see constructor
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      * @since JSF 1.2
438      * @param request
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      * @since JSF 1.2
456      * @param encoding
457      * @throws java.io.UnsupportedEncodingException
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      * @since JSF 1.2
469      */
470     @Override
471     public String getRequestCharacterEncoding()
472     {
473         return _servletRequest.getCharacterEncoding();
474     }
475 
476     /**
477      * @since JSF 1.2
478      */
479     @Override
480     public String getResponseCharacterEncoding()
481     {
482         return _servletResponse.getCharacterEncoding();
483     }
484 
485     /**
486      * @since JSF 1.2
487      * @param response
488      */
489     @Override
490     public void setResponse(final java.lang.Object response)
491     {
492         this._servletResponse = (ServletResponse) response;
493     }
494 
495     /**
496      * @since JSF 1.2
497      * @param encoding
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 }