Hi Kris,

Thanks, I'll try reopening the issue. From your work on refactoring
the code, do you think the changes that will be needed so solve the
problem are reasonably isolated?

Doug

> -----Original Message-----
> From: Kristian Marinkovic [mailto:[EMAIL PROTECTED]
> Sent: Monday, November 17, 2008 1:28 AM
> To: Tapestry users
> Subject: Re: Changing the behavior of short-circuiting render phases
> (re: TAP5-128, TAP5-126)
> 
> hi doug,
> 
> all we can do is to reopen the bug and vote for it ... :)
> 
> <IMHO>
> 
> i guess one of the reasons why this issue does not get resolved
> is the added complexity to the page rendering. first because the
> responsible class ComponentPageElementImpl is already very
> complex (>1000 loc) and it would be necessary to add some state
> information to the rendering process. currently the rendering is
> completely stateless only relying on the static structure of the page.
> 
> i've started to refactor ComponentPageElementImpl just to see
> how it could be solved....
> 
> </IMHO>
> 
> g,
> kris
> 
> 
> 
> 
> "Doug Hauge" <[EMAIL PROTECTED]>
> 15.11.2008 01:57
> Bitte antworten an
> "Tapestry users" <users@tapestry.apache.org>
> 
> 
> An
> "Tapestry users" <users@tapestry.apache.org>
> Kopie
> "Doug Hauge" <[EMAIL PROTECTED]>, "Adam Ayres"
> <[EMAIL PROTECTED]>, "Matt Ayres" <[EMAIL PROTECTED]>
> Thema
> Changing the behavior of short-circuiting render phases (re: TAP5-128,
> TAP5-126)
> 
> 
> 
> 
> 
> 
> 
> 
> As of Tapestry 5.0.16 (after the fix for TAP5-128), we are now running
> into
> a problem related to that described in TAP5-126. You closed the TAP5-
> 126
> issue
> saying that the code was behaving as documented and designed, but it
> seems
> that this behavior leads to problems when trying to implement generic
> mixins
> that can safely be added to arbitrary components. I'd like to check
> whether
> there is any possibility of convincing you to change the behavior so
> the
> reverse phases of a component/mixin are only called if the positive
> phase is
> for the same component mixin (e.g. a component's cleanupRender is
> called
> if
> and only if the component's setupRender was called).
> 
> It also seems odd that returning 'true' will cause other methods
within
> the
> same phase to be bypassed. There thus seems to be no way according to
> the
> documentation at
>
http://tapestry.apache.org/tapestry5/tapestry-core/guide/rendering.html
> to design a mixin that will either short-circuit or continue rendering
> as
> if it didn't exist. The Tapestry code still seems to allow the
behavior
> we need by declaring the render phase method to return 'Boolean', and
> return
> 'null' instead of 'true' to continue processing. However, unless I am
> missing
> something obvious, this is not documented behavior, so it is not clear
> that
> I can rely on it continuing to work.
> 
> The fundamental problem with the short-circuiting behavior as
> documented
> is
> that if a mixin short-circuits a render phase by returning either true
> or
> false, any component that contains it must be carefully written so it
> can
> handle it. Consider a component
> 
> class Component {
> 
>    void setupRender() {}
> 
>    void beginRender() {}
> 
>    void afterRender() {}
> 
>    void cleanupRender() {}
> }
> 
> Where 'setupRender' constructs some objects from the component
> parameters, 'beginRender' begins
> an HTML element, 'afterRender' closes the HTML element, and
> 'cleanupRender' cleans up.
> 
> And a mixin
> 
> class Mixin {
>    Boolean setupRender() { ... }
> 
>    Boolean beforeRender() { ... }
> 
>    Boolean afterRender() { ... }
> 
>    Boolean cleanupRender() { ... }
> }
> 
> We are returning 'Boolean' here instead of 'boolean' so we have the
> option of not short-circuiting
> anything. If this is not considered supported, instead of returning
> 'null' in the examples below
> simply remove the render phase method from the mixin.
> 
> 1) If 'Mixin.setupRender()' returns 'true', then
> 'Component.cleanupRender()' is not called because
> the phase is short-circuited, but 'Component.beginRender()' is called,
> so 'Component.beginRender()'
> would have to be written in such a way that it handles when
> 'Component.setupRender()' is not called.
> 
> 2) If 'Mixin.setupRender()' returns 'null', but 'Mixin.beforeRender()'
> returns 'false', then rendering
> is short-circuited to the after render phase and
> 'Component.beforeRender()' is not called. However, the
> 'Component.afterRender()' method is called, so it would have to be
> written in such a way that it handles
> The 'Component.beforeRender()' not being called, in this case it would
> have to create a property that
> records whether the HTML element was started, and only add an end tag
> if
> it was.
> 
> Thus, in the most general case, each render phase in the component
> would
> have to be written assuming
> that any subset of its previous render phase methods may not have been
> called, which leads to overly
> complicated code.
> 
> Doug
> 
> 
> 
> 
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to