[ 
https://issues.apache.org/jira/browse/MYFACES-3660?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Leonardo Uribe resolved MYFACES-3660.
-------------------------------------

       Resolution: Fixed
    Fix Version/s: 2.1.11
                   2.0.17

I checked this one and with the fixes done in MYFACES-3663, MYFACES-3665 and 
MYFACES-3668 we can close this one as fixed
                
> Component resource added using @ResourceDependency annotation from a facelet 
> component should have an id defined by facelets
> ----------------------------------------------------------------------------------------------------------------------------
>
>                 Key: MYFACES-3660
>                 URL: https://issues.apache.org/jira/browse/MYFACES-3660
>             Project: MyFaces Core
>          Issue Type: Bug
>          Components: JSR-314
>            Reporter: Leonardo Uribe
>            Assignee: Leonardo Uribe
>             Fix For: 2.0.17, 2.1.11
>
>
> A problem related to @ResourceDependency has been mentioned on:
> http://stackoverflow.com/questions/13526624/duplicate-id-error-with-partial-state-saving-and-myfaces-codi
> CODI add a component called WindowContextIdHolderComponent in 
> ResponseWriter.startDocument(), and later a UIViewRoot.createUniqueId() call 
> is done when getClientId() is called from the code that checks for duplicate 
> ids. 
> The problem is the code that process @ResourceDependency annotations in 
> ApplicationImpl object let UIViewRoot.addComponentResource() internals to 
> call createUniqueId(). In the example proposed, there is a dynamic block that 
> changes the resources added at an specific moment of time, and since by PSS 
> saving algorithm, restore view phase calls buildView() before restore the 
> initial state, the count of uniqueIdCounter in UIViewRoot is never restored, 
> and there is a chance that the same id of the one assigned to 
> WindowContextIdHolderComponent can be set to a component resource added by 
> @ResourceDependency effect.
> The problem of how generate ids is well known and has been studied for a long 
> time. A general solution for facelets was committed in MYFACES-3329, and has 
> worked well so far.
> In few words, we need to generate predictable component ids to make PSS 
> algorithm reliable, otherwise it will be problems related to state saving 
> that are very difficult to track down and solve. In the other hand, PSS 
> algorithm impose some restrictions over the view that conflicts with dynamic 
> manipulations of the component tree.
> I think the solution for this one is ensure all components created inside 
> facelets vdl.buildView has unique ids, doing some changes over 
> UIViewRoot.createUniqueId and changing @ResourceDependency processing in 
> ApplicationImpl, so if facelets is processing the current view use 
> FaceletCompositionContext.generateUniqueComponentId() to set an Id. Since 
> @ResourceDependency depends on the component tree structure, the ids will now 
> contains the information related to the tree structure itself (in the 
> generated id), preventing duplicates.
> In theory, if we can ensure that all components generated by facelets has a 
> component id defined by facelets algorithm, createUniqueId will be let to 
> components added programatically, so we can do some hack to restore the 
> uniqueIdCounter for UIViewRoot on restore view phase before call 
> vdl.buildView, and simulate the same behavior we had in JSF 1.2, without the 
> side effects over the state and performance.
> I think solutions using a HashMap using duplicates or random generators are 
> out of discussion, because they will not ensure the predictability we need to 
> get correct operation of PSS algorithm.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to