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}
*/