You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by an...@apache.org on 2011/04/10 19:12:59 UTC

svn commit: r1090836 - in /myfaces/trinidad/trunk/trinidad-api/src/main: java-templates/org/apache/myfaces/trinidad/component/ java/org/apache/myfaces/trinidad/component/ java/org/apache/myfaces/trinidad/util/

Author: andys
Date: Sun Apr 10 17:12:59 2011
New Revision: 1090836

URL: http://svn.apache.org/viewvc?rev=1090836&view=rev
Log:
TRINIDAD-2078 SKIP_ITERATION forces visit of non-rendered components

We no longer handle skip iteration in UIXComponent: this is now handled directly by iterating components.

 We have added some new APIs to help with this.  From Blake's comments on his patch:

1) Add to ComponentUtils: 

  /** 
   * @param visitContext 
   * @return <code>true</code> if this is a non-iterating visit. 
   */ 
  public static boolean isSkipIterationVisit(VisitContext visitContext) 

So that Components can determine whether they should iterate when tree visiting 

And modify the behavior of UIXCollection since it is the base class of all of the iterating components in Trinidad to switch inside it's override of visitChildren and call a new protected method: 

  /** 
   * Performs a non-iterating visit of the children. The default implementation visits all 
   * of the children. If the UIXCollection subclass doesn't visit some of its children in 
   * certain cases, it needs to override this method. 
   * @param visitContext 
   * @param callback 
   * @return 
   */ 
  protected boolean visitChildrenWithoutIterating( 


instead of the normal data visiting code if we are in a skip iteration visit. 

For convenience, I also made the following method on UIXComponent public: 

  /** 
   * Default implementation of visiting children that visits all children without iterating 
   * @param visitContext the <code>VisitContext</code> for this visit 
   * @param callback the <code>VisitCallback</code> instance 
   * @return <code>true</code> if the visit is complete. 
   */ 
  protected final boolean visitAllChildren( 
    VisitContext visitContext, 
    VisitCallback callback) 

And made it the default implementation of visitChildrenWithoutIterating(), which should be sufficient for all of the subclasses of UIXCollection that ship with Trinidad. It also happens to be precisely the same behavior as the old code we are fixing. 

Modified:
    myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXNavigationLevelTemplate.java
    myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXNavigationPathTemplate.java
    myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXNavigationTreeTemplate.java
    myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXPageTemplate.java
    myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXProcessTemplate.java
    myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXTreeTemplate.java
    myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXCollection.java
    myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXComponent.java
    myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/ComponentUtils.java

Modified: myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXNavigationLevelTemplate.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXNavigationLevelTemplate.java?rev=1090836&r1=1090835&r2=1090836&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXNavigationLevelTemplate.java (original)
+++ myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXNavigationLevelTemplate.java Sun Apr 10 17:12:59 2011
@@ -24,6 +24,8 @@ import javax.faces.component.visit.Visit
 import javax.faces.context.FacesContext;
 import javax.faces.event.PhaseId;
 
+import org.apache.myfaces.trinidad.util.ComponentUtils;
+
 
 /**
  * Base class for the NavigationLevel component.
@@ -62,6 +64,20 @@ abstract public class UIXNavigationLevel
     VisitContext  visitContext,
     VisitCallback callback)
   {
+    if (ComponentUtils.isSkipIterationVisit(visitContext))
+    {
+      return visitChildrenWithoutIterating(visitContext, callback);
+    }
+    else
+    {
+      return _visitChildrenIterating(visitContext, callback);
+    }
+  }
+
+  private boolean _visitChildrenIterating(
+    VisitContext  visitContext,
+    VisitCallback callback)
+  {
     boolean done = visitData(visitContext, callback);
 
     if (!done)

Modified: myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXNavigationPathTemplate.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXNavigationPathTemplate.java?rev=1090836&r1=1090835&r2=1090836&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXNavigationPathTemplate.java (original)
+++ myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXNavigationPathTemplate.java Sun Apr 10 17:12:59 2011
@@ -29,6 +29,8 @@ import javax.faces.component.visit.Visit
 import javax.faces.context.FacesContext;
 import javax.faces.event.PhaseId;
 
+import org.apache.myfaces.trinidad.util.ComponentUtils;
+
 
 /**
  * Base class for the NavigationPath component.
@@ -77,6 +79,20 @@ abstract public class UIXNavigationPathT
     VisitContext  visitContext,
     VisitCallback callback)
   {
+    if (ComponentUtils.isSkipIterationVisit(visitContext))
+    {
+      return visitChildrenWithoutIterating(visitContext, callback);
+    }
+    else
+    {
+      return _visitChildrenIterating(visitContext, callback);
+    }
+  }
+
+  private boolean _visitChildrenIterating(
+    VisitContext  visitContext,
+    VisitCallback callback)
+  {
     boolean done = visitData(visitContext, callback);
     
     if (!done)

Modified: myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXNavigationTreeTemplate.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXNavigationTreeTemplate.java?rev=1090836&r1=1090835&r2=1090836&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXNavigationTreeTemplate.java (original)
+++ myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXNavigationTreeTemplate.java Sun Apr 10 17:12:59 2011
@@ -36,6 +36,7 @@ import org.apache.myfaces.trinidad.model
 import org.apache.myfaces.trinidad.model.RowKeySet;
 import org.apache.myfaces.trinidad.model.RowKeySetTreeImpl;
 import org.apache.myfaces.trinidad.model.TreeModel;
+import org.apache.myfaces.trinidad.util.ComponentUtils;
 
 
 /**
@@ -116,7 +117,14 @@ abstract public class UIXNavigationTreeT
     VisitContext  visitContext,
     VisitCallback callback)
   {
-    return visitData(visitContext, callback);
+    if (ComponentUtils.isSkipIterationVisit(visitContext))
+    {
+      return visitChildrenWithoutIterating(visitContext, callback);
+    }
+    else
+    {
+      return visitData(visitContext, callback);
+    }
   }
 
   @Override

Modified: myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXPageTemplate.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXPageTemplate.java?rev=1090836&r1=1090835&r2=1090836&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXPageTemplate.java (original)
+++ myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXPageTemplate.java Sun Apr 10 17:12:59 2011
@@ -40,6 +40,7 @@ import org.apache.myfaces.trinidad.model
 import org.apache.myfaces.trinidad.model.RowKeySet;
 import org.apache.myfaces.trinidad.model.RowKeySetTreeImpl;
 import org.apache.myfaces.trinidad.model.TreeModel;
+import org.apache.myfaces.trinidad.util.ComponentUtils;
 
 
 /**
@@ -126,6 +127,20 @@ abstract public class UIXPageTemplate ex
     VisitContext  visitContext,
     VisitCallback callback)
   {
+    if (ComponentUtils.isSkipIterationVisit(visitContext))
+    {
+      return visitChildrenWithoutIterating(visitContext, callback);
+    }
+    else
+    {
+      return _visitChildrenIterating(visitContext, callback);
+    }
+  }
+  
+  private boolean _visitChildrenIterating(
+    VisitContext  visitContext,
+    VisitCallback callback)
+  {
     boolean done = visitData(visitContext, callback);
     
     if (!done)
@@ -173,7 +188,7 @@ abstract public class UIXPageTemplate ex
       }
     }
     
-    return done;
+    return done;    
   }
   
   @Override

Modified: myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXProcessTemplate.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXProcessTemplate.java?rev=1090836&r1=1090835&r2=1090836&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXProcessTemplate.java (original)
+++ myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXProcessTemplate.java Sun Apr 10 17:12:59 2011
@@ -24,6 +24,8 @@ import javax.faces.component.visit.Visit
 import javax.faces.context.FacesContext;
 import javax.faces.event.PhaseId;
 
+import org.apache.myfaces.trinidad.util.ComponentUtils;
+
 
 /**
  * Base class for the Process component, which shows the steps of a process.
@@ -60,6 +62,21 @@ abstract public class UIXProcessTemplate
     VisitContext  visitContext,
     VisitCallback callback)
   {
+    if (ComponentUtils.isSkipIterationVisit(visitContext))
+    {
+      return visitChildrenWithoutIterating(visitContext, callback);
+    }
+    else
+    {
+      return _visitChildrenIterating(visitContext, callback);
+    }
+  }
+
+
+  private boolean _visitChildrenIterating(
+    VisitContext  visitContext,
+    VisitCallback callback)
+  {
     boolean done = visitData(visitContext, callback);
 
     if (!done)

Modified: myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXTreeTemplate.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXTreeTemplate.java?rev=1090836&r1=1090835&r2=1090836&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXTreeTemplate.java (original)
+++ myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXTreeTemplate.java Sun Apr 10 17:12:59 2011
@@ -44,6 +44,7 @@ import org.apache.myfaces.trinidad.model
 import org.apache.myfaces.trinidad.model.RowKeySetTreeImpl;
 import org.apache.myfaces.trinidad.model.TreeModel;
 import org.apache.myfaces.trinidad.event.SelectionEvent;
+import org.apache.myfaces.trinidad.util.ComponentUtils;
 
 /**
  * Base class for Tree component.
@@ -157,7 +158,14 @@ abstract public class UIXTreeTemplate ex
     VisitContext  visitContext,
     VisitCallback callback)
   {
-    return visitData(visitContext, callback);
+    if (ComponentUtils.isSkipIterationVisit(visitContext))
+    {
+      return visitChildrenWithoutIterating(visitContext, callback);
+    }
+    else
+    {
+      return visitData(visitContext, callback);
+    }
   }
   
   @Override

Modified: myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXCollection.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXCollection.java?rev=1090836&r1=1090835&r2=1090836&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXCollection.java (original)
+++ myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXCollection.java Sun Apr 10 17:12:59 2011
@@ -1242,40 +1242,70 @@ public abstract class UIXCollection exte
     return defaultVisitChildren(visitContext, callback);
   }
 
+  /**
+   * Performs a non-iterating visit of the children.  The default implementation visits all
+   * of the children.  If the UIXCollection subclass doesn't visit some of its children in
+   * certain cases, it needs to override this method.
+   * @param visitContext
+   * @param callback
+   * @return
+   */
+  protected boolean visitChildrenWithoutIterating(
+    VisitContext  visitContext,
+    VisitCallback callback)
+  {
+    return visitAllChildren(visitContext, callback);
+  }
+  
+  /**
+   * Default implementation of child visiting of UIXCollection subclasses for cases where a
+   * UIXCollection subclass wants to restore the default implementation that one of its
+   * superclasses have overridden.
+   * @param visitContext
+   * @param callback
+   * @return
+   */
   protected final boolean defaultVisitChildren(
     VisitContext  visitContext,
     VisitCallback callback)
   {
-    boolean doneVisiting;
-
-    // Clear out the row index if one is set so that
-    // we start from a clean slate.
-    int oldRowIndex = getRowIndex();
-    setRowIndex(-1);
-
-    try
+    if (ComponentUtils.isSkipIterationVisit(visitContext))
     {
-      // visit the unstamped children
-      doneVisiting = visitUnstampedFacets(visitContext, callback);
-
-      if (!doneVisiting)
+      return visitChildrenWithoutIterating(visitContext, callback);
+    }
+    else
+    {
+      boolean doneVisiting;
+  
+      // Clear out the row index if one is set so that
+      // we start from a clean slate.
+      int oldRowIndex = getRowIndex();
+      setRowIndex(-1);
+  
+      try
       {
-        doneVisiting = _visitStampedColumnFacets(visitContext, callback);
-
-        // visit the stamped children
+        // visit the unstamped children
+        doneVisiting = visitUnstampedFacets(visitContext, callback);
+  
         if (!doneVisiting)
         {
-          doneVisiting = visitData(visitContext, callback);
+          doneVisiting = _visitStampedColumnFacets(visitContext, callback);
+  
+          // visit the stamped children
+          if (!doneVisiting)
+          {
+            doneVisiting = visitData(visitContext, callback);
+          }
         }
       }
+      finally
+      {
+        // restore the original rowIndex
+        setRowIndex(oldRowIndex);
+      }
+      
+      return doneVisiting;
     }
-    finally
-    {
-      // restore the original rowIndex
-      setRowIndex(oldRowIndex);
-    }
-
-    return doneVisiting;
   }
 
   /**

Modified: myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXComponent.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXComponent.java?rev=1090836&r1=1090835&r2=1090836&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXComponent.java (original)
+++ myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXComponent.java Sun Apr 10 17:12:59 2011
@@ -21,7 +21,6 @@ package org.apache.myfaces.trinidad.comp
 import java.io.IOException;
 import java.util.Collection;
 import java.util.Iterator;
-import java.util.Map;
 
 import javax.el.MethodExpression;
 import javax.faces.component.NamingContainer;
@@ -390,7 +389,7 @@ abstract public class UIXComponent exten
     }
 
     // visit all of the children of the component
-    return _visitAllChildren(visitContext, callback);
+    return visitAllChildren(visitContext, callback);
   }
 
   /**
@@ -399,7 +398,7 @@ abstract public class UIXComponent exten
    * @param callback the <code>VisitCallback</code> instance
    * @return <code>true</code> if the visit is complete.
    */
-  private boolean _visitAllChildren(
+  protected final boolean visitAllChildren(
     VisitContext visitContext,
     VisitCallback callback)
   {
@@ -667,11 +666,7 @@ abstract public class UIXComponent exten
 
     try
     {
-      // determine whether this visit should be iterating.  If it shouldn't, don't
-      // even call the protected hook.
-      doneVisiting =  (_isSkipIterationVisit(visitContext))
-                        ? uixParentComponent._visitAllChildren(visitContext, callback)
-                        : uixParentComponent.visitChildren(visitContext, callback);
+      doneVisiting = uixParentComponent.visitChildren(visitContext, callback);
     }
     catch (RuntimeException ex)
     {
@@ -840,18 +835,6 @@ abstract public class UIXComponent exten
   }
 
   /**
-   * Tests whether we should skip iteration during this visit
-   */
-  private static boolean _isSkipIterationVisit(VisitContext visitContext)
-  {
-    FacesContext context = visitContext.getFacesContext();
-    Map<Object, Object> attrs = context.getAttributes();
-    Object skipIteration = attrs.get("javax.faces.visit.SKIP_ITERATION");
-
-    return Boolean.TRUE.equals(skipIteration);
-  }
-
-  /**
    * <p>
    * Called when visiting the component during optimized partial page encoding so that the
    * component can modify what is actually encoded.  For example tab controls often

Modified: myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/ComponentUtils.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/ComponentUtils.java?rev=1090836&r1=1090835&r2=1090836&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/ComponentUtils.java (original)
+++ myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/ComponentUtils.java Sun Apr 10 17:12:59 2011
@@ -20,6 +20,7 @@ package org.apache.myfaces.trinidad.util
 
 import java.util.Date;
 import java.util.Locale;
+import java.util.Map;
 import java.util.TimeZone;
 
 import javax.faces.component.NamingContainer;
@@ -27,6 +28,8 @@ import javax.faces.component.UIComponent
 
 import javax.faces.component.UIViewRoot;
 
+import javax.faces.component.visit.VisitContext;
+
 import org.apache.myfaces.trinidad.component.UIXComponent;
 import javax.faces.context.FacesContext;
 
@@ -332,6 +335,19 @@ public final class ComponentUtils
   }
   
   /**
+   * @param visitContext
+   * @return <code>true</code> if this is a non-iterating visit.
+   */
+  public static boolean isSkipIterationVisit(VisitContext visitContext)
+  {
+    FacesContext context = visitContext.getFacesContext();
+    Map<Object, Object> attrs = context.getAttributes();
+    Object skipIteration = attrs.get("javax.faces.visit.SKIP_ITERATION");
+
+    return Boolean.TRUE.equals(skipIteration);
+  }
+  
+  /**
    * Gets the root cause of an exception.
    * Keeps unwrapping the given throwable until the root cause is found.
    */