The first problem we have had is that components need to separate the contex6 setup and teardown needed to process their children from the context setup and tear down of the components themselves. For example, consider a composite component that establishes an EL context for its children--that context should only be setup when the children are being processed, not when the component is processing its own attributes.

In the case of encoding, we want to delegate to the Renderer to ensure that the setup and teardown of context for child processing is consistent between optimized rendering using tree visiting and full rendering traversals.

The second problem was that UIXComponent.setUpEncodingContext was named differently than all of the other set up methods. I've made the spelling consistent (which after a quick check of the dictionary is consitently wrong through out Trinidad setup as a compound word is a noun and as a verb is two words, so it should have been setUp. Drat!) and temporarily left a final deprecated version in that I will whack shortly.

The third issue is that iterating components often want to modify only the manner in which their data is iterated over. To simplify this, we add a hook visitData() to UIXCollection.

-- Blake Sullivan

UIXComponent:

/**
* Hook for subclasses to override the manner in which the component's children are visited. The default
 * implementation visits all of the children and facets of the Component.
* <code>setupChildrenVisitingContext</code> will have been called before this method is * invoked and <code>tearDownChildrenVisitingContext</code> will be called after. * respectively. If the purpose of this visit was to encode the component and the
 * component uses a CoreRenderer, the CoreRenderer's
* <code>setupChildrenEncodingContext</code> and <code>tearDownChildrenEncodingContext</code>
 * will be called before and after this method is invoked, respectively.
 * @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.
 * @see #setupChildrenVisitingContext
 * @see #tearDownChildrenVisitingContext
* @see org.apache.myfaces.trinidad.render.CoreRenderer#setupChildrenEncodingContext * @see org.apache.myfaces.trinidad.render.CoreRenderer#tearDownChildrenEncodingContext
 */
 protected boolean visitChildren(
   VisitContext visitContext,
   VisitCallback callback)

 /**
* <p>Sets up the context necessary to visit or invoke the children of a component for all phases.
  * </p>
  * <p>The default implementation does nothing.</p>
  * <p>If a subclass overrides this method, it should override
  * <code>tearDownChildrenVisitingContext</code> as well.</p>
* <p>It is guaranteed that if <code>setupChildrenVisitingContext</code> completes * <code>tearDownChildrenVisitingContext</code> will be called for this component</p>
  * @param context FacesContext
  * @see #visitChildren
  * @see #tearDownChildrenVisitingContext
  */
protected void setupChildrenVisitingContext(@SuppressWarnings("unused") FacesContext context)

 /**
* <p>Tears down context created in order to visit or invoke the children of a component
  * for all phases.</p>
  * <p>The default implementation does nothing.</p>
  * <p>A subclass should only override this method if it overrode
  * <code>setupChildrenVisitingContext</code> as well</p>
* <p>It is guaranteed that <code>tearDownChildrenVisitingContext</code> will be called only after * <code>setupChildrenVisitingContext</code> has been called for this component</p>
  * @param context FacesContext
  * @see #setupChildrenVisitingContext
  * @see #visitChildren
  */
protected void tearDownChildrenVisitingContext(@SuppressWarnings("unused") FacesContext context)

CoreRenderer

  * <p>
* Called before rendering the current component's children in order to set
  * up any special context.
  * </p>
  * <p>If <code>setupChildrenEncodingContext</code> succeeds then
* <code>tearDownChildrenEncodingContext</code> will be called for the same component.
  * </p>
  * <p>The default implementation does nothing</p>
  * @param context FacesContext for this request
  * @param rc RenderingContext for this encoding pass
  * @param component Component to encode using this Renderer
  * @see #tearDownChildrenEncodingContext
  */
 public void setupChildrenEncodingContext(
   @SuppressWarnings("unused") FacesContext context,
   @SuppressWarnings("unused") RenderingContext rc,
   @SuppressWarnings("unused") UIComponent component)

 /**
  * <p>
* Called after rendering the current component's children in order to tear
  * down any special context.
  * </p>
  * <p>
* <code>tearDownChildrenEncodingContext</code> will be called on the component if
  * <code>setupChildrenEncodingContext</code> succeeded.
  * </p>
  * <p>The default implementation does nothing</p>
  * @param context FacesContext for this request
  * @param rc RenderingContext for this encoding pass
  * @param component Component to encode using this Renderer
  * @see #setupChildrenEncodingContext
  */
 public void tearDownChildrenEncodingContext(
   @SuppressWarnings("unused") FacesContext context,
   @SuppressWarnings("unused") RenderingContext rc,
   @SuppressWarnings("unused") UIComponent component)

UIXCollection:

 /**
* Visit the rows and children of the columns of the collection per row-index. This should * not visit row index -1 (it will be perfomed in the visitTree method). The columns
  * themselves should not be visited, only their children in this function.
  *
  * @param visitContext The visiting context
  * @param callback The visit callback
  * @return true if the visiting should stop
  * @see #visitChildren(VisitContext, VisitCallback)
  */
 protected abstract boolean visitData(
   VisitContext  visitContext,
   VisitCallback callback);


Reply via email to