https://issues.apache.org/jira/secure/attachment/12354131/
Interceptor-v4.patch
https://issues.apache.org/jira/browse/OPENEJB-201
Cheers
Prasad
On 3/23/07, Prasad Kashyap <[EMAIL PROTECTED]> wrote:
> This still does not seem to work for method-level interceptors.
>
> I have 2 method-level interceptors; 1 defined using annotation
and 1
> specified in the DD.
>
> As per the fix we applied recently, I am able to verify that the
> binding from the annotation is added to the list before the binding
> from the DD.
>
> Yet, the interceptor from the DD gets invoked before the
interceptor
> from the annotation !
>
> Cheers
> Prasad
>
> On 3/22/07, David Blevins <[EMAIL PROTECTED]> wrote:
> >
> > On Mar 22, 2007, at 6:44 PM, Prasad Kashyap wrote:
> >
> > > Thanx..
> > >
> > > https://issues.apache.org/jira/secure/attachment/12354016/
> > > AnnotationDeployer.patch
> > >
> >
> > Applied! Thank you very much!
> >
> > -David
> >
> > >
> > > On 3/22/07, David Blevins <[EMAIL PROTECTED]> wrote:
> > >> Your patch got line wrapped.
> > >>
> > >> Here, I've reopened this issue, go ahead and throw in in
there:
> > >>
> > >> http://issues.apache.org/jira/browse/OPENEJB-87
> > >>
> > >> -David
> > >>
> > >> On Mar 22, 2007, at 1:21 PM, Prasad Kashyap wrote:
> > >>
> > >> > Index: container/openejb-core/src/main/java/org/apache/
openejb/
> > >> > config/AnnotationDeployer.java
> > >> >
===================================================================
> > >> > --- container/openejb-core/src/main/java/org/apache/
openejb/config/
> > >> > AnnotationDeployer.java (revision
> > >> > 521254)
> > >> > +++ container/openejb-core/src/main/java/org/apache/
openejb/config/
> > >> > AnnotationDeployer.java (working
> > >> > copy)
> > >> > @@ -63,6 +63,7 @@
> > >> > import java.net.URL;
> > >> > import java.util.ArrayList;
> > >> > import java.util.Arrays;
> > >> > +import java.util.Collection;
> > >> > import java.util.List;
> > >> > import java.util.Map;
> > >> >
> > >> > @@ -307,14 +308,15 @@
> > >> >
> > >> > Interceptors interceptors =
> > >> > clazz.getAnnotation(Interceptors.class);
> > >> > if (interceptors != null){
> > >> > - EjbJar ejbJar = ejbModule.getEjbJar();
> > >> > + EjbJar ejbJar = ejbModule.getEjbJar();
> > >> > for (Class interceptor :
interceptors.value
> > >> ()) {
> > >> > if
> > >> > (ejbJar.getInterceptor(interceptor.getName()) == null){
> > >> > ejbJar.addInterceptor(new
> > >> > Interceptor(interceptor.getName()));
> > >> > }
> > >> > }
> > >> >
> > >> > - InterceptorBinding binding =
> > >> > assemblyDescriptor.addInterceptorBinding(new
InterceptorBinding());
> > >> > + InterceptorBinding binding = new
> > >> > InterceptorBinding();
> > >> > +
assemblyDescriptor.getInterceptorBinding().add
> > >> > (0, binding);
> > >> > binding.setEjbName(bean.getEjbName());
> > >> >
> > >> > for (Class interceptor :
interceptors.value
> > >> ()) {
> > >> > @@ -332,7 +334,8 @@
> > >> > }
> > >> > }
> > >> >
> > >> > - InterceptorBinding binding =
> > >> > assemblyDescriptor.addInterceptorBinding(new
InterceptorBinding());
> > >> > + InterceptorBinding binding = new
> > >> > InterceptorBinding();
> > >> > +
> > >> > assemblyDescriptor.getInterceptorBinding().add(0, binding);
> > >> > binding.setEjbName(bean.getEjbName
());
> > >> >
> > >> > for (Class interceptor :
interceptors.value
> > >> > ()) {
> > >> >
> > >> >
> > >> >
> > >> > On 3/22/07, Prasad Kashyap <[EMAIL PROTECTED]>
wrote:
> > >> >> On 3/22/07, David Blevins <[EMAIL PROTECTED]> wrote:
> > >> >> >
> > >> >> > On Mar 22, 2007, at 8:35 AM, Prasad Kashyap wrote:
> > >> >> >
> > >> >> > > Are you sure we can't just change the spec instead ?
> > >> >> >
> > >> >> > Maybe last year at this time :)
> > >> >> >
> > >> >> > > This is much complicated than the "simple" change you
> > >> >> mentioned. It
> > >> >> > > affects both lines 317 (class-level interceptor) and
335
> > >> >> (method-level
> > >> >> > > interceptor).
> > >> >> > >
> > >> >> > > InterceptorBinding binding =
> > >> >> > > assemblyDescriptor.addInterceptorBinding(new
> > >> InterceptorBinding
> > >> >> ());
> > >> >> > >
> > >> >> > > addInterceptorBinding() gets the existing binding
list and
> > >> >> adds one to
> > >> >> > > the bottom.
> > >> >> > >
> > >> >> > > Now if you simply modify this to add one to the top
of the
> > >> >> list, then
> > >> >> > > it would reverse the specification order as defined
by the the
> > >> >> > > annotations in the class. That's a no-no.
> > >> >> > >
> > >> >> > > The right way to do this would be to
> > >> >> > > 1. go over the collection of @Interceptor
annotatations in the
> > >> >> > > reverse order
> > >> >> > > 2. insert the interceptor-binding to the top of the
> > >> >> bindingsList in
> > >> >> > > the assembly-descriptor.
> > >> >> > >
> > >> >> >
> > >> >> > I mean at line 317 only (class-level interceptor) make
a call
> > >> like
> > >> >> > this instead:
> > >> >> >
> > >> >> > IntercpetorBinding binding = new IntercpetorBinding()
> > >> >> > assemblyDescriptor.getInterceptorBinding().add(0,
binding);
> > >> >> >
> > >> >> > This would put only the annotated class-level binding
before all
> > >> >> the
> > >> >> > other class-level bindings for that bean. It technically
> > >> puts it
> > >> >> > before all bindings, but they get resorted into package,
> > >> class, and
> > >> >> > method order anyway, so it works out fine.
> > >> >> >
> > >> >> > We wouldn't need to go over the @Interceptor
annotation in
> > >> reverse
> > >> >> > order as a class can only have one @Interceptor
annotation,
> > >> so we
> > >> >> > should be good as the loop will only ever execute once.
> > >> >>
> > >> >>
> > >> >> Oh shucks. I knew that. While reading the code, I had the
> > >> >> @Interceptors confused with the interceptors.value(). I
don't
> > >> know
> > >> >> how that confusion crept in. Thanks for patiently clearing
> > >> that up
> > >> >> for me.
> > >> >>
> > >> >> Adding the binding to the top of the list does work.
> > >> >>
> > >> >> I think we should do the same for the method-level
bindings too
> > >> >> (line 335).
> > >> >>
> > >> >> Cheers
> > >> >> Prasad
> > >> >>
> > >> >> >
> > >> >> > Thoughts?
> > >> >> >
> > >> >> > -David
> > >> >> >
> > >> >> >
> > >> >> > >
> > >> >> > > On 3/21/07, David Blevins <[EMAIL PROTECTED]>
wrote:
> > >> >> > >> Wow, you're going to be the interceptor king pretty
soon
> > >> here :)
> > >> >> > >> This is an extremely sharp observation. I
certainly never
> > >> >> saw it.
> > >> >> > >>
> > >> >> > >> Comments below...
> > >> >> > >>
> > >> >> > >> On Mar 21, 2007, at 12:37 PM, Prasad Kashyap wrote:
> > >> >> > >>
> > >> >> > >> > When an interceptor is declared in the DD and bound
> > >> >> specifically
> > >> >> > >> to a
> > >> >> > >> > bean (not using the wildcard *), it becomes yet
another
> > >> class
> > >> >> > >> > interceptor for the bean. In such a scenario,
Section
> > >> >> 12.8.2 of the
> > >> >> > >> > spec says,
> > >> >> > >> >
> > >> >> > >> > "The binding of interceptors to classes is
additive. If
> > >> >> > >> interceptors
> > >> >> > >> > are bound at the class-level and/or default-level
as well
> > >> >> as at the
> > >> >> > >> > method-level, both class-level and/or default-
level as
> > >> well as
> > >> >> > >> > method-level interceptors will apply. The deployment
> > >> >> descriptor
> > >> >> > >> may be
> > >> >> > >> > used to augment the interceptors and interceptor
methods
> > >> >> defined by
> > >> >> > >> > means of annotations.
> > >> >> > >> >
> > >> >> > >> > <emphasis>When the deployment descriptor is used
to augment
> > >> >> the
> > >> >> > >> > interceptors specified in annotations, the
interceptor
> > >> methods
> > >> >> > >> > specified in the deployment descriptor will be
invoked
> > >> >> after those
> > >> >> > >> > specified in annotations, </emphasis>
> > >> >> > >> >
> > >> >> > >> > according to the ordering specified in sections
12.3.1 and
> > >> >> > >> 12.4.1. The
> > >> >> > >> > interceptor-order deployment descriptor element
may be
> > >> used to
> > >> >> > >> > override this ordering."
> > >> >> > >> >
> > >> >> > >> > Expected outcome:
> > >> >> > >> > -----------------------------
> > >> >> > >> > As per the statement in <emphasis></emphasis>
above, the
> > >> >> > >> interceptor
> > >> >> > >> > declared in the DD and bound to the bean should
be invoked
> > >> >> after
> > >> >> > >> all
> > >> >> > >> > the other class level interceptors specified by
> > >> annotations.
> > >> >> > >> This is
> > >> >> > >> > assuming that the order is not modified by the
> > >> <interceptor-
> > >> >> order>
> > >> >> > >> > element.
> > >> >> > >> >
> > >> >> > >> > Actual result:
> > >> >> > >> > -------------------
> > >> >> > >> > The actual result I'm seeing is the class level
interceptor
> > >> >> > >> bound in
> > >> >> > >> > the DD gets invoked by before those specified by the
> > >> >> @Interceptor
> > >> >> > >> > annotation.
> > >> >> > >>
> > >> >> > >> This is easy to fix, we just need to tweak the
> > >> >> AnnotationDeployer to
> > >> >> > >> put the interceptor declarations found via the
@Interceptors
> > >> >> > >> annotation at the *beginning* of the list rather
than at the
> > >> >> end.
> > >> >> > >>
> > >> >> > >> http://fisheye6.cenqua.com/browse/openejb/trunk/
openejb3/
> > >> >> container/
> > >> >> > >> openejb-core/src/main/java/org/apache/openejb/config/
> > >> >> > >> AnnotationDeployer.java?r=519454#l335
> > >> >> > >>
> > >> >> > >> So right there on line 335 (love fisheye) we'd need
to put
> > >> that
> > >> >> > >> binding *before* the bindings already declared in
the list.
> > >> >> > >>
> > >> >> > >> Feel free to hack on it. It's actually a fantastic
place to
> > >> >> starting
> > >> >> > >> digging into the runtime code.
> > >> >> > >>
> > >> >> > >> -David
> > >> >> > >>
> > >> >> > >>
> > >> >> > >>
> > >> >> > >
> > >> >> >
> > >> >> >
> > >> >>
> > >> >
> > >>
> > >>
> > >
> >
> >
>