[jboss-cvs] JBossAS SVN: r69231 - in projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors: metadata and 1 other directory.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Wed Jan 23 04:07:42 EST 2008
Author: wolfc
Date: 2008-01-23 04:07:42 -0500 (Wed, 23 Jan 2008)
New Revision: 69231
Modified:
projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InterceptorsFactory.java
projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/BeanInterceptorMetaDataBridge.java
projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/EnvironmentInterceptorMetaDataBridge.java
projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/InterceptorMetaDataBridge.java
Log:
Added PostActivate and PrePassivate
Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InterceptorsFactory.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InterceptorsFactory.java 2008-01-23 09:02:54 UTC (rev 69230)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InterceptorsFactory.java 2008-01-23 09:07:42 UTC (rev 69231)
@@ -21,6 +21,7 @@
*/
package org.jboss.ejb3.interceptors.aop;
+import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
@@ -30,6 +31,8 @@
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
+import javax.ejb.PostActivate;
+import javax.ejb.PrePassivate;
import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptors;
@@ -45,8 +48,13 @@
import org.jboss.logging.Logger;
/**
- * Comment
+ * The interceptors factory analyzes the annotations and creates
+ * interceptor instances out of those. These are then attached
+ * to the advisor as meta data.
*
+ * Do not access this meta data directly, use the provided static
+ * methods herein.
+ *
* @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
* @version $Revision$
*/
@@ -54,7 +62,15 @@
{
private static final Logger log = Logger.getLogger(InterceptorsFactory.class);
- private List<? extends Interceptor> createInterceptors(Advisor advisor, InterceptorFactory interceptorFactory, Class<?>[] interceptorClasses, List<BusinessMethodInterceptorMethodInterceptor> interceptors, Map<Class<?>, Object> existingInterceptors, List<LifecycleCallbackInterceptorMethodInterceptor> postConstructs, List<LifecycleCallbackInterceptorMethodInterceptor> preDestroys) throws InstantiationException, IllegalAccessException
+ // TODO: allow for extensions (/ new life-cycle annotations) (and PostActive, PrePassivate are part of stateful)
+ /**
+ * This defined the life-cycle annotations for which we build up
+ * an interceptor chain.
+ */
+ @SuppressWarnings("unchecked")
+ private static final Class<? extends Annotation> lifeCycleAnnotationClasses[] = (Class<? extends Annotation>[]) new Class<?>[] { PostActivate.class, PostConstruct.class, PreDestroy.class, PrePassivate.class };
+
+ private List<? extends Interceptor> createInterceptors(Advisor advisor, InterceptorFactory interceptorFactory, Class<?>[] interceptorClasses, List<BusinessMethodInterceptorMethodInterceptor> interceptors, Map<Class<?>, Object> existingInterceptors, Map<Class<? extends Annotation>, List<LifecycleCallbackInterceptorMethodInterceptor>> lifeCycleInterceptors) throws InstantiationException, IllegalAccessException
{
if(interceptorClasses != null)
{
@@ -75,18 +91,17 @@
// TODO: should be only non-overriden methods (EJB 3 12.4.1 last bullet)
for(Method method : ClassHelper.getAllMethods(interceptorClass))
{
- if(interceptorAdvisor.isAnnotationPresent(interceptorClass, method, PostConstruct.class))
+ if(interceptorAdvisor.isAnnotationPresent(interceptorClass, method, AroundInvoke.class))
{
- postConstructs.add(new LifecycleCallbackInterceptorMethodInterceptor(interceptor, method));
+ interceptors.add(new BusinessMethodInterceptorMethodInterceptor(interceptor, method));
}
- if(interceptorAdvisor.isAnnotationPresent(interceptorClass, method, PreDestroy.class))
+ for(Class<? extends Annotation> lifeCycleAnnotationClass : lifeCycleAnnotationClasses)
{
- preDestroys.add(new LifecycleCallbackInterceptorMethodInterceptor(interceptor, method));
+ if(interceptorAdvisor.isAnnotationPresent(interceptorClass, method, lifeCycleAnnotationClass))
+ {
+ lifeCycleInterceptors.get(lifeCycleAnnotationClass).add(new LifecycleCallbackInterceptorMethodInterceptor(interceptor, method));
+ }
}
- if(interceptorAdvisor.isAnnotationPresent(interceptorClass, method, AroundInvoke.class))
- {
- interceptors.add(new BusinessMethodInterceptorMethodInterceptor(interceptor, method));
- }
}
//instanceAdvisor.appendInterceptorStack(stackName);
//instanceAdvisor.appendInterceptor(new InvokeSpecInterceptorInterceptor());
@@ -108,17 +123,22 @@
InterceptorFactoryRef interceptorFactoryRef = (InterceptorFactoryRef) advisor.resolveAnnotation(InterceptorFactoryRef.class);
if(interceptorFactoryRef == null)
throw new IllegalStateException("No InterceptorFactory specified on " + advisor.getName());
- log.info("interceptor factory class = " + interceptorFactoryRef.value());
+ log.debug("interceptor factory class = " + interceptorFactoryRef.value());
InterceptorFactory interceptorFactory = interceptorFactoryRef.value().newInstance();
Map<Class<?>, Object> interceptors = new HashMap<Class<?>, Object>();
- List<LifecycleCallbackInterceptorMethodInterceptor> postConstructs = new ArrayList<LifecycleCallbackInterceptorMethodInterceptor>();
- List<LifecycleCallbackInterceptorMethodInterceptor> preDestroys = new ArrayList<LifecycleCallbackInterceptorMethodInterceptor>();
+ Map<Class<? extends Annotation>, List<LifecycleCallbackInterceptorMethodInterceptor>> lifeCycleInterceptors = new HashMap<Class<? extends Annotation>, List<LifecycleCallbackInterceptorMethodInterceptor>>();
+ for(Class<? extends Annotation> lifeCycleAnnotationClass : lifeCycleAnnotationClasses)
+ {
+ List<LifecycleCallbackInterceptorMethodInterceptor> list = new ArrayList<LifecycleCallbackInterceptorMethodInterceptor>();
+ lifeCycleInterceptors.put(lifeCycleAnnotationClass, list);
+ }
+
DefaultInterceptors defaultInterceptorsAnnotation = (DefaultInterceptors) advisor.resolveAnnotation(DefaultInterceptors.class);
List<BusinessMethodInterceptorMethodInterceptor> defaultInterceptors = new ArrayList<BusinessMethodInterceptorMethodInterceptor>();
if(defaultInterceptorsAnnotation != null)
- createInterceptors(advisor, interceptorFactory, defaultInterceptorsAnnotation.value(), defaultInterceptors, interceptors, postConstructs, preDestroys);
+ createInterceptors(advisor, interceptorFactory, defaultInterceptorsAnnotation.value(), defaultInterceptors, interceptors, lifeCycleInterceptors);
log.debug("Found class interceptors " + defaultInterceptors);
// Default Interceptors
@@ -127,7 +147,7 @@
Interceptors interceptorsAnnotation = (Interceptors) advisor.resolveAnnotation(Interceptors.class);
List<BusinessMethodInterceptorMethodInterceptor> classInterceptors = new ArrayList<BusinessMethodInterceptorMethodInterceptor>();
if(interceptorsAnnotation != null)
- createInterceptors(advisor, interceptorFactory, interceptorsAnnotation.value(), classInterceptors, interceptors, postConstructs, preDestroys);
+ createInterceptors(advisor, interceptorFactory, interceptorsAnnotation.value(), classInterceptors, interceptors, lifeCycleInterceptors);
log.debug("Found class interceptors " + classInterceptors);
// Class Interceptors
@@ -178,11 +198,11 @@
log.debug("Found bean interceptors " + beanInterceptors);
instanceAdvisor.getMetaData().addMetaData(InterceptorsFactory.class, "beanInterceptors", beanInterceptors);
- instanceAdvisor.getMetaData().addMetaData(InterceptorsFactory.class, "preDestroys", Collections.unmodifiableList(preDestroys));
+ instanceAdvisor.getMetaData().addMetaData(InterceptorsFactory.class, "lifeCycleInterceptors", Collections.unmodifiableMap(lifeCycleInterceptors));
// Put the postConstructs interceptors here in the chain
// TODO: why? We may need more control
- return new InterceptorSequencer(postConstructs.toArray(new Interceptor[0]));
+ return new InterceptorSequencer(lifeCycleInterceptors.get(PostConstruct.class).toArray(new Interceptor[0]));
//return null;
}
catch(InstantiationException e)
@@ -241,11 +261,27 @@
}
@SuppressWarnings("unchecked")
- public static List<Interceptor> getPreDestroys(InstanceAdvisor instanceAdvisor)
+ private static Map<Class<? extends Annotation>, List<LifecycleCallbackInterceptorMethodInterceptor>> getLifeCycleInterceptors(InstanceAdvisor instanceAdvisor)
{
- return (List<Interceptor>) instanceAdvisor.getMetaData().getMetaData(InterceptorsFactory.class, "preDestroys");
+ return (Map<Class<? extends Annotation>, List<LifecycleCallbackInterceptorMethodInterceptor>>) instanceAdvisor.getMetaData().getMetaData(InterceptorsFactory.class, "lifeCycleInterceptors");
}
+ public static List<? extends Interceptor> getLifeCycleInterceptors(InstanceAdvisor instanceAdvisor, Class<? extends Annotation> lifeCycleAnnotationClass)
+ {
+ return getLifeCycleInterceptors(instanceAdvisor).get(lifeCycleAnnotationClass);
+ }
+
+ /**
+ * @deprecated use getLifeCycleInterceptors
+ * @param instanceAdvisor
+ * @return
+ */
+ @Deprecated
+ public static List<? extends Interceptor> getPreDestroys(InstanceAdvisor instanceAdvisor)
+ {
+ return getLifeCycleInterceptors(instanceAdvisor, PreDestroy.class);
+ }
+
private String toString(Object obj)
{
return obj.getClass().getName() + "@" + System.identityHashCode(obj);
Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/BeanInterceptorMetaDataBridge.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/BeanInterceptorMetaDataBridge.java 2008-01-23 09:02:54 UTC (rev 69230)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/BeanInterceptorMetaDataBridge.java 2008-01-23 09:07:42 UTC (rev 69231)
@@ -26,10 +26,14 @@
import java.util.Arrays;
import java.util.List;
+import javax.ejb.PostActivate;
+import javax.ejb.PrePassivate;
import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptors;
import org.jboss.ejb3.annotation.impl.InterceptorsImpl;
+import org.jboss.ejb3.annotation.impl.PostActivateImpl;
+import org.jboss.ejb3.annotation.impl.PrePassivateImpl;
import org.jboss.ejb3.interceptors.aop.annotation.DefaultInterceptors;
import org.jboss.ejb3.interceptors.aop.annotation.DefaultInterceptorsImpl;
import org.jboss.ejb3.metadata.MetaDataBridge;
@@ -201,6 +205,24 @@
return annotationClass.cast(interceptors);
}
}
+ else if(annotationClass == PostActivate.class)
+ {
+ if(beanMetaData instanceof JBossSessionBeanMetaData)
+ {
+ PostActivate lifeCycleAnnotation = getLifeCycleAnnotation(((JBossSessionBeanMetaData) beanMetaData).getPostActivates(), PostActivateImpl.class, methodName);
+ if(lifeCycleAnnotation != null)
+ return annotationClass.cast(lifeCycleAnnotation);
+ }
+ }
+ else if(annotationClass == PrePassivate.class)
+ {
+ if(beanMetaData instanceof JBossSessionBeanMetaData)
+ {
+ PrePassivate lifeCycleAnnotation = getLifeCycleAnnotation(((JBossSessionBeanMetaData) beanMetaData).getPrePassivates(), PrePassivateImpl.class, methodName);
+ if(lifeCycleAnnotation != null)
+ return annotationClass.cast(lifeCycleAnnotation);
+ }
+ }
return super.retrieveAnnotation(annotationClass, beanMetaData, classLoader, methodName, parameterNames);
}
}
Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/EnvironmentInterceptorMetaDataBridge.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/EnvironmentInterceptorMetaDataBridge.java 2008-01-23 09:02:54 UTC (rev 69230)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/EnvironmentInterceptorMetaDataBridge.java 2008-01-23 09:07:42 UTC (rev 69231)
@@ -75,7 +75,7 @@
return null;
}
- private <T extends Annotation> T getLifeCycleAnnotation(LifecycleCallbacksMetaData callbacks, Class<T> annotationImplType, String methodName)
+ protected <T extends Annotation> T getLifeCycleAnnotation(LifecycleCallbacksMetaData callbacks, Class<T> annotationImplType, String methodName)
{
if(callbacks == null || callbacks.isEmpty())
return null;
Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/InterceptorMetaDataBridge.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/InterceptorMetaDataBridge.java 2008-01-23 09:02:54 UTC (rev 69230)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/InterceptorMetaDataBridge.java 2008-01-23 09:07:42 UTC (rev 69231)
@@ -23,8 +23,12 @@
import java.lang.annotation.Annotation;
+import javax.ejb.PostActivate;
+import javax.ejb.PrePassivate;
import javax.interceptor.AroundInvoke;
+import org.jboss.ejb3.annotation.impl.PostActivateImpl;
+import org.jboss.ejb3.annotation.impl.PrePassivateImpl;
import org.jboss.ejb3.metadata.MetaDataBridge;
import org.jboss.logging.Logger;
import org.jboss.metadata.ejb.spec.InterceptorMetaData;
@@ -54,6 +58,18 @@
if(annotation != null)
return annotationClass.cast(annotation);
}
+ else if(annotationClass == PostActivate.class)
+ {
+ PostActivate lifeCycleAnnotation = getLifeCycleAnnotation(interceptorMetaData.getPostActivates(), PostActivateImpl.class, methodName);
+ if(lifeCycleAnnotation != null)
+ return annotationClass.cast(lifeCycleAnnotation);
+ }
+ else if(annotationClass == PrePassivate.class)
+ {
+ PrePassivate lifeCycleAnnotation = getLifeCycleAnnotation(interceptorMetaData.getPrePassivates(), PrePassivateImpl.class, methodName);
+ if(lifeCycleAnnotation != null)
+ return annotationClass.cast(lifeCycleAnnotation);
+ }
return super.retrieveAnnotation(annotationClass, interceptorMetaData, classLoader, methodName, parameterNames);
}
}
More information about the jboss-cvs-commits
mailing list