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/09/01 07:13:35 UTC

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

Author: lu4242
Date: Tue Sep  1 05:13:35 2009
New Revision: 809815

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

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

Modified: myfaces/core/trunk/api/src/main/java/javax/faces/component/UIComponent.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/api/src/main/java/javax/faces/component/UIComponent.java?rev=809815&r1=809814&r2=809815&view=diff
==============================================================================
--- myfaces/core/trunk/api/src/main/java/javax/faces/component/UIComponent.java (original)
+++ myfaces/core/trunk/api/src/main/java/javax/faces/component/UIComponent.java Tue Sep  1 05:13:35 2009
@@ -19,18 +19,31 @@
 package javax.faces.component;
 
 import java.io.IOException;
-import java.util.*;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Deque;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.PropertyResourceBundle;
+import java.util.ResourceBundle;
+import java.util.Set;
 
-import javax.el.ELContext;
 import javax.el.ELException;
 import javax.el.ValueExpression;
 import javax.faces.FacesException;
-import javax.faces.application.Application;
 import javax.faces.application.Resource;
 import javax.faces.component.visit.VisitCallback;
 import javax.faces.component.visit.VisitContext;
-import javax.faces.component.visit.VisitResult;
 import javax.faces.component.visit.VisitHint;
+import javax.faces.component.visit.VisitResult;
 import javax.faces.context.FacesContext;
 import javax.faces.el.ValueBinding;
 import javax.faces.event.AbortProcessingException;
@@ -69,7 +82,7 @@
     public static final String FACETS_KEY = "javax.faces.component.FACETS_KEY";
     public static final String VIEW_LOCATION_KEY = "javax.faces.component.VIEW_LOCATION_KEY";
     private static final String _COMPONENT_STACK = "componentStack:" + UIComponent.class.getName();
-    private Map<Class<? extends SystemEvent>, List<SystemEventListener>> _systemEventListenerClassMap;
+    Map<Class<? extends SystemEvent>, List<SystemEventListener>> _systemEventListenerClassMap;
     
     @Deprecated
     protected Map<String, ValueExpression> bindings;
@@ -591,7 +604,7 @@
         List<SystemEventListener> listeners = _systemEventListenerClassMap.get(eventClass);
         // Make sure the list for class exists
         if (listeners == null) {
-            listeners = new ArrayList<SystemEventListener>(2);
+            listeners = new _DeltaList<SystemEventListener>(new ArrayList<SystemEventListener>(2));
             _systemEventListenerClassMap.put(eventClass, listeners);
         }
 

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=809815&r1=809814&r2=809815&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 Tue Sep  1 05:13:35 2009
@@ -28,7 +28,6 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import javax.el.ValueExpression;
 import javax.faces.FacesException;
@@ -43,6 +42,8 @@
 import javax.faces.event.PostAddToViewEvent;
 import javax.faces.event.PreRemoveFromViewEvent;
 import javax.faces.event.PreRenderComponentEvent;
+import javax.faces.event.SystemEvent;
+import javax.faces.event.SystemEventListener;
 import javax.faces.render.RenderKit;
 import javax.faces.render.RenderKitFactory;
 import javax.faces.render.Renderer;
@@ -407,6 +408,14 @@
                 ((PartialStateHolder) entry.getValue()).clearInitialState();
             }
         }
+        if (_systemEventListenerClassMap != null)
+        {
+            for (Map.Entry<Class<? extends SystemEvent>, List<SystemEventListener>> entry : 
+                _systemEventListenerClassMap.entrySet())
+            {
+                ((PartialStateHolder) entry.getValue()).clearInitialState();
+            }
+        }
     }
 
     /**
@@ -980,6 +989,14 @@
                 ((PartialStateHolder) entry.getValue()).markInitialState();
             }
         }
+        if (_systemEventListenerClassMap != null)
+        {
+            for (Map.Entry<Class<? extends SystemEvent>, List<SystemEventListener>> entry : 
+                _systemEventListenerClassMap.entrySet())
+            {
+                ((PartialStateHolder) entry.getValue()).markInitialState();
+            }
+        }
     }
 
     @Override
@@ -1515,6 +1532,7 @@
             //and never changes during component life.
             Object facesListenersSaved = saveFacesListenersList(context);
             Object behaviorsMapSaved = saveBehaviorsMap(context);
+            Object systemEventListenerClassMapSaved = saveSystemEventListenerClassMap(context);
             Object stateHelperSaved = null;
             StateHelper stateHelper = getStateHelper(false);
             if (stateHelper != null)
@@ -1522,17 +1540,18 @@
                 stateHelperSaved = stateHelper.saveState(context);
             }
             
-            if (facesListenersSaved == null && stateHelperSaved == null && behaviorsMapSaved == null)
+            if (facesListenersSaved == null && stateHelperSaved == null && 
+                behaviorsMapSaved == null && systemEventListenerClassMapSaved == null)
             {
                 return null;
             }
             
-            return new Object[] {facesListenersSaved, stateHelperSaved, behaviorsMapSaved};
+            return new Object[] {facesListenersSaved, stateHelperSaved, behaviorsMapSaved, systemEventListenerClassMapSaved};
         }
         else
         {
             //Full
-            Object values[] = new Object[5];
+            Object values[] = new Object[6];
             values[0] = saveFacesListenersList(context);
             StateHelper stateHelper = getStateHelper(false);
             if (stateHelper != null)
@@ -1540,8 +1559,9 @@
                 values[1] = stateHelper.saveState(context);
             }
             values[2] = saveBehaviorsMap(context);
-            values[3] = _id;
-            values[4] = _clientId;
+            values[3] = saveSystemEventListenerClassMap(context);
+            values[4] = _id;
+            values[5] = _clientId;
 
             return values;
         }
@@ -1566,7 +1586,7 @@
         
         Object values[] = (Object[]) state;
         
-        if ( values.length == 5 && initialStateMarked())
+        if ( values.length == 6 && initialStateMarked())
         {
             //Delta mode is active, but we are restoring a full state.
             //we need to clear the initial state, to restore state without
@@ -1584,7 +1604,7 @@
                         ((_AttachedDeltaWrapper) values[0]).getWrappedStateObject());
             //}
         }
-        else if (values[0] != null || (values.length == 5))
+        else if (values[0] != null || (values.length == 6))
         {
             //Full
             _facesListeners = (_DeltaList<FacesListener>)
@@ -1597,21 +1617,23 @@
         
         getStateHelper().restoreState(context, values[1]);
         
-        if (values.length == 5)
+        if (values.length == 6)
         {
             //Full restore
             restoreFullBehaviorsMap(context, values[2]);
+            restoreFullSystemEventListenerClassMap(context, values[3]);
         }
         else
         {
             //Delta restore
             restoreDeltaBehaviorsMap(context, values[2]);
+            restoreDeltaSystemEventListenerClassMap(context, values[3]);
         }
         
-        if (values.length == 5)
+        if (values.length == 6)
         {
-            _id = (String) values[3];
-            _clientId = (String) values[4];
+            _id = (String) values[4];
+            _clientId = (String) values[5];
         }
     }
     
@@ -1726,8 +1748,101 @@
         {
             return null;
         }
-    } 
-
+    }
+    
+    @SuppressWarnings("unchecked")
+    private void restoreFullSystemEventListenerClassMap(FacesContext facesContext, Object stateObj)
+    {
+        if (stateObj != null)
+        {
+            Map<Class<? extends SystemEvent>, Object> stateMap = (Map<Class<? extends SystemEvent>, Object>) stateObj;
+            int initCapacity = (stateMap.size() * 4 + 3) / 3;
+            _systemEventListenerClassMap = new HashMap<Class<? extends SystemEvent>, List<SystemEventListener>>(initCapacity);
+            for (Map.Entry<Class<? extends SystemEvent>, Object> entry : stateMap.entrySet())
+            {
+                _systemEventListenerClassMap.put(entry.getKey(), (List<SystemEventListener>) restoreAttachedState(facesContext, entry.getValue()));
+            }
+        }
+        else
+        {
+            _systemEventListenerClassMap = null;
+        }        
+    }
+    
+    @SuppressWarnings("unchecked")
+    private void restoreDeltaSystemEventListenerClassMap(FacesContext facesContext, Object stateObj)
+    {
+        if (stateObj != null)
+        {
+            Map<Class<? extends SystemEvent>, Object> stateMap = (Map<Class<? extends SystemEvent>, Object>) stateObj;
+            int initCapacity = (stateMap.size() * 4 + 3) / 3;
+            if (_systemEventListenerClassMap == null)
+            {
+                _systemEventListenerClassMap = new HashMap<Class<? extends SystemEvent>, List<SystemEventListener>>(initCapacity);
+            }
+            for (Map.Entry<Class<? extends SystemEvent>, Object> entry : stateMap.entrySet())
+            {
+                Object savedObject = entry.getValue(); 
+                if (savedObject instanceof _AttachedDeltaWrapper)
+                {
+                    StateHolder holderList = (StateHolder) _systemEventListenerClassMap.get(entry.getKey());
+                    holderList.restoreState(facesContext, ((_AttachedDeltaWrapper) savedObject).getWrappedStateObject());
+                }
+                else
+                {
+                    _systemEventListenerClassMap.put(entry.getKey(), (List<SystemEventListener>) restoreAttachedState(facesContext, savedObject));
+                }
+            }
+        }
+    }
+    
+    private Object saveSystemEventListenerClassMap(FacesContext facesContext)
+    {
+        if (_systemEventListenerClassMap != null)
+        {
+            if (initialStateMarked())
+            {
+                HashMap<Class<? extends SystemEvent>, Object> stateMap = new HashMap<Class<? extends SystemEvent>, Object>(_systemEventListenerClassMap.size(), 1);
+                
+                for (Map.Entry<Class<? extends SystemEvent>, List<SystemEventListener> > entry : _systemEventListenerClassMap.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<Class<? extends SystemEvent>, Object> stateMap = 
+                    new HashMap<Class<? extends SystemEvent>, Object>(_systemEventListenerClassMap.size(), 1);
+                for (Map.Entry<Class<? extends SystemEvent>, List<SystemEventListener> > entry : _systemEventListenerClassMap.entrySet())
+                {
+                    stateMap.put(entry.getKey(), saveAttachedState(facesContext, entry.getValue()));
+                }
+                return stateMap;
+            }
+        }
+        else
+        {
+            return null;
+        }
+    }
+    
     /*
     private Object saveBindings(FacesContext context)
     {