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 2010/10/09 19:05:00 UTC

svn commit: r1006193 - in /myfaces/core/trunk/api/src/main/java/javax/faces/component: UIForm.java UINamingContainer.java

Author: lu4242
Date: Sat Oct  9 17:04:59 2010
New Revision: 1006193

URL: http://svn.apache.org/viewvc?rev=1006193&view=rev
Log:
MYFACES-2940 Use VisitContext information for prevent scan a component subtree on NamingContainer instances

Modified:
    myfaces/core/trunk/api/src/main/java/javax/faces/component/UIForm.java
    myfaces/core/trunk/api/src/main/java/javax/faces/component/UINamingContainer.java

Modified: myfaces/core/trunk/api/src/main/java/javax/faces/component/UIForm.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/api/src/main/java/javax/faces/component/UIForm.java?rev=1006193&r1=1006192&r2=1006193&view=diff
==============================================================================
--- myfaces/core/trunk/api/src/main/java/javax/faces/component/UIForm.java (original)
+++ myfaces/core/trunk/api/src/main/java/javax/faces/component/UIForm.java Sat Oct  9 17:04:59 2010
@@ -18,8 +18,12 @@
  */
 package javax.faces.component;
 
+import java.util.Collection;
 import java.util.Iterator;
 
+import javax.faces.component.visit.VisitCallback;
+import javax.faces.component.visit.VisitContext;
+import javax.faces.component.visit.VisitResult;
 import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
 import javax.faces.event.PostValidateEvent;
@@ -209,6 +213,72 @@ public class UIForm extends UIComponentB
 
         return super.saveState(context);
     }
+    
+    @Override
+    public boolean visitTree(VisitContext context, VisitCallback callback)
+    {
+        boolean isCachedFacesContext = isCachedFacesContext();
+        try
+        {
+            if (!isCachedFacesContext)
+            {
+                setCachedFacesContext(context.getFacesContext());
+            }
+            
+            if (!isVisitable(context)) {
+                return false;
+            }
+    
+            pushComponentToEL(context.getFacesContext(), this);
+            try {
+                VisitResult res = context.invokeVisitCallback(this, callback);
+                switch (res) {
+                //we are done nothing has to be processed anymore
+                case COMPLETE:
+                    return true;
+    
+                case REJECT:
+                    return false;
+    
+                //accept
+                default:
+                    // Take advantage of the fact this is a NamingContainer
+                    // and we can know if there are ids to visit inside it 
+                    Collection<String> subtreeIdsToVisit = context.getSubtreeIdsToVisit(this);
+                    
+                    if (subtreeIdsToVisit != null && !subtreeIdsToVisit.isEmpty())
+                    {
+                        if (getFacetCount() > 0) {
+                            for (UIComponent facet : getFacets().values()) {
+                                if (facet.visitTree(context, callback)) {
+                                    return true;
+                                }
+                            }
+                        }
+                        if (getChildCount() > 0) {
+                            for (UIComponent child : getChildren()) {
+                                if (child.visitTree(context, callback)) {
+                                    return true;
+                                }
+                            }
+                        }
+                    }
+                    return false;
+                }
+            }
+            finally {
+                //all components must call popComponentFromEl after visiting is finished
+                popComponentFromEL(context.getFacesContext());
+            }
+        }
+        finally
+        {
+            if (!isCachedFacesContext)
+            {
+                setCachedFacesContext(null);
+            }
+        }
+    }
 
     // ------------------ GENERATED CODE BEGIN (do not modify!) --------------------
 

Modified: myfaces/core/trunk/api/src/main/java/javax/faces/component/UINamingContainer.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/api/src/main/java/javax/faces/component/UINamingContainer.java?rev=1006193&r1=1006192&r2=1006193&view=diff
==============================================================================
--- myfaces/core/trunk/api/src/main/java/javax/faces/component/UINamingContainer.java (original)
+++ myfaces/core/trunk/api/src/main/java/javax/faces/component/UINamingContainer.java Sat Oct  9 17:04:59 2010
@@ -18,6 +18,11 @@
  */
 package javax.faces.component;
 
+import java.util.Collection;
+
+import javax.faces.component.visit.VisitCallback;
+import javax.faces.component.visit.VisitContext;
+import javax.faces.component.visit.VisitResult;
 import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
 
@@ -117,6 +122,72 @@ public class UINamingContainer extends U
     {
         return super.isRendered();
     }
+    
+    @Override
+    public boolean visitTree(VisitContext context, VisitCallback callback)
+    {
+        boolean isCachedFacesContext = isCachedFacesContext();
+        try
+        {
+            if (!isCachedFacesContext)
+            {
+                setCachedFacesContext(context.getFacesContext());
+            }
+            
+            if (!isVisitable(context)) {
+                return false;
+            }
+    
+            pushComponentToEL(context.getFacesContext(), this);
+            try {
+                VisitResult res = context.invokeVisitCallback(this, callback);
+                switch (res) {
+                //we are done nothing has to be processed anymore
+                case COMPLETE:
+                    return true;
+    
+                case REJECT:
+                    return false;
+    
+                //accept
+                default:
+                    // Take advantage of the fact this is a NamingContainer
+                    // and we can know if there are ids to visit inside it 
+                    Collection<String> subtreeIdsToVisit = context.getSubtreeIdsToVisit(this);
+                    
+                    if (subtreeIdsToVisit != null && !subtreeIdsToVisit.isEmpty())
+                    {
+                        if (getFacetCount() > 0) {
+                            for (UIComponent facet : getFacets().values()) {
+                                if (facet.visitTree(context, callback)) {
+                                    return true;
+                                }
+                            }
+                        }
+                        if (getChildCount() > 0) {
+                            for (UIComponent child : getChildren()) {
+                                if (child.visitTree(context, callback)) {
+                                    return true;
+                                }
+                            }
+                        }
+                    }
+                    return false;
+                }
+            }
+            finally {
+                //all components must call popComponentFromEl after visiting is finished
+                popComponentFromEL(context.getFacesContext());
+            }
+        }
+        finally
+        {
+            if (!isCachedFacesContext)
+            {
+                setCachedFacesContext(null);
+            }
+        }
+    }
 
     enum PropertyKeys
     {