You are viewing a plain text version of this content. The canonical link for it is here.
Posted to adffaces-commits@incubator.apache.org by aw...@apache.org on 2007/01/24 23:46:02 UTC

svn commit: r499620 - /incubator/adffaces/trunk/trinidad/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXCollection.java

Author: awiner
Date: Wed Jan 24 15:46:01 2007
New Revision: 499620

URL: http://svn.apache.org/viewvc?view=rev&rev=499620
Log:
ADFFACES-362: IndexOutOfBoundsException in UIXCollection.restoreStampState when transient components are included

Modified:
    incubator/adffaces/trunk/trinidad/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXCollection.java

Modified: incubator/adffaces/trunk/trinidad/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXCollection.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/trunk/trinidad/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXCollection.java?view=diff&rev=499620&r1=499619&r2=499620
==============================================================================
--- incubator/adffaces/trunk/trinidad/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXCollection.java (original)
+++ incubator/adffaces/trunk/trinidad/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXCollection.java Wed Jan 24 15:46:01 2007
@@ -747,6 +747,9 @@
   @SuppressWarnings("unchecked")
   protected Object saveStampState(FacesContext context, UIComponent stamp)
   {
+    if (stamp.isTransient())
+      return Transient.TRUE;
+
     Object[] state = new Object[3];
     state[0] = StampState.saveStampState(context, stamp);
 
@@ -771,23 +774,33 @@
     state[1] = facetState;
 
     int childCount = stamp.getChildCount();
-    Object[] childState;
+    Object[] childStateArray;
     if (childCount == 0)
     {
-      childState = _EMPTY_ARRAY;
+      childStateArray = _EMPTY_ARRAY;
     }
     else
     {
       List<UIComponent> children = stamp.getChildren();
-      childState = new Object[childCount];
+      childStateArray = new Object[childCount];
+      boolean wasAllTransient = true;
       for(int i=0; i < childCount; i++)
       {
         UIComponent child = children.get(i);
-        childState[i] = saveStampState(context, child);
+        Object childState = saveStampState(context, child);
+        if (childState != Transient.TRUE)
+          wasAllTransient = false;
+        
+        childStateArray[i] = childState;
       }
+      
+      // If all we found were transient components, just use
+      // an empty array
+      if (wasAllTransient)
+        childStateArray = _EMPTY_ARRAY;
     }
 
-    state[2] = childState;
+    state[2] = childStateArray;
 
     return state;
   }
@@ -805,18 +818,28 @@
     Object[] state = (Object[]) stampState;
     StampState.restoreStampState(context, stamp, state[0]);
 
-    Object[] facetState = (Object[]) state[1];
-    for(int i=0; i<facetState.length; i+=2)
+    Object[] facetStateArray = (Object[]) state[1];
+    for(int i=0; i<facetStateArray.length; i+=2)
     {
-      String facetName = (String) facetState[i];
-      restoreStampState(context, stamp.getFacet(facetName), facetState[i + 1]);
+      String facetName = (String) facetStateArray[i];
+      Object facetState = facetStateArray[i + 1];
+      if (facetState != Transient.TRUE)
+        restoreStampState(context, stamp.getFacet(facetName), facetState);
     }
 
     List<UIComponent> children = stamp.getChildren();
-    Object[] childState = (Object[]) state[2];
-    for(int i=0; i<childState.length; i++)
-    {
-      restoreStampState(context, children.get(i), childState[i]);
+    Object[] childStateArray = (Object[]) state[2];
+    int childIndex = 0;
+    for(int i=0; i<childStateArray.length; i++)
+    {
+      Object childState = childStateArray[i];
+      // Skip over any saved state that corresponds to transient
+      // components
+      if (childState != Transient.TRUE)
+      {
+        restoreStampState(context, children.get(childIndex), childState);
+        childIndex++;
+      }
     }
   }
 
@@ -1286,4 +1309,11 @@
   private static final Object _NULL = new Object();
   private static final Object[] _EMPTY_ARRAY = new Object[0];
   private static final TrinidadLogger _LOG = TrinidadLogger.createTrinidadLogger(UIXCollection.class);
+
+  // An enum to throw into state-saving so that we get a nice
+  // instance-equality to test against for noticing transient components
+  // TODO: is this really better than just, say, using null for 
+  // transient components?  It's certainly better at not papering
+  // over error cases
+  private enum Transient { TRUE };
 }