[jboss-cvs] JBossAS SVN: r75964 - in projects/ejb3/trunk/transactions: src/main/java/org/jboss/ejb3/tx and 2 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Jul 17 11:05:22 EDT 2008


Author: wolfc
Date: 2008-07-17 11:05:22 -0400 (Thu, 17 Jul 2008)
New Revision: 75964

Modified:
   projects/ejb3/trunk/transactions/pom.xml
   projects/ejb3/trunk/transactions/src/main/java/org/jboss/ejb3/tx/TxUtil.java
   projects/ejb3/trunk/transactions/src/test/java/org/jboss/ejb3/test/tx/getrollback/GetRollbackTestBean.java
   projects/ejb3/trunk/transactions/src/test/java/org/jboss/ejb3/test/tx/getrollback/unit/GetRollbackTestCase.java
Log:
Fixed ClassCastException with lifecycle callbacks

Modified: projects/ejb3/trunk/transactions/pom.xml
===================================================================
--- projects/ejb3/trunk/transactions/pom.xml	2008-07-17 15:04:28 UTC (rev 75963)
+++ projects/ejb3/trunk/transactions/pom.xml	2008-07-17 15:05:22 UTC (rev 75964)
@@ -101,7 +101,7 @@
     <dependency>
       <groupId>org.jboss.ejb3</groupId>
       <artifactId>jboss-ejb3-interceptors</artifactId>
-      <version>0.13.0</version>
+      <version>0.13.2-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.jboss.javaee</groupId>

Modified: projects/ejb3/trunk/transactions/src/main/java/org/jboss/ejb3/tx/TxUtil.java
===================================================================
--- projects/ejb3/trunk/transactions/src/main/java/org/jboss/ejb3/tx/TxUtil.java	2008-07-17 15:04:28 UTC (rev 75963)
+++ projects/ejb3/trunk/transactions/src/main/java/org/jboss/ejb3/tx/TxUtil.java	2008-07-17 15:05:22 UTC (rev 75964)
@@ -107,7 +107,10 @@
    
    protected static TransactionAttributeType getTxType(Advisor advisor, Method method)
    {
-      TransactionAttribute tx = (TransactionAttribute) advisor.resolveAnnotation(method, TransactionAttribute.class);
+      TransactionAttribute tx = null;
+      
+      if(method != null)
+         tx = (TransactionAttribute) advisor.resolveAnnotation(method, TransactionAttribute.class);
 
       if (tx == null)
          tx = (TransactionAttribute) advisor.resolveAnnotation(TransactionAttribute.class);
@@ -123,7 +126,11 @@
    
    private static TransactionAttributeType getTxType(Invocation invocation)
    {
-      return getTxType(invocation.getAdvisor(), ((MethodInvocation) invocation).getActualMethod());
+      // Use the method tx attribute if we're invoking a business method, else the bean attribute
+      Method method = null;
+      if(invocation instanceof MethodInvocation)
+         method = ((MethodInvocation) invocation).getActualMethod();
+      return getTxType(invocation.getAdvisor(), method);
    }
 
    public static UserTransaction getUserTransaction(BeanContext<?> ctx)

Modified: projects/ejb3/trunk/transactions/src/test/java/org/jboss/ejb3/test/tx/getrollback/GetRollbackTestBean.java
===================================================================
--- projects/ejb3/trunk/transactions/src/test/java/org/jboss/ejb3/test/tx/getrollback/GetRollbackTestBean.java	2008-07-17 15:04:28 UTC (rev 75963)
+++ projects/ejb3/trunk/transactions/src/test/java/org/jboss/ejb3/test/tx/getrollback/GetRollbackTestBean.java	2008-07-17 15:05:22 UTC (rev 75964)
@@ -26,6 +26,7 @@
 import static javax.ejb.TransactionAttributeType.REQUIRED;
 
 import javax.ejb.EJBContext;
+import javax.ejb.PrePassivate;
 import javax.ejb.Stateless;
 import javax.ejb.TransactionAttribute;
 import javax.ejb.TransactionAttributeType;
@@ -41,6 +42,8 @@
 {
    private EJBContext ctx = new MockEJBContext();
    
+   public boolean prePassivateRan = false;
+   
    @TransactionAttribute(MANDATORY)
    public boolean mandatory()
    {
@@ -59,6 +62,14 @@
       return ctx.getRollbackOnly();
    }
    
+   @PrePassivate
+   public void prePassivate()
+   {
+      ctx.getRollbackOnly();
+      
+      prePassivateRan = true;
+   }
+   
    @TransactionAttribute(REQUIRED)
    public boolean required()
    {

Modified: projects/ejb3/trunk/transactions/src/test/java/org/jboss/ejb3/test/tx/getrollback/unit/GetRollbackTestCase.java
===================================================================
--- projects/ejb3/trunk/transactions/src/test/java/org/jboss/ejb3/test/tx/getrollback/unit/GetRollbackTestCase.java	2008-07-17 15:04:28 UTC (rev 75963)
+++ projects/ejb3/trunk/transactions/src/test/java/org/jboss/ejb3/test/tx/getrollback/unit/GetRollbackTestCase.java	2008-07-17 15:05:22 UTC (rev 75964)
@@ -23,14 +23,23 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Constructor;
 import java.net.URL;
+import java.util.List;
 
 import javax.ejb.EJBTransactionRolledbackException;
+import javax.ejb.PrePassivate;
 import javax.naming.InitialContext;
 import javax.transaction.TransactionManager;
 
+import org.jboss.aop.Advisor;
+import org.jboss.aop.advice.Interceptor;
+import org.jboss.aop.joinpoint.ConstructionInvocation;
+import org.jboss.ejb3.interceptors.aop.LifecycleCallbacks;
 import org.jboss.ejb3.interceptors.container.BeanContext;
 import org.jboss.ejb3.interceptors.direct.DirectContainer;
 import org.jboss.ejb3.test.tx.getrollback.GetRollbackTestBean;
@@ -51,9 +60,31 @@
 {
    private static UnitTestBootstrap bootstrap;
    
-   private static DirectContainer<GetRollbackTestBean> container;
+   private static TestContainer<GetRollbackTestBean> container;
    private BeanContext<GetRollbackTestBean> instance;
    
+   private static class TestContainer<T> extends DirectContainer<T>
+   {
+      public TestContainer(String name, String domainName, Class<? extends T> beanClass)
+      {
+         super(name, domainName, beanClass);
+      }
+      
+      protected void invokeCallback(BeanContext<?> component, Class<? extends Annotation> lifecycleAnnotationType) throws Throwable
+      {
+         List<Class<?>> lifecycleInterceptorClasses = getInterceptorRegistry().getLifecycleInterceptorClasses();
+         Advisor advisor = getAdvisor();
+         Interceptor interceptors[] = LifecycleCallbacks.createLifecycleCallbackInterceptors(advisor, lifecycleInterceptorClasses, component, lifecycleAnnotationType);
+         
+         Constructor<?> constructor = getBeanClass().getConstructor();
+         Object initargs[] = null;
+         ConstructionInvocation invocation = new ConstructionInvocation(interceptors, constructor, initargs);
+         invocation.setAdvisor(advisor);
+         invocation.setTargetObject(component.getInstance());
+         invocation.invokeNext();
+      }
+   }
+   
    private void expectException(String methodName, Class<? extends Exception> exceptionClass) throws Throwable
    {
       try
@@ -98,7 +129,7 @@
       bootstrap.deploy(getResource("instance/beans.xml"));
       
       // TODO: should not use Stateful Container
-      container = new DirectContainer<GetRollbackTestBean>("GetRollbackTest", "Stateless Container", GetRollbackTestBean.class);
+      container = new TestContainer<GetRollbackTestBean>("GetRollbackTest", "Stateless Container", GetRollbackTestBean.class);
    }
 
    @AfterClass
@@ -117,7 +148,8 @@
    @After
    public void tearDown() throws Exception
    {
-      container.destroy(instance);
+      if(instance != null)
+         container.destroy(instance);
    }
    
 
@@ -162,6 +194,29 @@
    }
 
    /**
+    * This test is to make sure there is no ClassCastException in TxUtil.getTxType.
+    * It's actually not allowed by spec to do PrePassivate on a Stateless and it's
+    * also not allowed to do getRollbackOnly within a lifecycle method.
+    */
+   @Test
+   public void testPrePassivate() throws Throwable
+   {
+      InitialContext ctx = new InitialContext();
+      TransactionManager tm = (TransactionManager) ctx.lookup("java:/TransactionManager");
+      tm.begin();
+      try
+      {
+         container.invokeCallback(instance, PrePassivate.class);
+         
+         assertTrue(instance.getInstance().prePassivateRan);
+      }
+      finally
+      {
+         tm.rollback();
+      }
+   }
+   
+   /**
     * Test method for {@link org.jboss.ejb3.test.tx.getrollback.GetRollbackTestBean#required()}.
     * @throws Throwable 
     */




More information about the jboss-cvs-commits mailing list