setUpEncodingContext called twice on all partial page rendered roots during optimized PPR -----------------------------------------------------------------------------------------
Key: TRINIDAD-2067 URL: https://issues.apache.org/jira/browse/TRINIDAD-2067 Project: MyFaces Trinidad Issue Type: Bug Components: Archetype Affects Versions: 2.0.0-beta-3 Reporter: Blake Sullivan Assignee: Blake Sullivan setUpEncodingContext is called on all of the partial page roots during optimized partial page rendering. This is because optimizedPPR uses a tree visit to visit the partial page roots to render and the tree visiting code calls setUpEncodingContext before calling the visit callback. The optimized PPR code then calls encodeAll() on the partial target, which calls beforeEncode(), which calls setupEncodingContext again. This breaks code that can't have its setupEncodingContext (and tearDownEncodingContext) called twice in a row. A good example is a form renderer that uses setupEncodingContext to catch cases where forms have been nested. The fix is to add an api to UIXComponent: /** * Calls the VisitCallback after popping the encoding or visiting context of the * current component and then restores that context, returning the VisitCallbacks's * response. This handles the rare cases where a VisitCallback should not be * called inside the target component's callback. * @param visitContext the <code>VisitContext</code> for this visit * @param component the <code>UIComponent</code> to pop the context of * @param callback the <code>VisitCallback</code> instance to call in the popped context * @return the result of the VisitCallback */ public static VisitResult visitOutsideOfContext( VisitContext visitContext, UIComponent component, VisitCallback callback) The optimized PPR code can then wrap its current VisitCallback in one that calls visitOutsideOfContext, passing in the original VisitCallback. Other solutions would attempt to change the optimized PPR code to attempt to avoid calling encodeAll when the target was a UIXComponent, however doing so would require making assumptions about how different components have implemented encodeAll(), violating its abstraction. -- This message is automatically generated by JIRA. For more information on JIRA, see: http://www.atlassian.com/software/jira