You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by jl...@apache.org on 2011/06/29 14:30:59 UTC

svn commit: r1141069 - in /openejb/branches/openejb-3.2.x: ./ container/openejb-core/src/main/java/org/apache/openejb/core/managed/ container/openejb-core/src/main/java/org/apache/openejb/core/stateful/ container/openejb-core/src/main/java/org/apache/o...

Author: jlmonteiro
Date: Wed Jun 29 12:30:58 2011
New Revision: 1141069

URL: http://svn.apache.org/viewvc?rev=1141069&view=rev
Log:
Merge 1097964
OPENEJB-1091: Cause of RollbackException swallowed
Upgrade to version of Geronimo Transaction manager that supports the rollback cause.  Use the setRollbackOnly(Throwable) method if it is available in the Transaction implementation.

Added:
    openejb/branches/openejb-3.2.x/container/openejb-core/src/test/java/org/apache/openejb/transaction/
      - copied from r1097964, openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/transaction/
    openejb/branches/openejb-3.2.x/container/openejb-core/src/test/java/org/apache/openejb/transaction/TransactionRollbackCauseTest.java
      - copied unchanged from r1097964, openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/transaction/TransactionRollbackCauseTest.java
Modified:
    openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java
    openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
    openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/EjbTransactionUtil.java
    openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/JtaTransactionPolicy.java
    openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TransactionPolicy.java
    openejb/branches/openejb-3.2.x/container/openejb-spring/src/main/java/org/apache/openejb/spring/SpringTransactionPolicy.java
    openejb/branches/openejb-3.2.x/pom.xml

Modified: openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java?rev=1141069&r1=1141068&r2=1141069&view=diff
==============================================================================
--- openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java (original)
+++ openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java Wed Jun 29 12:30:58 2011
@@ -978,7 +978,7 @@ public class ManagedContainer implements
                     logger.error(message, e);
 
                     // [2] Mark the transaction for rollback.
-                    txPolicy.setRollbackOnly();
+                    txPolicy.setRollbackOnly(e);
 
                     // [3] Discard the instance
                     discardInstance(callContext);

Modified: openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java?rev=1141069&r1=1141068&r2=1141069&view=diff
==============================================================================
--- openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java (original)
+++ openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java Wed Jun 29 12:30:58 2011
@@ -989,7 +989,7 @@ public class StatefulContainer implement
                     logger.error(message, e);
 
                     // [2] Mark the transaction for rollback.
-                    txPolicy.setRollbackOnly();
+                    txPolicy.setRollbackOnly(e);
 
                     // [3] Discard the instance
                     discardInstance(callContext);

Modified: openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/EjbTransactionUtil.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/EjbTransactionUtil.java?rev=1141069&r1=1141068&r2=1141069&view=diff
==============================================================================
--- openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/EjbTransactionUtil.java (original)
+++ openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/EjbTransactionUtil.java Wed Jun 29 12:30:58 2011
@@ -115,7 +115,7 @@ public final class EjbTransactionUtil {
      */
     public static void handleApplicationException(TransactionPolicy txPolicy, Throwable appException, boolean rollback) throws ApplicationException {
         if (rollback) {
-            txPolicy.setRollbackOnly();
+            txPolicy.setRollbackOnly(appException);
         }
 
         if (!(appException instanceof ApplicationException)) {
@@ -139,7 +139,7 @@ public final class EjbTransactionUtil {
         }
 
         // Mark the transaction for rollback
-        txPolicy.setRollbackOnly();
+        txPolicy.setRollbackOnly(sysException);
 
         // Throw InvalidateReferenceException
         if (txPolicy.isClientTransaction()) {

Modified: openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/JtaTransactionPolicy.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/JtaTransactionPolicy.java?rev=1141069&r1=1141068&r2=1141069&view=diff
==============================================================================
--- openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/JtaTransactionPolicy.java (original)
+++ openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/JtaTransactionPolicy.java Wed Jun 29 12:30:58 2011
@@ -16,28 +16,29 @@
  */
 package org.apache.openejb.core.transaction;
 
-import java.rmi.RemoteException;
-import java.util.Map;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.LinkedList;
-import java.util.ArrayList;
+import org.apache.openejb.ApplicationException;
+import org.apache.openejb.SystemException;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.util.LogCategory;
+import org.apache.openejb.util.Logger;
+
 import javax.transaction.HeuristicMixedException;
 import javax.transaction.HeuristicRollbackException;
 import javax.transaction.InvalidTransactionException;
 import javax.transaction.RollbackException;
 import javax.transaction.Status;
+import javax.transaction.Synchronization;
 import javax.transaction.Transaction;
 import javax.transaction.TransactionManager;
 import javax.transaction.TransactionSynchronizationRegistry;
-import javax.transaction.Synchronization;
 import javax.transaction.xa.XAResource;
-
-import org.apache.openejb.ApplicationException;
-import org.apache.openejb.SystemException;
-import org.apache.openejb.loader.SystemInstance;
-import org.apache.openejb.util.LogCategory;
-import org.apache.openejb.util.Logger;
+import java.lang.reflect.Method;
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 
 public abstract class JtaTransactionPolicy implements TransactionPolicy {
     protected final static Logger logger = Logger.getInstance(LogCategory.OPENEJB, "org.apache.openejb.util.resources");
@@ -47,7 +48,7 @@ public abstract class JtaTransactionPoli
 
     protected final TransactionManager transactionManager;
     private final TransactionSynchronizationRegistry synchronizationRegistry;
-    private Map<Object,Object> resources;
+    private Map<Object, Object> resources;
     private final List<TransactionSynchronization> synchronizations = new LinkedList<TransactionSynchronization>();
     private boolean rollbackOnly;
 
@@ -79,7 +80,7 @@ public abstract class JtaTransactionPoli
 
     public boolean isRollbackOnly() {
         Transaction trasaction = getCurrentTransaction();
-        if (trasaction != null)  {
+        if (trasaction != null) {
             try {
                 int status = trasaction.getStatus();
                 return status == Status.STATUS_MARKED_ROLLBACK;
@@ -92,9 +93,14 @@ public abstract class JtaTransactionPoli
     }
 
     public void setRollbackOnly() {
+        setRollbackOnly(null);
+    }
+
+    @Override
+    public void setRollbackOnly(Throwable reason) {
         Transaction trasaction = getCurrentTransaction();
-        if (trasaction != null)  {
-            setRollbackOnly(trasaction);
+        if (trasaction != null) {
+            setRollbackOnly(trasaction, reason);
         } else {
             rollbackOnly = true;
         }
@@ -117,7 +123,7 @@ public abstract class JtaTransactionPoli
         }
 
         if (resources == null) {
-            resources = new LinkedHashMap<Object,Object>();
+            resources = new LinkedHashMap<Object, Object>();
         }
         resources.put(key, value);
     }
@@ -206,18 +212,45 @@ public abstract class JtaTransactionPoli
     }
 
 
-    protected void setRollbackOnly(Transaction tx) {
+    protected void setRollbackOnly(Transaction tx, Throwable reason) {
         try {
-            if (tx != null && tx.getStatus() == Status.STATUS_ACTIVE) {
+            if (tx == null || tx.getStatus() != Status.STATUS_ACTIVE) return;
+
+            if (reason == null) {
+
                 tx.setRollbackOnly();
-                txLogger.debug("TX {0}: setRollbackOnly() on transaction {1}", transactionType, tx);
+
+            } else {
+
+                final Method setRollbackOnly = setRollbackOnlyMethod(tx);
+
+                if (setRollbackOnly != null) {
+
+                    setRollbackOnly.invoke(tx, reason);
+
+                } else {
+
+                    tx.setRollbackOnly();
+
+                }
             }
+            
+            txLogger.debug("TX {0}: setRollbackOnly() on transaction {1}", transactionType, tx);
+
         } catch (Exception e) {
             txLogger.error("Exception during setRollbackOnly()", e);
             throw new IllegalStateException("No transaction active", e);
         }
     }
 
+    private Method setRollbackOnlyMethod(Transaction tx) {
+        try {
+            return tx.getClass().getMethod("setRollbackOnly", Throwable.class);
+        } catch (Throwable e) {
+            return null;
+        }
+    }
+
     protected Transaction beginTransaction() throws SystemException {
         Transaction transaction;
         try {
@@ -252,7 +285,7 @@ public abstract class JtaTransactionPoli
             if (tx == null) {
                 txLogger.debug("TX {0}: No transaction to resume", transactionType);
             } else {
-                txLogger.debug("TX {0}: Resuming transaction {1}" ,transactionType, tx);
+                txLogger.debug("TX {0}: Resuming transaction {1}", transactionType, tx);
                 transactionManager.resume(tx);
             }
         } catch (InvalidTransactionException ite) {

Modified: openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TransactionPolicy.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TransactionPolicy.java?rev=1141069&r1=1141068&r2=1141069&view=diff
==============================================================================
--- openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TransactionPolicy.java (original)
+++ openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TransactionPolicy.java Wed Jun 29 12:30:58 2011
@@ -80,6 +80,11 @@ public interface TransactionPolicy {
     void setRollbackOnly();
 
     /**
+     * Sets this TransactionPolicy to rollback when completed
+     */
+    void setRollbackOnly(Throwable reason);
+
+    /**
      * Commits or rolls back this TransactionPolicy.  If there the actual
      * transaction is completed or there is no actual transaction, the
      * registered TransactionSynchronization are called.  Otherwise, the

Modified: openejb/branches/openejb-3.2.x/container/openejb-spring/src/main/java/org/apache/openejb/spring/SpringTransactionPolicy.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.2.x/container/openejb-spring/src/main/java/org/apache/openejb/spring/SpringTransactionPolicy.java?rev=1141069&r1=1141068&r2=1141069&view=diff
==============================================================================
--- openejb/branches/openejb-3.2.x/container/openejb-spring/src/main/java/org/apache/openejb/spring/SpringTransactionPolicy.java (original)
+++ openejb/branches/openejb-3.2.x/container/openejb-spring/src/main/java/org/apache/openejb/spring/SpringTransactionPolicy.java Wed Jun 29 12:30:58 2011
@@ -99,6 +99,10 @@ public class SpringTransactionPolicy imp
         return getTransactionStatus().isRollbackOnly();
     }
 
+    public void setRollbackOnly(Throwable t) {
+        getTransactionStatus().setRollbackOnly();
+    }
+    
     public void setRollbackOnly() {
         getTransactionStatus().setRollbackOnly();
     }

Modified: openejb/branches/openejb-3.2.x/pom.xml
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.2.x/pom.xml?rev=1141069&r1=1141068&r2=1141069&view=diff
==============================================================================
--- openejb/branches/openejb-3.2.x/pom.xml (original)
+++ openejb/branches/openejb-3.2.x/pom.xml Wed Jun 29 12:30:58 2011
@@ -122,7 +122,7 @@
     <junit.version>4.8.1</junit.version>
     <org.apache.axis2.version>1.4.1</org.apache.axis2.version>
     <org.apache.openwebbeans.version>1.1.0</org.apache.openwebbeans.version>
-    <geronimo.connector.version>2.1</geronimo.connector.version>
+    <geronimo.connector.version>2.2.2-SNAPSHOT</geronimo.connector.version>
   </properties>
 
   <build>