You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2016/07/14 01:41:44 UTC

svn commit: r1752576 - /myfaces/core/trunk/api/src/main/java/javax/faces/component/UIComponentBase.java

Author: lu4242
Date: Thu Jul 14 01:41:43 2016
New Revision: 1752576

URL: http://svn.apache.org/viewvc?rev=1752576&view=rev
Log:
MYFACES-4048 TransientStateHolder values must be stored in the state if current phase is before render response

Modified:
    myfaces/core/trunk/api/src/main/java/javax/faces/component/UIComponentBase.java

Modified: myfaces/core/trunk/api/src/main/java/javax/faces/component/UIComponentBase.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/api/src/main/java/javax/faces/component/UIComponentBase.java?rev=1752576&r1=1752575&r2=1752576&view=diff
==============================================================================
--- myfaces/core/trunk/api/src/main/java/javax/faces/component/UIComponentBase.java (original)
+++ myfaces/core/trunk/api/src/main/java/javax/faces/component/UIComponentBase.java Thu Jul 14 01:41:43 2016
@@ -56,6 +56,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import javax.faces.event.PhaseId;
 
 
 /**
@@ -1921,6 +1922,8 @@ public abstract class UIComponentBase ex
             return stateObj;
         }
     }
+    
+    private static final int FULL_STATE_ARRAY_SIZE = 10;
 
     /**
      * Invoked after the render phase has completed, this method returns an object which can be passed to the
@@ -1981,22 +1984,45 @@ public abstract class UIComponentBase ex
                 return null;
             }
             
-            if ((_capabilities & FLAG_IS_RENDERER_TYPE_SET) != 0)
+            Object transientState = null;
+            if (!context.getCurrentPhaseId().equals(PhaseId.RENDER_RESPONSE))
+            {
+                transientState = saveTransientState(context);
+            }
+            
+            if (transientState != null)
             {
-                return new Object[] {facesListenersSaved, stateHelperSaved, behaviorsMapSaved,
-                                    systemEventListenerClassMapSaved, 
-                                    _rendererType};
+                if ((_capabilities & FLAG_IS_RENDERER_TYPE_SET) != 0)
+                {
+                    return new Object[] {facesListenersSaved, stateHelperSaved, behaviorsMapSaved,
+                                        systemEventListenerClassMapSaved, transientState,
+                                        _rendererType};
+                }
+                else
+                {
+                    return new Object[] {facesListenersSaved, stateHelperSaved, behaviorsMapSaved,
+                        systemEventListenerClassMapSaved, transientState};
+                }
             }
             else
             {
-                return new Object[] {facesListenersSaved, stateHelperSaved, behaviorsMapSaved,
-                    systemEventListenerClassMapSaved};
+                if ((_capabilities & FLAG_IS_RENDERER_TYPE_SET) != 0)
+                {
+                    return new Object[] {facesListenersSaved, stateHelperSaved, behaviorsMapSaved,
+                                        systemEventListenerClassMapSaved, null,
+                                        _rendererType};
+                }
+                else
+                {
+                    return new Object[] {facesListenersSaved, stateHelperSaved, behaviorsMapSaved,
+                        systemEventListenerClassMapSaved};
+                }
             }
         }
         else
         {
             //Full
-            Object values[] = new Object[9];
+            Object values[] = new Object[FULL_STATE_ARRAY_SIZE];
             values[0] = saveFacesListenersList(context);
             StateHelper stateHelper = getStateHelper(false);
             if (stateHelper != null)
@@ -2010,6 +2036,10 @@ public abstract class UIComponentBase ex
             values[6] = _markCreated;
             values[7] = _rendererType;
             values[8] = _capabilities;
+            if (!context.getCurrentPhaseId().equals(PhaseId.RENDER_RESPONSE))
+            {
+                values[9] = saveTransientState(context);
+            }
             //values[8] = _isRendererTypeSet;
             //values[9] = _addedByHandler;
             //values[10] = _facetCreatedUIPanel;
@@ -2048,7 +2078,7 @@ public abstract class UIComponentBase ex
         
         Object values[] = (Object[]) state;
         
-        if ( values.length == 9 && initialStateMarked())
+        if ( values.length == FULL_STATE_ARRAY_SIZE && initialStateMarked())
         {
             //Delta mode is active, but we are restoring a full state.
             //we need to clear the initial state, to restore state without
@@ -2066,7 +2096,7 @@ public abstract class UIComponentBase ex
                         ((_AttachedDeltaWrapper) values[0]).getWrappedStateObject());
             //}
         }
-        else if (values[0] != null || (values.length == 9))
+        else if (values[0] != null || (values.length == FULL_STATE_ARRAY_SIZE))
         {
             //Full
             _facesListeners = (_DeltaList<FacesListener>)
@@ -2079,7 +2109,7 @@ public abstract class UIComponentBase ex
         
         getStateHelper().restoreState(context, values[1]);
         
-        if (values.length == 9)
+        if (values.length == FULL_STATE_ARRAY_SIZE)
         {
             _id = (String) values[4];
             _clientId = (String) values[5];
@@ -2090,21 +2120,28 @@ public abstract class UIComponentBase ex
             //_addedByHandler = (Boolean) values[9];
             //_facetCreatedUIPanel = (Boolean) values[10];
         }
-        else if (values.length == 5)
+        else if (values.length == 6)
         {
-            _rendererType = (String) values[4];
+            restoreTransientState(context, values[4]);
+            _rendererType = (String) values[5];
             //_isRendererTypeSet = true;
             _capabilities |= FLAG_IS_RENDERER_TYPE_SET;
         }
-
+        else if (values.length == 5)
+        {
+            restoreTransientState(context, values[4]);
+        }
+        
+        
         // rendererType needs to be restored before SystemEventListener,
         // otherwise UIComponent.getCurrentComponent(context).getRenderer(context)
         // will not work correctly
-        if (values.length == 9)
+        if (values.length == FULL_STATE_ARRAY_SIZE)
         {
             //Full restore
             restoreFullBehaviorsMap(context, values[2]);
             restoreFullSystemEventListenerClassMap(context, values[3]);
+            restoreTransientState(context, values[9]);
         }
         else
         {