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
{