myfaces-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Leonardo Uribe (Commented) (JIRA)" <>
Subject [jira] [Commented] (MYFACES-3515) Duplicate id using a facet in a composite component
Date Thu, 29 Mar 2012 03:43:37 GMT


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:
>             Project: MyFaces Core
>          Issue Type: Bug
>         Environment: MyFaces 2.1.6, Tomahawk20 1.1.11
>            Reporter: dennis hoersch
>         Attachments:
> 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:!default.jspa
For more information on JIRA, see:


View raw message