You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by so...@apache.org on 2009/01/29 21:02:51 UTC

svn commit: r738986 - in /myfaces/trinidad/branches/sobryan-portlet: ./ trinidad-api/ trinidad-api/src/main/java/org/apache/myfaces/trinidad/config/ trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/ trinidad-impl/ trinidad-impl/src/main/java...

Author: sobryan
Date: Thu Jan 29 20:02:50 2009
New Revision: 738986

URL: http://svn.apache.org/viewvc?rev=738986&view=rev
Log:
A number of changes to prototype Portlet 2.0

Added:
    myfaces/trinidad/branches/sobryan-portlet/trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/RequestStateMap.java
    myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchResourceResponse.java
    myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/ResourceUploadRequestWrapper.java
Removed:
    myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/wrappers/ActionRequestWrapper.java
    myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/wrappers/ActionResponseWrapper.java
    myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/wrappers/PortletContextWrapper.java
    myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/wrappers/PortletRequestDispatcherWrapper.java
    myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/wrappers/PortletRequestWrapper.java
    myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/wrappers/PortletResponseWrapper.java
    myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/wrappers/RenderRequestWrapper.java
    myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/wrappers/RenderResponseWrapper.java
Modified:
    myfaces/trinidad/branches/sobryan-portlet/pom.xml
    myfaces/trinidad/branches/sobryan-portlet/trinidad-api/pom.xml
    myfaces/trinidad/branches/sobryan-portlet/trinidad-api/src/main/java/org/apache/myfaces/trinidad/config/Configurator.java
    myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/pom.xml
    myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/GlobalConfiguratorImpl.java
    myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchRenderResponse.java
    myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchResponseConfiguratorImpl.java
    myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/ActionUploadRequestWrapper.java
    myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/FileUploadConfiguratorImpl.java

Modified: myfaces/trinidad/branches/sobryan-portlet/pom.xml
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/pom.xml?rev=738986&r1=738985&r2=738986&view=diff
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/pom.xml (original)
+++ myfaces/trinidad/branches/sobryan-portlet/pom.xml Thu Jan 29 20:02:50 2009
@@ -40,15 +40,16 @@
     <!-- Standards -->
     <jdk.version>1.5</jdk.version>    
     <servlet.version>2.5</servlet.version>
-    <portlet.version>1.0</portlet.version>
+    <portlet.version>2.0</portlet.version>
     <jsp.version>2.1</jsp.version>
     <jstl.version>1.2</jstl.version>
     <jsf-spec.version>1.2</jsf-spec.version>
     <jsf-ri.version>1.2_09</jsf-ri.version>
     <jsf-myfaces.version>1.2.4</jsf-myfaces.version>
     <jsf-facelets.version>1.1.14</jsf-facelets.version>
-    <portlet-bridge.version>1.0.0-alpha-2</portlet-bridge.version>
+    <portlet-bridge.version>2.0.0-alpha</portlet-bridge.version>
     <commons-lang.version>2.4</commons-lang.version>
+    <myfaces-commons.version>1.0.1-SNAPSHOT</myfaces-commons.version>
     
     <!-- Testing -->
     <shale.version>1.0.4</shale.version>
@@ -261,6 +262,12 @@
       </dependency>
 
       <dependency>
+        <groupId>org.apache.myfaces.commons</groupId>
+        <artifactId>myfaces-commons-utils12</artifactId>
+        <version>${myfaces-commons.version}</version>
+      </dependency>      
+
+      <dependency>
         <groupId>org.apache.myfaces.trinidad</groupId>
         <artifactId>trinidad-build</artifactId>
         <version>${pom.version}</version>
@@ -313,7 +320,7 @@
         <artifactId>junit</artifactId>
         <version>${junit.version}</version>
         <scope>test</scope>
-      </dependency>      
+      </dependency>
     </dependencies>
   </dependencyManagement>
 

Modified: myfaces/trinidad/branches/sobryan-portlet/trinidad-api/pom.xml
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-api/pom.xml?rev=738986&r1=738985&r2=738986&view=diff
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-api/pom.xml (original)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-api/pom.xml Thu Jan 29 20:02:50 2009
@@ -61,6 +61,16 @@
       <scope>provided</scope> <!-- force provided scope here -->
     </dependency>
 
+    <dependency>
+      <groupId>org.apache.myfaces.portlet-bridge</groupId>
+      <artifactId>portlet-bridge-api</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.myfaces.commons</groupId>
+      <artifactId>myfaces-commons-utils12</artifactId>
+    </dependency>
+
     <!-- "test" scope dependencies -->
     <dependency>
       <groupId>junit</groupId>

Modified: myfaces/trinidad/branches/sobryan-portlet/trinidad-api/src/main/java/org/apache/myfaces/trinidad/config/Configurator.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-api/src/main/java/org/apache/myfaces/trinidad/config/Configurator.java?rev=738986&r1=738985&r2=738986&view=diff
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-api/src/main/java/org/apache/myfaces/trinidad/config/Configurator.java (original)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-api/src/main/java/org/apache/myfaces/trinidad/config/Configurator.java Thu Jan 29 20:02:50 2009
@@ -21,6 +21,8 @@
 import javax.faces.context.ExternalContext;
 import javax.servlet.ServletRequest;
 
+import org.apache.myfaces.trinidad.util.RequestStateMap;
+
 /**
  * This defines an abstract class for the Configurator. Classes implementing
  * this abstraction should be listed in the jar's /META-INF/services folder
@@ -158,7 +160,7 @@
    */
   public static final void disableConfiguratorServices(ServletRequest srq)
   {
-    srq.setAttribute(_DISABLE_SERVICES, Boolean.TRUE);
+    RequestStateMap.getInstance(srq).put(_DISABLE_SERVICES, Boolean.TRUE);
   }
 
   /**
@@ -180,7 +182,7 @@
    */
   protected static final boolean isConfiguratorServiceDisabled(ExternalContext ec)
   {
-    return Boolean.TRUE.equals(ec.getRequestMap().get(_DISABLE_SERVICES));
+    return Boolean.TRUE.equals(RequestStateMap.getInstance(ec).get(_DISABLE_SERVICES));
   }
 
   static private final String _DISABLE_SERVICES =  Configurator.class.getName()+".DISABLE_SERVICES";

Added: myfaces/trinidad/branches/sobryan-portlet/trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/RequestStateMap.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/RequestStateMap.java?rev=738986&view=auto
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/RequestStateMap.java (added)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/RequestStateMap.java Thu Jan 29 20:02:50 2009
@@ -0,0 +1,94 @@
+package org.apache.myfaces.trinidad.util;
+
+import java.lang.reflect.Method;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.faces.context.ExternalContext;
+
+import javax.portlet.faces.annotation.ExcludeFromManagedRequestScope;
+
+import javax.servlet.ServletRequest;
+
+import org.apache.myfaces.commons.util.RequestType;
+
+/**
+ * TODO: get rid of this object
+ */
+ @ExcludeFromManagedRequestScope
+ public class RequestStateMap extends HashMap<String, Object>
+ {
+   static public RequestStateMap getInstance(ServletRequest req)
+   {
+     RequestStateMap map = (RequestStateMap)req.getAttribute(_STATE_MAP);
+     
+     if(map == null)
+     {
+       map = new RequestStateMap();
+       req.setAttribute(_STATE_MAP, map);
+     }
+     
+     return map;
+   }
+   
+   static public RequestStateMap getInstance(ExternalContext ec)
+   {
+     Map<String, Object> reqMap = ec.getRequestMap();
+     RequestStateMap map = (RequestStateMap)reqMap.get(_STATE_MAP);
+     
+     //For now, always check this on a render so it can be removed from the session.
+     //This can be optimized to only save the state when request attributes are NOT preserved
+     if(RequestType.RENDER.equals(org.apache.myfaces.commons.util.ExternalContextUtils.getRequestType(ec)))
+     {
+       String uuid = ec.getRequestParameterMap().get(_STATE_MAP);
+       if(uuid!= null)
+       {
+          RequestStateMap myMap= (RequestStateMap)ec.getSessionMap().remove(_STATE_MAP+"."+uuid);
+          if(map == null)
+          {
+            map = myMap;
+          }
+          else
+          {
+            //TODO: put optimization code here
+          }
+       }
+     }
+     
+     if(map == null)
+     {
+       map = new RequestStateMap();
+       reqMap.put(_STATE_MAP, map);
+     }
+     
+     return map;
+   }
+   
+   private RequestStateMap(){};
+   
+   public void saveState(ExternalContext ec)
+   {
+     if(RequestType.ACTION.equals(org.apache.myfaces.commons.util.ExternalContextUtils.getRequestType(ec)))
+     {
+       try
+       {
+         //TODO: use reflection here but it can be replaced..
+         Object actionResp = ec.getResponse();
+         Method m = actionResp.getClass().getMethod("setRenderParameter", String.class, String.class);
+         String uuid = UUID.randomUUID().toString();
+
+         ec.getRequestMap().put(_STATE_MAP+"."+uuid, this);
+         m.invoke(actionResp, _STATE_MAP, uuid);
+       }
+       catch(Throwable t)
+       {
+         //TODO: Log exception
+         t.printStackTrace();
+       }
+     }
+   }
+   
+   private static final String _STATE_MAP = RequestStateMap.class.getName();
+ }

Modified: myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/pom.xml
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/pom.xml?rev=738986&r1=738985&r2=738986&view=diff
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/pom.xml (original)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/pom.xml Thu Jan 29 20:02:50 2009
@@ -81,6 +81,11 @@
       <artifactId>jsf-facelets</artifactId>
     </dependency>
 
+    <dependency>
+      <groupId>org.apache.myfaces.commons</groupId>
+      <artifactId>myfaces-commons-utils12</artifactId>
+    </dependency>
+
     <!-- "test" scope dependencies -->
     <dependency>
       <groupId>org.apache.myfaces.trinidad</groupId>

Modified: myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/GlobalConfiguratorImpl.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/GlobalConfiguratorImpl.java?rev=738986&r1=738985&r2=738986&view=diff
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/GlobalConfiguratorImpl.java (original)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/GlobalConfiguratorImpl.java Thu Jan 29 20:02:50 2009
@@ -19,14 +19,20 @@
 
 package org.apache.myfaces.trinidadinternal.config;
 
+import java.lang.reflect.Method;
+
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import java.util.UUID;
 import java.util.concurrent.atomic.AtomicReference;
 
 import javax.faces.context.ExternalContext;
 
+import javax.portlet.faces.annotation.ExcludeFromManagedRequestScope;
+
+import javax.servlet.ServletContext;
 import javax.servlet.ServletRequest;
 
 import javax.servlet.ServletRequestWrapper;
@@ -40,6 +46,9 @@
 import org.apache.myfaces.trinidad.logging.TrinidadLogger;
 import org.apache.myfaces.trinidad.skin.SkinFactory;
 import org.apache.myfaces.trinidad.util.ClassLoaderUtils;
+import org.apache.myfaces.commons.util.ExternalContextUtils;
+import org.apache.myfaces.commons.util.RequestType;
+import org.apache.myfaces.trinidad.util.RequestStateMap;
 import org.apache.myfaces.trinidadinternal.context.RequestContextFactoryImpl;
 import org.apache.myfaces.trinidadinternal.context.external.ServletCookieMap;
 import org.apache.myfaces.trinidadinternal.context.external.ServletRequestHeaderMap;
@@ -49,7 +58,6 @@
 import org.apache.myfaces.trinidadinternal.context.external.ServletRequestParameterValuesMap;
 import org.apache.myfaces.trinidadinternal.skin.SkinFactoryImpl;
 import org.apache.myfaces.trinidadinternal.skin.SkinUtils;
-import org.apache.myfaces.trinidad.util.ExternalContextUtils;
 
 /**
  * This is the implementation of the Trinidad's Global configurator. It provides the entry point for
@@ -123,7 +131,7 @@
    */
   static public boolean isRequestStarted(final ExternalContext ec)
   {
-    return (RequestType.getType(ec) != null);
+    return (RequestStateMap.getInstance(ec).get(_STATE_REQUEST_TYPE) != null);
   }
 
   /**
@@ -182,13 +190,16 @@
   {
     // asserts for debug which disappear in production
     assert externalContext != null;
-
+    RequestStateMap state = RequestStateMap.getInstance(externalContext);
+    RequestType reqType = (RequestType)state.get(_STATE_REQUEST_TYPE);
+ 
     // Do per-virtual request stuff
-    if (RequestType.getType(externalContext) == null)
+    if (reqType == null)
     {
-      // RequestType may change in a portal environment. Make sure it's set up to enforce the
-      // contracts
-      RequestType.setType(externalContext);
+      reqType = ExternalContextUtils.getRequestType(externalContext);
+      // RequestType may change in a portal environment. Make sure it's set up 
+      // to enforce the contracts
+      state.put(_STATE_REQUEST_TYPE, reqType);
 
       // By contract, Configurators beginRequest is only called once per physical request.
       // The globalConfigurator may be called multiple times, however, so we need to enforce
@@ -203,7 +214,7 @@
 
         _attachRequestContext(externalContext);
 
-        if (externalContext.getRequestMap().get(_IN_REQUEST) == null)
+        if (state.get(_IN_REQUEST) == null)
         {
           _startConfiguratorServiceRequest(externalContext);
         }
@@ -213,7 +224,7 @@
         _LOG.fine("GlobalConfigurator: Configurators have been disabled for this request.");
       }
     }
-    else if (!RequestType.isCorrectType(externalContext))
+    else if (reqType.equals(state.get(_STATE_REQUEST_TYPE)))
     {
       // This will happen if the actionRequest was not ended before dispatching to the render
       // request
@@ -275,28 +286,35 @@
   @Override
   public void endRequest(final ExternalContext externalContext)
   {
+    RequestStateMap state = RequestStateMap.getInstance(externalContext);
+    boolean responseWritable = ExternalContextUtils.isResponseWritable(externalContext);
+    
     // do per virtual-request stuff
-    if (RequestType.getType(externalContext) != null)
+    if (state.get(_STATE_REQUEST_TYPE) != null)
     {
       if (!_isDisabled(externalContext))
       {
         try
         {
-          final RequestType type = RequestType.getType(externalContext);
+          final RequestType type = ExternalContextUtils.getRequestType(externalContext);
   
           // Do not end services at the end of a portal action request
-          if (type != RequestType.PORTAL_ACTION)
+          if (responseWritable)
           {
             _endConfiguratorServiceRequest(externalContext);
           }
         }
         finally
         {
+          if(!responseWritable)
+          {
+            state.saveState(externalContext);
+          }
           _releaseRequestContext(externalContext);
-          _releaseManagedThreadLocals();
         }
       }
-      RequestType.clearType(externalContext);
+      
+      state.remove(_STATE_REQUEST_TYPE);
     }
   }
 
@@ -315,7 +333,8 @@
   @Override
   public ExternalContext getExternalContext(ExternalContext externalContext)
   {
-    if (RequestType.getType(externalContext) == null)
+    RequestStateMap state = RequestStateMap.getInstance(externalContext);
+    if (state.get(_STATE_REQUEST_TYPE) == null)
     {
       beginRequest(externalContext);
     }
@@ -438,8 +457,7 @@
       {
         _LOG.warning("REQUESTCONTEXT_NOT_PROPERLY_RELEASED");
       }
-      context.release();
-      _releaseManagedThreadLocals();
+      _releaseRequestContext(externalContext);
     }
     
     // See if we've got a cached RequestContext instance; if so,
@@ -452,32 +470,25 @@
     if (cachedRequestContext instanceof RequestContext)
     {
       context = (RequestContext) cachedRequestContext;
-      context.attach();
     }
     else
     {
       final RequestContextFactory factory = RequestContextFactory.getFactory();
       assert factory != null;
       context = factory.createContext(externalContext);
-      externalContext.getRequestMap().put(_REQUEST_CONTEXT, context);
+      RequestStateMap.getInstance(externalContext).put(_REQUEST_CONTEXT, context);
     }
-
+    context.attach();
     assert RequestContext.getCurrentInstance() == context;
   }
 
   private void _releaseRequestContext(final ExternalContext ec)
   {
-    //If it's not a portal action, we should remove the cached request because
-    //well want to create a new one next request
-    if(RequestType.getType(ec) != RequestType.PORTAL_ACTION)
-    {
-      ec.getRequestMap().remove(_REQUEST_CONTEXT);
-    }
-
     final RequestContext context = RequestContext.getCurrentInstance();
     if (context != null)
     {
       context.release();
+      _releaseManagedThreadLocals();
       assert RequestContext.getCurrentInstance() == null;
 
     }
@@ -497,12 +508,19 @@
   {
     // Physical request has now ended
     // Clear the in-request flag
-    ec.getRequestMap().remove(_IN_REQUEST);
+    RequestStateMap.getInstance(ec).remove(_IN_REQUEST);
     if(_services != null)
     {
       for (final Configurator config : _services)
       {
-        config.endRequest(ec);
+        try
+        {
+          config.endRequest(ec);
+        }
+        catch (Throwable t)
+        {
+          t.printStackTrace();
+        }
       }
     }
   }
@@ -514,12 +532,19 @@
     final boolean disabled = isConfiguratorServiceDisabled(ec);
 
     // Tell whether the services were disabled when the requests had begun
-    ec.getRequestMap().put(_IN_REQUEST, disabled);
+    RequestStateMap.getInstance(ec).put(_IN_REQUEST, disabled);
 
     // If this hasn't been initialized then please initialize
     for (final Configurator config : _services)
     {
-      config.beginRequest(ec);
+      try
+      {
+        config.beginRequest(ec);
+      }
+      catch(Throwable t)
+      {
+        t.printStackTrace();
+      }
     }
   }
 
@@ -675,6 +700,7 @@
       return (HttpServletRequest)getRequest();
     }
   }
+  
 
 
   private static volatile boolean _sSetRequestBugTested = false;
@@ -690,58 +716,11 @@
   static private final String _REQUEST_CONTEXT =
      GlobalConfiguratorImpl.class.getName()
      + ".REQUEST_CONTEXT";
-
-
-  private enum RequestType
-  {
-    PORTAL_ACTION,
-    PORTAL_RENDER,
-    SERVLET;
-
-    public static void clearType(final ExternalContext ec)
-    {
-      ec.getRequestMap().remove(_REQUEST_TYPE);
-    }
-
-    public static RequestType getType(final ExternalContext ec)
-    {
-      return (RequestType) ec.getRequestMap().get(_REQUEST_TYPE);
-    }
-
-    public static boolean isCorrectType(final ExternalContext ec)
-    {
-      return _findType(ec) == getType(ec);
-    }
-
-    @SuppressWarnings("unchecked")
-    public static void setType(final ExternalContext ec)
-    {
-      ec.getRequestMap().put(_REQUEST_TYPE, _findType(ec));
-    }
-
-    private static final RequestType _findType(final ExternalContext ec)
-    {
-      if (ExternalContextUtils.isPortlet(ec))
-      {
-        if (ExternalContextUtils.isAction(ec))
-        {
-          return PORTAL_ACTION;
-        }
-        else
-        {
-          return PORTAL_RENDER;
-        }
-      }
-      else
-      {
-        return SERVLET;
-      }
-    }
-
-    static private final String _REQUEST_TYPE = GlobalConfiguratorImpl.class.getName()
-                                                  + ".REQUEST_TYPE";
-  }
-
+  
+  static private final String _DISABLE_SERVICES =  Configurator.class.getName()+".DISABLE_SERVICES";
+  
+  static private final String _STATE_REQUEST_TYPE = GlobalConfiguratorImpl.class.getName()
+                                                + ".REQUEST_TYPE";
   static private class TestRequest extends ServletRequestWrapper
   {
     public TestRequest(ServletRequest request)

Modified: myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchRenderResponse.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchRenderResponse.java?rev=738986&r1=738985&r2=738986&view=diff
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchRenderResponse.java (original)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchRenderResponse.java Thu Jan 29 20:02:50 2009
@@ -25,7 +25,7 @@
 import javax.portlet.RenderRequest;
 import javax.portlet.RenderResponse;
 
-import org.apache.myfaces.trinidadinternal.webapp.wrappers.RenderResponseWrapper;
+import javax.portlet.filter.RenderResponseWrapper;
 
 @SuppressWarnings("deprecation")
 class DispatchRenderResponse extends RenderResponseWrapper
@@ -33,7 +33,7 @@
   public DispatchRenderResponse(ExternalContext ec)
   {
     super((RenderResponse)ec.getResponse());
-     _request = (RenderRequest)ec.getRequest();
+    _request = (RenderRequest)ec.getRequest();
   }
 
   @Override
@@ -72,6 +72,5 @@
 
   private final RenderRequest _request;
 
-  static private final Pattern _CONTENT_TYPE_PATTERN =
-                                  Pattern.compile("([^;]+)(?:;charset=(.*))?");
+  static private final Pattern _CONTENT_TYPE_PATTERN = Pattern.compile("([^;]+)(?:;charset=(.*))?");
 }

Added: myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchResourceResponse.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchResourceResponse.java?rev=738986&view=auto
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchResourceResponse.java (added)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchResourceResponse.java Thu Jan 29 20:02:50 2009
@@ -0,0 +1,60 @@
+package org.apache.myfaces.trinidadinternal.config.dispatch;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.faces.context.ExternalContext;
+
+import javax.portlet.RenderRequest;
+import javax.portlet.RenderResponse;
+import javax.portlet.ResourceRequest;
+import javax.portlet.ResourceResponse;
+import javax.portlet.filter.ResourceResponseWrapper;
+
+public class DispatchResourceResponse
+  extends ResourceResponseWrapper
+{
+  public DispatchResourceResponse(ExternalContext ec)
+  {
+    super((ResourceResponse)ec.getResponse());
+    _request = (ResourceRequest)ec.getRequest();
+  }
+
+  @Override
+  public void setContentType(
+    String contentTypeAndCharset)
+  {
+    if(contentTypeAndCharset != null)
+    {
+      Matcher matcher = _CONTENT_TYPE_PATTERN.matcher(contentTypeAndCharset);
+      if (matcher.matches())
+      {
+        String contentType = matcher.group(1);
+        String charset = (matcher.groupCount() > 1) ? matcher.group(2) : null;
+
+        // capture the content type on the request
+        _request.setAttribute(DispatchResponseConfiguratorImpl.__CONTENT_TYPE_KEY, contentType);
+
+        // TODO: use Agent APIs when available
+        if ("application/xhtml+xml".equals(contentType))
+        {
+          //TODO: Is this still needed in IE7??
+          String userAgent = _request.getProperty("User-agent");
+          if (userAgent != null && userAgent.indexOf("compatible; MSIE") != -1)
+          {
+            // IE must serve XHTML as text/html
+            contentTypeAndCharset = "text/html";
+
+            if (charset != null)
+              contentTypeAndCharset += ";charset=" + charset;
+          }
+        }
+      }
+    }
+    super.setContentType(contentTypeAndCharset);
+  }
+
+  private final ResourceRequest _request;
+
+  static private final Pattern _CONTENT_TYPE_PATTERN = Pattern.compile("([^;]+)(?:;charset=(.*))?");
+}

Modified: myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchResponseConfiguratorImpl.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchResponseConfiguratorImpl.java?rev=738986&r1=738985&r2=738986&view=diff
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchResponseConfiguratorImpl.java (original)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchResponseConfiguratorImpl.java Thu Jan 29 20:02:50 2009
@@ -24,7 +24,8 @@
 import javax.faces.context.FacesContext;
 
 import org.apache.myfaces.trinidad.config.Configurator;
-import org.apache.myfaces.trinidad.util.ExternalContextUtils;
+import org.apache.myfaces.commons.util.ExternalContextUtils;
+import org.apache.myfaces.trinidad.util.RequestStateMap;
 
 /**
  * TODO: Document this
@@ -40,18 +41,22 @@
   {
     if(!isApplied(externalContext))
     {
-      if(ExternalContextUtils.isPortlet(externalContext))
+      switch(ExternalContextUtils.getRequestType(externalContext))
       {
-        if(!ExternalContextUtils.isAction(externalContext))
-        {
+        case RENDER:
+          //TODO: not sure if this is needed
           externalContext.setResponse(new DispatchRenderResponse(externalContext));
-        }
+          break;
+          
+        case RESOURCE:
+          //TODO: Not sure if this is needed
+          externalContext.setResponse(new DispatchResourceResponse(externalContext));
+          break;
+          
+        case SERVLET:
+          externalContext.setResponse(new DispatchServletResponse(externalContext));
       }
-      else
-      {
-        externalContext.setResponse(new DispatchServletResponse(externalContext));
-      }
-
+      
       apply(externalContext);
     }
 
@@ -75,7 +80,7 @@
    */
   static public boolean isApplied(ExternalContext context)
   {
-    return (context.getRequestMap().get(_APPLIED)!=null);
+    return (RequestStateMap.getInstance(context).get(_APPLIED)!=null);
   }
 
   /**
@@ -84,7 +89,7 @@
   @SuppressWarnings("unchecked")
   static public void apply(ExternalContext context)
   {
-    context.getRequestMap().put(_APPLIED, Boolean.TRUE);
+    RequestStateMap.getInstance(context).put(_APPLIED, Boolean.TRUE);
   }
 
   static private final String _APPLIED =

Modified: myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/ActionUploadRequestWrapper.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/ActionUploadRequestWrapper.java?rev=738986&r1=738985&r2=738986&view=diff
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/ActionUploadRequestWrapper.java (original)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/ActionUploadRequestWrapper.java Thu Jan 29 20:02:50 2009
@@ -30,9 +30,10 @@
 import javax.portlet.ActionRequest;
 import javax.portlet.ActionResponse;
 
+import javax.portlet.filter.ActionRequestWrapper;
+
 import org.apache.myfaces.trinidad.logging.TrinidadLogger;
 import org.apache.myfaces.trinidadinternal.share.util.CaboHttpUtils;
-import org.apache.myfaces.trinidadinternal.webapp.wrappers.ActionRequestWrapper;
 
 public class ActionUploadRequestWrapper
   extends ActionRequestWrapper
@@ -110,7 +111,6 @@
       }
 
       _extractedAndDecodedParams.put(key, newValue);
-      _response.setRenderParameters(_extractedAndDecodedParams);
     }
 
     // Let the UploadedFiles know, so it can fix up filenames

Modified: myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/FileUploadConfiguratorImpl.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/FileUploadConfiguratorImpl.java?rev=738986&r1=738985&r2=738986&view=diff
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/FileUploadConfiguratorImpl.java (original)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/FileUploadConfiguratorImpl.java Thu Jan 29 20:02:50 2009
@@ -30,11 +30,14 @@
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.myfaces.commons.util.ExternalContextUtils;
+
+import org.apache.myfaces.commons.util.RequestType;
 import org.apache.myfaces.trinidad.config.Configurator;
 import org.apache.myfaces.trinidad.context.RequestContext;
 import org.apache.myfaces.trinidad.logging.TrinidadLogger;
 import org.apache.myfaces.trinidad.model.UploadedFile;
-import org.apache.myfaces.trinidad.util.ExternalContextUtils;
+import org.apache.myfaces.trinidad.util.RequestStateMap;
 import org.apache.myfaces.trinidadinternal.share.util.MultipartFormHandler;
 import org.apache.myfaces.trinidadinternal.share.util.MultipartFormItem;
 
@@ -55,7 +58,7 @@
   static public Map<String, String[]> getAddedParameters(ExternalContext externalContext)
   {
     @SuppressWarnings("unchecked")
-    Map<String, String[]> map = (Map<String, String[]>) externalContext.getRequestMap().get(_PARAMS);
+    Map<String, String[]> map = (Map<String, String[]>) RequestStateMap.getInstance(externalContext).get(_PARAMS);
 
     return map;
   }
@@ -68,7 +71,7 @@
    */
   static public boolean isApplied(ExternalContext context)
   {
-    return (context.getRequestMap().get(_APPLIED)!=null);
+    return (RequestStateMap.getInstance(context).get(_APPLIED)!=null);
   }
 
   /**
@@ -77,7 +80,7 @@
   @SuppressWarnings("unchecked")
   static public void apply(ExternalContext context)
   {
-    context.getRequestMap().put(_APPLIED, AppliedClass.APPLIED);
+    RequestStateMap.getInstance(context).put(_APPLIED, AppliedClass.APPLIED);
   }
 
   /* (non-Javadoc)
@@ -87,6 +90,8 @@
   @SuppressWarnings("unchecked")
   public void beginRequest(ExternalContext externalContext)
   {
+    RequestType type = ExternalContextUtils.getRequestType(externalContext);
+    
     /*
      * Note: This class does not do a dispose on the file uploads.  The
      * reason for this is that in a portal environment, multiple render-requests
@@ -100,7 +105,7 @@
     // as possible is a good thing
     //Process MultipartForm if need be
     if (MultipartFormHandler.isMultipartRequest(externalContext) &&
-       (externalContext.getRequest() instanceof HttpServletRequest || ExternalContextUtils.isPortlet(externalContext)))
+       (ExternalContextUtils.isHttpServletRequest(externalContext) || type.isPortlet()))
     {
       try
       {
@@ -110,7 +115,7 @@
         // AdamWiner: looks like the previous Trinidad incarnation
         // of this code didn't have any allowed configuration...
         mfh.setMaximumAllowedBytes(_maxAllowedBytes);
-        mfh.setCharacterEncoding(ExternalContextUtils.getCharacterEncoding(externalContext));
+        mfh.setCharacterEncoding(externalContext.getRequestCharacterEncoding());
 
         final HashMap<String, String[]> parameters = new HashMap<String, String[]>();
         MultipartFormItem item;
@@ -223,24 +228,23 @@
 
   static private ExternalContext _getExternalContextWrapper(ExternalContext externalContext, Map<String, String[]> addedParams)
   {
+    /**
+     * Only need to support Servlet, Action, and Resource (for ppr) Requests.
+     */
     if(!isApplied(externalContext))
     {
-      if(!ExternalContextUtils.isPortlet(externalContext))
-      {  
-        externalContext.setRequest(new UploadRequestWrapper(
-            (HttpServletRequest)externalContext.getRequest(),
-            addedParams));        
-      }
-      else if(ExternalContextUtils.isAction(externalContext))
+      switch(ExternalContextUtils.getRequestType(externalContext))
       {
-        /*
-         * We only need to do this if we have an action request.  Why?
-         * Because durring the ActionRequest, the wrapper will set the
-         * RenderParameters.  This is a cool thing because subsequent
-         * render requests will retain these parameters for us.
-         */
-        externalContext.setRequest(new ActionUploadRequestWrapper(externalContext,
-           addedParams));
+        case SERVLET:
+          externalContext.setRequest(new UploadRequestWrapper((HttpServletRequest)externalContext.getRequest(), addedParams));
+          break;
+        
+        case ACTION:
+          externalContext.setRequest(new ActionUploadRequestWrapper(externalContext, addedParams));
+          break;
+        
+        case RESOURCE:
+          externalContext.setRequest(new ResourceUploadRequestWrapper(externalContext, addedParams));
       }
       apply(externalContext);        
     }

Added: myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/ResourceUploadRequestWrapper.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/ResourceUploadRequestWrapper.java?rev=738986&view=auto
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/ResourceUploadRequestWrapper.java (added)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/ResourceUploadRequestWrapper.java Thu Jan 29 20:02:50 2009
@@ -0,0 +1,158 @@
+package org.apache.myfaces.trinidadinternal.config.upload;
+
+import java.io.UnsupportedEncodingException;
+
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.faces.context.ExternalContext;
+
+import javax.portlet.ResourceRequest;
+import javax.portlet.ResourceResponse;
+import javax.portlet.filter.ResourceRequestWrapper;
+
+import org.apache.myfaces.trinidad.logging.TrinidadLogger;
+import org.apache.myfaces.trinidadinternal.share.util.CaboHttpUtils;
+
+public class ResourceUploadRequestWrapper
+  extends ResourceRequestWrapper
+{
+  public ResourceUploadRequestWrapper(ExternalContext ec,
+                                      Map<String, String[]> params)
+  {
+    super((ResourceRequest) ec.getRequest());
+    _response = (ResourceResponse) ec.getResponse();
+
+    @SuppressWarnings("unchecked")
+    Map<String, String[]> origionalMap = super.getParameterMap();
+
+    _extractedParams = new HashMap<String, String[]>(origionalMap);
+    _extractedParams.putAll(params);
+
+    _encoding = super.getCharacterEncoding();
+  }
+
+  /**
+   * Hide the content type so that no one tries to re-download the
+   * uploaded files.
+   */
+  @Override
+  public String getContentType()
+  {
+    return _WWW_FORM_URLENCODED_TYPE;
+  }
+
+  @Override
+  public String getCharacterEncoding()
+  {
+    return _encoding;
+  }
+
+
+  /**
+   * Trap calls to setCharacterEncoding() to decode parameters correctly
+   */
+  @Override
+  public void setCharacterEncoding(String encoding)
+    throws UnsupportedEncodingException
+  {
+    // If the encoding is already right, we can bail
+    if (encoding.equals(_encoding))
+      return;
+
+    // Don't call super.setCharacterEncoding() - it's too late
+    // and we'll get a warning
+    _encoding = encoding;
+    if (_LOG.isFine())
+      _LOG.fine("Switching encoding of wrapper to " + encoding);
+
+    _extractedAndDecodedParams =
+        new HashMap<String, String[]>(_extractedParams.size());
+
+    byte[] buffer = new byte[256];
+
+    for (Map.Entry<String, String[]> entry: _extractedParams.entrySet())
+    {
+      String key = entry.getKey();
+      key = CaboHttpUtils.decodeRequestParameter(key, encoding, buffer);
+
+      String[] oldValue = entry.getValue();
+      int length = oldValue.length;
+      String[] newValue = new String[length];
+      for (int i = 0; i < length; i++)
+      {
+        newValue[i] =
+            CaboHttpUtils.decodeRequestParameter(oldValue[i], encoding,
+                                                 buffer);
+        if (_LOG.isFinest())
+          _LOG.finest("Parameter " + key + ":" + newValue[i]);
+      }
+
+      _extractedAndDecodedParams.put(key, newValue);
+    }
+
+    // Let the UploadedFiles know, so it can fix up filenames
+    UploadedFiles.setCharacterEncoding(this, encoding);
+  }
+
+  @Override
+  public String getParameter(String param)
+  {
+    String[] value = _getParameterValues(param);
+    if (value == null)
+      return null;
+
+    return value[0];
+  }
+
+  @Override
+  public Map<String, String[]> getParameterMap()
+  {
+    Map<String, String[]> map = _getMap();
+    return Collections.unmodifiableMap(map);
+  }
+
+  @Override
+  public Enumeration<String> getParameterNames()
+  {
+    return Collections.enumeration(_getMap().keySet());
+  }
+
+  @Override
+  public String[] getParameterValues(String param)
+  {
+    String[] value = _getParameterValues(param);
+    if (value == null)
+      return null;
+
+    return (String[]) value.clone();
+  }
+
+  private String[] _getParameterValues(String param)
+  {
+    return _getMap().get(param);
+  }
+
+  /**
+   * Get the correct map of parameters whether or not setCharacterEncoding()
+   * was called.
+   */
+  private Map<String, String[]> _getMap()
+  {
+    if (_extractedAndDecodedParams != null)
+      return _extractedAndDecodedParams;
+
+    return _extractedParams;
+  }
+
+  private Map<String, String[]> _extractedAndDecodedParams;
+  private Map<String, String[]> _extractedParams;
+  private ResourceResponse _response;
+  private String _encoding;
+  private static final String _WWW_FORM_URLENCODED_TYPE =
+    "application/x-www-form-urlencoded";
+  private static final TrinidadLogger _LOG =
+    TrinidadLogger.createTrinidadLogger(ResourceUploadRequestWrapper.class);
+}