Hi

I agree with Jakob. Client ids should be stable, because without that
PSS will break (it relies on clientId to save delta state). I don't see
any case where a renderkit provide a custom clientId generation.

regards,

Leonardo

2011/5/14 Jakob Korherr <jakob.korh...@gmail.com>:
> Good question, but I guess it is ok. At least the spec does not tell
> us otherwise, right?
>
> Regards,
> Jakob
>
> 2011/5/13 Martin Koci <martin.kocicak.k...@gmail.com>:
>>
>> One more question: UIComponent.getClientId() uses
>> Renderer.convertClientId
>>
>> 1) INVOKE_APPLICATION - action listener calls component.getClient() ->
>> component generates client id with renderer1 + as next step
>> actionListener changes renderKitId
>>
>> 2) RENDER_RESPOSE: renderer2 from new renderkit renders component with
>> clientId from renderer1!
>>
>> Is that ok?
>>
>> Leonardo Uribe píše v Pá 13. 05. 2011 v 15:45 -0500:
>>> Hi
>>>
>>> 2011/5/13 Martin Koci <martin.kocicak.k...@gmail.com>:
>>> > Leonardo Uribe píše v Pá 13. 05. 2011 v 14:59 -0500:
>>> >> Hi
>>> >>
>>> >> +1 to both changes.
>>> >
>>> > That means: replace StateHelper with attribute as MYFACES-3136 suggests,
>>> > right?
>>>
>>> That means change StateHelper.eval to StateHelper.get in
>>> UIComponentBase.getRendererType()
>>>
>>> The point 3 it is not really necessary, because this property is part
>>> of the full state, not the delta, which is the one that consume space
>>> on server side state saving. I prefer keep using StateHelper but get
>>> instead eval.
>>>
>>> >
>>> >>  I agree with you about rendererType is always an
>>> >> String, there is not any mention on the spec saying rendererType could
>>> >> receive EL expressions. If someone wants to change a renderer, it uses
>>> >> a RenderKit wrapper or just define another RenderKitId to be used for
>>> >> the current application.
>>> >>
>>> >> Please note this description of UIViewRoot.getRenderKitId :
>>> >>
>>> >> "... Return the render kit identifier of the RenderKit associated with
>>> >> this view. Unless explicitly set, as in
>>> >> ViewHandler.createView(javax.faces.context.FacesContext,
>>> >> java.lang.String), the returned value will be null. ..."
>>> >>
>>> >> and setRenderKitId:
>>> >>
>>> >> "... Set the render kit identifier of the RenderKit associated with
>>> >> this view. This method may be called at any time between the end of
>>> >> Apply Request Values phase of the request processing lifecycle (i.e.
>>> >> when events are being broadcast) and the beginning of the Render
>>> >> Response phase. ..."
>>> >>
>>> >> So any caching must preserve this behavior.
>>> >
>>> > Thats very interesting, with this behaviour it is possible to change
>>> > renderkit in actionListener for example. But it also means that renderer
>>> > cannot be be cached UIComponentBase:
>>> >
>>> > 1) UIComponent.decode -> caches renderer
>>> > 2) INVOKE_APPLICATION -> changes renderKit
>>> > 3) UIComponent.encodeBegin -> uses old cached renderer
>>> >
>>> > but caching is valid for all encode* method then. Any ideas how to
>>> > detect "this component will be rendered in this lifecycle" and cache
>>> > renderer even for getClientId? stateManagement calls getClientId
>>> > (checkIds) before component.encodeBegin. Can we use visitTree method for
>>> > that?
>>>
>>> Cache as soon as you do the lookup, but clean it inside encodeAll
>>> call. Note some code is necessary here if encodeAll is called multiple
>>> times over the same instance (datatable or datalist case). Use a
>>> simple variable to do the trick.
>>>
>>> Leonardo
>>>
>>
>>
>>
>
>
>
> --
> Jakob Korherr
>
> blog: http://www.jakobk.com
> twitter: http://twitter.com/jakobkorherr
> work: http://www.irian.at
>

Reply via email to