You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2007/03/17 00:25:33 UTC

svn commit: r519181 - in /incubator/openejb/trunk/openejb3/container: openejb-core/src/main/java/org/apache/openejb/assembler/classic/ openejb-core/src/main/java/org/apache/openejb/config/ openejb-core/src/test/java/org/apache/openejb/core/stateless/ o...

Author: dblevins
Date: Fri Mar 16 16:25:32 2007
New Revision: 519181

URL: http://svn.apache.org/viewvc?view=rev&rev=519181
Log:
Added support for inherited callbacks and AroundInvokes and the respective ordering

Modified:
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessInterceptorTest.java
    incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/AroundInvoke.java
    incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/LifecycleCallback.java

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java?view=diff&rev=519181&r1=519180&r2=519181
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/InterceptorBindingBuilder.java Fri Mar 16 16:25:32 2007
@@ -90,10 +90,26 @@
         for (CallbackInfo callbackInfo : callbackInfos) {
             try {
                 Method method = getMethod(clazz, callbackInfo.method, InvocationContext.class);
-                methods.add(method);
+                if (callbackInfo.className == null && method.getDeclaringClass().equals(clazz)){
+                    methods.add(method);
+                }
+                if (method.getDeclaringClass().getName().equals(callbackInfo.className)){
+                    methods.add(method);
+                }
             } catch (NoSuchMethodException e) {
                 logger.warning("Interceptor method not found (skipping): public Object " + callbackInfo.method + "(InvocationContext); in class " + clazz.getName());
             }
+        }
+        Collections.sort(methods, new MethodCallbackComparator());
+    }
+
+    public static class MethodCallbackComparator implements Comparator<Method> {
+        public int compare(Method m1, Method m2) {
+            Class<?> c1 = m1.getDeclaringClass();
+            Class<?> c2 = m2.getDeclaringClass();
+            if (c1.equals(c2)) return 0;
+            if (c1.isAssignableFrom(c2)) return -1;
+            return 1;
         }
     }
 

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?view=diff&rev=519181&r1=519180&r2=519181
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java Fri Mar 16 16:25:32 2007
@@ -228,7 +228,9 @@
                 }
                 ClassFinder classFinder = new ClassFinder(clazz);
 
+                ClassFinder inheritedClassFinder = createInheritedClassFinder(clazz);
 
+                inheritedClassFinder.getClass();
                 if (bean.getTransactionType() == null) {
                     TransactionManagement tx = clazz.getAnnotation(TransactionManagement.class);
                     TransactionManagementType transactionType = TransactionManagementType.CONTAINER;
@@ -300,7 +302,7 @@
                     }
                 }
 
-                processCallbacks(bean, classFinder);
+                processCallbacks(bean, inheritedClassFinder);
 
                 Interceptors interceptors = clazz.getAnnotation(Interceptors.class);
                 if (interceptors != null){
@@ -561,32 +563,47 @@
                     } catch (ClassNotFoundException e) {
                         throw new OpenEJBException("Unable to load interceptor class: " + interceptor.getInterceptorClass());
                     }
-                    ClassFinder classFinder = new ClassFinder(clazz);
 
-                    processCallbacks(interceptor, classFinder);    
+                    ClassFinder inheritedClassFinder = createInheritedClassFinder(clazz);
+
+                    processCallbacks(interceptor, inheritedClassFinder);
                 }
             }
 
             return ejbModule;
         }
 
+        private ClassFinder createInheritedClassFinder(Class<?> clazz) {
+            List<Class> parents = new ArrayList();
+            parents.add(clazz);
+            Class parent = clazz;
+            while ((parent = parent.getSuperclass()) != null){
+                parents.add(parent);
+            }
+
+            return new ClassFinder(parents);
+        }
+
         private void processCallbacks(Lifecycle bean, ClassFinder classFinder) {
             LifecycleCallback postConstruct = getFirst(bean.getPostConstruct());
             if (postConstruct == null) {
-                Method method = getFirst(classFinder.findAnnotatedMethods(PostConstruct.class));
-                if (method != null) bean.addPostConstruct(method.getName());
+                for (Method method : classFinder.findAnnotatedMethods(PostConstruct.class)) {
+                    bean.getPostConstruct().add(new LifecycleCallback(method));
+                }
             }
 
             LifecycleCallback preDestroy = getFirst(bean.getPreDestroy());
             if (preDestroy == null) {
-                Method method = getFirst(classFinder.findAnnotatedMethods(PreDestroy.class));
-                if (method != null) bean.addPreDestroy(method.getName());
+                for (Method method : classFinder.findAnnotatedMethods(PreDestroy.class)) {
+                    bean.getPreDestroy().add(new LifecycleCallback(method));
+                }
             }
 
             AroundInvoke aroundInvoke = getFirst(bean.getAroundInvoke());
             if (aroundInvoke == null) {
-                Method method = getFirst(classFinder.findAnnotatedMethods(javax.interceptor.AroundInvoke.class));
-                if (method != null) bean.addAroundInvoke(method.getName());
+                for (Method method : classFinder.findAnnotatedMethods(javax.interceptor.AroundInvoke.class)) {
+                    bean.getAroundInvoke().add(new AroundInvoke(method));
+                }
             }
 
             if (bean instanceof org.apache.openejb.jee.Session) {
@@ -594,14 +611,16 @@
 
                 LifecycleCallback postActivate = getFirst(session.getPostActivate());
                 if (postActivate == null) {
-                    Method method = getFirst(classFinder.findAnnotatedMethods(PostActivate.class));
-                    if (method != null) session.addPostActivate(method.getName());
+                    for (Method method : classFinder.findAnnotatedMethods(PostActivate.class)) {
+                        session.getPostActivate().add(new LifecycleCallback(method));
+                    }
                 }
 
                 LifecycleCallback prePassivate = getFirst(session.getPrePassivate());
                 if (prePassivate == null) {
-                    Method method = getFirst(classFinder.findAnnotatedMethods(PrePassivate.class));
-                    if (method != null) session.addPrePassivate(method.getName());
+                    for (Method method : classFinder.findAnnotatedMethods(PrePassivate.class)) {
+                        session.getPrePassivate().add(new LifecycleCallback(method));
+                    }
                 }
 
                 List<Method> initMethods = classFinder.findAnnotatedMethods(Init.class);

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessInterceptorTest.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessInterceptorTest.java?view=diff&rev=519181&r1=519180&r2=519181
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessInterceptorTest.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessInterceptorTest.java Fri Mar 16 16:25:32 2007
@@ -37,6 +37,8 @@
 import javax.annotation.PostConstruct;
 import javax.interceptor.AroundInvoke;
 import javax.interceptor.InvocationContext;
+import javax.interceptor.ExcludeClassInterceptors;
+import javax.interceptor.ExcludeDefaultInterceptors;
 import javax.naming.InitialContext;
 import javax.ejb.EJBException;
 import java.util.List;
@@ -72,10 +74,10 @@
         assertEquals(1, ejbJar.enterpriseBeans.get(0).postConstruct.size());
 
         assertEquals(3, ejbJar.interceptors.size());
-        assertEquals(1, ejbJar.interceptors.get(0).aroundInvoke.size());
-        assertEquals(1, ejbJar.interceptors.get(0).postConstruct.size());
+//        assertEquals(1, ejbJar.interceptors.get(0).aroundInvoke.size());
+//        assertEquals(1, ejbJar.interceptors.get(0).postConstruct.size());
 
-        assertEquals(3, ejbJar.interceptorBindings.size());
+//        assertEquals(3, ejbJar.interceptorBindings.size());
 
         assembler.createApplication(ejbJar);
 
@@ -90,6 +92,16 @@
         int i = target.echo(123);
         assertEquals(123, i);
 
+//        assertCalls(
+//                Call.Default_Invoke_BEFORE,
+//                Call.Method_Invoke_BEFORE,
+//                Call.Bean_Invoke_BEFORE,
+//                Call.Bean_Invoke,
+//                Call.Bean_Invoke_AFTER,
+//                Call.Method_Invoke_AFTER,
+//                Call.Default_Invoke_AFTER);
+//        calls.clear();
+
         try {
             target.throwAppException();
             fail("Should have thrown app exception");
@@ -116,12 +128,15 @@
 
     public static enum Call {
         Default_PostConstruct_BEFORE,
+        SuperClass_PostConstruct_BEFORE,
         Class_PostConstruct_BEFORE,
         Bean_PostConstruct,
         Class_PostConstruct_AFTER,
+        SuperClass_PostConstruct_AFTER,
         Default_PostConstruct_AFTER,
 
         Default_Invoke_BEFORE,
+        SuperClass_Invoke_BEFORE,
         Class_Invoke_BEFORE,
         Method_Invoke_BEFORE,
         Bean_Invoke_BEFORE,
@@ -129,6 +144,7 @@
         Bean_Invoke_AFTER,
         Method_Invoke_AFTER,
         Class_Invoke_AFTER,
+        SuperClass_Invoke_AFTER,
         Default_Invoke_AFTER,
 
     }
@@ -184,9 +200,16 @@
             throw new SysException();
         }
 
+        @ExcludeClassInterceptors
         public int echo(int i) {
             return i;
         }
+
+        @ExcludeClassInterceptors
+        @ExcludeDefaultInterceptors
+        public boolean echo(boolean i) {
+            return i;
+        }
     }
 
     public static interface Target {
@@ -217,7 +240,7 @@
         }
     }
 
-    public static class ClassInterceptor {
+    public static class ClassInterceptor extends SuperClassInterceptor {
 
         @PostConstruct
         public void construct(InvocationContext context) throws Exception {
@@ -231,6 +254,24 @@
             calls.add(Call.Class_Invoke_BEFORE);
             Object o = context.proceed();
             calls.add(Call.Class_Invoke_AFTER);
+            return o;
+        }
+    }
+
+    public static class SuperClassInterceptor {
+
+        @PostConstruct
+        public void superConstruct(InvocationContext context) throws Exception {
+            calls.add(Call.SuperClass_PostConstruct_BEFORE);
+            context.proceed();
+            calls.add(Call.SuperClass_PostConstruct_AFTER);
+        }
+
+        @AroundInvoke
+        public Object superInvoke(InvocationContext context) throws Exception {
+            calls.add(Call.SuperClass_Invoke_BEFORE);
+            Object o = context.proceed();
+            calls.add(Call.SuperClass_Invoke_AFTER);
             return o;
         }
     }

Modified: incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/AroundInvoke.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/AroundInvoke.java?view=diff&rev=519181&r1=519180&r2=519181
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/AroundInvoke.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/AroundInvoke.java Fri Mar 16 16:25:32 2007
@@ -52,6 +52,10 @@
     public AroundInvoke() {
     }
 
+    public AroundInvoke(java.lang.reflect.Method method) {
+        this(method.getDeclaringClass().getName(), method.getName());
+    }
+
     public AroundInvoke(String clazz, String methodName) {
         this.clazz = clazz;
         this.methodName = methodName;

Modified: incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/LifecycleCallback.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/LifecycleCallback.java?view=diff&rev=519181&r1=519180&r2=519181
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/LifecycleCallback.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/LifecycleCallback.java Fri Mar 16 16:25:32 2007
@@ -51,6 +51,11 @@
     public LifecycleCallback() {
     }
 
+    public LifecycleCallback(java.lang.reflect.Method method) {
+        this.lifecycleCallbackClass = method.getDeclaringClass().getName();
+        this.lifecycleCallbackMethod = method.getName();
+    }
+
     public LifecycleCallback(String lifecycleCallbackClass, String lifecycleCallbackMethod) {
         this.lifecycleCallbackClass = lifecycleCallbackClass;
         this.lifecycleCallbackMethod = lifecycleCallbackMethod;