myfaces-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jakob Korherr <jakob.korh...@gmail.com>
Subject Re: [core] Can UIComponent.rendererType be ValueExpression ? (MYFACES-3136)
Date Sat, 14 May 2011 10:17:15 GMT
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.koci@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.koci@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

Mime
View raw message