[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openejb-development
Subject:    Re: Multiple lifecycle interceptor callbacks don't work
From:       "Prasad Kashyap" <goyathlay.geronimo () gmail ! com>
Date:       2007-05-21 17:12:11
Message-ID: c278ac970705211012y5fd260fpf9a94a70f00b92c4 () mail ! gmail ! com
[Download RAW message or body]

Opened a JIRA to track this

https://issues.apache.org/jira/browse/OPENEJB-582

Cheers
Prasad

On 5/1/07, Prasad Kashyap <goyathlay.geronimo@gmail.com> wrote:
> On 3/21/07, David Blevins <david.blevins@visi.com> wrote:
> >
> > On Mar 21, 2007, at 7:37 PM, Prasad Kashyap wrote:
> >
> > > However, can you please help me understand this better.
> > >
> > > Section 12.4 of the spec says, "Lifecycle callback interceptor methods
> > > may be defined on superclasses of the bean class or interceptor
> > > classes. However, a given class may not have more than one lifecycle
> > > callback interceptor method for the same lifecycle event."
> > >
> > > Also Section 12.4.1 says,
> > > • If a bean class has superclasses, any lifecycle callback interceptor
> > > methods defined on those superclasses are invoked, most general
> > > superclass first.
> > > • The lifecycle callback interceptor method, if any, on the bean class
> > > itself is invoked.
> > >
> > >
> > > My understanding is that for a given lifecycle event, (say
> > > PostConstruct), the bean's superclass' @PostConstruct is first called
> > > followed by the bean's @PostConstruct. Am I correct ?
> > >
> > > If correct, then how can the superclass' @PostConstruct invoke the
> > > InvocationContext.proceed() ? The method signature of a lifecycle
> > > callback method on a bean or it's superclass should be   void
> > > <METHOD>()  . Where can it get a handle on the InvocationContext
> > > object ? How can it proceed down the chain ?
> >
> > Good question.  Looking at the code, it seems like things will just
> > come to a halt.  We may need to add something in there to fix that.
> >
>
> Has a fix for this been added now ?
>
> > -David
>
> Cheers
> Prasad
>
> >
> > >
> > > On 3/21/07, David Blevins <david.blevins@visi.com> wrote:
> > >>
> > >> On Mar 20, 2007, at 1:39 PM, Prasad Kashyap wrote:
> > >>
> > >> > https://issues.apache.org/jira/secure/attachment/12353787/
> > >> > Interceptor-v2.patch
> > >> >
> > >> > I have attached a patch here that defines a stateless bean and a
> > >> > stateful bean with lifecycle interceptors at many levels. Both the
> > >> > beans have super class with in-bean lifecycle interceptors. Then
> > >> the
> > >> > beans themselves have in-bean lifecycle interceptors.
> > >> >
> > >> > The beans declare a @Interceptor class that has lifecycle
> > >> > interceptors. The interceptor has a super class with lifecycle
> > >> > interceptor.
> > >> >
> > >> > There are printlns in the interceptor code to verify the callbacks
> > >> > order.
> > >> >
> > >> > StatefulInterceptorTests and StatelessInterceptorTests in the
> > >> client
> > >> > code invoke the beans though they don't have specific test
> > >> methods to
> > >> > test the callbacks. See the printlns above.
> > >> >
> > >> > Expected results: (interceptor callback in the following order,
> > >> as per
> > >> > Section 12.4.1 of core spec)
> > >> > -------------------------
> > >> > SuperClassInterceptor
> > >> > ClassInterceptor
> > >> > SuperBeanInterceptor
> > >> > InBeanInterceptor
> > >> >
> > >> >
> > >> > Actual Result:
> > >> > --------------------
> > >> > SuperClassInterceptor
> > >> >
> > >> >
> > >> > The top most interceptor in the chain executes.  Then it doesn't go
> > >> > down the chain. You can verify that by removing each top one and it
> > >> > executes only the next one in the chain.
> > >>
> > >> This is strange as I seems to work in this test case:
> > >>
> > >> http://fisheye6.cenqua.com/browse/openejb/trunk/openejb3/container/
> > >> openejb-core/src/test/java/org/apache/openejb/core/stateless/
> > >> StatelessInterceptorTest.java?r=519214
> > >>
> > >> Maybe my test case is flawed somehow.
> > >>
> > >> The code that should be working and perhaps does not is:
> > >>
> > >>   1. Get the callbacks (including @AroundInvoke) declared in the
> > >> class and it's super class and add them to the descriptor tree
> > >> (AnnotationDeployer:line 568)[1].
> > >>   2. Block out callbacks from parents overridden by the child.
> > >> (InterceptorBindingBuilder: lines 134)[2]
> > >>   3. Sort the callbacks parent first, child last
> > >> (InterceptorBindingBuilder: lines 147)[3]
> > >>
> > >> -David
> > >>
> > >> [1]  http://fisheye6.cenqua.com/browse/openejb/trunk/openejb3/
> > >> container/openejb-core/src/main/java/org/apache/openejb/config/
> > >> AnnotationDeployer.java?r=519454#l568
> > >> [2]  http://fisheye6.cenqua.com/browse/openejb/trunk/openejb3/
> > >> container/openejb-core/src/main/java/org/apache/openejb/assembler/
> > >> classic/InterceptorBindingBuilder.java?r=519454#l134
> > >> [3]  http://fisheye6.cenqua.com/browse/openejb/trunk/openejb3/
> > >> container/openejb-core/src/main/java/org/apache/openejb/assembler/
> > >> classic/InterceptorBindingBuilder.java?r=519454#l147
> > >>
> > >>
> > >>
> > >>
> > >
> >
> >
>

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic