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/01/02 06:23:42 UTC

svn commit: r1054350 - 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/scope/conversation/...

Author: gpetracek
Date: Sun Jan  2 05:23:41 2011
New Revision: 1054350

URL: http://svn.apache.org/viewvc?rev=1054350&view=rev
Log:
EXTCDI-116 first draft

Modified:
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/request/CodiFacesContextWrapper.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/request/FacesMessageObserver.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/scope/conversation/WindowContextManagerObserver.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/listener/request/CodiFacesContextWrapper.java

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/request/CodiFacesContextWrapper.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/CodiFacesContextWrapper.java?rev=1054350&r1=1054349&r2=1054350&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/request/CodiFacesContextWrapper.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/request/CodiFacesContextWrapper.java Sun Jan  2 05:23:41 2011
@@ -19,11 +19,10 @@
 package org.apache.myfaces.extensions.cdi.jsf.impl.listener.request;
 
 import org.apache.myfaces.extensions.cdi.core.api.config.CodiCoreConfig;
-import org.apache.myfaces.extensions.cdi.core.api.scope.conversation.WindowContext;
 import org.apache.myfaces.extensions.cdi.core.impl.util.ClassDeactivation;
 import org.apache.myfaces.extensions.cdi.core.impl.util.CodiUtils;
 import org.apache.myfaces.extensions.cdi.jsf.impl.scope.conversation.RedirectedConversationAwareExternalContext;
-import org.apache.myfaces.extensions.cdi.jsf.impl.util.ConversationUtils;
+import org.apache.myfaces.extensions.cdi.message.api.Message;
 
 import javax.el.ELContext;
 import javax.faces.application.Application;
@@ -36,6 +35,7 @@ import javax.faces.context.ResponseWrite
 import javax.faces.render.RenderKit;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 /**
@@ -51,8 +51,6 @@ class CodiFacesContextWrapper extends Fa
 
     private BeforeAfterFacesRequestBroadcaster beforeAfterFacesRequestBroadcaster;
 
-    private WindowContext windowContext;
-
     CodiFacesContextWrapper(FacesContext wrappedFacesContext)
     {
         this.wrappedFacesContext = wrappedFacesContext;
@@ -112,24 +110,17 @@ class CodiFacesContextWrapper extends Fa
     {
         this.wrappedFacesContext.addMessage(componentId, facesMessage);
 
-        if(this.windowContext == null)
-        {
-            this.windowContext = ConversationUtils.getWindowContextManager().getCurrentWindowContext();
-        }
-
-        if(this.windowContext == null)
-        {
-            return;
-        }
+        //don't store it directly in the window context - it would trigger a too early restore (in some cases)
+        Map<String, Object> requestMap = getExternalContext().getRequestMap();
 
         @SuppressWarnings({"unchecked"})
         List<FacesMessageEntry> facesMessageEntryList =
-                this.windowContext.getAttribute(FacesMessage.class.getName(), List.class);
+                (List<FacesMessageEntry>)requestMap.get(Message.class.getName());
 
         if(facesMessageEntryList == null)
         {
             facesMessageEntryList = new CopyOnWriteArrayList<FacesMessageEntry>();
-            this.windowContext.setAttribute(FacesMessage.class.getName(), facesMessageEntryList);
+            requestMap.put(Message.class.getName(), facesMessageEntryList);
         }
 
         facesMessageEntryList.add(new FacesMessageEntry(componentId, facesMessage));

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/request/FacesMessageObserver.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/FacesMessageObserver.java?rev=1054350&r1=1054349&r2=1054350&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/request/FacesMessageObserver.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/request/FacesMessageObserver.java Sun Jan  2 05:23:41 2011
@@ -22,13 +22,14 @@ import org.apache.myfaces.extensions.cdi
 import org.apache.myfaces.extensions.cdi.jsf.api.config.JsfModuleConfig;
 import org.apache.myfaces.extensions.cdi.jsf.api.listener.phase.JsfLifecyclePhaseInformation;
 import org.apache.myfaces.extensions.cdi.jsf.api.listener.request.AfterFacesRequest;
-import org.apache.myfaces.extensions.cdi.jsf.api.listener.request.BeforeFacesRequest;
+import org.apache.myfaces.extensions.cdi.message.api.Message;
 
 import javax.enterprise.event.Observes;
-import javax.faces.application.FacesMessage;
 import javax.faces.context.FacesContext;
 import javax.inject.Inject;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 /**
  * @author Gerhard Petracek
@@ -53,40 +54,21 @@ public class FacesMessageObserver
         this.alwaysKeepMessages = jsfModuleConfig.isAlwaysKeepMessages();
     }
 
-    protected void restoreFacesMessages(@Observes @BeforeFacesRequest FacesContext facesContext)
-    {
-        if(!this.alwaysKeepMessages)
-        {
-            return;
-        }
-
-        @SuppressWarnings({"unchecked"})
-        List<FacesMessageEntry> facesMessageEntryList =
-                this.windowContext.getAttribute(FacesMessage.class.getName(), List.class);
-
-        if(facesMessageEntryList != null)
-        {
-            for(FacesMessageEntry facesMessageEntry : facesMessageEntryList)
-            {
-                facesContext.addMessage(facesMessageEntry.getComponentId(), facesMessageEntry.getFacesMessage());
-                facesMessageEntryList.remove(facesMessageEntry);
-            }
-            facesMessageEntryList.clear();
-        }
-    }
-
     protected void saveFacesMessages(@Observes @AfterFacesRequest FacesContext facesContext)
     {
-        if(this.lifecyclePhaseInformation.isRenderResponsePhase() || !this.alwaysKeepMessages)
+        if(this.alwaysKeepMessages && !this.lifecyclePhaseInformation.isRenderResponsePhase())
         {
+            Map<String, Object> requestMap = facesContext.getExternalContext().getRequestMap();
+
             @SuppressWarnings({"unchecked"})
             List<FacesMessageEntry> facesMessageEntryList =
-                    this.windowContext.getAttribute(FacesMessage.class.getName(), List.class);
+                    (List<FacesMessageEntry>)requestMap.get(Message.class.getName());
 
-            if(facesMessageEntryList != null)
+            if(facesMessageEntryList == null)
             {
-                facesMessageEntryList.clear();
+                facesMessageEntryList = new CopyOnWriteArrayList<FacesMessageEntry>();
             }
+            this.windowContext.setAttribute(Message.class.getName(), facesMessageEntryList, true);
         }
     }
 }

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/scope/conversation/WindowContextManagerObserver.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/scope/conversation/WindowContextManagerObserver.java?rev=1054350&r1=1054349&r2=1054350&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/scope/conversation/WindowContextManagerObserver.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/scope/conversation/WindowContextManagerObserver.java Sun Jan  2 05:23:41 2011
@@ -23,17 +23,20 @@ import org.apache.myfaces.extensions.cdi
 import org.apache.myfaces.extensions.cdi.jsf.api.listener.phase.JsfPhaseId;
 import org.apache.myfaces.extensions.cdi.jsf.api.request.RequestTypeResolver;
 import org.apache.myfaces.extensions.cdi.jsf.api.config.JsfModuleConfig;
+import org.apache.myfaces.extensions.cdi.jsf.impl.listener.request.FacesMessageEntry;
 import org.apache.myfaces.extensions.cdi.jsf.impl.scope.conversation.spi.EditableConversation;
 import org.apache.myfaces.extensions.cdi.jsf.impl.scope.conversation.spi.EditableWindowContext;
 import org.apache.myfaces.extensions.cdi.jsf.impl.scope.conversation.spi.EditableWindowContextManager;
 import org.apache.myfaces.extensions.cdi.jsf.impl.scope.conversation.spi.WindowHandler;
 import org.apache.myfaces.extensions.cdi.jsf.impl.util.ConversationUtils;
 import org.apache.myfaces.extensions.cdi.jsf.impl.util.RequestCache;
+import org.apache.myfaces.extensions.cdi.message.api.Message;
 
 import javax.enterprise.event.Observes;
 import javax.faces.context.FacesContext;
 import javax.faces.event.PhaseEvent;
 import java.io.IOException;
+import java.util.List;
 
 import static org.apache.myfaces.extensions.cdi.core.impl.scope.conversation.spi.WindowContextManager
         .AUTOMATED_ENTRY_POINT_PARAMETER_KEY;
@@ -73,6 +76,8 @@ final class WindowContextManagerObserver
         //don't refactor it to a lazy restore
         storeCurrentViewIdAsNewViewId(phaseEvent.getFacesContext(), windowContext);
 
+        tryToRestoreMessages(phaseEvent.getFacesContext(), windowContext, jsfModuleConfig);
+
         //for performance reasons + cleanup at the beginning of the request (check timeout,...)
         //+ we aren't allowed to cleanup in case of redirects
         //we would transfer the restored view-id into the conversation
@@ -85,6 +90,30 @@ final class WindowContextManagerObserver
         cleanupInactiveConversations(windowContext);
     }
 
+    private void tryToRestoreMessages(FacesContext facesContext,
+                                      EditableWindowContext windowContext,
+                                      JsfModuleConfig jsfModuleConfig)
+    {
+        if(!jsfModuleConfig.isAlwaysKeepMessages())
+        {
+            return;
+        }
+
+        @SuppressWarnings({"unchecked"})
+        List<FacesMessageEntry> facesMessageEntryList =
+                windowContext.getAttribute(Message.class.getName(), List.class);
+
+        if(facesMessageEntryList != null)
+        {
+            for(FacesMessageEntry facesMessageEntry : facesMessageEntryList)
+            {
+                facesContext.addMessage(facesMessageEntry.getComponentId(), facesMessageEntry.getFacesMessage());
+                facesMessageEntryList.remove(facesMessageEntry);
+            }
+            facesMessageEntryList.clear();
+        }
+    }
+
     protected void cleanupAndRecordCurrentViewAsOldViewId(
             @Observes @AfterPhase(JsfPhaseId.RENDER_RESPONSE) PhaseEvent phaseEvent,
             EditableWindowContextManager windowContextManager,

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/listener/request/CodiFacesContextWrapper.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/CodiFacesContextWrapper.java?rev=1054350&r1=1054349&r2=1054350&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/listener/request/CodiFacesContextWrapper.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/listener/request/CodiFacesContextWrapper.java Sun Jan  2 05:23:41 2011
@@ -19,13 +19,12 @@
 package org.apache.myfaces.extensions.cdi.jsf2.impl.listener.request;
 
 import org.apache.myfaces.extensions.cdi.core.api.config.CodiCoreConfig;
-import org.apache.myfaces.extensions.cdi.core.api.scope.conversation.WindowContext;
 import org.apache.myfaces.extensions.cdi.core.impl.util.ClassDeactivation;
 import org.apache.myfaces.extensions.cdi.core.impl.util.CodiUtils;
 import org.apache.myfaces.extensions.cdi.jsf.impl.listener.request.BeforeAfterFacesRequestBroadcaster;
 import org.apache.myfaces.extensions.cdi.jsf.impl.listener.request.FacesMessageEntry;
-import org.apache.myfaces.extensions.cdi.jsf.impl.util.ConversationUtils;
 import org.apache.myfaces.extensions.cdi.jsf2.impl.scope.conversation.RedirectedConversationAwareExternalContext;
+import org.apache.myfaces.extensions.cdi.message.api.Message;
 
 import javax.faces.application.FacesMessage;
 import javax.faces.context.ExternalContext;
@@ -33,6 +32,7 @@ import javax.faces.context.FacesContext;
 import javax.faces.context.FacesContextWrapper;
 import javax.faces.application.Application;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 /**
@@ -48,8 +48,6 @@ class CodiFacesContextWrapper extends Fa
 
     private BeforeAfterFacesRequestBroadcaster beforeAfterFacesRequestBroadcaster;
 
-    private WindowContext windowContext;
-
     CodiFacesContextWrapper(FacesContext wrappedFacesContext)
     {
         this.wrappedFacesContext = wrappedFacesContext;
@@ -117,24 +115,17 @@ class CodiFacesContextWrapper extends Fa
     {
         this.wrappedFacesContext.addMessage(componentId, facesMessage);
 
-        if(this.windowContext == null)
-        {
-            this.windowContext = ConversationUtils.getWindowContextManager().getCurrentWindowContext();
-        }
-
-        if(this.windowContext == null)
-        {
-            return;
-        }
+        //don't store it directly in the window context - it would trigger a too early restore (in some cases)
+        Map<String, Object> requestMap = getExternalContext().getRequestMap();
 
         @SuppressWarnings({"unchecked"})
         List<FacesMessageEntry> facesMessageEntryList =
-                this.windowContext.getAttribute(FacesMessage.class.getName(), List.class);
+                (List<FacesMessageEntry>)requestMap.get(Message.class.getName());
 
         if(facesMessageEntryList == null)
         {
             facesMessageEntryList = new CopyOnWriteArrayList<FacesMessageEntry>();
-            this.windowContext.setAttribute(FacesMessage.class.getName(), facesMessageEntryList);
+            requestMap.put(Message.class.getName(), facesMessageEntryList);
         }
 
         facesMessageEntryList.add(new FacesMessageEntry(componentId, facesMessage));