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;