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/06/26 23:30:39 UTC

svn commit: r788877 [2/2] - in /myfaces/core/branches/2_0_0/api/src: main/java/javax/faces/component/ main/resources/META-INF/ test/java/javax/faces/component/

Added: myfaces/core/branches/2_0_0/api/src/main/java/javax/faces/component/_DeltaList.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/api/src/main/java/javax/faces/component/_DeltaList.java?rev=788877&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/api/src/main/java/javax/faces/component/_DeltaList.java (added)
+++ myfaces/core/branches/2_0_0/api/src/main/java/javax/faces/component/_DeltaList.java Fri Jun 26 21:30:38 2009
@@ -0,0 +1,523 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package javax.faces.component;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+
+import javax.faces.context.FacesContext;
+
+/**
+ * This class handle deltas on facesListener and validatorList.
+ * 
+ * It is only used by this methods on UIComponentBase:
+ * 
+ * addFacesListener
+ * broadcast
+ * getFacesListeners
+ * removeFacesListener
+ * 
+ * A facesListener could hold PartialStateHolder instances, so it 
+ * is necessary to provide convenient methods to track deltas.
+ * 
+ * @author Leonardo Uribe (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+class _DeltaList<T> implements List<T>, PartialStateHolder
+{
+
+    private List<T> _delegate;
+    private UIComponent _component;
+    private Map<Object,Boolean> _deltas;
+    private boolean _initialStateMarked;
+    
+    public _DeltaList()
+    {
+    }
+    
+    public _DeltaList(List<T> delegate)
+    {
+        _delegate = delegate;
+    }
+    
+    private boolean _createDeltas()
+    {
+        if (initialStateMarked())
+        {
+            if (_deltas == null)
+            {
+                _deltas = new HashMap<Object, Boolean>(4);
+            }
+            return true;
+        }
+
+        return false;
+    }    
+
+    public void add(int index, T element)
+    {
+        if (_createDeltas())
+        {
+            _deltas.put(element, Boolean.TRUE);
+        }
+        _delegate.add(index, element);
+    }
+
+    public boolean add(T e)
+    {
+        if (_createDeltas())
+        {
+            _deltas.put(e, Boolean.TRUE);
+        }
+        return _delegate.add(e);
+    }
+
+    public boolean addAll(Collection<? extends T> c)
+    {
+        if (_createDeltas())
+        {
+            for (Iterator<? extends T> it = c.iterator(); it.hasNext();)
+            {
+                _deltas.put(it.next(), Boolean.TRUE);
+            }
+        }        
+        return _delegate.addAll(c);
+    }
+
+    public boolean addAll(int index, Collection<? extends T> c)
+    {
+        if (_createDeltas())
+        {
+            for (Iterator<? extends T> it = c.iterator(); it.hasNext();)
+            {
+                _deltas.put(it.next(), Boolean.TRUE);
+            }
+        }        
+        return _delegate.addAll(index, c);
+    }
+
+    public void clear()
+    {
+        if (_createDeltas())
+        {
+            for (Iterator<? extends T> it = _delegate.iterator(); it.hasNext();)
+            {
+                _deltas.put(it.next(), Boolean.FALSE);
+            }
+        }        
+        _delegate.clear();
+    }
+
+    public boolean contains(Object o)
+    {
+        return _delegate.contains(o);
+    }
+
+    public boolean containsAll(Collection<?> c)
+    {
+        return _delegate.containsAll(c);
+    }
+
+    public boolean equals(Object o)
+    {
+        return _delegate.equals(o);
+    }
+
+    public T get(int index)
+    {
+        return _delegate.get(index);
+    }
+
+    public int hashCode()
+    {
+        return _delegate.hashCode();
+    }
+
+    public int indexOf(Object o)
+    {
+        return _delegate.indexOf(o);
+    }
+
+    public boolean isEmpty()
+    {
+        return _delegate.isEmpty();
+    }
+
+    public Iterator<T> iterator()
+    {
+        return _delegate.iterator();
+    }
+
+    public int lastIndexOf(Object o)
+    {
+        return _delegate.lastIndexOf(o);
+    }
+
+    public ListIterator<T> listIterator()
+    {
+        return _delegate.listIterator();
+    }
+
+    public ListIterator<T> listIterator(int index)
+    {
+        return _delegate.listIterator(index);
+    }
+
+    public T remove(int index)
+    {
+        if (_createDeltas())
+        {
+            _deltas.put(_delegate.get(index), Boolean.FALSE);
+        }        
+        return _delegate.remove(index);
+    }
+
+    public boolean remove(Object o)
+    {
+        if (_createDeltas())
+        {
+            _deltas.put(o, Boolean.FALSE);
+        }                
+        return _delegate.remove(o);
+    }
+
+    public boolean removeAll(Collection<?> c)
+    {
+        if (_createDeltas())
+        {
+            for (Iterator it = c.iterator(); it.hasNext();)
+            {
+                _deltas.put(it.next(), Boolean.FALSE);
+            }
+        }
+        return _delegate.removeAll(c);
+    }
+
+    public boolean retainAll(Collection<?> c)
+    {
+        return _delegate.retainAll(c);
+    }
+
+    public T set(int index, T element)
+    {
+        if (_createDeltas())
+        {
+            _deltas.put(_delegate.get(index), Boolean.FALSE);
+            _deltas.put(element, Boolean.TRUE);
+        }
+        return _delegate.set(index, element);
+    }
+
+    public int size()
+    {
+        return _delegate == null ? 0 : _delegate.size();
+    }
+
+    public List<T> subList(int fromIndex, int toIndex)
+    {
+        return _delegate.subList(fromIndex, toIndex);
+    }
+
+    public Object[] toArray()
+    {
+        return _delegate.toArray();
+    }
+
+    public <T> T[] toArray(T[] a)
+    {
+        return _delegate.toArray(a);
+    }
+
+    public boolean isTransient()
+    {
+        return false;
+    }
+
+    public void setTransient(boolean newTransientValue)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    public void restoreState(FacesContext context, Object state)
+    {
+        if (state == null)
+        {
+            return;
+        }
+        
+        if (_createDeltas())
+        {            
+            //Restore delta
+            Object[] listAsMap = (Object[]) state;
+            for (int cnt = 0; cnt < listAsMap.length; cnt += 2)
+            {   
+                if (listAsMap[cnt] instanceof Boolean)
+                {
+                    Boolean value = (Boolean) listAsMap[cnt];
+                    T key = (T) UIComponentBase.
+                        restoreAttachedState(context, listAsMap[cnt+1]);
+                    _deltas.put(key,value);
+                    if (key != null)
+                    {
+                        if (value.booleanValue())
+                        {
+                            _delegate.add(key);
+                        }
+                        else
+                        {
+                            _delegate.remove(key);
+                        }
+                    }
+                }
+                else if (listAsMap[cnt+1] != null)
+                {
+                    if (listAsMap[cnt+1] instanceof _AttachedDeltaWrapper)
+                    {
+                        _AttachedDeltaWrapper wrapper = (_AttachedDeltaWrapper) listAsMap[cnt+1];
+                        //Restore delta state
+                        ((PartialStateHolder)_delegate.get((Integer)listAsMap[cnt])).restoreState(context, wrapper.getWrappedStateObject());
+                    }
+                    else
+                    {
+                        //Replace it
+                        _delegate.set((Integer)listAsMap[cnt], (T) UIComponentBase.restoreAttachedState(context, listAsMap[cnt+1]));
+                    }
+                }
+                else if (listAsMap[cnt] != null)
+                {
+                    _delegate.set((Integer)listAsMap[cnt],null);
+                }
+            }
+        }
+        else
+        {
+            //Restore delegate
+            Object[] lst = (Object[]) state;
+            _delegate = new ArrayList<T>(lst.length);
+            for (int i = 0; i < lst.length; i++)
+            {
+                _delegate.add((T) UIComponentBase.restoreAttachedState(context, lst[i]));
+            }
+        }
+    }
+
+    public Object saveState(FacesContext context)
+    {
+        if (initialStateMarked())
+        {
+            if (_deltas != null)
+            {
+                //Count stateHolder instances to keep track
+                int stateHolderKeyCount = 0;
+                for (int i = 0; i < _delegate.size(); i++)
+                {
+                    T key = _delegate.get(i);
+                    if (key instanceof StateHolder && !_deltas.containsKey(key))
+                    {
+                        stateHolderKeyCount+=2;
+                    }
+                }
+                
+                int cnt = 0;
+                boolean nullDelta = true;
+                Object[] mapArr = (Object[]) new Object[_deltas.size() * 2+stateHolderKeyCount];
+                for (Map.Entry<Object, Boolean> entry : _deltas.entrySet())
+                {
+                    mapArr[cnt] = entry.getValue();
+                    Object value = entry.getKey();
+                    if (value instanceof StateHolder ||
+                        value instanceof List ||
+                        !(value instanceof Serializable))
+                    {
+                        mapArr[cnt+1] = UIComponentBase.saveAttachedState(context, value);
+                    }
+                    else
+                    {
+                        mapArr[cnt+1] = value;
+                    }
+                    cnt += 2;
+                    nullDelta = false;
+                }
+    
+                //Deal with StateHolder instances
+                for (int i = 0; i < _delegate.size(); i++)
+                {
+                    T value = _delegate.get(i);
+                    if (value instanceof StateHolder && !_deltas.containsKey(value))
+                    {
+                        mapArr[cnt] = i;
+                        if (value instanceof PartialStateHolder)
+                        {
+                            //Could contain delta, save it as _AttachedDeltaState
+                            PartialStateHolder holder = (PartialStateHolder) value;
+                            if (holder.isTransient())
+                            {                                
+                                mapArr[cnt + 1] = null;
+                                nullDelta = false;
+                            }
+                            else
+                            {
+                                Object savedValue = holder.saveState(context);
+                                if (savedValue != null)
+                                {
+                                    mapArr[cnt+1] = new _AttachedDeltaWrapper(value.getClass(), savedValue);
+                                    nullDelta = false;
+                                }
+                                else
+                                {
+                                    mapArr[cnt] = null;
+                                    mapArr[cnt+1] = null;
+                                }
+                            }
+                        }
+                        else
+                        {
+                            mapArr[cnt+1] = UIComponentBase.saveAttachedState(context, value);
+                            nullDelta = false;
+                        }
+                        cnt+=2;
+                    }
+                }
+                if (nullDelta)
+                {
+                    return null;
+                }
+                return mapArr;
+            }
+            else
+            {
+                //Count stateHolder instances to keep track
+                int stateHolderKeyCount = 0;
+                for (int i = 0; i < _delegate.size(); i++)
+                {
+                    T key = _delegate.get(i);
+                    if (key instanceof StateHolder)
+                    {
+                        stateHolderKeyCount += 2;
+                    }
+                }
+
+                int cnt = 0;
+                Object[] mapArr = (Object[]) new Object[stateHolderKeyCount];
+                boolean nullDelta = true;
+                //Deal with StateHolder instances
+                for (int i = 0; i < _delegate.size(); i++)
+                {
+                    T value = _delegate.get(i);
+                    if (value instanceof StateHolder)
+                    {
+                        mapArr[cnt] = i;
+                        if (value instanceof PartialStateHolder)
+                        {
+                            //Could contain delta, save it as _AttachedDeltaState
+                            PartialStateHolder holder = (PartialStateHolder) value;
+                            if (holder.isTransient())
+                            {                                
+                                mapArr[cnt + 1] = null;
+                                nullDelta = false;
+                            }
+                            else
+                            {
+                                Object savedValue = holder.saveState(context);
+                                if (savedValue != null)
+                                {
+                                    mapArr[cnt+1] = new _AttachedDeltaWrapper(value.getClass(), savedValue);
+                                    nullDelta = false;
+                                }
+                                else
+                                {
+                                    mapArr[cnt] = null;
+                                    mapArr[cnt+1] = null;
+                                }
+                            }
+                        }
+                        else
+                        {
+                            mapArr[cnt+1] = UIComponentBase.saveAttachedState(context, value);
+                            nullDelta = false;
+                        }
+                        cnt+=2;
+                    }
+                }
+                if (nullDelta)
+                {
+                    return null;
+                }
+                return mapArr;                
+            }
+        }
+        else
+        {
+            Object [] lst = new Object[this.size()];
+            int i = 0;
+            for (Iterator it = _delegate.iterator(); it.hasNext();)
+            {
+                lst[i] = UIComponentBase.saveAttachedState(context, it.next());
+                i++;
+            }
+            return lst;
+        }
+    }
+
+    @Override
+    public void clearInitialState()
+    {
+        //Reset delta setting to null
+        _deltas = null;
+        _initialStateMarked = false;
+        if (_delegate != null)
+        {
+            for (T value : _delegate)
+            {
+                if (value instanceof PartialStateHolder)
+                {
+                    ((PartialStateHolder)value).clearInitialState();
+                }
+            }
+        }
+    }
+
+    @Override
+    public boolean initialStateMarked()
+    {
+        return _initialStateMarked;
+    }
+
+    @Override
+    public void markInitialState()
+    {
+        _initialStateMarked = true;
+        if (_delegate != null)
+        {
+            for (T value : _delegate)
+            {
+                if (value instanceof PartialStateHolder)
+                {
+                    ((PartialStateHolder)value).markInitialState();
+                }
+            }
+        }
+    }
+}

Propchange: myfaces/core/branches/2_0_0/api/src/main/java/javax/faces/component/_DeltaList.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/core/branches/2_0_0/api/src/main/java/javax/faces/component/_DeltaList.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: myfaces/core/branches/2_0_0/api/src/main/java/javax/faces/component/_DeltaStateHelper.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/api/src/main/java/javax/faces/component/_DeltaStateHelper.java?rev=788877&r1=788876&r2=788877&view=diff
==============================================================================
--- myfaces/core/branches/2_0_0/api/src/main/java/javax/faces/component/_DeltaStateHelper.java (original)
+++ myfaces/core/branches/2_0_0/api/src/main/java/javax/faces/component/_DeltaStateHelper.java Fri Jun 26 21:30:38 2009
@@ -109,6 +109,21 @@
  *   <li>The state is handled in the same way on UIData, so components
  *   inside UIData share its state on all rows. There is no way to save 
  *   delta per row.</li>
+ *   <li>The map backed by method put(Serializable,String,Object) is
+ *   a replacement of UIComponentBase.attributesMap and UIComponent.bindings map.
+ *   Note that on jsf 1.2, instances saved on attributesMap should not be
+ *   StateHolder, but on jsf 2.0 it is possible to have it. PartialStateHolder
+ *   instances are not handled in this map, or in other words delta state is not
+ *   handled in this classes (markInitialState and clearInitialState is not propagated).</li>
+ *   <li>The list backed by method add(Serializable,Object) should be (is not) a 
+ *   replacement of UIComponentBase.facesListeners, but note that StateHelper
+ *   does not implement PartialStateHolder, and facesListener could have instances
+ *   of that class that needs to be notified when UIComponent.markInitialState or
+ *   UIComponent.clearInitialState is called, or in other words facesListeners
+ *   should deal with PartialStateHolder instances.</li>
+ *   <li>The list backed by method add(Serializable,Object) is 
+ *   a replacement of UIViewRoot.phaseListeners list. Note that instances of
+ *   PhaseListener are not expected to implement StateHolder or PartialStateHolder.</li>
  * </ul>
  * </p>
  * <p>
@@ -171,7 +186,7 @@
      */
     private boolean _createDeltas()
     {
-        if (isInitalStateMarked())
+        if (isInitialStateMarked())
         {
             if (_deltas == null)
             {
@@ -183,7 +198,7 @@
         return false;
     }
     
-    protected boolean isInitalStateMarked()
+    protected boolean isInitialStateMarked()
     {
         return _component.initialStateMarked();
     }
@@ -490,7 +505,7 @@
     @Override
     public Object saveState(FacesContext context)
     {
-        Map serializableMap = (isInitalStateMarked()) ? _deltas : _fullState;
+        Map serializableMap = (isInitialStateMarked()) ? _deltas : _fullState;
 
         if (serializableMap == null || serializableMap.size() == 0)
         {
@@ -594,7 +609,7 @@
             Object savedValue = UIComponentBase.restoreAttachedState(context,
                     serializedState[cnt + 1]);
 
-            if (isInitalStateMarked())
+            if (isInitialStateMarked())
             {
                 if (savedValue instanceof InternalDeltaListMap)
                 {

Modified: myfaces/core/branches/2_0_0/api/src/main/resources/META-INF/componentClass12.vm
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/api/src/main/resources/META-INF/componentClass12.vm?rev=788877&r1=788876&r2=788877&view=diff
==============================================================================
--- myfaces/core/branches/2_0_0/api/src/main/resources/META-INF/componentClass12.vm (original)
+++ myfaces/core/branches/2_0_0/api/src/main/resources/META-INF/componentClass12.vm Fri Jun 26 21:30:38 2009
@@ -104,6 +104,7 @@
 #set ($defaultValue = false)
 #end
     // Property: $property.name
+#if ($property.isStateHolder())
 #if ($property.isLiteralOnly() || $property.isTagExcluded() )
     private $type $field #if($defaultValue) = $defaultValue;#{else};#{end}
 
@@ -112,6 +113,13 @@
     private $type $field;
     
 #end
+
+    private boolean _$utils.getPrefixedPropertyName("isSet", $property.name)()
+    {
+        Boolean value = (Boolean) getStateHelper().get(PropertyKeys.${property.name}Set);
+        return value == null ? false : value;
+    }
+
 #if($utils.isPrimitiveClass($type) && !$property.isTagExcluded() )
     private boolean ${field}Set;
     
@@ -178,74 +186,263 @@
     public void $utils.getPrefixedPropertyName("set", $property.name)($type $utils.getVariableFromName($property.name))
     {
         this.$field = $utils.getVariableFromName($property.name);
+        if (initialStateMarked())
+        {
+            getStateHelper().put(PropertyKeys.${property.name}Set,Boolean.TRUE);
+        }
 #if ($utils.isPrimitiveClass($type) && !$property.isTagExcluded() )
         this.${field}Set = true;        
 #end
     }
+#else
+## StateHelper aware property
+#if ($property.name == "for")
+## To keep compatibility with RI, we should call it forVal
+#set ($field = "forVal")
+#else
+#set ($field = $property.name)
 #end
 
-    @Override
-    public Object saveState(FacesContext facesContext)
+    public $type $utils.getMethodReaderFromProperty($property.name, $type)()
+    {
+#if ($property.isLiteralOnly())
+#if ($defaultValue)
+        Object value = getStateHelper().get(PropertyKeys.$field);
+        if (value != null)
+        {
+            return $utils.castIfNecessary($type) value;        
+        }
+        return $defaultValue;        
+#else
+        return $utils.castIfNecessary($type) getStateHelper().get(PropertyKeys.$field);        
+#end
+#else
+#if ($defaultValue)
+        return $utils.castIfNecessary($type) getStateHelper().eval(PropertyKeys.$field, $defaultValue);
+#else
+        return $utils.castIfNecessary($type) getStateHelper().eval(PropertyKeys.$field);
+#end
+#end
+    }
+    
+    public void $utils.getPrefixedPropertyName("set", $property.name)($type $utils.getVariableFromName($property.name))
     {
-#set ($primitiveCount = $propertyList.size() + 1)
+        getStateHelper().put(PropertyKeys.$field, $utils.getVariableFromName($property.name) ); 
+    }    
+#end
+#end
+
+#if ($component.className.startsWith("javax.faces.component.html"))
+    protected enum PropertyKeys
+    {
+#else
+    enum PropertyKeys
+    {
+#end
+#set ($comma = "")
+#set ($addc = "false")
+#foreach( $property in $propertyList )
+#if ($property.name == "for")
+#set ($addc = "true")
+## To keep compatibility with RI, we should call it forVal
+#set ($field = "forVal")
+#else
+#set ($field = $property.name)
+#end
+#set ($type = $utils.getClassFromFullClass($property.className))
+#if($utils.getDefaultValueField($property)) 
+#set ($defaultValue = $utils.getDefaultValueField($property))
+#else
+#set ($defaultValue = false)
+#end
+#if ($property.name == "for")
+        $comma $field("for")
+#else
+#if ($property.isStateHolder())
+        $comma ${field}Set
+#else
+        $comma $field
+#end
+#end
+#set($comma = ",")
+#end
+#if ("true" == $addc)
+        ;
+        String c;
+        
+        PropertyKeys()
+        {
+        }
+        
+        //Constructor needed by "for" property
+        PropertyKeys(String c)
+        { 
+            this.c = c;
+        }
+        
+        public String toString()
+        {
+            return ((this.c != null) ? this.c : super.toString());
+        }
+#end
+    }
+
+#set ($primitiveCount = 1) ## $propertyList.size() + 1 
 #foreach( $property in $propertyList )
+#if ($property.isStateHolder())
+#set ($primitiveCount = $primitiveCount + 1)
 #if($utils.isPrimitiveClass($property.className))
 #set ($primitiveCount = $primitiveCount + 1)
 #end
 #end
-        Object[] values = new Object[$primitiveCount];
-        values[0] = super.saveState(facesContext);
+#end
+## saveState and restoreState methods only has sense if we have properties
+## that does not use StateHelper class.
+#if ($primitiveCount > 1)
+
+    public void markInitialState()
+    {
+        super.markInitialState();
+#foreach( $property in $propertyList )
+#set ($field = $property.fieldName)
+#if ($property.isStateHolder())        
+        if ($field != null && 
+            $field instanceof PartialStateHolder)
+        {
+            ((PartialStateHolder)$field).markInitialState();
+        }
+#end
+#end
+    }
+    
+    public void clearInitialState()
+    {
+        if (initialStateMarked())
+        {
+            super.clearInitialState();
+#foreach( $property in $propertyList )
+#set ($field = $property.fieldName)
+#if ($property.isStateHolder())
+##          //Only has sense propagate this method if is initialStateMarked
+            if ($field != null && 
+                $field instanceof PartialStateHolder)
+            {
+                ((PartialStateHolder)$field).clearInitialState();
+            }
+#end
+#end
+        }
+    }
+
+    @Override
+    public Object saveState(FacesContext facesContext)
+    {
+        if (initialStateMarked())
+        {
+            boolean nullDelta = true;
+            Object parentSaved = super.saveState(facesContext);
 #set ($arrayIndex = 0)
 #foreach( $property in $propertyList )
 #set ($field = $property.fieldName)
 #set ($type = $property.className)
+#if ($property.isStateHolder())
 #set ($arrayIndex = $arrayIndex + 1)
-#if ($property.jspName == "validator" && $property.isMethodBinding() )
-        values[$arrayIndex] = saveAttachedState(facesContext,${field}List);
-#elseif ( $property.isStateHolder() )## || $utils.isConverter($type)
-        values[$arrayIndex] = saveAttachedState(facesContext,$field);
-#elseif($utils.isPrimitiveClass($type))
-        values[$arrayIndex] = ${utils.getBoxedClass($type)}.valueOf($field);
-#else
-        values[$arrayIndex] = $field;
+            Object ${property.name}Saved = null;
+            if (!_$utils.getPrefixedPropertyName("isSet", $property.name)() &&
+                $field != null && $field instanceof PartialStateHolder)
+            {
+                //Delta
+                StateHolder holder = (StateHolder) $field;
+                if (!holder.isTransient())
+                {
+                    Object attachedState = holder.saveState(facesContext);
+                    if (attachedState != null)
+                    {
+                        nullDelta = false;
+                    }
+                    ${property.name}Saved = new _AttachedDeltaWrapper(${field}.getClass(),
+                        attachedState);
+                }
+            }
+            else
+            {
+                //Full
+                ${property.name}Saved = saveAttachedState(facesContext,$field);
+                nullDelta = false;
+            }        
+## StateHelper Properties does not need save and restore
+#end
+#end
+            if (parentSaved == null && nullDelta)
+            {
+                //No values
+                return null;
+            }
+            
+            Object[] values = new Object[$primitiveCount];
+            values[0] = parentSaved;
+## Save full state
+#set ($arrayIndex = 0)
+#foreach( $property in $propertyList )
+#set ($field = $property.fieldName)
+#set ($type = $property.className)
+#if ($property.isStateHolder())
+#set ($arrayIndex = $arrayIndex + 1)
+            values[$arrayIndex] = ${property.name}Saved;
+## StateHelper Properties does not need save and restore
+#end
 #end
-#if($utils.isPrimitiveClass($type) && !$property.isTagExcluded())
+            return values;
+        }
+        else
+        {
+            Object[] values = new Object[$primitiveCount];
+            values[0] = super.saveState(facesContext);
+## Save full state
+#set ($arrayIndex = 0)
+#foreach( $property in $propertyList )
+#set ($field = $property.fieldName)
+#set ($type = $property.className)
+#if ($property.isStateHolder())
 #set ($arrayIndex = $arrayIndex + 1)
-        values[$arrayIndex] = Boolean.valueOf(${field}Set);
+            values[$arrayIndex] = saveAttachedState(facesContext,$field);
+## StateHelper Properties does not need save and restore
 #end
 #end
-        return values; 
+            return values;
+        }
     }
 
     @Override
     public void restoreState(FacesContext facesContext, Object state)
     {
+        if (state == null)
+        {
+            return;
+        }
+        
         Object[] values = (Object[])state;
         super.restoreState(facesContext,values[0]);
 #set ($arrayIndex = 0)
 #foreach( $property in $propertyList )
 #set ($field = $property.fieldName)
 #set ($type = $property.className)
+#if ($property.isStateHolder())
 #set ($arrayIndex = $arrayIndex + 1)
-#if ( $property.isStateHolder() )
-#if ($property.jspName == "validator" && $property.isMethodBinding() )
-        ${field}List = (List<Validator>) restoreAttachedState(facesContext,values[$arrayIndex]);
-#elseif ($utils.isList($type))
-        $field = (List) restoreAttachedState(facesContext,values[$arrayIndex]);
-#else
-        $field = $utils.castIfNecessary($type) restoreAttachedState(facesContext,values[$arrayIndex]); 
-#end
-#elseif ($utils.isConverter($type)) 
-        $field = (Converter) restoreAttachedState(facesContext,values[$arrayIndex]);
-#elseif ($utils.isPrimitiveClass($type))
-        $field = ($utils.castIfNecessary($type) values[$arrayIndex]).${type}Value();
+        if (values[$arrayIndex] instanceof _AttachedDeltaWrapper)
+        {
+            //Delta
+            ((StateHolder)$field).restoreState(facesContext, ((_AttachedDeltaWrapper) values[$arrayIndex]).getWrappedStateObject());
+        }
+        else
+        {
+            //Full
+            $field = $utils.castIfNecessary($type) restoreAttachedState(facesContext,values[$arrayIndex]);
+        }         
 #else
-        $field = $utils.castIfNecessary($type) values[$arrayIndex];
-#end
-#if($utils.isPrimitiveClass($type) && !$property.isTagExcluded() )
-#set ($arrayIndex = $arrayIndex + 1)
-        ${field}Set = ((Boolean) values[$arrayIndex]).booleanValue();
+## StateHelper Properties does not need save and restore
 #end
 #end
     }
+#end
 }

Modified: myfaces/core/branches/2_0_0/api/src/test/java/javax/faces/component/_Delta2StateHelperTest.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/api/src/test/java/javax/faces/component/_Delta2StateHelperTest.java?rev=788877&r1=788876&r2=788877&view=diff
==============================================================================
--- myfaces/core/branches/2_0_0/api/src/test/java/javax/faces/component/_Delta2StateHelperTest.java (original)
+++ myfaces/core/branches/2_0_0/api/src/test/java/javax/faces/component/_Delta2StateHelperTest.java Fri Jun 26 21:30:38 2009
@@ -22,6 +22,9 @@
 import java.util.Map;
 
 import javax.faces.context.FacesContext;
+import javax.faces.event.PhaseEvent;
+import javax.faces.event.PhaseId;
+import javax.faces.event.PhaseListener;
 
 
 public class _Delta2StateHelperTest extends AbstractComponentTest
@@ -480,5 +483,125 @@
             assertNull(mapB.get("key2"));
             assertNull(mapB.get("key1"));
         }
+    }
+    
+    public static class TestPhaseListener1 implements PhaseListener
+    {
+        public TestPhaseListener1(){}
+        
+        @Override
+        public void afterPhase(PhaseEvent event){}
+
+        @Override
+        public void beforePhase(PhaseEvent event){}
+
+        @Override
+        public PhaseId getPhaseId()
+        {
+            return PhaseId.ANY_PHASE;
+        }
+        
+        @Override
+        public boolean equals(Object obj)
+        {
+            if (obj instanceof TestPhaseListener1)
+                return true;
+            return false;
+        }
+    }
+    
+    public static class TestPhaseListener2 implements PhaseListener
+    {
+        public TestPhaseListener2(){}
+        
+        @Override
+        public void afterPhase(PhaseEvent event){}
+
+        @Override
+        public void beforePhase(PhaseEvent event){}
+
+        @Override
+        public PhaseId getPhaseId()
+        {
+            return PhaseId.ANY_PHASE;
+        }
+        
+        @Override
+        public boolean equals(Object obj)
+        {
+            if (obj instanceof TestPhaseListener2)
+                return true;
+            return false;
+        }
+    }    
+        
+    public void testUIViewRootPhaseListener1() throws Exception
+    {
+        UIViewRoot a = new UIViewRoot();
+        UIViewRoot b = new UIViewRoot();
+        
+        PhaseListener phaseListener1 = new TestPhaseListener1();
+        
+        a.addPhaseListener(phaseListener1);
+        
+        b.restoreState(facesContext, a.saveState(facesContext));
+        
+        assertTrue(a.getPhaseListeners().contains(phaseListener1));
+        assertTrue(b.getPhaseListeners().contains(phaseListener1));
+    }
+    
+    public void testUIViewRootPhaseListener2() throws Exception
+    {
+        UIViewRoot a = new UIViewRoot();
+        UIViewRoot b = new UIViewRoot();
+        
+        a.markInitialState();
+        b.markInitialState();
+        
+        PhaseListener phaseListener1 = new TestPhaseListener1();
+        
+        a.addPhaseListener(phaseListener1);
+        
+        b.restoreState(facesContext, a.saveState(facesContext));
+        
+        assertTrue(a.getPhaseListeners().contains(phaseListener1));
+        assertTrue(b.getPhaseListeners().contains(phaseListener1));
+    }
+    
+    public void testUIViewRootPhaseListener3() throws Exception
+    {
+        UIViewRoot a = new UIViewRoot();
+        UIViewRoot b = new UIViewRoot();
+        UIViewRoot c = new UIViewRoot();
+
+        PhaseListener phaseListener2 = new TestPhaseListener1();
+        a.addPhaseListener(phaseListener2);
+        b.addPhaseListener(phaseListener2);
+        c.addPhaseListener(phaseListener2);
+        
+        a.markInitialState();
+        b.markInitialState();
+        c.markInitialState();
+        
+        PhaseListener phaseListener1 = new TestPhaseListener1();
+        
+        a.addPhaseListener(phaseListener1);
+        
+        b.restoreState(facesContext, a.saveState(facesContext));
+        
+        assertTrue(a.getPhaseListeners().contains(phaseListener1));
+        assertTrue(b.getPhaseListeners().contains(phaseListener1));
+        assertTrue(a.getPhaseListeners().contains(phaseListener2));
+        assertTrue(b.getPhaseListeners().contains(phaseListener2));
+        
+        a.removePhaseListener(phaseListener1);
+        a.removePhaseListener(phaseListener2);
+        
+        c.restoreState(facesContext, a.saveState(facesContext));
+        
+        assertFalse(a.getPhaseListeners().contains(phaseListener1));
+        assertFalse(c.getPhaseListeners().contains(phaseListener1));
+        assertFalse(a.getPhaseListeners().contains(phaseListener2));
+        assertFalse(c.getPhaseListeners().contains(phaseListener2));
     }    
 }

Added: myfaces/core/branches/2_0_0/api/src/test/java/javax/faces/component/_DeltaFacesListenerListTest.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/api/src/test/java/javax/faces/component/_DeltaFacesListenerListTest.java?rev=788877&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/api/src/test/java/javax/faces/component/_DeltaFacesListenerListTest.java (added)
+++ myfaces/core/branches/2_0_0/api/src/test/java/javax/faces/component/_DeltaFacesListenerListTest.java Fri Jun 26 21:30:38 2009
@@ -0,0 +1,494 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package javax.faces.component;
+
+import java.util.Arrays;
+import javax.faces.context.FacesContext;
+import javax.faces.event.FacesListener;
+
+public class _DeltaFacesListenerListTest extends AbstractComponentTest
+{
+    public _DeltaFacesListenerListTest(String arg0)
+    {
+        super(arg0);
+    }
+    
+    public static class UITestComponent extends UIComponentBase
+    {
+        
+        public UITestComponent()
+        {
+        }
+
+        @Override
+        public String getFamily()
+        {
+            return "javax.faces.Test";
+        }
+    }
+    
+    public static class NoStateFacesListener implements FacesListener
+    {
+        public NoStateFacesListener()
+        {
+        }
+
+        @Override
+        public boolean equals(Object obj)
+        {
+            if (obj instanceof NoStateFacesListener)
+                return true;
+            return false;
+        }
+    }
+    
+    public static class NoStateFacesListener2 implements FacesListener
+    {
+        public NoStateFacesListener2()
+        {
+        }
+
+        @Override
+        public boolean equals(Object obj)
+        {
+            if (obj instanceof NoStateFacesListener2)
+                return true;
+            return false;
+        }
+    }
+    
+    public static class StateFacesListener implements FacesListener, StateHolder
+    {
+        private boolean _transient;
+        
+        String value;
+        
+        public StateFacesListener()
+        {
+        }
+
+        @Override
+        public boolean equals(Object obj)
+        {
+            if (obj instanceof StateFacesListener)
+            {
+                if (value == null)
+                {
+                    if (((StateFacesListener)obj).value == null)
+                    {
+                        return true;
+                    }
+                }
+                else if (value.equals(((StateFacesListener)obj).value))
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        public boolean isTransient()
+        {
+            return _transient;
+        }
+
+        public void setTransient(boolean _transient)
+        {
+            this._transient = _transient;
+        }
+
+        @Override
+        public void restoreState(FacesContext context, Object state)
+        {
+            value = (String) state;
+        }
+
+        @Override
+        public Object saveState(FacesContext context)
+        {
+            return value;
+        }
+
+        public String getValue()
+        {
+            return value;
+        }
+
+        public void setValue(String value)
+        {
+            this.value = value;
+        }
+    }
+    
+    public static class PartialStateFacesListener extends StateFacesListener implements PartialStateHolder
+    {
+        private boolean initialStateMarked;
+        
+        @Override
+        public void restoreState(FacesContext context, Object state)
+        {
+            if (state != null)
+            {
+                value = (String) state;
+            }
+        }
+
+        @Override
+        public Object saveState(FacesContext context)
+        {
+            if (!initialStateMarked())
+            {
+                return value;
+            }
+            return null;
+        }
+
+        @Override
+        public void clearInitialState()
+        {
+            initialStateMarked = false;
+        }
+
+        @Override
+        public boolean initialStateMarked()
+        {
+            return initialStateMarked;
+        }
+
+        @Override
+        public void markInitialState()
+        {
+            initialStateMarked = true;
+        }        
+    }
+
+    @Override
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+    }
+
+    @Override
+    protected void tearDown() throws Exception
+    {
+        super.tearDown();
+    }
+
+    public void testSimpleAddRemove()
+    {
+        UITestComponent a = new UITestComponent();
+        FacesListener listener1 = new NoStateFacesListener(); 
+        a.addFacesListener(listener1);
+        assertTrue(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        a.removeFacesListener(listener1);
+        assertFalse(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));        
+    }
+    
+    public void testSimpleSaveRestore1()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        FacesListener listener1 = new NoStateFacesListener(); 
+        a.addFacesListener(listener1);
+        b.addFacesListener(listener1);
+        b.restoreState(facesContext, a.saveState(facesContext));
+        assertTrue(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertTrue(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));
+        a.removeFacesListener(listener1);
+        b.removeFacesListener(listener1);
+        assertFalse(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertFalse(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));        
+    }
+    
+    public void testSimpleSaveRestore2()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        a.markInitialState();
+        b.markInitialState();
+        FacesListener listener1 = new NoStateFacesListener(); 
+        a.addFacesListener(listener1);
+        Object [] savedState1 = (Object[]) a.saveState(facesContext);       
+        b.restoreState(facesContext, savedState1);
+        assertTrue(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertTrue(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));
+        a.removeFacesListener(listener1);
+        b.removeFacesListener(listener1);
+        assertFalse(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertFalse(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));        
+    }
+    
+    public void testSimpleSaveRestore3()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        FacesListener listener1 = new NoStateFacesListener(); 
+        FacesListener listener2 = new NoStateFacesListener();
+        a.addFacesListener(listener1);
+        b.addFacesListener(listener2);
+        a.markInitialState();
+        b.markInitialState();
+        Object [] savedState1 = (Object[]) a.saveState(facesContext);
+        assertNull(savedState1 == null ? null : savedState1[1]);
+        b.restoreState(facesContext, savedState1);        
+        assertTrue(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertTrue(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));
+        a.removeFacesListener(listener1);
+        b.removeFacesListener(listener1);
+        assertFalse(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertFalse(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));        
+    }
+    
+    public void testSimpleSaveRestore4()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        FacesListener listener1 = new NoStateFacesListener(); 
+        FacesListener listener2 = new NoStateFacesListener2();
+        a.addFacesListener(listener1);
+        b.addFacesListener(listener1);
+        a.markInitialState();
+        b.markInitialState();
+        a.addFacesListener(listener2);
+        b.restoreState(facesContext, a.saveState(facesContext));
+        assertTrue(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertTrue(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener2));
+        assertTrue(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertTrue(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener2));
+        a.removeFacesListener(listener1);
+        b.removeFacesListener(listener1);
+        a.removeFacesListener(listener2);
+        b.removeFacesListener(listener2);
+        assertFalse(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertFalse(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener2));
+        assertFalse(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertFalse(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener2));
+    }
+    
+    public void testSimpleSaveRestore5()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        UITestComponent c = new UITestComponent();
+        FacesListener listener1 = new NoStateFacesListener(); 
+        FacesListener listener2 = new NoStateFacesListener2();
+        a.addFacesListener(listener1);
+        b.addFacesListener(listener1);
+        a.markInitialState();
+        b.markInitialState();
+        a.addFacesListener(listener2);
+        b.restoreState(facesContext, a.saveState(facesContext));
+        assertTrue(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertTrue(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener2));
+        assertTrue(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertTrue(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener2));
+        a.removeFacesListener(listener1);
+        b.removeFacesListener(listener1);
+        a.removeFacesListener(listener2);
+        b.removeFacesListener(listener2);
+        assertFalse(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertFalse(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener2));
+        assertFalse(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertFalse(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener2));
+        
+        //Save fully
+        b.clearInitialState();
+        c.restoreState(facesContext, b.saveState(facesContext));
+        //c._facesListeners should be empty
+        assertFalse(Arrays.asList(c.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertFalse(Arrays.asList(c.getFacesListeners(FacesListener.class)).contains(listener2));
+    }
+    
+    public void testSimpleSaveRestore6()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        StateFacesListener listener1 = new StateFacesListener(); 
+        StateFacesListener listener2 = new StateFacesListener();
+        listener1.setValue("value1");
+        listener2.setValue("value2");
+        a.addFacesListener(listener1);
+        b.addFacesListener(listener2);
+        a.markInitialState();
+        b.markInitialState();
+        Object [] savedState1 = (Object[]) a.saveState(facesContext);
+        // This is not null because StateFacesListener is instance of StateHolder 
+        // and always needs to be saved and restored!
+        assertNotNull(savedState1[0]);
+        b.restoreState(facesContext, savedState1);        
+        assertTrue(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertTrue(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));
+        a.removeFacesListener(listener1);
+        b.removeFacesListener(listener1);
+        assertFalse(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertFalse(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));        
+    }
+    
+    public void testSimpleSaveRestore7()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        UITestComponent c = new UITestComponent();
+        StateFacesListener listener1 = new StateFacesListener(); 
+        StateFacesListener listener2 = new StateFacesListener();
+        listener1.setValue("value1");
+        listener2.setValue("value2");
+        a.addFacesListener(listener1);
+        b.addFacesListener(listener1);
+        a.markInitialState();
+        b.markInitialState();
+        a.addFacesListener(listener2);
+        b.restoreState(facesContext, a.saveState(facesContext));
+        assertTrue(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertTrue(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener2));
+        assertTrue(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertTrue(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener2));
+        a.removeFacesListener(listener1);
+        b.removeFacesListener(listener1);
+        a.removeFacesListener(listener2);
+        b.removeFacesListener(listener2);
+        assertFalse(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertFalse(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener2));
+        assertFalse(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertFalse(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener2));
+        
+        //Save fully
+        b.clearInitialState();
+        c.restoreState(facesContext, b.saveState(facesContext));
+        //c._facesListeners should be empty
+        assertFalse(Arrays.asList(c.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertFalse(Arrays.asList(c.getFacesListeners(FacesListener.class)).contains(listener2));
+    }
+    
+    public void testSimpleSaveRestore8()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        StateFacesListener listener1 = new PartialStateFacesListener(); 
+        listener1.setValue("value1");
+        a.addFacesListener(listener1);
+        b.addFacesListener(listener1);
+        a.markInitialState();
+        b.markInitialState();
+        Object [] savedState1 = (Object[]) a.saveState(facesContext);
+        // This is null because StateFacesListener is instance of PartialStateHolder 
+        assertNull(savedState1 == null ? null : savedState1[1]);
+        b.restoreState(facesContext, savedState1);        
+        assertTrue(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertTrue(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));
+        a.removeFacesListener(listener1);
+        b.removeFacesListener(listener1);
+        assertFalse(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertFalse(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));        
+    }
+    
+    public void testSimpleSaveRestore9()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        StateFacesListener listener1 = new PartialStateFacesListener(); 
+        listener1.setValue("value1");
+        StateFacesListener listener2 = new PartialStateFacesListener(); 
+        listener2.setValue("value2");        
+        a.addFacesListener(listener1);
+        b.addFacesListener(listener1);
+        a.markInitialState();
+        b.markInitialState();
+        a.addFacesListener(listener2);
+        Object [] savedState1 = (Object[]) a.saveState(facesContext);
+        // This is null because StateFacesListener is instance of PartialStateHolder but a
+        // listener was added after markInitialState
+        assertNotNull(savedState1[0]);
+        b.restoreState(facesContext, savedState1);        
+        assertTrue(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertTrue(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertTrue(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener2));
+        assertTrue(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener2));
+        a.removeFacesListener(listener1);
+        b.removeFacesListener(listener1);
+        assertFalse(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertFalse(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertTrue(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener2));
+        assertTrue(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener2));
+    }    
+    
+    public void testSimpleSaveRestoreTransient1()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        StateFacesListener listener1 = new StateFacesListener();
+        listener1.setTransient(true);
+        listener1.setValue("value");
+        a.addFacesListener(listener1);
+        b.restoreState(facesContext, a.saveState(facesContext));
+        assertTrue(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertFalse(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));
+    }
+    
+    public void testSimpleSaveRestoreTransient2()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        a.markInitialState();
+        b.markInitialState();
+        StateFacesListener listener1 = new StateFacesListener();
+        listener1.setTransient(true);
+        listener1.setValue("value");
+        a.addFacesListener(listener1);
+        b.restoreState(facesContext, a.saveState(facesContext));
+        assertTrue(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertFalse(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));
+    }
+    
+    public void testSimpleSaveRestoreTransient3()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        FacesListener listener2 = new NoStateFacesListener2();
+        a.addFacesListener(listener2);
+        b.addFacesListener(listener2);        
+        a.markInitialState();
+        b.markInitialState();
+        StateFacesListener listener1 = new StateFacesListener();
+        listener1.setTransient(true);
+        listener1.setValue("value");
+        a.addFacesListener(listener1);
+        b.restoreState(facesContext, a.saveState(facesContext));
+        assertTrue(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertFalse(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));
+    }
+    
+    public void testSimpleSaveRestoreTransient4()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        StateFacesListener listener1 = new StateFacesListener();
+        listener1.setTransient(true);
+        listener1.setValue("value");
+        a.addFacesListener(listener1);
+        b.addFacesListener(listener1);
+        a.markInitialState();
+        b.markInitialState();
+        //Since listener1 is transient
+        Object [] savedState1 = (Object[]) a.saveState(facesContext);
+        b.restoreState(facesContext, savedState1);  
+        assertTrue(Arrays.asList(a.getFacesListeners(FacesListener.class)).contains(listener1));
+        assertFalse(Arrays.asList(b.getFacesListeners(FacesListener.class)).contains(listener1));
+    }
+}

Propchange: myfaces/core/branches/2_0_0/api/src/test/java/javax/faces/component/_DeltaFacesListenerListTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/core/branches/2_0_0/api/src/test/java/javax/faces/component/_DeltaFacesListenerListTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: myfaces/core/branches/2_0_0/api/src/test/java/javax/faces/component/_DeltaListTest.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/api/src/test/java/javax/faces/component/_DeltaListTest.java?rev=788877&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/api/src/test/java/javax/faces/component/_DeltaListTest.java (added)
+++ myfaces/core/branches/2_0_0/api/src/test/java/javax/faces/component/_DeltaListTest.java Fri Jun 26 21:30:38 2009
@@ -0,0 +1,643 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package javax.faces.component;
+
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.faces.context.FacesContext;
+import javax.faces.event.FacesListener;
+
+public class _DeltaListTest extends AbstractComponentTest
+{
+    public _DeltaListTest(String arg0)
+    {
+        super(arg0);
+    }
+    
+    public static class UITestComponent extends UIComponentBase
+    {
+        public _DeltaList<FacesListener> _facesListeners = null;
+        
+        public UITestComponent()
+        {
+        }
+
+        @Override
+        public String getFamily()
+        {
+            return "javax.faces.Test";
+        }
+        
+        public void addTestFacesListener(FacesListener listener)
+        {
+            if (listener == null)
+                throw new NullPointerException("listener");
+            if (_facesListeners == null)
+            {
+                _facesListeners = new _DeltaList<FacesListener>(new ArrayList<FacesListener>());
+            }
+            _facesListeners.add(listener);
+        }
+        
+        public FacesListener[] getTestFacesListeners(Class clazz)
+        {
+            if (clazz == null)
+            {
+                throw new NullPointerException("Class is null");
+            }
+            if (!FacesListener.class.isAssignableFrom(clazz))
+            {
+                throw new IllegalArgumentException("Class " + clazz.getName() + " must implement " + FacesListener.class);
+            }
+
+            if (_facesListeners == null)
+            {
+                return (FacesListener[]) Array.newInstance(clazz, 0);
+            }
+            List<FacesListener> lst = null;
+            for (Iterator<FacesListener> it = _facesListeners.iterator(); it.hasNext();)
+            {
+                FacesListener facesListener = it.next();
+                if (clazz.isAssignableFrom(facesListener.getClass()))
+                {
+                    if (lst == null)
+                        lst = new ArrayList<FacesListener>();
+                    lst.add(facesListener);
+                }
+            }
+            if (lst == null)
+            {
+                return (FacesListener[]) Array.newInstance(clazz, 0);
+            }
+
+            return lst.toArray((FacesListener[]) Array.newInstance(clazz, lst.size()));
+        }
+        
+        public void removeTestFacesListener(FacesListener listener)
+        {
+            if (listener == null)
+            {
+                throw new NullPointerException("listener is null");
+            }
+
+            if (_facesListeners != null)
+            {
+                _facesListeners.remove(listener);
+            }
+        }
+                
+        @Override
+        public void clearInitialState()
+        {
+            super.clearInitialState();
+            if (_facesListeners != null)
+            {
+                _facesListeners.clearInitialState();
+            }
+        }
+
+        @Override
+        public void markInitialState()
+        {
+            super.markInitialState();
+            if (_facesListeners != null)
+            {
+                _facesListeners.markInitialState();
+            }
+        }
+
+        @Override
+        public void restoreState(FacesContext facesContext, Object state)
+        {
+            if (state == null)
+            {
+                return;
+            }
+            
+            Object[] values = (Object[])state;
+            super.restoreState(facesContext,values[0]);
+            if (initialStateMarked())
+            {
+                if (values[1] instanceof _AttachedDeltaWrapper)
+                {
+                    //Delta
+                    if (_facesListeners != null)
+                        ((StateHolder)_facesListeners).restoreState(facesContext,
+                                ((_AttachedDeltaWrapper) values[1]).getWrappedStateObject());
+                }
+                else if (values[1] != null)
+                {
+                    //Full
+                    _facesListeners = (_DeltaList<FacesListener>) restoreAttachedState(facesContext,values[1]);
+                }
+            }
+            else
+            {
+                _facesListeners = (_DeltaList<FacesListener>) restoreAttachedState(facesContext,values[1]);
+            }
+        }
+        
+        private Object saveFacesListenersList(FacesContext facesContext)
+        {
+            PartialStateHolder holder = (PartialStateHolder) _facesListeners;
+            if (initialStateMarked() && _facesListeners != null && holder.initialStateMarked())
+            {                
+                Object attachedState = holder.saveState(facesContext);
+                if (attachedState != null)
+                {
+                    return new _AttachedDeltaWrapper(_facesListeners.getClass(),
+                            attachedState);
+                }
+                //_facesListeners instances once is created never changes, we can return null
+                return null;
+            }
+            else
+            {
+                return saveAttachedState(facesContext,_facesListeners);
+            }            
+        }
+
+        @Override
+        public Object saveState(FacesContext facesContext)
+        {
+            Object[] values = new Object[2];
+            values[0] = super.saveState(facesContext);
+            values[1] = saveFacesListenersList(facesContext);
+            
+            if (values[0] == null && values[1] == null)
+            {
+                //No values
+                return null;
+            }
+            return values;
+        }        
+    }
+    
+    public static class NoStateFacesListener implements FacesListener
+    {
+        public NoStateFacesListener()
+        {
+        }
+
+        @Override
+        public boolean equals(Object obj)
+        {
+            if (obj instanceof NoStateFacesListener)
+                return true;
+            return false;
+        }
+    }
+    
+    public static class NoStateFacesListener2 implements FacesListener
+    {
+        public NoStateFacesListener2()
+        {
+        }
+
+        @Override
+        public boolean equals(Object obj)
+        {
+            if (obj instanceof NoStateFacesListener2)
+                return true;
+            return false;
+        }
+    }
+    
+    public static class StateFacesListener implements FacesListener, StateHolder
+    {
+        private boolean _transient;
+        
+        String value;
+        
+        public StateFacesListener()
+        {
+        }
+
+        @Override
+        public boolean equals(Object obj)
+        {
+            if (obj instanceof StateFacesListener)
+            {
+                if (value == null)
+                {
+                    if (((StateFacesListener)obj).value == null)
+                    {
+                        return true;
+                    }
+                }
+                else if (value.equals(((StateFacesListener)obj).value))
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        public boolean isTransient()
+        {
+            return _transient;
+        }
+
+        public void setTransient(boolean _transient)
+        {
+            this._transient = _transient;
+        }
+
+        @Override
+        public void restoreState(FacesContext context, Object state)
+        {
+            value = (String) state;
+        }
+
+        @Override
+        public Object saveState(FacesContext context)
+        {
+            return value;
+        }
+
+        public String getValue()
+        {
+            return value;
+        }
+
+        public void setValue(String value)
+        {
+            this.value = value;
+        }
+    }
+    
+    public static class PartialStateFacesListener extends StateFacesListener implements PartialStateHolder
+    {
+        private boolean initialStateMarked;
+        
+        @Override
+        public void restoreState(FacesContext context, Object state)
+        {
+            if (state != null)
+            {
+                value = (String) state;
+            }
+        }
+
+        @Override
+        public Object saveState(FacesContext context)
+        {
+            if (!initialStateMarked())
+            {
+                return value;
+            }
+            return null;
+        }
+
+        @Override
+        public void clearInitialState()
+        {
+            initialStateMarked = false;
+        }
+
+        @Override
+        public boolean initialStateMarked()
+        {
+            return initialStateMarked;
+        }
+
+        @Override
+        public void markInitialState()
+        {
+            initialStateMarked = true;
+        }        
+    }
+
+    @Override
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+    }
+
+    @Override
+    protected void tearDown() throws Exception
+    {
+        super.tearDown();
+    }
+
+    public void testSimpleAddRemove()
+    {
+        UITestComponent a = new UITestComponent();
+        FacesListener listener1 = new NoStateFacesListener(); 
+        a.addTestFacesListener(listener1);
+        assertTrue(a._facesListeners.contains(listener1));
+        a.removeTestFacesListener(listener1);
+        assertFalse(a._facesListeners.contains(listener1));        
+    }
+    
+    public void testSimpleSaveRestore1()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        FacesListener listener1 = new NoStateFacesListener(); 
+        a.addTestFacesListener(listener1);
+        b.addTestFacesListener(listener1);
+        b.restoreState(facesContext, a.saveState(facesContext));
+        assertTrue(a._facesListeners.contains(listener1));
+        assertTrue(b._facesListeners.contains(listener1));
+        a.removeTestFacesListener(listener1);
+        b.removeTestFacesListener(listener1);
+        assertFalse(a._facesListeners.contains(listener1));
+        assertFalse(b._facesListeners.contains(listener1));        
+    }
+    
+    public void testSimpleSaveRestore2()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        a.markInitialState();
+        b.markInitialState();
+        FacesListener listener1 = new NoStateFacesListener(); 
+        a.addTestFacesListener(listener1);
+        Object [] savedState1 = (Object[]) a.saveState(facesContext);       
+        b.restoreState(facesContext, savedState1);
+        assertTrue(a._facesListeners.contains(listener1));
+        assertTrue(b._facesListeners.contains(listener1));
+        a.removeTestFacesListener(listener1);
+        b.removeTestFacesListener(listener1);
+        assertFalse(a._facesListeners.contains(listener1));
+        assertFalse(b._facesListeners.contains(listener1));        
+    }
+    
+    public void testSimpleSaveRestore3()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        FacesListener listener1 = new NoStateFacesListener(); 
+        FacesListener listener2 = new NoStateFacesListener();
+        a.addTestFacesListener(listener1);
+        b.addTestFacesListener(listener2);
+        a.markInitialState();
+        b.markInitialState();
+        Object [] savedState1 = (Object[]) a.saveState(facesContext);
+        assertNull(savedState1 == null ? null : savedState1[1]);
+        b.restoreState(facesContext, savedState1);        
+        assertTrue(a._facesListeners.contains(listener1));
+        assertTrue(b._facesListeners.contains(listener1));
+        a.removeTestFacesListener(listener1);
+        b.removeTestFacesListener(listener1);
+        assertFalse(a._facesListeners.contains(listener1));
+        assertFalse(b._facesListeners.contains(listener1));        
+    }
+    
+    public void testSimpleSaveRestore4()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        FacesListener listener1 = new NoStateFacesListener(); 
+        FacesListener listener2 = new NoStateFacesListener2();
+        a.addTestFacesListener(listener1);
+        b.addTestFacesListener(listener1);
+        a.markInitialState();
+        b.markInitialState();
+        a.addTestFacesListener(listener2);
+        b.restoreState(facesContext, a.saveState(facesContext));
+        assertTrue(a._facesListeners.contains(listener1));
+        assertTrue(a._facesListeners.contains(listener2));
+        assertTrue(b._facesListeners.contains(listener1));
+        assertTrue(b._facesListeners.contains(listener2));
+        a.removeTestFacesListener(listener1);
+        b.removeTestFacesListener(listener1);
+        a.removeTestFacesListener(listener2);
+        b.removeTestFacesListener(listener2);
+        assertFalse(a._facesListeners.contains(listener1));
+        assertFalse(a._facesListeners.contains(listener2));
+        assertFalse(b._facesListeners.contains(listener1));
+        assertFalse(b._facesListeners.contains(listener2));
+    }
+    
+    public void testSimpleSaveRestore5()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        UITestComponent c = new UITestComponent();
+        FacesListener listener1 = new NoStateFacesListener(); 
+        FacesListener listener2 = new NoStateFacesListener2();
+        a.addTestFacesListener(listener1);
+        b.addTestFacesListener(listener1);
+        a.markInitialState();
+        b.markInitialState();
+        a.addTestFacesListener(listener2);
+        b.restoreState(facesContext, a.saveState(facesContext));
+        assertTrue(a._facesListeners.contains(listener1));
+        assertTrue(a._facesListeners.contains(listener2));
+        assertTrue(b._facesListeners.contains(listener1));
+        assertTrue(b._facesListeners.contains(listener2));
+        a.removeTestFacesListener(listener1);
+        b.removeTestFacesListener(listener1);
+        a.removeTestFacesListener(listener2);
+        b.removeTestFacesListener(listener2);
+        assertFalse(a._facesListeners.contains(listener1));
+        assertFalse(a._facesListeners.contains(listener2));
+        assertFalse(b._facesListeners.contains(listener1));
+        assertFalse(b._facesListeners.contains(listener2));
+        
+        //Save fully
+        b.clearInitialState();
+        c.restoreState(facesContext, b.saveState(facesContext));
+        //c._facesListeners should be empty
+        assertFalse(c._facesListeners.contains(listener1));
+        assertFalse(c._facesListeners.contains(listener2));
+    }
+    
+    public void testSimpleSaveRestore6()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        StateFacesListener listener1 = new StateFacesListener(); 
+        StateFacesListener listener2 = new StateFacesListener();
+        listener1.setValue("value1");
+        listener2.setValue("value2");
+        a.addTestFacesListener(listener1);
+        b.addTestFacesListener(listener2);
+        a.markInitialState();
+        b.markInitialState();
+        Object [] savedState1 = (Object[]) a.saveState(facesContext);
+        // This is not null because StateFacesListener is instance of StateHolder 
+        // and always needs to be saved and restored!
+        assertNotNull(savedState1[1]);
+        b.restoreState(facesContext, savedState1);        
+        assertTrue(a._facesListeners.contains(listener1));
+        assertTrue(b._facesListeners.contains(listener1));
+        a.removeTestFacesListener(listener1);
+        b.removeTestFacesListener(listener1);
+        assertFalse(a._facesListeners.contains(listener1));
+        assertFalse(b._facesListeners.contains(listener1));        
+    }
+    
+    public void testSimpleSaveRestore7()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        UITestComponent c = new UITestComponent();
+        StateFacesListener listener1 = new StateFacesListener(); 
+        StateFacesListener listener2 = new StateFacesListener();
+        listener1.setValue("value1");
+        listener2.setValue("value2");
+        a.addTestFacesListener(listener1);
+        b.addTestFacesListener(listener1);
+        a.markInitialState();
+        b.markInitialState();
+        a.addTestFacesListener(listener2);
+        b.restoreState(facesContext, a.saveState(facesContext));
+        assertTrue(a._facesListeners.contains(listener1));
+        assertTrue(a._facesListeners.contains(listener2));
+        assertTrue(b._facesListeners.contains(listener1));
+        assertTrue(b._facesListeners.contains(listener2));
+        a.removeTestFacesListener(listener1);
+        b.removeTestFacesListener(listener1);
+        a.removeTestFacesListener(listener2);
+        b.removeTestFacesListener(listener2);
+        assertFalse(a._facesListeners.contains(listener1));
+        assertFalse(a._facesListeners.contains(listener2));
+        assertFalse(b._facesListeners.contains(listener1));
+        assertFalse(b._facesListeners.contains(listener2));
+        
+        //Save fully
+        b.clearInitialState();
+        c.restoreState(facesContext, b.saveState(facesContext));
+        //c._facesListeners should be empty
+        assertFalse(c._facesListeners.contains(listener1));
+        assertFalse(c._facesListeners.contains(listener2));
+    }
+    
+    public void testSimpleSaveRestore8()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        StateFacesListener listener1 = new PartialStateFacesListener(); 
+        listener1.setValue("value1");
+        a.addTestFacesListener(listener1);
+        b.addTestFacesListener(listener1);
+        a.markInitialState();
+        b.markInitialState();
+        Object [] savedState1 = (Object[]) a.saveState(facesContext);
+        // This is null because StateFacesListener is instance of PartialStateHolder 
+        assertNull(savedState1 == null ? null : savedState1[1]);
+        b.restoreState(facesContext, savedState1);        
+        assertTrue(a._facesListeners.contains(listener1));
+        assertTrue(b._facesListeners.contains(listener1));
+        a.removeTestFacesListener(listener1);
+        b.removeTestFacesListener(listener1);
+        assertFalse(a._facesListeners.contains(listener1));
+        assertFalse(b._facesListeners.contains(listener1));        
+    }
+    
+    public void testSimpleSaveRestore9()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        StateFacesListener listener1 = new PartialStateFacesListener(); 
+        listener1.setValue("value1");
+        StateFacesListener listener2 = new PartialStateFacesListener(); 
+        listener2.setValue("value2");        
+        a.addTestFacesListener(listener1);
+        b.addTestFacesListener(listener1);
+        a.markInitialState();
+        b.markInitialState();
+        a.addTestFacesListener(listener2);
+        Object [] savedState1 = (Object[]) a.saveState(facesContext);
+        // This is null because StateFacesListener is instance of PartialStateHolder but a
+        // listener was added after markInitialState
+        assertNotNull(savedState1[1]);
+        b.restoreState(facesContext, savedState1);        
+        assertTrue(a._facesListeners.contains(listener1));
+        assertTrue(b._facesListeners.contains(listener1));
+        assertTrue(a._facesListeners.contains(listener2));
+        assertTrue(b._facesListeners.contains(listener2));
+        a.removeTestFacesListener(listener1);
+        b.removeTestFacesListener(listener1);
+        assertFalse(a._facesListeners.contains(listener1));
+        assertFalse(b._facesListeners.contains(listener1));
+        assertTrue(a._facesListeners.contains(listener2));
+        assertTrue(b._facesListeners.contains(listener2));
+    }    
+    
+    public void testSimpleSaveRestoreTransient1()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        StateFacesListener listener1 = new StateFacesListener();
+        listener1.setTransient(true);
+        listener1.setValue("value");
+        a.addTestFacesListener(listener1);
+        b.restoreState(facesContext, a.saveState(facesContext));
+        assertTrue(a._facesListeners.contains(listener1));
+        assertFalse(b._facesListeners.contains(listener1));
+    }
+    
+    public void testSimpleSaveRestoreTransient2()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        a.markInitialState();
+        b.markInitialState();
+        StateFacesListener listener1 = new StateFacesListener();
+        listener1.setTransient(true);
+        listener1.setValue("value");
+        a.addTestFacesListener(listener1);
+        b.restoreState(facesContext, a.saveState(facesContext));
+        assertTrue(a._facesListeners.contains(listener1));
+        assertFalse(b._facesListeners.contains(listener1));
+    }
+    
+    public void testSimpleSaveRestoreTransient3()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        FacesListener listener2 = new NoStateFacesListener2();
+        a.addTestFacesListener(listener2);
+        b.addTestFacesListener(listener2);        
+        a.markInitialState();
+        b.markInitialState();
+        StateFacesListener listener1 = new StateFacesListener();
+        listener1.setTransient(true);
+        listener1.setValue("value");
+        a.addTestFacesListener(listener1);
+        b.restoreState(facesContext, a.saveState(facesContext));
+        assertTrue(a._facesListeners.contains(listener1));
+        assertFalse(b._facesListeners.contains(listener1));
+    }
+    
+    public void testSimpleSaveRestoreTransient4()
+    {
+        UITestComponent a = new UITestComponent();
+        UITestComponent b = new UITestComponent();
+        StateFacesListener listener1 = new StateFacesListener();
+        listener1.setTransient(true);
+        listener1.setValue("value");
+        a.addTestFacesListener(listener1);
+        b.addTestFacesListener(listener1);
+        a.markInitialState();
+        b.markInitialState();
+        //Since listener1 is transient
+        Object [] savedState1 = (Object[]) a.saveState(facesContext);
+        b.restoreState(facesContext, savedState1);  
+        assertTrue(a._facesListeners.contains(listener1));
+        assertFalse(b._facesListeners.contains(listener1));
+    }
+}

Propchange: myfaces/core/branches/2_0_0/api/src/test/java/javax/faces/component/_DeltaListTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/core/branches/2_0_0/api/src/test/java/javax/faces/component/_DeltaListTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: myfaces/core/branches/2_0_0/api/src/test/java/javax/faces/component/_DeltaStateHelperTest.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/api/src/test/java/javax/faces/component/_DeltaStateHelperTest.java?rev=788877&r1=788876&r2=788877&view=diff
==============================================================================
--- myfaces/core/branches/2_0_0/api/src/test/java/javax/faces/component/_DeltaStateHelperTest.java (original)
+++ myfaces/core/branches/2_0_0/api/src/test/java/javax/faces/component/_DeltaStateHelperTest.java Fri Jun 26 21:30:38 2009
@@ -72,7 +72,7 @@
         }
 
         @Override
-        protected boolean isInitalStateMarked()
+        protected boolean isInitialStateMarked()
         {
             return _initialStateMarked;
         }
@@ -112,10 +112,10 @@
     public void testIsInitalStateMarked()
     {
         assertTrue("Initial state must be marked", _instance
-                .isInitalStateMarked());
+                .isInitialStateMarked());
         _instance.setInitialStateMarked(false);
         assertFalse("Initial state must be false", _instance
-                .isInitalStateMarked());
+                .isInitialStateMarked());
     }
 
     /**