You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ar...@apache.org on 2010/10/04 17:22:42 UTC

svn commit: r1004284 - /myfaces/trinidad/branches/1.2.12.3-branch/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXIteratorTemplate.java

Author: arobinson74
Date: Mon Oct  4 15:22:42 2010
New Revision: 1004284

URL: http://svn.apache.org/viewvc?rev=1004284&view=rev
Log:
TRINIDAD-1932 Add code to handle ALL_IDS in the UIXIterator visit tree method

Modified:
    myfaces/trinidad/branches/1.2.12.3-branch/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXIteratorTemplate.java

Modified: myfaces/trinidad/branches/1.2.12.3-branch/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXIteratorTemplate.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/1.2.12.3-branch/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXIteratorTemplate.java?rev=1004284&r1=1004283&r2=1004284&view=diff
==============================================================================
--- myfaces/trinidad/branches/1.2.12.3-branch/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXIteratorTemplate.java (original)
+++ myfaces/trinidad/branches/1.2.12.3-branch/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXIteratorTemplate.java Mon Oct  4 15:22:42 2010
@@ -6,9 +6,9 @@
  *  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
@@ -27,9 +27,12 @@ import java.util.List;
 
 import java.util.Map;
 import java.util.Set;
+
+import javax.faces.FacesException;
 import javax.faces.component.UIComponent;
 import javax.faces.component.UINamingContainer;
 import javax.faces.context.FacesContext;
+import javax.faces.event.AbortProcessingException;
 import javax.faces.event.PhaseId;
 
 import javax.faces.render.Renderer;
@@ -51,7 +54,7 @@ import org.apache.myfaces.trinidad.util.
  * Each child is repeatedly stamped as many times as necessary.
  * Iteration is done starting at the index given by {@link #getFirst()}
  * for as many indices as specified by {@link #getRows()}.
- * If {@link #getRows()} returns 0, then the iteration continues until 
+ * If {@link #getRows()} returns 0, then the iteration continues until
  * there are no more elements in the underlying data.
  */
 public abstract class UIXIteratorTemplate extends UIXCollection implements FlattenedComponent, LocalRowKeyIndex
@@ -101,7 +104,7 @@ public abstract class UIXIteratorTemplat
         throw (IOException) exp;
       throw new IllegalStateException(exp);
     }
-    
+
     return processedChildren;
   }
 
@@ -140,10 +143,12 @@ public abstract class UIXIteratorTemplat
       Runner runner = new Runner()
       {
         @Override
-        protected void process(UIComponent kid,
-                               ComponentProcessingContext cpContext) throws IOException
+        protected void process(
+          UIComponent                kid,
+          ComponentProcessingContext cpContext
+          ) throws IOException
         {
-          __encodeRecursive(context, kid);
+          kid.encodeAll(context);
         }
       };
       runner.run();
@@ -166,13 +171,12 @@ public abstract class UIXIteratorTemplat
    */
   @Override
   public boolean visitTree(
-    VisitContext visitContext,
-    VisitCallback callback)
-  {    
-    
+    final VisitContext visitContext,
+    final VisitCallback callback)
+  {
     if (!isVisitable(visitContext))
       return false;
-    
+
     // invoke the callback for this component
     VisitResult result = visitContext.invokeVisitCallback(this, callback);
 
@@ -186,11 +190,10 @@ public abstract class UIXIteratorTemplat
                               ? RenderingContext.getCurrentInstance()
                               : null;
       Collection<String> idsToVisit = visitContext.getSubtreeIdsToVisit(this);
+      boolean visitAllIds = idsToVisit == VisitContext.ALL_IDS;
       if (idsToVisit.isEmpty())
         return false;
-      
-      String thisClientId = getClientId(context);
-      Object oldKey = getRowKey();
+
       try
       {
         if (PhaseId.RENDER_RESPONSE == phaseId)
@@ -200,66 +203,25 @@ public abstract class UIXIteratorTemplat
         else
         {
           setupVisitingContext(context);
-        }      
-        
-        ClientRowKeyManager keyMgr = this.getClientRowKeyManager();
-
-        for (String clientId : idsToVisit)
-        {
-          Object rowKey = null;
-          
-          // look for row key in client ids to visit and set currency before visiting children
-          int index = clientId.indexOf(thisClientId);
-          
-          if (index >= 0)
+        }
+
+        if (visitAllIds)
+        {
+          if (_visitAllChildren(visitContext, callback))
           {
-            index += thisClientId.length();
-            if (index < clientId.length() && clientId.charAt(index) == UINamingContainer.SEPARATOR_CHAR)
-            {
-              int endIndex = clientId.indexOf(UINamingContainer.SEPARATOR_CHAR, index + 1);
-              
-              if (endIndex >= 0 && endIndex > index)
-              {
-                String clientRowKey = clientId.substring(index + 1, endIndex);
-                rowKey = keyMgr.getRowKey(context, this, clientRowKey);
-              }
-            }
+            return true;
           }
-              
-          // visit the children with correct currency
-          setRowKey(rowKey);                    
-
-          Iterator<UIComponent> kids = getFacetsAndChildren();          
-          while(kids.hasNext())
+        }
+        else
+        {
+          if (_visitSubIds(context, visitContext, idsToVisit, callback))
           {
-            boolean done;            
-            UIComponent currChild = kids.next();
-            
-            if (currChild instanceof UIXComponent)
-            {
-              UIXComponent uixChild = (UIXComponent)currChild;
-
-              // delegate to UIXComponent's visitTree implementation to allow
-              // subclassses to modify the behavior
-              done = uixChild.visitTree(visitContext, callback);
-            }
-            else
-            {
-              // use generic visit implementation
-              done = visitTree(visitContext, currChild, callback);
-            }
-
-            // If any kid visit returns true, we are done.
-            if (done)
-            {
-              return true;
-            }                    
+            return true;
           }
-        }                
+        }
       }
       finally
       {
-        setRowKey(oldKey);
         // tear down the context we set up in order to visit our children
         if (PhaseId.RENDER_RESPONSE == phaseId)
         {
@@ -269,10 +231,10 @@ public abstract class UIXIteratorTemplat
         {
           tearDownVisitingContext(context);
         }
-      }      
+      }
     }
     // if we got this far, we're not done
-    return false;    
+    return false;
   }
 
   /**
@@ -294,7 +256,7 @@ public abstract class UIXIteratorTemplat
       public Object get(Object key)
       {
         // some of these keys are from <c:forEach>, ie:
-        // javax.servlet.jsp.jstl.core.LoopTagStatus 
+        // javax.servlet.jsp.jstl.core.LoopTagStatus
         if ("begin".equals(key)) // from jstl
         {
           return Integer.valueOf(getFirst());
@@ -315,7 +277,7 @@ public abstract class UIXIteratorTemplat
         }
         return map.get(key);
       }
-    
+
       @Override
       public Set<Map.Entry<String, Object>> entrySet()
       {
@@ -329,7 +291,7 @@ public abstract class UIXIteratorTemplat
     CollectionModel current,
     Object value)
   {
-    CollectionModel model = ModelUtils.toCollectionModel(value); 
+    CollectionModel model = ModelUtils.toCollectionModel(value);
     // initialize to -1. we need to do this incase some application logic
     // changed this index. Also, some JSF1.0 RI classes were initially starting
     // with a rowIndex of 0.
@@ -354,7 +316,118 @@ public abstract class UIXIteratorTemplat
     };
     runner.run();
   }
-  
+
+  private boolean _visitAllChildren(
+    final VisitContext  visitContext,
+    final VisitCallback visitCallback)
+  {
+    Runner runner = new Runner()
+    {
+      @Override
+      protected void process(
+        UIComponent                kid,
+        ComponentProcessingContext cpContext
+        ) throws Exception
+      {
+        if (UIXComponent.visitTree(visitContext, kid, visitCallback))
+        {
+          throw new VisitingCompleteException();
+        }
+      }
+    };
+    runner.run();
+
+    if (runner.exception != null)
+    {
+      if (runner.exception instanceof VisitingCompleteException)
+      {
+        return true;
+      }
+      else if (runner.exception instanceof RuntimeException)
+      {
+        throw (RuntimeException)runner.exception;
+      }
+      else
+      {
+        throw new FacesException(runner.exception);
+      }
+    }
+
+    return false;
+  }
+
+  private boolean _visitSubIds(
+    FacesContext       facesContext,
+    VisitContext       visitContext,
+    Collection<String> idsToVisit,
+    VisitCallback      callback)
+  {
+    Object oldKey = getRowKey();
+    try
+    {
+      ClientRowKeyManager keyMgr = this.getClientRowKeyManager();
+      String thisClientId = getClientId(facesContext);
+      for (String clientId : idsToVisit)
+      {
+        Object rowKey = null;
+
+        // look for row key in client ids to visit and set currency before visiting children
+        int index = clientId.indexOf(thisClientId);
+
+        if (index >= 0)
+        {
+          index += thisClientId.length();
+          if (index < clientId.length() && clientId.charAt(index) == UINamingContainer.SEPARATOR_CHAR)
+          {
+            int endIndex = clientId.indexOf(UINamingContainer.SEPARATOR_CHAR, index + 1);
+
+            if (endIndex >= 0 && endIndex > index)
+            {
+              String clientRowKey = clientId.substring(index + 1, endIndex);
+              rowKey = keyMgr.getRowKey(facesContext, this, clientRowKey);
+            }
+          }
+        }
+
+        // visit the children with correct currency
+        setRowKey(rowKey);
+
+        Iterator<UIComponent> kids = getFacetsAndChildren();
+        while(kids.hasNext())
+        {
+          boolean done;
+          UIComponent currChild = kids.next();
+
+          if (currChild instanceof UIXComponent)
+          {
+            UIXComponent uixChild = (UIXComponent)currChild;
+
+            // delegate to UIXComponent's visitTree implementation to allow
+            // subclassses to modify the behavior
+            done = uixChild.visitTree(visitContext, callback);
+          }
+          else
+          {
+            // use generic visit implementation
+            done = visitTree(visitContext, currChild, callback);
+          }
+
+          // If any kid visit returns true, we are done.
+          if (done)
+          {
+            return true;
+          }
+        }
+      }
+
+      return false;
+    }
+    finally
+    {
+      setRowKey(oldKey);
+    }
+  }
+
   private abstract class Runner implements ComponentProcessor<Object>
   {
     public Runner()
@@ -366,11 +439,11 @@ public abstract class UIXIteratorTemplat
     {
       _cpContext = cpContext;
     }
-    
+
     public final boolean run()
     {
       FacesContext context = FacesContext.getCurrentInstance();
-      
+
       List<UIComponent> stamps = getStamps();
       int oldIndex = getRowIndex();
       int first = getFirst();
@@ -378,9 +451,9 @@ public abstract class UIXIteratorTemplat
       int end = (rows <= 0) //show everything
         ? Integer.MAX_VALUE
         : first + rows;
-      
+
       boolean processedChild = false;
-      
+
       try
       {
         for(int i=first; i<end; i++)
@@ -405,7 +478,7 @@ public abstract class UIXIteratorTemplat
       {
         setRowIndex(oldIndex);
       }
-      
+
       return processedChild;
     }
 
@@ -440,6 +513,12 @@ public abstract class UIXIteratorTemplat
     private final ComponentProcessingContext _cpContext;
   }
 
+  private static class VisitingCompleteException
+    extends RuntimeException
+  {
+
+  }
+
   @Override
   void __encodeBegin(FacesContext context) throws IOException
   {
@@ -482,7 +561,7 @@ public abstract class UIXIteratorTemplat
           first = 0;
         else
         {
-          // scroll to the last page: 
+          // scroll to the last page:
           first = size - rows;
           model.setRowIndex(first);
           // make sure the row is indeed available:
@@ -502,5 +581,4 @@ public abstract class UIXIteratorTemplat
       model.setRowIndex(oldIndex);
     }
   }
-
-}
+}
\ No newline at end of file