You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2008/08/14 01:14:32 UTC

svn commit: r685725 - in /myfaces/tomahawk/trunk/core: ./ src/main/java/org/apache/myfaces/webapp/filter/

Author: lu4242
Date: Wed Aug 13 16:14:31 2008
New Revision: 685725

URL: http://svn.apache.org/viewvc?rev=685725&view=rev
Log:
MYFACES-434 Make optional TomahawkFacesContextWrapper, and if ExtensionsFilter is correctly configured, use it rather than it.

Modified:
    myfaces/tomahawk/trunk/core/pom.xml
    myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/webapp/filter/ExtensionsFilter.java
    myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/webapp/filter/ServeResourcePhaseListener.java
    myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/webapp/filter/TomahawkFacesContextFactory.java

Modified: myfaces/tomahawk/trunk/core/pom.xml
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/pom.xml?rev=685725&r1=685724&r2=685725&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/core/pom.xml (original)
+++ myfaces/tomahawk/trunk/core/pom.xml Wed Aug 13 16:14:31 2008
@@ -57,6 +57,17 @@
       <scope>compile</scope>
     </dependency>
 
+    <!-- Transitive dependency from commons-fileupload.
+    in 1.2 it was declared optional, but t:inputFileUpload
+    uses it indirectly, so it is necessary to include it
+    in our pom as runtime dependency  -->
+    <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+      <version>1.3.2</version>
+      <scope>runtime</scope>
+    </dependency>
+
     <dependency>
       <groupId>commons-collections</groupId>
       <artifactId>commons-collections</artifactId>

Modified: myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/webapp/filter/ExtensionsFilter.java
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/webapp/filter/ExtensionsFilter.java?rev=685725&r1=685724&r2=685725&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/webapp/filter/ExtensionsFilter.java (original)
+++ myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/webapp/filter/ExtensionsFilter.java Wed Aug 13 16:14:31 2008
@@ -18,16 +18,24 @@
  */
 package org.apache.myfaces.webapp.filter;
 
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.fileupload.FileUpload;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.myfaces.renderkit.html.util.AddResource;
 import org.apache.myfaces.renderkit.html.util.AddResourceFactory;
 
-import javax.servlet.*;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
 /**
  * This filter is mandatory for the use of many tomahawk components.
  *
@@ -245,14 +253,6 @@
         HttpServletResponse httpResponse = (HttpServletResponse) response;
         HttpServletRequest httpRequest = (HttpServletRequest) request;
 
-        HttpServletRequest extendedRequest = httpRequest;
-
-        // For multipart/form-data requests
-        // This is done by TomahawkFacesContextWrapper
-        //if (FileUpload.isMultipartContent(httpRequest)) {
-        //    extendedRequest = new MultipartRequestWrapper(httpRequest, _uploadMaxFileSize, _uploadThresholdSize, _uploadRepositoryPath);
-        //}
-
         // Serve resources
         AddResource addResource;
 
@@ -270,7 +270,14 @@
             throw new ServletException(th);
         }
 
-        /*
+        HttpServletRequest extendedRequest = httpRequest;
+
+        // For multipart/form-data requests
+        // This is done by TomahawkFacesContextWrapper
+        if (FileUpload.isMultipartContent(httpRequest)) {
+            extendedRequest = new MultipartRequestWrapper(httpRequest, _uploadMaxFileSize, _uploadThresholdSize, _uploadRepositoryPath);
+        }
+        
         try
         {
             addResource.responseStarted();
@@ -336,9 +343,8 @@
         {
             addResource.responseFinished();         
         }
-        */
         
-        chain.doFilter(extendedRequest, response);
+        //chain.doFilter(extendedRequest, response);
     }
 
     public boolean isValidContentType(String contentType)

Modified: myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/webapp/filter/ServeResourcePhaseListener.java
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/webapp/filter/ServeResourcePhaseListener.java?rev=685725&r1=685724&r2=685725&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/webapp/filter/ServeResourcePhaseListener.java (original)
+++ myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/webapp/filter/ServeResourcePhaseListener.java Wed Aug 13 16:14:31 2008
@@ -35,7 +35,16 @@
 import org.apache.myfaces.tomahawk.util.ExternalContextUtils;
 
 /**
- * @author Martin Marinschek
+ * This listener is used for serve resources, as a replacement of 
+ * ExtensionsFilter serve resources feature.
+ * <p>
+ * The idea is map FacesServlet to org.apache.myfaces.RESOURCE_VIRTUAL_PATH
+ * (Default is "/faces/myFacesExtensionResource), so this
+ * listener can receive the request.
+ * </p>
+ * 
+ * @author Martin Marinschek (latest modification by $Author$)
+ * @version $Revision$ $Date$
  */
 public class ServeResourcePhaseListener implements PhaseListener {
 
@@ -84,7 +93,7 @@
 
                 try
                 {
-                    addResource= AddResourceFactory.getInstance(request,(ServletContext) fc.getExternalContext().getContext());
+                    addResource= AddResourceFactory.getInstance(request, context);
                     if( addResource.isResourceUri(context, request ) ){
                         addResource.serveResource(context, request, response);
                         event.getFacesContext().responseComplete();

Modified: myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/webapp/filter/TomahawkFacesContextFactory.java
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/webapp/filter/TomahawkFacesContextFactory.java?rev=685725&r1=685724&r2=685725&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/webapp/filter/TomahawkFacesContextFactory.java (original)
+++ myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/webapp/filter/TomahawkFacesContextFactory.java Wed Aug 13 16:14:31 2008
@@ -23,16 +23,32 @@
 import javax.faces.context.FacesContextFactory;
 import javax.faces.lifecycle.Lifecycle;
 import javax.servlet.ServletContext;
+import javax.servlet.ServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.apache.commons.fileupload.FileUpload;
 import org.apache.myfaces.renderkit.html.util.AddResource;
 import org.apache.myfaces.renderkit.html.util.AddResourceFactory;
 import org.apache.myfaces.tomahawk.util.ExternalContextUtils;
 
+/**
+ * The objective of this factory is this:
+ *  
+ * 1. Wrap a multipart request (used for t:inputFileUpload), 
+ *    so the request could be correctly decoded.
+ * 2. If a buffered instance of AddResource is configured, 
+ *    ExtensionsFilter must buffer and add the resource reference 
+ *    to the head of jsf pages (for example when it is used 
+ *    DefaultAddResource)
+ * 
+ * @author Martin Marinschek (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
 public class TomahawkFacesContextFactory extends FacesContextFactory {
 
+    public static final String DISABLE_TOMAHAWK_FACES_CONTEXT_WRAPPER = 
+        "org.apache.myfaces.DISABLE_TOMAHAWK_FACES_CONTEXT_WRAPPER";
+    
     private FacesContextFactory delegate;
 
     public TomahawkFacesContextFactory(FacesContextFactory delegate) {
@@ -43,23 +59,47 @@
         
         if(!ExternalContextUtils.getRequestType(context, request).isPortlet())
         {
-            //This is servlet world
-            //For handle buffered response we need to wrap response object here,
-            //so all response will be written and then on facesContext
-            //release() method write to the original response.
-            //This could not be done on TomahawkFacesContextWrapper
-            //constructor, because the delegate ExternalContext do
-            //calls like dispatch, forward and redirect, that requires
-            //the wrapped response instance to work properly.
-            AddResource addResource = AddResourceFactory.getInstance((HttpServletRequest)request,(ServletContext)context);
-            
-            if (addResource.requiresBuffer())
+            ServletRequest servletRequest = (ServletRequest) request;
+            ServletContext servletContext = (ServletContext) context;
+            // If no ExtensionsFilter wraps before the call, and 
+            //there is not a value indicating disabling the wrapping,
+            //use TomahawkFacesContextWrapper 
+            if (servletRequest.getAttribute(ExtensionsFilter.DOFILTER_CALLED) == null &&
+                    !getBooleanValue(servletContext.getInitParameter(
+                            DISABLE_TOMAHAWK_FACES_CONTEXT_WRAPPER), false))
             {
-                ExtensionsResponseWrapper extensionsResponseWrapper = new ExtensionsResponseWrapper((HttpServletResponse)response);
-                return new TomahawkFacesContextWrapper(delegate.getFacesContext(context, request, extensionsResponseWrapper, lifecycle),
-                        extensionsResponseWrapper);
+                //This is servlet world
+                //For handle buffered response we need to wrap response object here,
+                //so all response will be written and then on facesContext
+                //release() method write to the original response.
+                //This could not be done on TomahawkFacesContextWrapper
+                //constructor, because the delegate ExternalContext do
+                //calls like dispatch, forward and redirect, that requires
+                //the wrapped response instance to work properly.            
+                AddResource addResource = AddResourceFactory.getInstance((HttpServletRequest)request,(ServletContext)context);
+                
+                if (addResource.requiresBuffer())
+                {
+                    ExtensionsResponseWrapper extensionsResponseWrapper = new ExtensionsResponseWrapper((HttpServletResponse)response);
+                    return new TomahawkFacesContextWrapper(delegate.getFacesContext(context, request, extensionsResponseWrapper, lifecycle),
+                            extensionsResponseWrapper);
+                }
+            }
+            else
+            {
+                //The wrapping was done by extensions filter, so 
+                //TomahawkFacesContextWrapper is not needed
+                return delegate.getFacesContext(context, request, response, lifecycle);
             }
         }
         return new TomahawkFacesContextWrapper(delegate.getFacesContext(context, request, response, lifecycle));
     }
+    
+    private static boolean getBooleanValue(String initParameter, boolean defaultVal)
+    {
+        if(initParameter == null || initParameter.trim().length()==0)
+            return defaultVal;
+
+        return (initParameter.equalsIgnoreCase("on") || initParameter.equals("1") || initParameter.equalsIgnoreCase("true"));
+    }    
 }