[ 
https://issues.apache.org/jira/browse/MYFACES-3515?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13240949#comment-13240949
 ] 

Leonardo Uribe commented on MYFACES-3515:
-----------------------------------------

I was not able to reproduce the bug, but I can see the problem. The reason why 
we haven't seen it is any call to UIViewRoot.createUniqueId() increase the 
unique counter, so as soon as the view gets bigger and bigger, the different 
between the unique counter in UIViewRoot and other counters in composite 
components gets bigger too. In few words, the probability to see the problem is 
very small, but I'm glad someone has been able to see it.

The panel created by ComponentSupport.createFacetUIPanel is special. To be 
restored properly and do not create duplicate ids or any other unwanted 
conflicts, it requires an unique id. This code is usually called when more than 
one component is added to a facet and it is necessary to create a shared 
container. Use FaceletCompositionContext.generateUniqueComponentId() is not 
possible, because <c:if> blocks inside a facet will make component ids 
unstable. Use UniqueIdVendor is feasible but also will be affected by <c:if> 
blocks inside a facet. The only solution that will generate real unique ids is 
use the parent id and the facet name and derive an unique id that cannot be 
generated by SectionUniqueIdCounter, doing the same trick as with metadata: use 
a double __ and add a prefix (f). Note this id will never be printed into the 
response, because this is just a container.

Note in facelets 1.1.x facets requires a container component, but in JSF 2.0 / 
2.1, the behavior to handle facets was changed in order to make f:metadata 
component work (requires facets can contain more than one component 
automatically).

I also have notice a small performance improvement: our calls to 
UniqueIdVendor.createUniqueId() increase the unique counter in 1, but when a 
seed is passed this is not necessary. That will save one HashMap.get() call per 
component create by facelets.
                
> Duplicate id using a facet in a composite component
> ---------------------------------------------------
>
>                 Key: MYFACES-3515
>                 URL: https://issues.apache.org/jira/browse/MYFACES-3515
>             Project: MyFaces Core
>          Issue Type: Bug
>         Environment: MyFaces 2.1.6, Tomahawk20 1.1.11
>            Reporter: dennis hoersch
>         Attachments: duplicateIdTest.zip
>
>
> Hello,
> I get an IllegalStateException using a facet in a composite component. The 
> facet gets the same id as the internal 'composite component'-facet. The facet 
> is created using CumponentSupport.addFacet(). Here the id of the facet is 
> generated using the view root instead of the UniqueIdVendor of the parent to 
> whom the facet is added.
> In other places the id is retrieved with something like
>         FaceletCompositionContext mctx = 
> FaceletCompositionContext.getCurrentInstance(facesContext);
>         UniqueIdVendor uniqueIdVendor = mctx.getUniqueIdVendorFromStack();
>         if (uniqueIdVendor == null)
>         {
>             uniqueIdVendor = facesContext.getViewRoot();
>         }
>       String uid = uniqueIdVendor.createUniqueId(facesContext, null);

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to