[
https://issues.apache.org/jira/browse/TRINIDAD-1504?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Matthias Weßendorf resolved TRINIDAD-1504.
------------------------------------------
Resolution: Fixed
Fix Version/s: 1.2.12-core
Assignee: Matthias Weßendorf
> Allow FlattenedComponent to render content
> ------------------------------------------
>
> Key: TRINIDAD-1504
> URL: https://issues.apache.org/jira/browse/TRINIDAD-1504
> Project: MyFaces Trinidad
> Issue Type: Improvement
> Affects Versions: 1.2.11-core
> Reporter: Blake Sullivan
> Assignee: Matthias Weßendorf
> Fix For: 1.2.12-core
>
> Attachments: JIRA_1504_12_11_3.patch
>
> Original Estimate: 24h
> Remaining Estimate: 24h
>
> Currently components implementing the FlattenedComponent interface cannot
> render any content when flattening their children because while rendering can
> only occur once per component per request, flattening may occur multiple
> times during rendering since Renderers often make one or more passes over
> their children to collect information before making the rendering pass.
> Unfortunately, there is currently no way for FlattenedComponents to
> distinguish the cases where flattening is occurring for the purposes of
> simple in-context child iteration from the cases where encoding will occur.
> The proposal is to add apis to allow the FlattenedComponents to distinguish
> between these two cases.
> To org.apache.myfaces.trinidad.component.ComponentProcessingContext
> Add:
> /**
> * Hints to the the FlattenedComponents regarding what the flattened
> iteration is being used for,
> * The FlattenedComponent may use this information to change its flattening
> behavior.
> * For example, a FlattenedComponent may generate output during a
> <code>PROCESS_FOR_ENCODING</code>
> * iteration, but not during a normal iteration.
> */
> public enum ProcessingHint
> {
> /**
> * Indicates that the iteration is occurring in order to encode iterated
> components. This
> * hint may only be used during the RenderResponse phase and only once
> per an iterated
> * component. Due to these guarantees, the FlattenedComponent is allowed
> to generate
> * content during the iteration, an exception to the normal rule that
> iterations must
> * be idempotent in case the same component is iterated multiple times.
> */
> PROCESS_FOR_ENCODING
> }
> /**
> * <p>Returns hints that influence the behavior of the component
> processing</p>
> *
> * @return a non-empty, unmodifiable collection of ProcessingHints
> */
> public Set<ProcessingHint> getHints()
> {
> return _hints;
> }
> To org.apache.myfaces.trinidad.component.UIXComponent
> Add:
> /**
> * Helper function called by Renderers to encode a flattened view of a
> group of
> * potentially FlattenedComponent instances rooted at a single child of the
> component,
> * invoking the <code>childProcessor</code> with its
> * <code>callbackContext</code> on each renderable instance. This method
> must be called
> * when the childProcessor is actually encoding and the childProcessor must
> not attempt
> * to encode the same component instances more than once per request.
> * <p>
> * If a Renderer needs to
> * collect information about its possibly flattened children before calling
> * <code>encodeFlattenedChild(FacesContext, ComponentProcessor,
> UIComponent, Object)</code>,
> * it should call <code>processFlattenedChildren(FacesContext,
> ComponentProcessor, UIComponent, Object)</code>
> * to collect the information.
> * <p>
> * If the child is a FlattenedComponent, the <code>childProcessor</code>
> will
> * be called on each of that FlattenedComponent's children, recursing if
> those children are
> * themselves FlattenedComponents, otherwise, the
> <code>childProcessor</code> will be called on
> * the child itself.
> * <p>
> * FlattenedComponents that wish to check whether they are processed for
> the purpose of
> * encoding can check the ProcessingHints of the ComponentProcessingContext
> for the
> * presence of <code>PROCESS_FOR_ENCODING hint</code>.
> * <p>
> * If the Renderer accidentally passes in the component to be encoded
> instead of one
> * of its children, the result will almost certainly be an infinite
> recursion and stack overflow.
> * @return <code>true</code> If any children were processed
> * @see UIXComponent#processFlattenedChildren(FacesContext,
> ComponentProcessor, UIComponent, Object)
> * @see FlattenedComponent
> */
> public static <S> boolean encodeFlattenedChild(
> FacesContext context,
> ComponentProcessor<S> childProcessor,
> UIComponent child,
> S callbackContext) throws IOException
> /**
> * Helper function called by Renderers to encode a flattened view of their
> children,
> * invoking the <code>childProcessor</code> with its
> * <code>callbackContext</code> on each renderable instance. This method
> must be called
> * when the childProcessor is actually encoding and the childProcessor must
> not attempt
> * to encode the same component instances more than once per request.
> * <p>
> * If a Renderer needs to
> * collect information about its possibly flattened children before calling
> * <code>encodeFlattenedChild(FacesContext, ComponentProcessor,
> Iterable<UIComponent>, Object)</code>,
> * it should call
> * <code>processFlattenedChildren(FacesContext, ComponentProcessor,
> Iterable<UIComponent>, Object)</code>
> * to collect the information.
> * <p>
> * For each FlattenedComponent child, the <code>childProcessor</code> will
> * be called on each of that FlattenedComponent's children, recursing if
> those children are
> * themselves FlattenedComponents, otherwise, the
> <code>childProcessor</code> will be called on
> * the child itself.
> * <p>
> * FlattenedComponents that wish to check whether they are processed for
> the purpose of
> * encoding can check the ProcessingHints of the ComponentProcessingContext
> for the
> * presence of <code>PROCESS_FOR_ENCODING hint</code>.
> * @return <code>true</code> If any children were processed
> * @see UIXComponent#processFlattenedChildren(FacesContext,
> ComponentProcessor, Iterable, Object)
> * @see FlattenedComponent
> */
> public static <S> boolean encodeFlattenedChildren(
> FacesContext context,
> ComponentProcessor<S> childProcessor,
> Iterable<UIComponent> children,
> S callbackContext) throws IOException
> When encoding their flattened children, the Renderers call one of the two
> encoding methods on UIXComponent. If a FlattenedComponent wishes to check
> whether its children are being flattened for the purpose of encoding, it can
> check
> ComponentProcessingContext.getHints().contains(ProcessingHint.PROCESS_FOR_ENCODING)
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.