You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by gp...@apache.org on 2011/09/26 03:02:41 UTC

svn commit: r1175639 - in /myfaces/extensions/cdi/trunk/jee-modules: jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/request/ jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/ jsf20-module/...

Author: gpetracek
Date: Mon Sep 26 01:02:40 2011
New Revision: 1175639

URL: http://svn.apache.org/viewvc?rev=1175639&view=rev
Log:
EXTCDI-228 detection of existing wrappers

Modified:
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/request/CodiFacesContextFactory.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/ConversationUtils.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/JsfUtils.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/listener/request/CodiFacesContextFactory.java

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/request/CodiFacesContextFactory.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/request/CodiFacesContextFactory.java?rev=1175639&r1=1175638&r2=1175639&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/request/CodiFacesContextFactory.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/request/CodiFacesContextFactory.java Mon Sep 26 01:02:40 2011
@@ -20,6 +20,7 @@ package org.apache.myfaces.extensions.cd
 
 import org.apache.myfaces.extensions.cdi.core.api.activation.Deactivatable;
 import org.apache.myfaces.extensions.cdi.core.impl.util.ClassDeactivation;
+import org.apache.myfaces.extensions.cdi.jsf.impl.util.JsfUtils;
 
 import javax.faces.context.FacesContextFactory;
 import javax.faces.context.FacesContext;
@@ -83,7 +84,13 @@ public class CodiFacesContextFactory ext
         {
             return facesContext;
         }
+
+        facesContext.getExternalContext().getRequestMap()
+                .put(JsfUtils.FACES_CONTEXT_MANUAL_WRAPPER_KEY, Boolean.TRUE);
+
         //TODO has to be deactivatable
+        //might lead to double wrapping (in case of jsf 1.2 and other libs which also wrap the faces-context)
+        //we might need a lazy double wrapper detection + flag in CodiFacesContextWrapper if we see side-effects
         return new CodiFacesContextWrapper(facesContext);
     }
 

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/ConversationUtils.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/ConversationUtils.java?rev=1175639&r1=1175638&r2=1175639&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/ConversationUtils.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/ConversationUtils.java Mon Sep 26 01:02:40 2011
@@ -400,13 +400,24 @@ public abstract class ConversationUtils
                                     String url,
                                     WindowHandler windowHandler) throws IOException
     {
-        if(isMultipleRedirectDetected(externalContext) || FacesContext.getCurrentInstance().getResponseComplete())
+        //might get called multiple times due to manual wrapping in AccessScopeAwareNavigationHandler#wrapFacesContext
+        //which might happen twice e.g. because
+        //  (with jsf2) there is a wrapper in between which doesn't implement FacesContextWrapper
+        //  (with jsf1.2) there is no way to detected already wrapped instances in a portable way
+        if(isFacesContextManuallyWrapped(externalContext) && isRedirectInterceptedAlready(externalContext) &&
+                !FacesContext.getCurrentInstance().getResponseComplete())
+        {
+            externalContext.redirect(url);
+            return;
+        }
+
+        if(isRedirectInterceptedAlready(externalContext) || FacesContext.getCurrentInstance().getResponseComplete())
         {
             return;
         }
         else
         {
-            redirectPerformed(externalContext);
+            redirectIntercepted(externalContext);
         }
 
         storeCurrentViewIdAsOldViewId(FacesContext.getCurrentInstance());
@@ -428,6 +439,11 @@ public abstract class ConversationUtils
         }
     }
 
+    private static boolean isFacesContextManuallyWrapped(ExternalContext externalContext)
+    {
+        return Boolean.TRUE.equals(externalContext.getRequestMap().get(JsfUtils.FACES_CONTEXT_MANUAL_WRAPPER_KEY));
+    }
+
     private static void saveFacesMessages(ExternalContext externalContext)
     {
         JsfModuleConfig jsfModuleConfig = CodiUtils.getContextualReferenceByClass(JsfModuleConfig.class);
@@ -449,12 +465,12 @@ public abstract class ConversationUtils
         }
     }
 
-    private static boolean isMultipleRedirectDetected(ExternalContext externalContext)
+    private static boolean isRedirectInterceptedAlready(ExternalContext externalContext)
     {
         return externalContext.getRequestMap().containsKey(REDIRECT_PERFORMED_KEY);
     }
 
-    private static void redirectPerformed(ExternalContext externalContext)
+    private static void redirectIntercepted(ExternalContext externalContext)
     {
         externalContext.getRequestMap().put(REDIRECT_PERFORMED_KEY, Boolean.TRUE);
     }

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/JsfUtils.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/JsfUtils.java?rev=1175639&r1=1175638&r2=1175639&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/JsfUtils.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/JsfUtils.java Mon Sep 26 01:02:40 2011
@@ -47,6 +47,9 @@ import org.apache.myfaces.extensions.cdi
 @Typed()
 public abstract class JsfUtils
 {
+    public static final String FACES_CONTEXT_MANUAL_WRAPPER_KEY =
+            FacesContext.class.getName() + ":manuallyWrappedByCodi";
+
     private JsfUtils()
     {
         // prevent instantiation

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/listener/request/CodiFacesContextFactory.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/listener/request/CodiFacesContextFactory.java?rev=1175639&r1=1175638&r2=1175639&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/listener/request/CodiFacesContextFactory.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/listener/request/CodiFacesContextFactory.java Mon Sep 26 01:02:40 2011
@@ -20,9 +20,11 @@ package org.apache.myfaces.extensions.cd
 
 import org.apache.myfaces.extensions.cdi.core.api.activation.Deactivatable;
 import org.apache.myfaces.extensions.cdi.core.impl.util.ClassDeactivation;
+import org.apache.myfaces.extensions.cdi.jsf.impl.util.JsfUtils;
 
 import javax.faces.context.FacesContextFactory;
 import javax.faces.context.FacesContext;
+import javax.faces.context.FacesContextWrapper;
 import javax.faces.lifecycle.Lifecycle;
 
 /**
@@ -87,14 +89,47 @@ public class CodiFacesContextFactory ext
      */
     public static FacesContext wrapFacesContext(FacesContext facesContext)
     {
-        if(facesContext instanceof CodiFacesContextWrapper)
+        if(isWrappedAlreadyByCodi(facesContext))
         {
             return facesContext;
         }
+
+        facesContext.getExternalContext().getRequestMap()
+                .put(JsfUtils.FACES_CONTEXT_MANUAL_WRAPPER_KEY, Boolean.TRUE);
+
         //TODO has to be deactivatable
         return new CodiFacesContextWrapper(facesContext);
     }
 
+    private static boolean isWrappedAlreadyByCodi(FacesContext facesContext)
+    {
+        if(facesContext instanceof FacesContextWrapper)
+        {
+            return containsCodiFacesContextWrapper((FacesContextWrapper) facesContext);
+        }
+        return false;
+    }
+
+    private static boolean containsCodiFacesContextWrapper(FacesContextWrapper facesContext)
+    {
+        if(facesContext == null)
+        {
+            return false;
+        }
+
+        if(facesContext instanceof CodiFacesContextWrapper)
+        {
+            return true;
+        }
+
+        if(facesContext.getWrapped() instanceof FacesContextWrapper)
+        {
+            return containsCodiFacesContextWrapper((FacesContextWrapper)facesContext.getWrapped());
+        }
+
+        return false;
+    }
+
     /**
      * {@inheritDoc}
      */