[jboss-cvs] JBossAS SVN: r72136 - in projects/ejb3/trunk: core/src/main/java/org/jboss/ejb3/aop and 10 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Sun Apr 13 11:47:37 EDT 2008
Author: wolfc
Date: 2008-04-13 11:47:36 -0400 (Sun, 13 Apr 2008)
New Revision: 72136
Added:
projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/metadata/InterceptorOrderBean.java
projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/AbstractInterceptor.java
Removed:
projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/EJB3InterceptorsInterceptor.java
Modified:
projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/BaseContext.java
projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/BeanContainer.java
projects/ejb3/trunk/core/src/test/java/org/jboss/ejb3/test/threadlocal/MockBeanContext.java
projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/EJB3InterceptorInterceptor.java
projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/LifecycleCallbacks.java
projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/container/BeanContext.java
projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/container/DummyBeanContext.java
projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/registry/InterceptorRegistry.java
projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/metadata/unit/MetadataTestCase.java
projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorA.java
projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorB.java
projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorChainBean.java
projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/unit/InterceptorChainTestCase.java
projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/SimpleContext.java
projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/SimplePoolInterceptor.java
projects/ejb3/trunk/interceptors/src/test/resources/metadata/META-INF/ejb-jar.xml
Log:
EJBTHREE-1261: calling lifecycle callbacks in correct order
Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/BaseContext.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/BaseContext.java 2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/BaseContext.java 2008-04-13 15:47:36 UTC (rev 72136)
@@ -21,9 +21,9 @@
*/
package org.jboss.ejb3;
-import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.jboss.aop.metadata.SimpleMetaData;
import org.jboss.ejb3.interceptor.InterceptorInfo;
@@ -44,8 +44,7 @@
protected RealmMapping rm;
protected SimpleMetaData metadata;
- protected HashMap<Class<?>, Object> interceptorInstances;
- private Object interceptors[];
+ protected Map<Class<?>, Object> interceptorInstances = new HashMap<Class<?>, Object>();
/**
* Use with extreme caution, must not break getInstance post condition.
@@ -98,12 +97,10 @@
{
EJBContainer c = (EJBContainer) container;
List<Class<?>> interceptorClasses = c.getBeanContainer().getInterceptorClasses();
- List<Object> interceptors = new ArrayList<Object>();
for(Class<?> interceptorClass : interceptorClasses)
{
- interceptors.add(c.createInterceptor(interceptorClass));
+ interceptorInstances.put(interceptorClass, c.createInterceptor(interceptorClass));
}
- this.interceptors = interceptors.toArray(new Object[0]);
}
catch(IllegalAccessException e)
{
@@ -132,8 +129,11 @@
return container;
}
- public Object[] getInterceptors()
+ public Object getInterceptor(Class<?> interceptorClass) throws IllegalArgumentException
{
- return interceptors;
+ Object interceptor = interceptorInstances.get(interceptorClass);
+ if(interceptor == null)
+ throw new IllegalArgumentException("No interceptor found for " + interceptorClass + " in " + this);
+ return interceptor;
}
}
Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/BeanContainer.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/BeanContainer.java 2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/BeanContainer.java 2008-04-13 15:47:36 UTC (rev 72136)
@@ -27,20 +27,16 @@
import java.util.ArrayList;
import java.util.List;
-import javax.interceptor.Interceptors;
-
import org.jboss.aop.Advisor;
import org.jboss.aop.Domain;
import org.jboss.aop.annotation.AnnotationRepository;
import org.jboss.ejb3.EJBContainer;
import org.jboss.ejb3.cluster.metadata.ClusteredMetaDataBridge;
import org.jboss.ejb3.interceptors.InterceptorFactoryRef;
-import org.jboss.ejb3.interceptors.aop.annotation.DefaultInterceptors;
import org.jboss.ejb3.interceptors.container.AbstractContainer;
import org.jboss.ejb3.interceptors.container.ContainerInterceptorFactory;
import org.jboss.ejb3.interceptors.container.InterceptorFactoryRefImpl;
import org.jboss.ejb3.interceptors.direct.AbstractDirectContainer;
-import org.jboss.ejb3.interceptors.lang.ClassHelper;
import org.jboss.ejb3.interceptors.metadata.AdditiveBeanInterceptorMetaDataBridge;
import org.jboss.ejb3.interceptors.metadata.InterceptorComponentMetaDataLoaderFactory;
import org.jboss.ejb3.interceptors.metadata.InterceptorMetaDataBridge;
@@ -68,45 +64,9 @@
setBeanContextFactoryClass(BeanContainerBeanContextFactory.class);
}
- private static void addInterceptorClasses(List<Class<?>> interceptorClasses, Class<?> interceptors[])
- {
- if(interceptors != null)
- {
- for(Class<?> interceptorClass : interceptors)
- {
- if(!interceptorClasses.contains(interceptorClass))
- interceptorClasses.add(interceptorClass);
- }
- }
- }
-
- private static void addInterceptorClasses(List<Class<?>> interceptorClasses, Interceptors interceptorsAnnotation)
- {
- if(interceptorsAnnotation != null)
- {
- addInterceptorClasses(interceptorClasses, interceptorsAnnotation.value());
- }
- }
-
public List<Class<?>> getInterceptorClasses()
{
- // FIXME: move to ejb3-interceptors
- List<Class<?>> interceptorClasses = new ArrayList<Class<?>>();
-
- DefaultInterceptors defaultInterceptorsAnnotation = getAnnotation(DefaultInterceptors.class);
- if(defaultInterceptorsAnnotation != null)
- addInterceptorClasses(interceptorClasses, defaultInterceptorsAnnotation.value());
-
- Interceptors interceptorsAnnotation = (Interceptors) getAdvisor().resolveAnnotation(Interceptors.class);
- addInterceptorClasses(interceptorClasses, interceptorsAnnotation);
-
- for(Method beanMethod : ClassHelper.getAllMethods(getBeanClass()))
- {
- interceptorsAnnotation = (Interceptors) getAdvisor().resolveAnnotation(beanMethod, Interceptors.class);
- addInterceptorClasses(interceptorClasses, interceptorsAnnotation);
- }
-
- return interceptorClasses;
+ return getInterceptorRegistry().getInterceptorClasses();
}
@Override
Modified: projects/ejb3/trunk/core/src/test/java/org/jboss/ejb3/test/threadlocal/MockBeanContext.java
===================================================================
--- projects/ejb3/trunk/core/src/test/java/org/jboss/ejb3/test/threadlocal/MockBeanContext.java 2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/core/src/test/java/org/jboss/ejb3/test/threadlocal/MockBeanContext.java 2008-04-13 15:47:36 UTC (rev 72136)
@@ -92,6 +92,14 @@
}
/* (non-Javadoc)
+ * @see org.jboss.ejb3.interceptors.container.BeanContext#getInterceptor(java.lang.Class)
+ */
+ public Object getInterceptor(Class<?> interceptorClass) throws IllegalArgumentException
+ {
+ throw new IllegalArgumentException("NOP");
+ }
+
+ /* (non-Javadoc)
* @see org.jboss.ejb3.interceptors.container.BeanContext#getInterceptors()
*/
public Object[] getInterceptors()
Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/EJB3InterceptorInterceptor.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/EJB3InterceptorInterceptor.java 2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/EJB3InterceptorInterceptor.java 2008-04-13 15:47:36 UTC (rev 72136)
@@ -66,19 +66,8 @@
public Object invoke(Invocation invocation) throws Throwable
{
- // TODO: speed up
- Object interceptors[] = ContainerMethodInvocation.getContainerMethodInvocation(invocation).getBeanContext().getInterceptors();
- if(interceptors != null)
- {
- for(Object interceptor : interceptors)
- {
- if(interceptor.getClass().equals(interceptorClass))
- return invoke(interceptor, invocation);
- }
- }
- //throw new IllegalStateException("Can't find an interceptor instance for " + interceptorClass + " among " + Arrays.toString(instances));
- // The business method interceptor method interceptor only exists when there is an aroundInvoke
- return invocation.invokeNext();
+ Object interceptor = ContainerMethodInvocation.getContainerMethodInvocation(invocation).getBeanContext().getInterceptor(interceptorClass);
+ return invoke(interceptor, invocation);
}
private Object invoke(Object interceptor, final Invocation invocation) throws Throwable
Deleted: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/EJB3InterceptorsInterceptor.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/EJB3InterceptorsInterceptor.java 2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/EJB3InterceptorsInterceptor.java 2008-04-13 15:47:36 UTC (rev 72136)
@@ -1,51 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.ejb3.interceptors.aop;
-
-import java.util.List;
-
-import org.jboss.aop.advice.Interceptor;
-import org.jboss.aop.joinpoint.Invocation;
-import org.jboss.ejb3.interceptors.container.ContainerMethodInvocation;
-
-/**
- * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
- * @version $Revision: $
- */
-public class EJB3InterceptorsInterceptor implements Interceptor
-{
- public EJB3InterceptorsInterceptor(List<Class<?>> applicableInterceptorClasses)
- {
- // TODO Auto-generated constructor stub
- }
-
- public String getName()
- {
- return EJB3InterceptorsInterceptor.class.getName();
- }
-
- public Object invoke(Invocation invocation) throws Throwable
- {
- ContainerMethodInvocation.getContainerMethodInvocation(invocation).getBeanContext().getInterceptors();
- return null;
- }
-}
Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/LifecycleCallbacks.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/LifecycleCallbacks.java 2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/LifecycleCallbacks.java 2008-04-13 15:47:36 UTC (rev 72136)
@@ -43,13 +43,11 @@
public static Interceptor[] createLifecycleCallbackInterceptors(Advisor advisor, List<Class<?>> lifecycleInterceptorClasses, BeanContext<?> component, Class<? extends Annotation> lifecycleAnnotationType) throws Exception
{
List<Interceptor> interceptors = new ArrayList<Interceptor>();
- Object ejb3Interceptors[] = component.getInterceptors();
- for(Object interceptor : ejb3Interceptors)
+ // 12.7 footnote 57: ignore method level interceptors
+ // The lifecycle callbacks on the interceptors must be invoked in order
+ for(Class<?> interceptorClass : lifecycleInterceptorClasses)
{
- // 12.7 footnote 57: ignore method level interceptors
- Class<?> interceptorClass = interceptor.getClass();
- if(!lifecycleInterceptorClasses.contains(interceptorClass))
- continue;
+ Object interceptor = component.getInterceptor(interceptorClass);
ExtendedAdvisor interceptorAdvisor = ExtendedAdvisorHelper.getExtendedAdvisor(advisor, interceptor);
for(Method interceptorMethod : ClassHelper.getAllMethods(interceptorClass))
{
@@ -59,6 +57,8 @@
}
}
}
+
+ // Bean lifecycle callbacks
Class<?> beanClass = advisor.getClazz();
for(Method beanMethod : ClassHelper.getAllMethods(beanClass))
{
@@ -67,6 +67,7 @@
interceptors.add(new LifecycleCallbackBeanMethodInterceptor(beanMethod));
}
}
+
interceptors.add(0, PerVmAdvice.generateInterceptor(null, new InvocationContextInterceptor(), "setup"));
return interceptors.toArray(new Interceptor[0]);
Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/container/BeanContext.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/container/BeanContext.java 2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/container/BeanContext.java 2008-04-13 15:47:36 UTC (rev 72136)
@@ -30,7 +30,17 @@
*/
public interface BeanContext<T>
{
+ /**
+ * @return the bean instance
+ */
T getInstance();
- Object[] getInterceptors();
+ /**
+ * Get the EJB3 interceptor of a certain type.
+ *
+ * @param interceptorClass the interceptor type to get
+ * @return the interceptor
+ * @throws IllegalArgumentException if no interceptor of that class is associated
+ */
+ Object getInterceptor(Class<?> interceptorClass) throws IllegalArgumentException;
}
Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/container/DummyBeanContext.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/container/DummyBeanContext.java 2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/container/DummyBeanContext.java 2008-04-13 15:47:36 UTC (rev 72136)
@@ -21,6 +21,7 @@
*/
package org.jboss.ejb3.interceptors.container;
+import java.util.LinkedHashMap;
import java.util.List;
/**
@@ -30,7 +31,8 @@
public class DummyBeanContext<T> implements BeanContext<T>
{
private T instance;
- private Object interceptors[];
+ private Object[] interceptors;
+ private LinkedHashMap<Class<?>, Object> interceptorsMap = new LinkedHashMap<Class<?>, Object>();
public DummyBeanContext(T instance, List<Object> interceptors)
{
@@ -38,6 +40,8 @@
assert interceptors != null : "interceptors is null";
this.instance = instance;
this.interceptors = interceptors.toArray(new Object[0]);
+ for(Object interceptor : interceptors)
+ this.interceptorsMap.put(interceptor.getClass(), interceptor);
}
public T getInstance()
@@ -45,9 +49,16 @@
return instance;
}
+ public Object getInterceptor(Class<?> interceptorClass) throws IllegalArgumentException
+ {
+ Object interceptor = interceptorsMap.get(interceptorClass);
+ if(interceptor == null)
+ throw new IllegalArgumentException("No interceptor found for " + interceptorClass + " in " + this);
+ return interceptor;
+ }
+
public Object[] getInterceptors()
{
return interceptors;
}
-
}
Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/registry/InterceptorRegistry.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/registry/InterceptorRegistry.java 2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/registry/InterceptorRegistry.java 2008-04-13 15:47:36 UTC (rev 72136)
@@ -94,6 +94,12 @@
private void initialize()
{
+ // The lifecycle interceptor classes are:
+ // 1. the interceptors listed in an interceptor-order
+ // or
+ // 2. default interceptor + class interceptors
+ // where set 1 = set 2 + optionally extra interceptors
+
DefaultInterceptors defaultInterceptorsAnnotation = (DefaultInterceptors) advisor.resolveAnnotation(DefaultInterceptors.class);
List<Class<?>> defaultInterceptorClasses = new ArrayList<Class<?>>();
if(defaultInterceptorsAnnotation != null)
@@ -102,7 +108,8 @@
defaultInterceptorClasses.add(defaultInterceptorClass);
}
log.debug("Found default interceptors " + defaultInterceptorClasses);
- interceptorClasses.addAll(defaultInterceptorClasses);
+// interceptorClasses.addAll(defaultInterceptorClasses);
+ List<Class<?>> lifecycleInterceptorClasses = new ArrayList<Class<?>>();
lifecycleInterceptorClasses.addAll(defaultInterceptorClasses);
Interceptors interceptorsAnnotation = (Interceptors) advisor.resolveAnnotation(Interceptors.class);
@@ -112,14 +119,32 @@
for(Class<?> classInterceptorClass : interceptorsAnnotation.value())
{
classInterceptorClasses.add(classInterceptorClass);
- if(!interceptorClasses.contains(classInterceptorClass))
- interceptorClasses.add(classInterceptorClass);
+// if(!interceptorClasses.contains(classInterceptorClass))
+// interceptorClasses.add(classInterceptorClass);
if(!lifecycleInterceptorClasses.contains(classInterceptorClass))
lifecycleInterceptorClasses.add(classInterceptorClass);
}
}
log.debug("Found class interceptors " + classInterceptorClasses);
+ {
+ // Ordering of lifecycle interceptors
+ InterceptorOrder order = (InterceptorOrder) advisor.resolveAnnotation(InterceptorOrder.class);
+ if(order != null)
+ {
+ List<Class<?>> orderedInterceptorClasses = Arrays.asList(order.value());
+ if(!orderedInterceptorClasses.containsAll(lifecycleInterceptorClasses))
+ throw new IllegalStateException("EJB3 12.8.2 footnote 59: all applicable lifecycle interceptors must be listed in the interceptor order");
+ lifecycleInterceptorClasses = orderedInterceptorClasses;
+ }
+ }
+ this.lifecycleInterceptorClasses.addAll(lifecycleInterceptorClasses);
+ for(Class<?> interceptorClass : lifecycleInterceptorClasses)
+ {
+ if(!interceptorClasses.contains(interceptorClass))
+ interceptorClasses.add(interceptorClass);
+ }
+
Class<?> beanClass = advisor.getClazz();
for(Method beanMethod : ClassHelper.getAllMethods(beanClass))
{
@@ -128,11 +153,7 @@
if(interceptorsAnnotation != null)
{
for(Class<?> interceptorClass : interceptorsAnnotation.value())
- {
methodInterceptorClasses.add(interceptorClass);
- if(!interceptorClasses.contains(interceptorClass))
- interceptorClasses.add(interceptorClass);
- }
}
// Interceptors applicable for this bean method
@@ -152,9 +173,19 @@
order = (InterceptorOrder) advisor.resolveAnnotation(InterceptorOrder.class);
// TODO: validate the order to see if all interceptors are listed
if(order != null)
- applicableInterceptorClasses.put(beanMethod, Arrays.asList(order.value()));
- else
- applicableInterceptorClasses.put(beanMethod, methodApplicableInterceptorClasses);
+ {
+ List<Class<?>> orderedInterceptorClasses = Arrays.asList(order.value());
+ if(!orderedInterceptorClasses.containsAll(methodApplicableInterceptorClasses))
+ throw new IllegalStateException("EJB3 12.8.2 footnote 59: all applicable method interceptors must be listed in the interceptor order");
+ methodApplicableInterceptorClasses = orderedInterceptorClasses;
+ }
+ applicableInterceptorClasses.put(beanMethod, methodApplicableInterceptorClasses);
+
+ for(Class<?> interceptorClass : methodApplicableInterceptorClasses)
+ {
+ if(!interceptorClasses.contains(interceptorClass))
+ interceptorClasses.add(interceptorClass);
+ }
}
}
Added: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/metadata/InterceptorOrderBean.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/metadata/InterceptorOrderBean.java (rev 0)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/metadata/InterceptorOrderBean.java 2008-04-13 15:47:36 UTC (rev 72136)
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ejb3.test.interceptors.metadata;
+
+import org.jboss.ejb3.interceptors.ManagedObject;
+import org.jboss.logging.Logger;
+
+/**
+ * This one has an interceptor bound to it via an interceptor order.
+ *
+ * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
+ * @version $Revision: $
+ */
+ at ManagedObject
+public class InterceptorOrderBean
+{
+ private static final Logger log = Logger.getLogger(InterceptorOrderBean.class);
+
+ public String sayHi(String name)
+ {
+ log.debug("sayHi");
+ return "Hi " + name;
+ }
+}
Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/metadata/unit/MetadataTestCase.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/metadata/unit/MetadataTestCase.java 2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/metadata/unit/MetadataTestCase.java 2008-04-13 15:47:36 UTC (rev 72136)
@@ -39,6 +39,7 @@
import org.jboss.ejb3.metadata.annotation.AnnotationRepositoryToMetaData;
import org.jboss.ejb3.test.interceptors.common.CommonInterceptor;
import org.jboss.ejb3.test.interceptors.direct.DirectMethodInterceptor;
+import org.jboss.ejb3.test.interceptors.metadata.InterceptorOrderBean;
import org.jboss.ejb3.test.interceptors.metadata.MetadataBean;
import org.jboss.logging.Logger;
import org.jboss.metadata.ejb.jboss.JBoss50MetaData;
@@ -114,6 +115,14 @@
};
}
+ @Override
+ protected void setUp() throws Exception
+ {
+ CommonInterceptor.aroundInvokes = 0;
+ CommonInterceptor.postConstructs = 0;
+ CommonInterceptor.preDestroys = 0;
+ }
+
public void test() throws Throwable
{
AspectManager.verbose = true;
@@ -170,4 +179,50 @@
bean = null;
}
+
+ public void testInterceptorOrder() throws Throwable
+ {
+ // To make surefire happy
+ Thread.currentThread().setContextClassLoader(MetadataBean.class.getClassLoader());
+
+ // Bootstrap AOP
+ // FIXME: use the right jboss-aop.xml
+ URL url = Thread.currentThread().getContextClassLoader().getResource("proxy/jboss-aop.xml");
+ log.info("deploying AOP from " + url);
+ AspectXmlLoader.deployXML(url);
+
+ // Bootstrap metadata
+ UnmarshallerFactory unmarshallerFactory = UnmarshallerFactory.newInstance();
+ Unmarshaller unmarshaller = unmarshallerFactory.newUnmarshaller();
+ url = Thread.currentThread().getContextClassLoader().getResource("metadata/META-INF/ejb-jar.xml");
+ EjbJar30MetaData metaData = (EjbJar30MetaData) unmarshaller.unmarshal(url.toString(), schemaResolverForClass(EjbJar30MetaData.class));
+ JBoss50MetaData jbossMetaData = new JBoss50MetaData();
+ jbossMetaData.merge(null, metaData);
+
+ JBossEnterpriseBeanMetaData beanMetaData = jbossMetaData.getEnterpriseBean("InterceptorOrderBean");
+ assertNotNull(beanMetaData);
+
+ assertEquals(0, CommonInterceptor.postConstructs);
+
+ MyContainer<InterceptorOrderBean> container = new MyContainer<InterceptorOrderBean>("InterceptorOrderBean", "Test", InterceptorOrderBean.class, beanMetaData);
+ container.testAdvisor();
+
+ BeanContext<InterceptorOrderBean> bean = container.construct();
+
+ assertEquals("CommonInterceptor postConstruct must have been called once", 1, CommonInterceptor.postConstructs);
+
+ System.out.println(bean.getClass() + " " + bean.getClass().getClassLoader());
+ System.out.println(" " + Arrays.toString(bean.getClass().getInterfaces()));
+ String result = container.invoke(bean, "sayHi", "Test");
+ System.out.println(result);
+
+ assertEquals("sayHi didn't invoke CommonInterceptor.aroundInvoke once", 1, CommonInterceptor.aroundInvokes);
+
+ assertEquals("CommonInterceptor postConstruct must have been called once", 1, CommonInterceptor.postConstructs);
+
+ container.destroy(bean);
+ assertEquals(1, CommonInterceptor.preDestroys);
+
+ bean = null;
+ }
}
Added: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/AbstractInterceptor.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/AbstractInterceptor.java (rev 0)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/AbstractInterceptor.java 2008-04-13 15:47:36 UTC (rev 72136)
@@ -0,0 +1,53 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ejb3.test.interceptors.order;
+
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+import javax.interceptor.AroundInvoke;
+import javax.interceptor.InvocationContext;
+
+/**
+ * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
+ * @version $Revision: $
+ */
+public abstract class AbstractInterceptor
+{
+ @AroundInvoke
+ public Object aroundInvoke(InvocationContext ctx) throws Exception
+ {
+ List<String> list = (List<String>) ctx.getParameters()[0];
+ list.add(getInterceptorName());
+ return ctx.proceed();
+ }
+
+ protected abstract String getInterceptorName();
+
+ @PostConstruct
+ public void postConstruct(InvocationContext ctx) throws Exception
+ {
+ InterceptorChainBean bean = (InterceptorChainBean) ctx.getTarget();
+ bean.addPostConstruct(getInterceptorName());
+ ctx.proceed();
+ }
+}
Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorA.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorA.java 2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorA.java 2008-04-13 15:47:36 UTC (rev 72136)
@@ -21,22 +21,16 @@
*/
package org.jboss.ejb3.test.interceptors.order;
-import java.util.List;
-import javax.interceptor.AroundInvoke;
-import javax.interceptor.InvocationContext;
-
/**
* @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
* @version $Revision: $
*/
-public class InterceptorA
+public class InterceptorA extends AbstractInterceptor
{
- @AroundInvoke
- public Object aroundInvoke(InvocationContext ctx) throws Exception
+ @Override
+ protected String getInterceptorName()
{
- List<String> list = (List<String>) ctx.getParameters()[0];
- list.add("A");
- return ctx.proceed();
- }
+ return "A";
+ }
}
Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorB.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorB.java 2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorB.java 2008-04-13 15:47:36 UTC (rev 72136)
@@ -21,22 +21,16 @@
*/
package org.jboss.ejb3.test.interceptors.order;
-import java.util.List;
-import javax.interceptor.AroundInvoke;
-import javax.interceptor.InvocationContext;
-
/**
* @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
* @version $Revision: $
*/
-public class InterceptorB
+public class InterceptorB extends AbstractInterceptor
{
- @AroundInvoke
- public Object aroundInvoke(InvocationContext ctx) throws Exception
+ @Override
+ protected String getInterceptorName()
{
- List<String> list = (List<String>) ctx.getParameters()[0];
- list.add("B");
- return ctx.proceed();
- }
+ return "B";
+ }
}
Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorChainBean.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorChainBean.java 2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorChainBean.java 2008-04-13 15:47:36 UTC (rev 72136)
@@ -21,13 +21,18 @@
*/
package org.jboss.ejb3.test.interceptors.order;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
+import javax.annotation.PostConstruct;
import javax.interceptor.Interceptors;
import org.jboss.ejb3.interceptors.ManagedObject;
/**
+ * Keep track of the interceptor chain invoked.
+ *
* @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
* @version $Revision: $
*/
@@ -35,9 +40,29 @@
@Interceptors({InterceptorA.class, InterceptorB.class})
public class InterceptorChainBean
{
- //@Interceptors({InterceptorA.class, InterceptorB.class})
- public void createInterceptorChain(List<String> chain)
+ private List<String> postConstructs = new ArrayList<String>();
+
+ protected boolean addPostConstruct(String name)
{
+ return postConstructs.add(name);
+ }
+
+ /**
+ * Add the called instance to the chain and return
+ * the post constructs invoked.
+ *
+ * @param chain
+ * @return a list of post constructed instances
+ */
+ public List<String> createInterceptorChain(List<String> chain)
+ {
chain.add("BEAN");
+ return Collections.unmodifiableList(postConstructs);
}
+
+ @PostConstruct
+ public void postConstruct()
+ {
+ addPostConstruct("BEAN");
+ }
}
Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/unit/InterceptorChainTestCase.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/unit/InterceptorChainTestCase.java 2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/unit/InterceptorChainTestCase.java 2008-04-13 15:47:36 UTC (rev 72136)
@@ -143,10 +143,12 @@
BeanContext<InterceptorChainBean> bean = container.construct();
List<String> chain = new ArrayList<String>();
- container.invoke(bean, "createInterceptorChain", chain);
+ List<String> postConstructs = container.invoke(bean, "createInterceptorChain", chain);
assertEquals(Arrays.asList("B", "A", "BEAN"), chain);
+ assertEquals(Arrays.asList("B", "A", "BEAN"), postConstructs);
+
bean = null;
}
}
Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/SimpleContext.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/SimpleContext.java 2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/SimpleContext.java 2008-04-13 15:47:36 UTC (rev 72136)
@@ -37,6 +37,11 @@
return instance;
}
+ public Object getInterceptor(Class<?> interceptorClass) throws IllegalArgumentException
+ {
+ throw new IllegalArgumentException("No interceptors defined");
+ }
+
public Object[] getInterceptors()
{
return new Object[0];
Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/SimplePoolInterceptor.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/SimplePoolInterceptor.java 2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/SimplePoolInterceptor.java 2008-04-13 15:47:36 UTC (rev 72136)
@@ -58,7 +58,8 @@
ProxiedBean bean = createNewInstance ? new ProxiedBean() : pooledBean;
pooledBean = bean;
ctx.setInstance(bean);
- mi.setTargetObject(bean);
+ //mi.setTargetObject(bean);
+ mi.setBeanContext(ctx);
try
{
return invocation.invokeNext();
@@ -66,6 +67,7 @@
finally
{
ctx.setInstance(null);
+ mi.setBeanContext(null);
}
}
Modified: projects/ejb3/trunk/interceptors/src/test/resources/metadata/META-INF/ejb-jar.xml
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/resources/metadata/META-INF/ejb-jar.xml 2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/test/resources/metadata/META-INF/ejb-jar.xml 2008-04-13 15:47:36 UTC (rev 72136)
@@ -15,6 +15,9 @@
<method-name>aroundInvoke</method-name>
</around-invoke>
</session>
+ <session>
+ <ejb-name>InterceptorOrderBean</ejb-name>
+ </session>
</enterprise-beans>
<interceptors>
<interceptor>
@@ -43,5 +46,11 @@
<method-name>intercept</method-name>
</method>
</interceptor-binding>
+ <interceptor-binding>
+ <ejb-name>InterceptorOrderBean</ejb-name>
+ <interceptor-order>
+ <interceptor-class>org.jboss.ejb3.test.interceptors.common.CommonInterceptor</interceptor-class>
+ </interceptor-order>
+ </interceptor-binding>
</assembly-descriptor>
</ejb-jar>
\ No newline at end of file
More information about the jboss-cvs-commits
mailing list