You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ma...@apache.org on 2007/08/10 09:32:29 UTC

svn commit: r564496 - in /myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal: config/xmlHttp/ renderkit/core/ webapp/

Author: matzew
Date: Fri Aug 10 00:32:25 2007
New Revision: 564496

URL: http://svn.apache.org/viewvc?view=rev&rev=564496
Log:
Merged Adam's commit "Revision: 564273" to the 102-release tag

TRINIDAD-46: PPR over AJAX
- A final bug fix before releasing 1.0.2: ensure that all incoming AJAX requests are
 decoded into UTF-8, instead of the encoding of the original page.
- Thanks to Daniel Niklas for identifying the issue

Added:
    myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/xmlHttp/XmlHttpServletRequest.java
Modified:
    myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/xmlHttp/XmlHttpConfigurator.java
    myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/xmlHttp/XmlHttpServletResponse.java
    myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/CoreRenderKit.java
    myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/TrinidadFilterImpl.java

Modified: myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/xmlHttp/XmlHttpConfigurator.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/xmlHttp/XmlHttpConfigurator.java?view=diff&rev=564496&r1=564495&r2=564496
==============================================================================
--- myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/xmlHttp/XmlHttpConfigurator.java (original)
+++ myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/xmlHttp/XmlHttpConfigurator.java Fri Aug 10 00:32:25 2007
@@ -27,6 +27,7 @@
 import javax.faces.context.ExternalContext;
 
 import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletResponse;
 
@@ -56,6 +57,11 @@
   public static ServletResponse getWrappedServletResponse(ServletResponse response)
   {
     return new XmlHttpServletResponse(response);
+  }
+
+  public static ServletRequest getAjaxServletRequest(ServletRequest request)
+  {
+    return new XmlHttpServletRequest(request);
   }
 
   public static void beginRequest(ExternalContext externalContext)

Added: myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/xmlHttp/XmlHttpServletRequest.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/xmlHttp/XmlHttpServletRequest.java?view=auto&rev=564496
==============================================================================
--- myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/xmlHttp/XmlHttpServletRequest.java (added)
+++ myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/xmlHttp/XmlHttpServletRequest.java Fri Aug 10 00:32:25 2007
@@ -0,0 +1,66 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.myfaces.trinidadinternal.config.xmlHttp;
+
+import java.io.UnsupportedEncodingException;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+
+import org.apache.myfaces.trinidad.logging.TrinidadLogger;
+
+/**
+ * Wrapper used to force AJAX requests to be treated as UTF-8,
+ * since they all are UTF-8.
+ */
+@SuppressWarnings("deprecation")
+final class XmlHttpServletRequest extends HttpServletRequestWrapper
+{
+  XmlHttpServletRequest(ServletRequest request)
+  {
+    super((HttpServletRequest)request);
+    
+    try
+    {
+      super.setCharacterEncoding("UTF-8");
+    }
+    catch (UnsupportedEncodingException uee)
+    {
+      // Should NEVER happen, since UTF-8 is supported everywhere
+      _LOG.severe(uee);
+    }
+  }
+  
+  @Override
+  public void setCharacterEncoding(String encoding)
+  {
+    _LOG.fine("Ignoring attempt to set encoding to {0} in an AJAX request",
+              encoding);
+  }
+  
+  @Override
+  public String getCharacterEncoding()
+  {
+    return "UTF-8";
+  }
+  
+  static private final TrinidadLogger _LOG =
+    TrinidadLogger.createTrinidadLogger(XmlHttpServletRequest.class); 
+}

Modified: myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/xmlHttp/XmlHttpServletResponse.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/xmlHttp/XmlHttpServletResponse.java?view=diff&rev=564496&r1=564495&r2=564496
==============================================================================
--- myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/xmlHttp/XmlHttpServletResponse.java (original)
+++ myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/xmlHttp/XmlHttpServletResponse.java Fri Aug 10 00:32:25 2007
@@ -29,6 +29,7 @@
 import org.apache.myfaces.trinidad.logging.TrinidadLogger;
 import org.apache.myfaces.trinidadinternal.renderkit.core.ppr.XmlResponseWriter;
 
+@SuppressWarnings("deprecation")
 final class XmlHttpServletResponse extends HttpServletResponseWrapper
 {
   XmlHttpServletResponse(ServletResponse response)

Modified: myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/CoreRenderKit.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/CoreRenderKit.java?view=diff&rev=564496&r1=564495&r2=564496
==============================================================================
--- myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/CoreRenderKit.java (original)
+++ myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/CoreRenderKit.java Fri Aug 10 00:32:25 2007
@@ -147,6 +147,11 @@
     return "org.apache.myfaces.trinidad.core.desktop";
   }
 
+  static public boolean isAjaxRequest(ExternalContext ec)
+  {
+    return "true".equals(ec.getRequestHeaderMap().get(_PPR_REQUEST_HEADER));
+  }
+
   static public boolean isPartialRequest(Map<String, String[]> parameters)
   {
     String[] array = parameters.get(_PPR_REQUEST_HEADER);
@@ -157,7 +162,9 @@
 
   static public boolean isPartialRequest(ExternalContext ec)
   {
-    return "true".equals(ec.getRequestHeaderMap().get(_PPR_REQUEST_HEADER)) ||
+    // A partial request could be an AJAX request, or it could
+    // be an IFRAME-postback to handle file upload
+    return isAjaxRequest(ec) ||
            "true".equals(ec.getRequestParameterMap().get(_PPR_REQUEST_HEADER));    
   }
   

Modified: myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/TrinidadFilterImpl.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/TrinidadFilterImpl.java?view=diff&rev=564496&r1=564495&r2=564496
==============================================================================
--- myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/TrinidadFilterImpl.java (original)
+++ myfaces/trinidad/tags/trinidad-1.0.2/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/TrinidadFilterImpl.java Fri Aug 10 00:32:25 2007
@@ -137,7 +137,19 @@
     }
     else
     {
-      isPartialRequest = CoreRenderKit.isPartialRequest(externalContext);
+      // Only test for AJAX request, since file uploads *should* be
+      // handled by the above test.  NOTE: this will not necessarily
+      // work if someone is using Trinidad PPR with non-Trinidad 
+      // file upload!  I've no idea currently how to cleanly handle
+      // that combination in JSF 1.1.  We don't want to ask if
+      // its a partial request here, as this requires getting a
+      // query parameter, but that could block setting
+      // the character set later in the request in some app servers!
+      isPartialRequest = CoreRenderKit.isAjaxRequest(externalContext);
+      if (isPartialRequest)
+      {
+        request = XmlHttpConfigurator.getAjaxServletRequest(request);
+      }
     }
 
     if (isPartialRequest)