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 2011/01/06 00:51:01 UTC
svn commit: r1055689 - in /myfaces/trinidad/trunk/trinidad-api/src:
main/java/org/apache/myfaces/trinidad/component/UIXComponent.java
test/clirr/clirr-runner.txt
Author: arobinson74
Date: Wed Jan 5 23:51:01 2011
New Revision: 1055689
URL: http://svn.apache.org/viewvc?rev=1055689&view=rev
Log:
Implementation of TRINIDAD-1998
Modified:
myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXComponent.java
myfaces/trinidad/trunk/trinidad-api/src/test/clirr/clirr-runner.txt
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=1055689&r1=1055688&r2=1055689&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 Wed Jan 5 23:51:01 2011
@@ -521,59 +521,7 @@ abstract public class UIXComponent exten
// visit the children of the component if we aren't supposed to skip them
if (!skipChildren)
{
- // setup any context needed for visiting the children of the component as opposed
- // to the component itself
- if (rc != null)
- {
- uixComponent.setupChildrenEncodingContext(context, rc);
- }
- else
- {
- uixComponent.setupChildrenVisitingContext(context);
- }
-
- try
- {
- // determine whether this visit should be iterating. If it shouldn't, don't
- // even call the protected hook. We currently don't iterate during the
- // restore view phase when we are visiting all of the components.
- boolean noIterate = (visitContext.getIdsToVisit() == VisitContext.ALL_IDS) &&
- (context.getCurrentPhaseId() == PhaseId.RESTORE_VIEW);
-
- doneVisiting = (noIterate)
- ? uixComponent._visitAllChildren(visitContext, callback)
- : uixComponent.visitChildren(visitContext, callback);
- }
- catch (RuntimeException ex)
- {
- re = ex;
- }
- finally
- {
- try
- {
- // teardown any context initialized above
- if (rc != null)
- {
- uixComponent.tearDownChildrenEncodingContext(context, rc);
- }
- else
- {
- uixComponent.tearDownChildrenVisitingContext(context);
- }
- }
- catch (RuntimeException ex)
- {
- if (re == null)
- {
- throw ex;
- }
- else
- {
- _LOG.warning(ex);
- }
- }
- }
+ doneVisiting = visitChildren(visitContext, uixComponent, callback);
}
}
else
@@ -629,6 +577,127 @@ abstract public class UIXComponent exten
}
/**
+ * Utility method to allow the visiting of children components while visiting a parent using
+ * a new visit callback or visit context. The method may only be called when the parent is
+ * is the target of a visitation to ensure that it is properly in context.
+ * <p>Example usage:</p>
+ * <pre>@Override
+ * public VisitResult visit(
+ * VisitContext visitContext,
+ * UIComponent target)
+ * {
+ * if (someCondition)
+ * {
+ * UIXComponent.visitChildren(target, visitContext, new VisitCallback() {...});
+ * return VisitResult.COMPLETE;
+ * }
+ * ...
+ * }</pre>
+ *
+ * @param visitContext the <code>VisitContext</code> for this visit
+ * @param parentComponent the <code>UIComponent</code> to visit the children. The parent component
+ * must be actively being visited in order to call this method.
+ * @param callback the <code>VisitCallback</code> instance
+ * whose <code>visit</code> method will be called
+ * for each node visited.
+ * @return component implementations may return <code>true</code>
+ * to indicate that the tree visit is complete (eg. all components
+ * that need to be visited have been visited). This results in
+ * the tree visit being short-circuited such that no more components
+ * are visited.
+ */
+ public static boolean visitChildren(
+ VisitContext visitContext,
+ UIComponent parentComponent,
+ VisitCallback callback)
+ {
+ if (!(parentComponent instanceof UIXComponent))
+ {
+ // Not a UIXComponent, there is no extra functionality necessary in order to visit the
+ // children.
+ for (Iterator<UIComponent> iter = parentComponent.getFacetsAndChildren(); iter.hasNext();)
+ {
+ UIComponent child = iter.next();
+
+ if (child.visitTree(visitContext, callback))
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ UIXComponent uixParentComponent = (UIXComponent)parentComponent;
+ FacesContext context = visitContext.getFacesContext();
+ RenderingContext rc = (_isEncodingVisit(visitContext))
+ ? RenderingContext.getCurrentInstance()
+ : null;
+ boolean doneVisiting = false;
+ RuntimeException re = null;
+
+ // setup any context needed for visiting the children of the component as opposed
+ // to the component itself
+
+ if (parentComponent instanceof UIXComponent)
+ {
+ if (rc != null)
+ {
+ uixParentComponent.setupChildrenEncodingContext(context, rc);
+ }
+ else
+ {
+ uixParentComponent.setupChildrenVisitingContext(context);
+ }
+ }
+
+ try
+ {
+ // determine whether this visit should be iterating. If it shouldn't, don't
+ // even call the protected hook. We currently don't iterate during the
+ // restore view phase when we are visiting all of the components.
+ boolean noIterate = (visitContext.getIdsToVisit() == VisitContext.ALL_IDS) &&
+ (context.getCurrentPhaseId() == PhaseId.RESTORE_VIEW);
+
+ doneVisiting = (noIterate)
+ ? uixParentComponent._visitAllChildren(visitContext, callback)
+ : uixParentComponent.visitChildren(visitContext, callback);
+ }
+ catch (RuntimeException ex)
+ {
+ re = ex;
+ }
+ finally
+ {
+ try
+ {
+ // teardown any context initialized above
+ if (rc != null)
+ {
+ uixParentComponent.tearDownChildrenEncodingContext(context, rc);
+ }
+ else
+ {
+ uixParentComponent.tearDownChildrenVisitingContext(context);
+ }
+ }
+ catch (RuntimeException ex)
+ {
+ if (re == null)
+ {
+ throw ex;
+ }
+ else
+ {
+ _LOG.warning(ex);
+ }
+ }
+ }
+
+ return doneVisiting;
+ }
+
+ /**
* Add a component as a partial target to the current request. This code handles the
* delegation to {@link #setPartialTarget(FacesContext, PartialPageContext)}
* for UIXComponents or assumes for {@link UIComponent} that components with a renderer
Modified: myfaces/trinidad/trunk/trinidad-api/src/test/clirr/clirr-runner.txt
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-api/src/test/clirr/clirr-runner.txt?rev=1055689&r1=1055688&r2=1055689&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-api/src/test/clirr/clirr-runner.txt (original)
+++ myfaces/trinidad/trunk/trinidad-api/src/test/clirr/clirr-runner.txt Wed Jan 5 23:51:01 2011
@@ -86,6 +86,7 @@ INFO: 7011: org.apache.myfaces.trinidad.
INFO: 7011: org.apache.myfaces.trinidad.component.UIXComponent: Method 'public void tearDownChildrenEncodingContext(javax.faces.context.FacesContext, org.apache.myfaces.trinidad.context.RenderingContext)' has been added
ERROR: 7005: org.apache.myfaces.trinidad.component.UIXComponent: Parameter 1 of 'protected boolean visitChildren(org.apache.myfaces.trinidad.component.visit.VisitContext, org.apache.myfaces.trinidad.component.visit.VisitCallback)' has changed its type to javax.faces.component.visit.VisitContext
ERROR: 7005: org.apache.myfaces.trinidad.component.UIXComponent: Parameter 2 of 'protected boolean visitChildren(org.apache.myfaces.trinidad.component.visit.VisitContext, org.apache.myfaces.trinidad.component.visit.VisitCallback)' has changed its type to javax.faces.component.visit.VisitCallback
+INFO: 7011: org.apache.myfaces.trinidad.component.UIXComponent: Method 'public boolean visitChildren(javax.faces.component.visit.VisitContext, javax.faces.component.UIComponent, javax.faces.component.visit.VisitCallback)' has been added
ERROR: 7005: org.apache.myfaces.trinidad.component.UIXComponent: Parameter 1 of 'public boolean visitTree(org.apache.myfaces.trinidad.component.visit.VisitContext, org.apache.myfaces.trinidad.component.visit.VisitCallback)' has changed its type to javax.faces.component.visit.VisitContext
ERROR: 7005: org.apache.myfaces.trinidad.component.UIXComponent: Parameter 2 of 'public boolean visitTree(org.apache.myfaces.trinidad.component.visit.VisitContext, org.apache.myfaces.trinidad.component.visit.VisitCallback)' has changed its type to javax.faces.component.visit.VisitCallback
ERROR: 7005: org.apache.myfaces.trinidad.component.UIXComponent: Parameter 1 of 'public boolean visitTree(org.apache.myfaces.trinidad.component.visit.VisitContext, javax.faces.component.UIComponent, org.apache.myfaces.trinidad.component.visit.VisitCallback)' has changed its type to javax.faces.component.visit.VisitContext