Coverage Report - org.apache.myfaces.context.servlet.ServletExternalContextImpl
 
Classes in this File Line Coverage Branch Coverage Complexity
ServletExternalContextImpl
0%
0/313
0%
0/122
2.072
 
 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.OutputStream;
 23  
 import java.io.UnsupportedEncodingException;
 24  
 import java.io.Writer;
 25  
 import java.net.URLDecoder;
 26  
 import java.net.URLEncoder;
 27  
 import java.security.Principal;
 28  
 import java.util.ArrayList;
 29  
 import java.util.Arrays;
 30  
 import java.util.HashMap;
 31  
 import java.util.Iterator;
 32  
 import java.util.List;
 33  
 import java.util.Locale;
 34  
 import java.util.Map;
 35  
 import java.util.logging.Logger;
 36  
 
 37  
 import javax.faces.FacesException;
 38  
 import javax.faces.FactoryFinder;
 39  
 import javax.faces.context.FacesContext;
 40  
 import javax.faces.context.Flash;
 41  
 import javax.faces.context.FlashFactory;
 42  
 import javax.faces.context.PartialResponseWriter;
 43  
 import javax.faces.context.PartialViewContext;
 44  
 import javax.faces.lifecycle.ClientWindow;
 45  
 import javax.faces.render.ResponseStateManager;
 46  
 import javax.servlet.RequestDispatcher;
 47  
 import javax.servlet.ServletContext;
 48  
 import javax.servlet.ServletException;
 49  
 import javax.servlet.ServletRequest;
 50  
 import javax.servlet.ServletResponse;
 51  
 import javax.servlet.http.Cookie;
 52  
 import javax.servlet.http.HttpServletRequest;
 53  
 import javax.servlet.http.HttpServletResponse;
 54  
 import javax.servlet.http.HttpSession;
 55  
 
 56  
 import org.apache.myfaces.shared.context.flash.FlashImpl;
 57  
 import org.apache.myfaces.util.EnumerationIterator;
 58  
 
 59  
 /**
 60  
  * Implements the external context for servlet request. JSF 1.2, 6.1.3
 61  
  *
 62  
  * @author Manfred Geiler (latest modification by $Author$)
 63  
  * @author Anton Koinov
 64  
  * @version $Revision$ $Date$
 65  
  */
 66  
 public final class ServletExternalContextImpl extends ServletExternalContextImplBase
 67  
 {
 68  
     //private static final Log log = LogFactory.getLog(ServletExternalContextImpl.class);
 69  0
     private static final Logger log = Logger.getLogger(ServletExternalContextImpl.class.getName());
 70  
 
 71  
     private static final String URL_PARAM_SEPERATOR="&";
 72  
     private static final char URL_QUERY_SEPERATOR='?';
 73  
     private static final char URL_FRAGMENT_SEPERATOR='#';
 74  
     private static final String URL_NAME_VALUE_PAIR_SEPERATOR="=";
 75  
 
 76  
     private ServletRequest _servletRequest;
 77  
     private ServletResponse _servletResponse;
 78  
     private Map<String, Object> _sessionMap;
 79  
     private Map<String, Object> _requestMap;
 80  
     private Map<String, String> _requestParameterMap;
 81  
     private Map<String, String[]> _requestParameterValuesMap;
 82  
     private Map<String, String> _requestHeaderMap;
 83  
     private Map<String, String[]> _requestHeaderValuesMap;
 84  
     private Map<String, Object> _requestCookieMap;
 85  
     private HttpServletRequest _httpServletRequest;
 86  
     private HttpServletResponse _httpServletResponse;
 87  
     private String _requestServletPath;
 88  
     private String _requestPathInfo;
 89  
     private FlashFactory _flashFactory;
 90  
     private Flash _flash;
 91  
     private FacesContext _currentFacesContext;
 92  
 
 93  
     public ServletExternalContextImpl(final ServletContext servletContext, 
 94  
             final ServletRequest servletRequest,
 95  
             final ServletResponse servletResponse)
 96  
     {
 97  0
         super(servletContext); // initialize ServletExternalContextImplBase
 98  
         
 99  0
         _servletRequest = servletRequest;
 100  0
         _servletResponse = servletResponse;
 101  0
         _sessionMap = null;
 102  0
         _requestMap = null;
 103  0
         _requestParameterMap = null;
 104  0
         _requestParameterValuesMap = null;
 105  0
         _requestHeaderMap = null;
 106  0
         _requestHeaderValuesMap = null;
 107  0
         _requestCookieMap = null;
 108  0
         _httpServletRequest = isHttpServletRequest(servletRequest) ? (HttpServletRequest) servletRequest : null;
 109  0
         _httpServletResponse = isHttpServletResponse(servletResponse) ? (HttpServletResponse) servletResponse : null;
 110  
 
 111  0
         if (_httpServletRequest != null)
 112  
         {
 113  
             // HACK: MultipartWrapper scrambles the servletPath for some reason in Tomcat 4.1.29 embedded in JBoss
 114  
             // 3.2.3!?
 115  
             // (this was reported by frederic.auge [frederic.auge@laposte.net])
 116  0
             _requestServletPath = _httpServletRequest.getServletPath();
 117  0
             _requestPathInfo = _httpServletRequest.getPathInfo();
 118  
         }
 119  0
     }
 120  
     
 121  
     public ServletExternalContextImpl(final ServletContext servletContext, 
 122  
             final ServletRequest servletRequest,
 123  
             final ServletResponse servletResponse,
 124  
             final FlashFactory flashFactory)
 125  
     {
 126  0
         this(servletContext, servletRequest, servletResponse);
 127  0
         _flashFactory = flashFactory;
 128  0
     }
 129  
 
 130  
     public void release()
 131  
     {
 132  0
         super.release(); // releases fields on ServletExternalContextImplBase
 133  
         
 134  0
         _currentFacesContext = null;
 135  0
         _servletRequest = null;
 136  0
         _servletResponse = null;
 137  0
         _sessionMap = null;
 138  0
         _requestMap = null;
 139  0
         _requestParameterMap = null;
 140  0
         _requestParameterValuesMap = null;
 141  0
         _requestHeaderMap = null;
 142  0
         _requestHeaderValuesMap = null;
 143  0
         _requestCookieMap = null;
 144  0
         _httpServletRequest = null;
 145  0
         _httpServletResponse = null;
 146  0
     }
 147  
 
 148  
     @Override
 149  
     public Object getSession(boolean create)
 150  
     {
 151  0
         checkHttpServletRequest();
 152  0
         return ((HttpServletRequest) _servletRequest).getSession(create);
 153  
     }
 154  
     
 155  
     @Override
 156  
     public String getSessionId(boolean create)
 157  
     {
 158  0
         checkHttpServletRequest();
 159  0
         HttpSession session = ((HttpServletRequest) _servletRequest).getSession(create);
 160  0
         if (session != null)
 161  
         {
 162  0
             return session.getId();
 163  
         }
 164  
         else
 165  
         {
 166  0
             return "";
 167  
         }
 168  
     }
 169  
     
 170  
 
 171  
     @Override
 172  
     public Object getRequest()
 173  
     {
 174  0
         return _servletRequest;
 175  
     }
 176  
 
 177  
     /**
 178  
      * @since 2.0
 179  
      */
 180  
     @Override
 181  
     public int getRequestContentLength()
 182  
     {
 183  0
         return _servletRequest.getContentLength();
 184  
     }
 185  
 
 186  
     @Override
 187  
     public Object getResponse()
 188  
     {
 189  0
         return _servletResponse;
 190  
     }
 191  
 
 192  
     /**
 193  
      * @since 2.0
 194  
      */
 195  
     @Override
 196  
     public int getResponseBufferSize()
 197  
     {
 198  0
         return _servletResponse.getBufferSize();
 199  
     }
 200  
 
 201  
     @Override
 202  
     public String getResponseContentType()
 203  
     {
 204  0
         return _servletResponse.getContentType();
 205  
     }
 206  
 
 207  
     @Override
 208  
     public OutputStream getResponseOutputStream() throws IOException
 209  
     {
 210  0
         return _servletResponse.getOutputStream();
 211  
     }
 212  
 
 213  
     /**
 214  
      * @since JSF 2.0
 215  
      */
 216  
     @Override
 217  
     public Writer getResponseOutputWriter() throws IOException
 218  
     {
 219  0
         return _servletResponse.getWriter();
 220  
     }
 221  
 
 222  
     @Override
 223  
     public Map<String, Object> getSessionMap()
 224  
     {
 225  0
         if (_sessionMap == null)
 226  
         {
 227  0
             checkHttpServletRequest();
 228  0
             _sessionMap = new SessionMap(_httpServletRequest);
 229  
         }
 230  0
         return _sessionMap;
 231  
     }
 232  
 
 233  
     @Override
 234  
     public Map<String, Object> getRequestMap()
 235  
     {
 236  0
         if (_requestMap == null)
 237  
         {
 238  0
             _requestMap = new RequestMap(_servletRequest);
 239  
         }
 240  0
         return _requestMap;
 241  
     }
 242  
 
 243  
     @Override
 244  
     public Map<String, String> getRequestParameterMap()
 245  
     {
 246  0
         if (_requestParameterMap == null)
 247  
         {
 248  0
             _requestParameterMap = new RequestParameterMap(_servletRequest);
 249  
         }
 250  0
         return _requestParameterMap;
 251  
     }
 252  
 
 253  
     @Override
 254  
     public Map<String, String[]> getRequestParameterValuesMap()
 255  
     {
 256  0
         if (_requestParameterValuesMap == null)
 257  
         {
 258  0
             _requestParameterValuesMap = new RequestParameterValuesMap(_servletRequest);
 259  
         }
 260  0
         return _requestParameterValuesMap;
 261  
     }
 262  
 
 263  
     @Override
 264  
     public int getRequestServerPort()
 265  
     {
 266  0
         return _servletRequest.getServerPort();
 267  
     }
 268  
 
 269  
     @Override
 270  
     @SuppressWarnings("unchecked")
 271  
     public Iterator<String> getRequestParameterNames()
 272  
     {
 273  0
         return new EnumerationIterator(_servletRequest.getParameterNames());
 274  
     }
 275  
 
 276  
     @Override
 277  
     public Map<String, String> getRequestHeaderMap()
 278  
     {
 279  0
         if (_requestHeaderMap == null)
 280  
         {
 281  0
             checkHttpServletRequest();
 282  0
             _requestHeaderMap = new RequestHeaderMap(_httpServletRequest);
 283  
         }
 284  0
         return _requestHeaderMap;
 285  
     }
 286  
 
 287  
     @Override
 288  
     public Map<String, String[]> getRequestHeaderValuesMap()
 289  
     {
 290  0
         if (_requestHeaderValuesMap == null)
 291  
         {
 292  0
             checkHttpServletRequest();
 293  0
             _requestHeaderValuesMap = new RequestHeaderValuesMap(_httpServletRequest);
 294  
         }
 295  0
         return _requestHeaderValuesMap;
 296  
     }
 297  
 
 298  
     // FIXME: See with the EG if we can get the return value changed to Map<String, Cookie> as it
 299  
     //        would be more elegant -= Simon Lessard =-
 300  
     @Override
 301  
     public Map<String, Object> getRequestCookieMap()
 302  
     {
 303  0
         if (_requestCookieMap == null)
 304  
         {
 305  0
             checkHttpServletRequest();
 306  0
             _requestCookieMap = new CookieMap(_httpServletRequest);
 307  
         }
 308  
 
 309  0
         return _requestCookieMap;
 310  
     }
 311  
 
 312  
     @Override
 313  
     public Locale getRequestLocale()
 314  
     {
 315  0
         return _servletRequest.getLocale();
 316  
     }
 317  
 
 318  
     @Override
 319  
     public String getRequestPathInfo()
 320  
     {
 321  0
         checkHttpServletRequest();
 322  
         // return (_httpServletRequest).getPathInfo();
 323  
         // HACK: see constructor
 324  0
         return _requestPathInfo;
 325  
     }
 326  
 
 327  
     @Override
 328  
     public String getRequestContentType()
 329  
     {
 330  0
         return _servletRequest.getContentType();
 331  
     }
 332  
 
 333  
     @Override
 334  
     public String getRequestContextPath()
 335  
     {
 336  0
         checkHttpServletRequest();
 337  0
         return _httpServletRequest.getContextPath();
 338  
     }
 339  
 
 340  
     @Override
 341  
     public String getRequestScheme()
 342  
     {
 343  0
         return _servletRequest.getScheme();
 344  
     }
 345  
 
 346  
     @Override
 347  
     public String encodeActionURL(final String url)
 348  
     {
 349  0
         checkNull(url, "url");
 350  0
         checkHttpServletRequest();
 351  0
         String encodedUrl = ((HttpServletResponse) _servletResponse).encodeURL(url);
 352  0
         encodedUrl = encodeURL(encodedUrl, null);
 353  0
         return encodedUrl;
 354  
     }
 355  
 
 356  
     @Override
 357  
     public String encodeBookmarkableURL(String baseUrl, Map<String,List<String>> parameters)
 358  
     {
 359  0
         return encodeURL(baseUrl, parameters);
 360  
     }
 361  
 
 362  
     @Override
 363  
     public String encodeResourceURL(final String url)
 364  
     {
 365  0
         checkNull(url, "url");
 366  0
         checkHttpServletRequest();
 367  0
         return ((HttpServletResponse) _servletResponse).encodeURL(url);
 368  
     }
 369  
 
 370  
     @Override
 371  
     public String encodeNamespace(final String s)
 372  
     {
 373  0
         return s;
 374  
     }
 375  
 
 376  
     @Override
 377  
     public String encodePartialActionURL(String url)
 378  
     {
 379  0
         checkNull(url, "url");
 380  0
         checkHttpServletRequest();
 381  0
         return encodeURL(((HttpServletResponse) _servletResponse).encodeURL(url), null);
 382  
     }
 383  
 
 384  
     @Override
 385  
     public String encodeRedirectURL(String baseUrl, Map<String,List<String>> parameters)
 386  
     {
 387  0
         return _httpServletResponse.encodeRedirectURL(encodeURL(baseUrl, parameters));
 388  
     }
 389  
 
 390  
     @Override
 391  
     public void dispatch(final String requestURI) throws IOException, FacesException
 392  
     {
 393  0
         RequestDispatcher requestDispatcher = _servletRequest.getRequestDispatcher(requestURI);
 394  
 
 395  
         // If there is no dispatcher, send NOT_FOUND
 396  0
         if (requestDispatcher == null)
 397  
         {
 398  0
             ((HttpServletResponse) _servletResponse).sendError(HttpServletResponse.SC_NOT_FOUND);
 399  
 
 400  0
             return;
 401  
         }
 402  
 
 403  
         try
 404  
         {
 405  0
             requestDispatcher.forward(_servletRequest, _servletResponse);
 406  
         }
 407  0
         catch (ServletException e)
 408  
         {
 409  0
             if (e.getMessage() != null)
 410  
             {
 411  0
                 throw new FacesException(e.getMessage(), e);
 412  
             }
 413  
 
 414  0
             throw new FacesException(e);
 415  
 
 416  0
         }
 417  0
     }
 418  
 
 419  
     @Override
 420  
     public String getRequestServerName()
 421  
     {
 422  0
         return _servletRequest.getServerName();
 423  
     }
 424  
 
 425  
     @Override
 426  
     public String getRequestServletPath()
 427  
     {
 428  0
         checkHttpServletRequest();
 429  
         // return (_httpServletRequest).getServletPath();
 430  
         // HACK: see constructor
 431  0
         return _requestServletPath;
 432  
     }
 433  
 
 434  
     @Override
 435  
     public String getAuthType()
 436  
     {
 437  0
         checkHttpServletRequest();
 438  0
         return _httpServletRequest.getAuthType();
 439  
     }
 440  
 
 441  
     @Override
 442  
     public String getRemoteUser()
 443  
     {
 444  0
         checkHttpServletRequest();
 445  0
         return _httpServletRequest.getRemoteUser();
 446  
     }
 447  
 
 448  
     @Override
 449  
     public boolean isUserInRole(final String role)
 450  
     {
 451  0
         checkNull(role, "role");
 452  0
         checkHttpServletRequest();
 453  0
         return _httpServletRequest.isUserInRole(role);
 454  
     }
 455  
 
 456  
     @Override
 457  
     public Principal getUserPrincipal()
 458  
     {
 459  0
         checkHttpServletRequest();
 460  0
         return _httpServletRequest.getUserPrincipal();
 461  
     }
 462  
 
 463  
     @Override
 464  
     public void invalidateSession()
 465  
     {
 466  0
         HttpSession session = (HttpSession) getSession(false);
 467  
 
 468  0
         if (session != null)
 469  
         {
 470  0
             session.invalidate();
 471  
         }
 472  0
     }
 473  
 
 474  
     /**
 475  
      * @since 2.0
 476  
      */
 477  
     @Override
 478  
     public boolean isResponseCommitted()
 479  
     {
 480  0
         return _httpServletResponse.isCommitted();
 481  
     }
 482  
 
 483  
     @Override
 484  
     public void redirect(final String url) throws IOException
 485  
     {
 486  0
         FacesContext facesContext = getCurrentFacesContext();
 487  0
         PartialViewContext partialViewContext = facesContext.getPartialViewContext(); 
 488  0
         if (partialViewContext.isPartialRequest())
 489  
         {
 490  0
             PartialResponseWriter writer = partialViewContext.getPartialResponseWriter();
 491  0
             this.setResponseContentType("text/xml");
 492  0
             this.setResponseCharacterEncoding("UTF-8");
 493  0
             this.addResponseHeader("Cache-control", "no-cache");
 494  0
             writer.startDocument();
 495  0
             writer.redirect(url);
 496  0
             writer.endDocument();
 497  0
             facesContext.responseComplete();
 498  0
         }
 499  0
         else if (_servletResponse instanceof HttpServletResponse)
 500  
         {
 501  0
             ((HttpServletResponse) _servletResponse).sendRedirect(url);
 502  0
             facesContext.responseComplete();
 503  
         }
 504  
         else
 505  
         {
 506  0
             throw new IllegalArgumentException("Only HttpServletResponse supported");
 507  
         }
 508  0
     }
 509  
 
 510  
     /**
 511  
      * @since 2.0
 512  
      */
 513  
     @Override
 514  
     public void responseFlushBuffer() throws IOException
 515  
     {
 516  0
         checkHttpServletResponse();
 517  0
         _httpServletResponse.flushBuffer();
 518  0
     }
 519  
 
 520  
     /**
 521  
      * @since 2.0
 522  
      */
 523  
     @Override
 524  
     public void responseReset()
 525  
     {
 526  0
         checkHttpServletResponse();
 527  0
         _httpServletResponse.reset();
 528  0
     }
 529  
 
 530  
     /**
 531  
      * @since 2.0
 532  
      */
 533  
     @Override
 534  
     public void responseSendError(int statusCode, String message) throws IOException
 535  
     {
 536  0
         checkHttpServletResponse();
 537  0
         if (message == null)
 538  
         {
 539  0
             _httpServletResponse.sendError(statusCode);
 540  
         }
 541  
         else
 542  
         {
 543  0
             _httpServletResponse.sendError(statusCode, message);
 544  
         }
 545  0
     }
 546  
 
 547  
     @Override
 548  
     @SuppressWarnings("unchecked")
 549  
     public Iterator<Locale> getRequestLocales()
 550  
     {
 551  0
         checkHttpServletRequest();
 552  0
         return new EnumerationIterator(_httpServletRequest.getLocales());
 553  
     }
 554  
 
 555  
     /**
 556  
      * @since JSF 1.2
 557  
      * @param request
 558  
      */
 559  
     @Override
 560  
     public void setRequest(final java.lang.Object request)
 561  
     {
 562  0
         this._servletRequest = (ServletRequest) request;
 563  0
         this._httpServletRequest = isHttpServletRequest(_servletRequest) ? (HttpServletRequest) _servletRequest : null;
 564  0
         this._httpServletRequest = isHttpServletRequest(_servletRequest) ? (HttpServletRequest) _servletRequest : null;
 565  0
         this._requestHeaderMap = null;
 566  0
         this._requestHeaderValuesMap = null;
 567  0
         this._requestMap = null;
 568  0
         this._requestParameterMap = null;
 569  0
         this._requestParameterValuesMap = null;
 570  0
         this._requestCookieMap = null;
 571  0
         this._sessionMap = null;
 572  0
     }
 573  
 
 574  
     /**
 575  
      * @since JSF 1.2
 576  
      * @param encoding
 577  
      * @throws java.io.UnsupportedEncodingException
 578  
      */
 579  
     @Override
 580  
     public void setRequestCharacterEncoding(final java.lang.String encoding) throws java.io.UnsupportedEncodingException
 581  
     {
 582  
 
 583  0
         this._servletRequest.setCharacterEncoding(encoding);
 584  
 
 585  0
     }
 586  
 
 587  
     /**
 588  
      * @since JSF 1.2
 589  
      */
 590  
     @Override
 591  
     public String getRequestCharacterEncoding()
 592  
     {
 593  0
         return _servletRequest.getCharacterEncoding();
 594  
     }
 595  
 
 596  
     /**
 597  
      * @since JSF 1.2
 598  
      */
 599  
     @Override
 600  
     public String getResponseCharacterEncoding()
 601  
     {
 602  0
         return _servletResponse.getCharacterEncoding();
 603  
     }
 604  
 
 605  
     /**
 606  
      * @since JSF 1.2
 607  
      * @param response
 608  
      */
 609  
     @Override
 610  
     public void setResponse(final java.lang.Object response)
 611  
     {
 612  0
         this._servletResponse = (ServletResponse) response;
 613  0
     }
 614  
 
 615  
     /**
 616  
      * @since 2.0
 617  
      */
 618  
     @Override
 619  
     public void setResponseBufferSize(int size)
 620  
     {
 621  0
         checkHttpServletResponse();
 622  0
         _httpServletResponse.setBufferSize(size);
 623  0
     }
 624  
 
 625  
     /**
 626  
      * @since JSF 1.2
 627  
      * @param encoding
 628  
      */
 629  
     @Override
 630  
     public void setResponseCharacterEncoding(final java.lang.String encoding)
 631  
     {
 632  0
         this._servletResponse.setCharacterEncoding(encoding);
 633  0
     }
 634  
 
 635  
     /**
 636  
      * @since 2.0
 637  
      */
 638  
     @Override
 639  
     public void setResponseContentLength(int length)
 640  
     {
 641  0
         checkHttpServletResponse();
 642  0
         _httpServletResponse.setContentLength(length);
 643  0
     }
 644  
 
 645  
     @Override
 646  
     public void setResponseContentType(String contentType)
 647  
     {
 648  
         // If the response has not been committed yet.
 649  0
         if (!_servletResponse.isCommitted())
 650  
         {
 651  
             // Sets the content type of the response being sent to the client
 652  0
             _servletResponse.setContentType(contentType);
 653  
         }
 654  
         else
 655  
         {
 656  
             // I did not throw an exception just to be sure nothing breaks.
 657  0
             log.severe("Cannot set content type. Response already committed");
 658  
         }
 659  0
     }
 660  
 
 661  
     /**
 662  
      * @since 2.0
 663  
      */
 664  
     @Override
 665  
     public void setResponseHeader(String name, String value)
 666  
     {
 667  0
         checkHttpServletResponse();
 668  0
         _httpServletResponse.setHeader(name, value);
 669  0
     }
 670  
 
 671  
     @Override
 672  
     public void setResponseStatus(int statusCode)
 673  
     {
 674  0
         checkHttpServletResponse();
 675  0
         _httpServletResponse.setStatus(statusCode);
 676  0
     }
 677  
 
 678  
     private void checkHttpServletRequest()
 679  
     {
 680  0
         if (_httpServletRequest == null)
 681  
         {
 682  0
             throw new UnsupportedOperationException("Only HttpServletRequest supported");
 683  
         }
 684  0
     }
 685  
 
 686  
     private boolean isHttpServletRequest(final ServletRequest servletRequest)
 687  
     {
 688  0
         return servletRequest instanceof HttpServletRequest;
 689  
     }
 690  
 
 691  
     private void checkHttpServletResponse()
 692  
     {
 693  0
         if (_httpServletRequest == null)
 694  
         {
 695  0
             throw new UnsupportedOperationException("Only HttpServletResponse supported");
 696  
         }
 697  0
     }
 698  
     private boolean isHttpServletResponse(final ServletResponse servletResponse)
 699  
     {
 700  0
         return servletResponse instanceof HttpServletResponse;
 701  
     }
 702  
 
 703  
     /**
 704  
      * @since JSF 2.0
 705  
      */
 706  
     @Override
 707  
     public void addResponseCookie(final String name,
 708  
             final String value, final Map<String, Object> properties)
 709  
     {
 710  0
         checkHttpServletResponse();
 711  0
         Cookie cookie = new Cookie(name, value);
 712  0
         if (properties != null)
 713  
         {
 714  0
             for (Map.Entry<String, Object> entry : properties.entrySet())
 715  
             {
 716  0
                 String propertyKey = entry.getKey();
 717  0
                 Object propertyValue = entry.getValue();
 718  0
                 if ("comment".equals(propertyKey))
 719  
                 {
 720  0
                     cookie.setComment((String) propertyValue);
 721  0
                     continue;
 722  
                 }
 723  0
                 else if ("domain".equals(propertyKey))
 724  
                 {
 725  0
                     cookie.setDomain((String)propertyValue);
 726  0
                     continue;
 727  
                 }
 728  0
                 else if ("maxAge".equals(propertyKey))
 729  
                 {
 730  0
                     cookie.setMaxAge((Integer) propertyValue);
 731  0
                     continue;
 732  
                 }
 733  0
                 else if ("secure".equals(propertyKey))
 734  
                 {
 735  0
                     cookie.setSecure((Boolean) propertyValue);
 736  0
                     continue;
 737  
                 }
 738  0
                 else if ("path".equals(propertyKey))
 739  
                 {
 740  0
                     cookie.setPath((String) propertyValue);
 741  0
                     continue;
 742  
                 }
 743  0
                 else if ("httpOnly".equals(propertyKey))
 744  
                 {
 745  0
                     cookie.setHttpOnly((Boolean) propertyValue);
 746  0
                     continue;
 747  
                 }
 748  0
                 throw new IllegalArgumentException("Unused key when creating Cookie");
 749  
             }
 750  
         }
 751  0
         _httpServletResponse.addCookie(cookie);
 752  0
     }
 753  
 
 754  
     @Override
 755  
     public void addResponseHeader(String name, String value)
 756  
     {
 757  0
         _httpServletResponse.addHeader(name, value);
 758  0
     }
 759  
 
 760  
     private String encodeURL(String baseUrl, Map<String, List<String>> parameters)
 761  
     {
 762  0
         checkNull(baseUrl, "url");
 763  0
         checkHttpServletRequest();
 764  
 
 765  0
         String fragment = null;
 766  0
         String queryString = null;
 767  0
         Map<String, List<String>> paramMap = null;
 768  
 
 769  
         //extract any URL fragment
 770  0
         int index = baseUrl.indexOf(URL_FRAGMENT_SEPERATOR);
 771  0
         if (index != -1)
 772  
         {
 773  0
             fragment = baseUrl.substring(index+1);
 774  0
             baseUrl = baseUrl.substring(0,index);
 775  
         }
 776  
 
 777  
         //extract the current query string and add the params to the paramMap
 778  0
         index = baseUrl.indexOf(URL_QUERY_SEPERATOR);
 779  0
         if (index != -1)
 780  
         {
 781  0
             queryString = baseUrl.substring(index + 1);
 782  0
             baseUrl = baseUrl.substring(0, index);
 783  0
             String[] nameValuePairs = queryString.split(URL_PARAM_SEPERATOR);
 784  0
             for (int i = 0; i < nameValuePairs.length; i++)
 785  
             {
 786  0
                 String[] currentPair = nameValuePairs[i].split(URL_NAME_VALUE_PAIR_SEPERATOR);
 787  0
                 String currentName = currentPair[0];
 788  
 
 789  0
                 if (paramMap == null)
 790  
                 {
 791  0
                     paramMap = new HashMap<String, List<String>>();
 792  
                 }
 793  
                 
 794  0
                 List<String> values = paramMap.get(currentName);
 795  0
                 if (values == null)
 796  
                 {
 797  0
                     values = new ArrayList<String>(1);
 798  0
                     paramMap.put(currentName, values);
 799  
                 }
 800  
  
 801  
                 try
 802  
                 {
 803  0
                     values.add(currentPair.length > 1
 804  
                                 ? URLDecoder.decode(currentPair[1], getResponseCharacterEncoding())
 805  
                                 : "");
 806  
                 }
 807  0
                 catch (UnsupportedEncodingException e)
 808  
                 {
 809  
                     //shouldn't ever get here
 810  0
                     throw new UnsupportedOperationException("Encoding type=" + getResponseCharacterEncoding()
 811  
                                                             + " not supported", e);
 812  0
                 }
 813  
             }
 814  
         }
 815  
 
 816  
         //add/update with new params on the paramMap
 817  0
         if (parameters != null && parameters.size() > 0)
 818  
         {
 819  0
             for (Map.Entry<String, List<String>> pair : parameters.entrySet())
 820  
             {
 821  0
                 if (pair.getKey() != null && pair.getKey().trim().length() != 0)
 822  
                 {
 823  0
                     if (paramMap == null)
 824  
                     {
 825  0
                         paramMap = new HashMap<String, List<String>>();
 826  
                     }
 827  0
                     paramMap.put(pair.getKey(), pair.getValue());
 828  
                 }
 829  0
             }
 830  
         }
 831  
         
 832  0
         FacesContext facesContext = getCurrentFacesContext();
 833  0
         ClientWindow window = facesContext.getExternalContext().getClientWindow();
 834  0
         if (window != null && window.isClientWindowRenderModeEnabled(facesContext))
 835  
         {
 836  0
             if (paramMap == null)
 837  
             {
 838  0
                 paramMap = new HashMap<String, List<String>>();
 839  
             }
 840  
 
 841  0
             if (!paramMap.containsKey(ResponseStateManager.CLIENT_WINDOW_URL_PARAM))
 842  
             {
 843  0
                 paramMap.put(ResponseStateManager.CLIENT_WINDOW_URL_PARAM, Arrays.asList(window.getId()));
 844  
             }
 845  
 
 846  0
             Map<String, String> additionalQueryURLParameters = window.getQueryURLParameters(facesContext);
 847  0
             if (additionalQueryURLParameters != null)
 848  
             {
 849  0
                 for (Map.Entry<String , String> entry : additionalQueryURLParameters.entrySet())
 850  
                 {
 851  0
                     paramMap.put(entry.getKey(), Arrays.asList(entry.getValue()));
 852  0
                 }
 853  
             }
 854  
         }    
 855  
 
 856  0
         boolean hasParams = paramMap != null && paramMap.size()>0;
 857  
 
 858  0
         if (!hasParams && fragment == null)
 859  
         {
 860  0
             return baseUrl;
 861  
         }
 862  
 
 863  
         // start building the new URL
 864  0
         StringBuilder newUrl = new StringBuilder(baseUrl);
 865  
 
 866  
         //now add the updated param list onto the url
 867  0
         if (hasParams)
 868  
         {
 869  0
             boolean isFirstPair = true;
 870  0
             for (Map.Entry<String, List<String>> pair : paramMap.entrySet())
 871  
             {
 872  0
                 for (String value : pair.getValue())
 873  
                 {
 874  0
                     if (!isFirstPair)
 875  
                     {
 876  0
                         newUrl.append(URL_PARAM_SEPERATOR);
 877  
                     }
 878  
                     else
 879  
                     {
 880  0
                         newUrl.append(URL_QUERY_SEPERATOR);
 881  0
                         isFirstPair = false;
 882  
                     }
 883  
 
 884  0
                     newUrl.append(pair.getKey());
 885  0
                     newUrl.append(URL_NAME_VALUE_PAIR_SEPERATOR);
 886  
                     try
 887  
                     {
 888  0
                         newUrl.append(URLEncoder.encode(value,getResponseCharacterEncoding()));
 889  
                     }
 890  0
                     catch (UnsupportedEncodingException e)
 891  
                     {
 892  
                         //shouldn't ever get here
 893  0
                         throw new UnsupportedOperationException("Encoding type=" + getResponseCharacterEncoding()
 894  
                                                                 + " not supported", e);
 895  0
                     }
 896  0
                 }
 897  0
             }
 898  
         }
 899  
 
 900  
         //add the fragment back on (if any)
 901  0
         if (fragment != null)
 902  
         {
 903  0
             newUrl.append(URL_FRAGMENT_SEPERATOR);
 904  0
             newUrl.append(fragment);
 905  
         }
 906  
 
 907  0
         return newUrl.toString();
 908  
     }
 909  
     
 910  
     /**
 911  
      * @since 2.0
 912  
      */
 913  
     public Flash getFlash()
 914  
     {
 915  0
         if (_flash == null)
 916  
         {
 917  0
             if (_flashFactory == null)
 918  
             {
 919  0
                 _flashFactory = (FlashFactory) FactoryFinder.getFactory(
 920  
                     FactoryFinder.FLASH_FACTORY);
 921  0
                 if (_flashFactory == null)
 922  
                 {
 923  
                     //Fallback to servlet default flash
 924  0
                     _flash = FlashImpl.getCurrentInstance(this);
 925  
                 }
 926  
                 else
 927  
                 {
 928  0
                     _flash = _flashFactory.getFlash(true);
 929  
                 }
 930  
             }
 931  
             else
 932  
             {
 933  0
                 _flash = _flashFactory.getFlash(true);
 934  
             }
 935  
         }
 936  0
         return _flash;
 937  
         //return FlashImpl.getCurrentInstance(this);
 938  
     }
 939  
 
 940  
     @Override
 941  
     public boolean isSecure()
 942  
     {
 943  0
         return _servletRequest.isSecure();
 944  
     }
 945  
 
 946  
     @Override
 947  
     public int getSessionMaxInactiveInterval()
 948  
     {
 949  0
         HttpSession session = _httpServletRequest.getSession();
 950  0
         return session.getMaxInactiveInterval();
 951  
     }
 952  
     
 953  
     @Override
 954  
     public void setSessionMaxInactiveInterval(int interval)
 955  
     {
 956  0
         HttpSession session = _httpServletRequest.getSession();
 957  0
         session.setMaxInactiveInterval(interval);
 958  0
     }
 959  
     
 960  
     protected FacesContext getCurrentFacesContext()
 961  
     {
 962  0
         if (_currentFacesContext == null)
 963  
         {
 964  0
             _currentFacesContext = FacesContext.getCurrentInstance();
 965  
         }
 966  0
         return _currentFacesContext;
 967  
     }
 968  
 }