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/12/10 00:58:56 UTC

svn commit: r889023 - in /myfaces/portlet-bridge/core/branches/sobryan_portlet-bridge-3.0.0/impl/src/main: java/org/apache/myfaces/portlet/faces/context/ resources/META-INF/services/

Author: sobryan
Date: Wed Dec  9 23:58:55 2009
New Revision: 889023

URL: http://svn.apache.org/viewvc?rev=889023&view=rev
Log:
Bug fix with ExternalContextFactory

Added:
    myfaces/portlet-bridge/core/branches/sobryan_portlet-bridge-3.0.0/impl/src/main/java/org/apache/myfaces/portlet/faces/context/PortletExternalContextFactoryImpl.java
Removed:
    myfaces/portlet-bridge/core/branches/sobryan_portlet-bridge-3.0.0/impl/src/main/java/org/apache/myfaces/portlet/faces/context/FacesExternalContextFactoryImpl.java
Modified:
    myfaces/portlet-bridge/core/branches/sobryan_portlet-bridge-3.0.0/impl/src/main/resources/META-INF/services/javax.faces.context.ExternalContextFactory

Added: myfaces/portlet-bridge/core/branches/sobryan_portlet-bridge-3.0.0/impl/src/main/java/org/apache/myfaces/portlet/faces/context/PortletExternalContextFactoryImpl.java
URL: http://svn.apache.org/viewvc/myfaces/portlet-bridge/core/branches/sobryan_portlet-bridge-3.0.0/impl/src/main/java/org/apache/myfaces/portlet/faces/context/PortletExternalContextFactoryImpl.java?rev=889023&view=auto
==============================================================================
--- myfaces/portlet-bridge/core/branches/sobryan_portlet-bridge-3.0.0/impl/src/main/java/org/apache/myfaces/portlet/faces/context/PortletExternalContextFactoryImpl.java (added)
+++ myfaces/portlet-bridge/core/branches/sobryan_portlet-bridge-3.0.0/impl/src/main/java/org/apache/myfaces/portlet/faces/context/PortletExternalContextFactoryImpl.java Wed Dec  9 23:58:55 2009
@@ -0,0 +1,128 @@
+package org.apache.myfaces.portlet.faces.context;
+
+import javax.faces.FacesException;
+import javax.faces.context.ExternalContext;
+import javax.faces.context.ExternalContextFactory;
+
+import javax.faces.context.FacesContext;
+
+import javax.portlet.PortletConfig;
+import javax.portlet.PortletContext;
+import javax.portlet.PortletRequest;
+import javax.portlet.PortletResponse;
+import javax.portlet.faces.Bridge;
+
+import javax.servlet.ServletRequest;
+
+public class PortletExternalContextFactoryImpl
+  extends ExternalContextFactory
+{
+  private ExternalContextFactory mWrapped;
+  
+  public PortletExternalContextFactoryImpl(ExternalContextFactory factory)
+  {
+    mWrapped = factory;
+  }
+
+  public ExternalContext getExternalContext(Object context, Object request,
+                                            Object response)
+    throws FacesException
+  {
+    // if in portlet environment -- do a portlet container neutral test
+    // first in case we are packaged in a web app that isn't deployed 
+    // on a portlet container/as a portlet. Note:  can't use the BridgeUtil
+    // method as that call requires the facesContext to exist.
+    if (isPortletRequest(request))
+    {
+      // As its possible an in-protocol resource needs to access the FacesContext
+      // hence we could be passed the servlet objects in a portlet request
+      // try converting back to the portlet objects
+      Object pTemp = null;
+      PortletRequest pRequest = null;
+      ServletRequest sRequest = null;
+      
+      if (request instanceof PortletRequest)
+        pRequest = (PortletRequest) request;
+      else if (request instanceof ServletRequest)
+        sRequest = (ServletRequest) request;
+      
+      if (!(context instanceof PortletContext))
+      {
+        if (pRequest != null)
+        {
+          pTemp = pRequest.getAttribute("javax.portlet.config");
+        } 
+        else if (sRequest != null)
+        {
+          pTemp = sRequest.getAttribute("javax.portlet.config");
+        }
+        
+        if (pTemp != null) context = ((PortletConfig) pTemp).getPortletContext();
+      }
+      if (!(response instanceof PortletResponse))
+      {
+        if (pRequest != null)
+        {
+          pTemp = pRequest.getAttribute("javax.portlet.response");
+        } 
+        else if (sRequest != null)
+        {
+          pTemp = sRequest.getAttribute("javax.portlet.response");
+        }
+        
+        if (pTemp != null) response = pTemp;
+      }      
+      if (!(request instanceof PortletRequest))
+      {
+        if (sRequest != null)
+        {
+          pTemp = sRequest.getAttribute("javax.portlet.request");
+        }
+        
+        if (pTemp != null) request = pTemp;
+      }
+      
+      // make sure they passed the right objects
+      if (context instanceof PortletContext && request instanceof PortletRequest
+        && response instanceof PortletResponse)
+      {
+          return new PortletExternalContextImpl((PortletContext) context, (PortletRequest) request, (PortletResponse) response);
+      }
+      else
+      {
+        throw new FacesException("getExternalContext failed: Running in a portlet request but not passed portlet objects");
+      }
+    }
+    else
+    {
+      // otherwise, delegate
+      return getWrapped().getExternalContext(context, request, response);
+    }
+  }
+  
+  @Override
+  public ExternalContextFactory getWrapped()
+  {
+    return mWrapped;
+  }
+  
+  private boolean isPortletRequest(Object request) 
+  {
+    // could be either a servlet or portlet request object (or both)
+    // Check servlet side first in case we are packaged in an application
+    // that is running as a servlet in an environment that doesn't contain
+    // a portlet container.
+    if (request instanceof ServletRequest)
+    {
+      ServletRequest sr = (ServletRequest) request;
+      Bridge.PortletPhase phase = (Bridge.PortletPhase) sr.getAttribute(Bridge.PORTLET_LIFECYCLE_PHASE);
+      return (phase != null);
+    }
+    else if (request instanceof PortletRequest)
+    {
+      return true;
+    }
+      
+    return false;
+  }
+}

Modified: myfaces/portlet-bridge/core/branches/sobryan_portlet-bridge-3.0.0/impl/src/main/resources/META-INF/services/javax.faces.context.ExternalContextFactory
URL: http://svn.apache.org/viewvc/myfaces/portlet-bridge/core/branches/sobryan_portlet-bridge-3.0.0/impl/src/main/resources/META-INF/services/javax.faces.context.ExternalContextFactory?rev=889023&r1=889022&r2=889023&view=diff
==============================================================================
--- myfaces/portlet-bridge/core/branches/sobryan_portlet-bridge-3.0.0/impl/src/main/resources/META-INF/services/javax.faces.context.ExternalContextFactory (original)
+++ myfaces/portlet-bridge/core/branches/sobryan_portlet-bridge-3.0.0/impl/src/main/resources/META-INF/services/javax.faces.context.ExternalContextFactory Wed Dec  9 23:58:55 2009
@@ -1 +1 @@
-org.apache.myfaces.portlet.faces.context.FacesExternalContextFactory
+org.apache.myfaces.portlet.faces.context.PortletExternalContextFactoryImpl