tapestry-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Vjeran Marcinko (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (TAP5-1284) When using @PageActivationContext and override a no-args activate event handler of parent page, the handler called too soon
Date Tue, 28 Jun 2011 08:35:17 GMT

    [ https://issues.apache.org/jira/browse/TAP5-1284?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13056388#comment-13056388
] 

Vjeran Marcinko commented on TAP5-1284:
---------------------------------------

I have to add comment about this since this is maybe the biggest design issue I have with
Tapestry pages overall.
The general problem is that mechanism for *configuring page*, by accepting request parameters:
in one of following ways:
@PageActivationContext or
@ActivationRequestParameter or
"activate" handler
, is mixed with the only place one can *execute post-configuration logic* in a page, and that
is "activate" handler.

Typical case is when one wants to execute some page-hierarchy security check that depends
upon parameters from child classes, such as in case above. There are many other cases as well.
So having some post-activate event should be delightful since it would solve this issue. 

Whenever I brought this issue on mailing list, I got answer that using subclassing for common
page processing logic is no-good design issue (subclassing is evil), thus I should use intercepting
via filters, which although have some nice advantages, but also bring some big drawbacks for
many cases).


> When using @PageActivationContext and override a no-args activate event handler of parent
page, the handler called too soon
> ---------------------------------------------------------------------------------------------------------------------------
>
>                 Key: TAP5-1284
>                 URL: https://issues.apache.org/jira/browse/TAP5-1284
>             Project: Tapestry 5
>          Issue Type: Bug
>          Components: tapestry-core
>    Affects Versions: 5.2.0
>            Reporter: Alexander Gavrilov
>            Assignee: Howard M. Lewis Ship
>            Priority: Critical
>
> It appears that the overrided onActivate() method is called before the @PageActivationContext
logic, which means the following can fail:
> public class BasePage { 
>     private MyEntity entity; 
>       
>     protected void setEntity(MyEntity entity) { 
>          this.entity = entity; 
>     } 
>        
>     protected void onActivate() { 
>         if (entity == null) throw new RuntimeException("Entity not found."); 
>     } 
> } 
> public class ConcreteClass { 
>     @PageActivationContext 
>     private MyEntity entity; 
>     protected void onActivate() { 
>         setEntity(entity); 
>         super.onActivate(); 
>     } 
> } 
> Workaround is do not use methods overriding. 
> The problem is the consecuence of Howard's approach:  "if the child class *overrides*
a method of the parent, then the overridden method will be invoked only by the parent class".
When Tapestry performs transformation it skips OnEventWorker advice, which invoke event handler
method of subclass and add it only for parent class. And required for @PageActivationContext
chain of invocation breaks. My approach is that if some class override some event handler
method of some class then Tapestry should stop advaicing parent class method invocation and
should rely on subclass method definition and is the subclass implementor responibility to
invoke parent class method.   

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Mime
View raw message