Hey Leonardo,
You are right - the same issue reproduces with two nested ui:composition
templates.
I logged the following Mojarra issue for the problem:
https://javaserverfaces.dev.java.net/issues/show_bug.cgi?id=1684
I do not think we have to abandon the idea of using TemplateClient
mechanism for for the composite component implementation
because of this issue. You are already using a separate TemplateClient
stack for composites in your patch, so we do not
need to wait for the fix before implementing the correct behavior for
composites. All we need is a stack with only one TemplateClient
being considered 'current'. includeDefinition() should be checking the
current TemplateClient only, and we should pop the current
TemplateClient before calling TemplateClient.apply(), then restore
(push) it when the apply() is done.
Max
Leonardo Uribe wrote:
Hi
I tried the proposal of use some variation of TemplateClient API (I
attach it as reference on MYFACES-2638-6.patch ). The solution works
for simple cases, but it does not when nested composite components are
used.
Look this example (I removed the non relevant code):
testCompositeInsertChildren.xhtml (the page when it is used)
<testComposite:compositeInsertChildren>
<h:outputText value="GAMMA " />
</testComposite:compositeInsertChildren>
testComposite:compositeInsertChildren
<composite:implementation>
<testComposite:compositeInsertChildrenInner>
<h:outputText value="BETA " />
<composite:insertChildren />
</testComposite:compositeInsertChildrenInner>
</composite:implementation>
testComposite:compositeInsertChildrenInner
<composite:implementation>
<h:outputText value="ALFA " />
<composite:insertChildren/>
<h:outputText value="OMEGA " />
</composite:implementation>
The example should render this:
ALFA BETA GAMMA OMEGA
But it is rendered this:
ALFA GAMMA OMEGA
The current algorithm do it correctly because the tree is completely
built before relocate, so the listener relocates BETA too. Facelets
executed the inner FaceletHandler instance first and then the outer
ones. On composite components, it executes first the composite
component facelet, then the FaceletHandler children.
Suggestions are welcome.
regards,
Leonardo Uribe