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 2009/08/29 03:58:41 UTC

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

Author: lu4242
Date: Sat Aug 29 01:58:41 2009
New Revision: 809081

URL: http://svn.apache.org/viewvc?rev=809081&view=rev
Log:
MYFACES-2342 New objects added for new api in UIViewRoot, UIComponent and UIComponentBase could be saved and restored (UIComponentBase._behaviorsMap)

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=809081&r1=809080&r2=809081&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 Sat Aug 29 01:58:41 2009
@@ -87,6 +87,21 @@
     private UIComponent _parent = null;
     private boolean _transient = false;
 
+    /**
+     * This map holds ClientBehavior instances.
+     * 
+     *  Note that BehaviorBase implements PartialStateHolder, so this class 
+     *  should deal with that fact on clearInitialState() and 
+     *  markInitialState() methods.
+     * 
+     *  Also, the map used by this instance is not set from outside this class.
+     *  
+     *  Note it is possible (but maybe not expected/valid) to manipulate 
+     *  the values of the map(the list) but not put instances on the map 
+     *  directly, because ClientBehaviorHolder.getClientBehaviors says that 
+     *  this method should return a non null unmodificable map.
+     *  
+     */
     private Map<String, List<ClientBehavior>> _behaviorsMap = null;
     
     public UIComponentBase()
@@ -315,23 +330,6 @@
         
         if(eventNames.contains(eventName))
         {
-            if (initialStateMarked()) 
-            {
-                if (_behaviorsMap != null) 
-                {
-                    for (String key : _behaviorsMap.keySet()) 
-                    {
-                        for (ClientBehavior curBehavior : _behaviorsMap.get(key)) 
-                        {
-                            if (curBehavior instanceof PartialStateHolder) 
-                            {
-                                ((PartialStateHolder)behavior).clearInitialState();
-                            }
-                        }
-                    }
-                }
-            }
-            
             if(_behaviorsMap == null)
             {
                 _behaviorsMap = new HashMap<String,List<ClientBehavior>>();
@@ -340,12 +338,11 @@
             List<ClientBehavior> behaviorsForEvent = _behaviorsMap.get(eventName);
             if(behaviorsForEvent == null)
             {
-                behaviorsForEvent = new ArrayList<ClientBehavior>();
+                behaviorsForEvent = new _DeltaList<ClientBehavior>(new ArrayList<ClientBehavior>());
                 _behaviorsMap.put(eventName, behaviorsForEvent);
             }
             
             behaviorsForEvent.add(behavior);
-            
         }
     }
 
@@ -403,6 +400,13 @@
         {
             _facesListeners.clearInitialState();
         }
+        if (_behaviorsMap != null)
+        {
+            for (Map.Entry<String, List<ClientBehavior> > entry : _behaviorsMap.entrySet())
+            {
+                ((PartialStateHolder) entry.getValue()).clearInitialState();
+            }
+        }
     }
 
     /**
@@ -969,6 +973,13 @@
         {
             _facesListeners.markInitialState();
         }
+        if (_behaviorsMap != null)
+        {
+            for (Map.Entry<String, List<ClientBehavior> > entry : _behaviorsMap.entrySet())
+            {
+                ((PartialStateHolder) entry.getValue()).markInitialState();
+            }
+        }
     }
 
     @Override
@@ -1503,6 +1514,7 @@
             //_id and _clientId was already restored from template
             //and never changes during component life.
             Object facesListenersSaved = saveFacesListenersList(context);
+            Object behaviorsMapSaved = saveBehaviorsMap(context);
             Object stateHelperSaved = null;
             StateHelper stateHelper = getStateHelper(false);
             if (stateHelper != null)
@@ -1510,25 +1522,26 @@
                 stateHelperSaved = stateHelper.saveState(context);
             }
             
-            if (facesListenersSaved == null && stateHelperSaved == null)
+            if (facesListenersSaved == null && stateHelperSaved == null && behaviorsMapSaved == null)
             {
                 return null;
             }
             
-            return new Object[] {facesListenersSaved, stateHelperSaved};
+            return new Object[] {facesListenersSaved, stateHelperSaved, behaviorsMapSaved};
         }
         else
         {
             //Full
-            Object values[] = new Object[4];
+            Object values[] = new Object[5];
             values[0] = saveFacesListenersList(context);
             StateHelper stateHelper = getStateHelper(false);
             if (stateHelper != null)
             {
                 values[1] = stateHelper.saveState(context);
             }
-            values[2] = _id;
-            values[3] = _clientId;
+            values[2] = saveBehaviorsMap(context);
+            values[3] = _id;
+            values[4] = _clientId;
 
             return values;
         }
@@ -1553,7 +1566,7 @@
         
         Object values[] = (Object[]) state;
         
-        if ( values.length == 4 && initialStateMarked())
+        if ( values.length == 5 && initialStateMarked())
         {
             //Delta mode is active, but we are restoring a full state.
             //we need to clear the initial state, to restore state without
@@ -1563,14 +1576,15 @@
         
         if (values[0] instanceof _AttachedDeltaWrapper)
         {
-            //Delta
-            if (_facesListeners != null)
-            {
+            //Delta: check for null is not necessary since _facesListener field
+            //is only set once and never reset
+            //if (_facesListeners != null)
+            //{
                 ((StateHolder)_facesListeners).restoreState(context,
                         ((_AttachedDeltaWrapper) values[0]).getWrappedStateObject());
-            }
+            //}
         }
-        else if (values[0] != null || (values.length == 4))
+        else if (values[0] != null || (values.length == 5))
         {
             //Full
             _facesListeners = (_DeltaList<FacesListener>)
@@ -1583,10 +1597,21 @@
         
         getStateHelper().restoreState(context, values[1]);
         
-        if (values.length == 4)
+        if (values.length == 5)
+        {
+            //Full restore
+            restoreFullBehaviorsMap(context, values[2]);
+        }
+        else
+        {
+            //Delta restore
+            restoreDeltaBehaviorsMap(context, values[2]);
+        }
+        
+        if (values.length == 5)
         {
-            _id = (String) values[2];
-            _clientId = (String) values[3];
+            _id = (String) values[3];
+            _clientId = (String) values[4];
         }
     }
     
@@ -1608,7 +1633,100 @@
         {
             return saveAttachedState(facesContext,_facesListeners);
         }            
-    }    
+    }
+
+    @SuppressWarnings("unchecked")
+    private void restoreFullBehaviorsMap(FacesContext facesContext, Object stateObj)
+    {
+        if (stateObj != null)
+        {
+            Map<String, Object> stateMap = (Map<String, Object>) stateObj;
+            int initCapacity = (stateMap.size() * 4 + 3) / 3;
+            _behaviorsMap = new HashMap<String,  List<ClientBehavior> >(initCapacity);
+            for (Map.Entry<String, Object> entry : stateMap.entrySet())
+            {
+                _behaviorsMap.put(entry.getKey(), (List<ClientBehavior>) restoreAttachedState(facesContext, entry.getValue()));
+            }
+        }
+        else
+        {
+            _behaviorsMap = null;
+        }        
+    }
+    
+    @SuppressWarnings("unchecked")
+    private void restoreDeltaBehaviorsMap(FacesContext facesContext, Object stateObj)
+    {
+        if (stateObj != null)
+        {
+            Map<String, Object> stateMap = (Map<String, Object>) stateObj;
+            int initCapacity = (stateMap.size() * 4 + 3) / 3;
+            if (_behaviorsMap == null)
+            {
+                _behaviorsMap = new HashMap<String,  List<ClientBehavior> >(initCapacity);
+            }
+            for (Map.Entry<String, Object> entry : stateMap.entrySet())
+            {
+                Object savedObject = entry.getValue(); 
+                if (savedObject instanceof _AttachedDeltaWrapper)
+                {
+                    StateHolder holderList = (StateHolder) _behaviorsMap.get(entry.getKey());
+                    holderList.restoreState(facesContext, ((_AttachedDeltaWrapper) savedObject).getWrappedStateObject());
+                }
+                else
+                {
+                    _behaviorsMap.put(entry.getKey(), (List<ClientBehavior>) restoreAttachedState(facesContext, savedObject));
+                }
+            }
+        }
+    }
+    
+    private Object saveBehaviorsMap(FacesContext facesContext)
+    {
+        if (_behaviorsMap != null)
+        {
+            if (initialStateMarked())
+            {
+                HashMap<String, Object> stateMap = new HashMap<String, Object>(_behaviorsMap.size(), 1);
+                
+                for (Map.Entry<String, List<ClientBehavior> > entry : _behaviorsMap.entrySet())
+                {
+                    // The list is always an instance of _DeltaList so we can cast to
+                    // PartialStateHolder 
+                    PartialStateHolder holder = (PartialStateHolder) entry.getValue();
+                    if (holder.initialStateMarked())
+                    {
+                        Object attachedState = holder.saveState(facesContext);
+                        if (attachedState != null)
+                        {
+                            stateMap.put(entry.getKey(), new _AttachedDeltaWrapper(_facesListeners.getClass(),
+                                    attachedState));
+                        }
+                    }
+                    else
+                    {
+                        stateMap.put(entry.getKey(), saveAttachedState(facesContext, holder));
+                    }
+                }
+                return stateMap;
+            }
+            else
+            {
+                //Save it in the traditional way
+                HashMap<String, Object> stateMap = 
+                    new HashMap<String, Object>(_behaviorsMap.size(), 1);
+                for (Map.Entry<String, List<ClientBehavior> > entry : _behaviorsMap.entrySet())
+                {
+                    stateMap.put(entry.getKey(), saveAttachedState(facesContext, entry.getValue()));
+                }
+                return stateMap;
+            }
+        }
+        else
+        {
+            return null;
+        }
+    } 
 
     /*
     private Object saveBindings(FacesContext context)