^ Up ^ :-)
Cheers Prasad On 3/21/07, David Blevins <[EMAIL PROTECTED]> wrote:
On Mar 21, 2007, at 7:37 PM, Prasad Kashyap wrote: > I'm sorry. My test class had a very dumb bug. The chain works fine. :) > 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. -David > > On 3/21/07, David Blevins <[EMAIL PROTECTED]> 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 >> >> >> >> >
