[jboss-svn-commits] JBL Code SVN: r23861 - labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Nov 13 09:51:32 EST 2008


Author: jhalliday
Date: 2008-11-13 09:51:31 -0500 (Thu, 13 Nov 2008)
New Revision: 23861

Modified:
   labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca/XATerminatorImple.java
Log:
Merged fix for JBTM-427 from trunk to 4.2.3.SP


Modified: labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca/XATerminatorImple.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca/XATerminatorImple.java	2008-11-13 14:47:58 UTC (rev 23860)
+++ labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca/XATerminatorImple.java	2008-11-13 14:51:31 UTC (rev 23861)
@@ -1,20 +1,20 @@
 /*
  * JBoss, Home of Professional Open Source
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors 
- * as indicated by the @author tags. 
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags.
  * See the copyright.txt in the distribution for a
- * full listing of individual contributors. 
+ * full listing of individual contributors.
  * This copyrighted material is made available to anyone wishing to use,
  * modify, copy, or redistribute it subject to the terms and conditions
  * of the GNU Lesser General Public License, v. 2.1.
- * This program is distributed in the hope that it will be useful, but WITHOUT A 
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A 
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * 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,
  * v.2.1 along with this distribution; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  * MA  02110-1301, USA.
- * 
+ *
  * (C) 2005-2006,
  * @author JBoss Inc.
  */
@@ -34,10 +34,7 @@
 import java.io.IOException;
 import java.util.Stack;
 
-import javax.transaction.HeuristicCommitException;
-import javax.transaction.HeuristicMixedException;
-import javax.transaction.HeuristicRollbackException;
-import javax.transaction.SystemException;
+import javax.transaction.*;
 import javax.transaction.xa.*;
 
 import com.arjuna.ats.arjuna.common.Uid;
@@ -51,7 +48,7 @@
 
 /**
  * The XATerminator implementation.
- * 
+ *
  * @author mcl
  *
  */
@@ -62,36 +59,42 @@
 	/**
 	 * Commit the transaction identified and hence any inflow-associated
 	 * work.
-	 * 
+	 *
 	 * @param xid the transaction to commit
 	 * @param onePhase whether or not this is a one-phase commit (should only
 	 * be <code>true</code> if there is a single resource associated with the
 	 * transaction).
-	 * 
+	 *
 	 * @exception XAException thrown if there are any errors, including if
 	 * the transaction cannot commit and has to roll back.
 	 */
-	
+
 	public void commit (Xid xid, boolean onePhase) throws XAException
 	{
 		try
 		{
 			TransactionImple tx = TxImporter.getImportedTransaction(xid);
-			
+
 			if (tx == null)
 				throw new XAException(XAException.XAER_INVAL);
-			
+
 			if (onePhase)
 				tx.doOnePhaseCommit();
 			else
 				tx.doCommit();
-			
+
 			TxImporter.removeImportedTransaction(xid);
 		}
+        catch(RollbackException e) {
+            TxImporter.removeImportedTransaction(xid);
+            XAException xaException = new XAException(XAException.XA_RBROLLBACK);
+            xaException.initCause(e);
+            throw xaException;
+        }
 		catch (XAException ex)
 		{
 			TxImporter.removeImportedTransaction(xid);
-			
+
 			throw ex;
 		}
 		catch (HeuristicRollbackException ex)
@@ -105,30 +108,30 @@
 		catch (SystemException ex)
 		{
 			TxImporter.removeImportedTransaction(xid);
-			
+
 			throw new XAException(XAException.XAER_RMERR);
 		}
 	}
-	
+
 	/**
 	 * If the transaction subordinate generated a heuristic, then
 	 * this operation will be called later once that heuristic has been
 	 * resolved.
-	 * 
+	 *
 	 * @param xid the transaction.
-	 * 
+	 *
 	 * @throws XAException if any error happens.
 	 */
-	
+
 	public void forget (Xid xid) throws XAException
 	{
 		try
 		{
 			TransactionImple tx = TxImporter.getImportedTransaction(xid);
-			
+
 			if (tx == null)
 				throw new XAException(XAException.XAER_INVAL);
-			
+
 			tx.doForget();
 		}
 		catch (Exception ex)
@@ -140,39 +143,58 @@
 			TxImporter.removeImportedTransaction(xid);
 		}
 	}
-	
+
 	/**
 	 * Prepare the imported transaction.
-	 * 
+	 *
 	 * @param xid the transaction to prepare.
-	 * 
+	 *
 	 * @throws XAException thrown if any error occurs, including if the
 	 * transaction has rolled back.
-	 * 
+	 *
 	 * @return either XAResource.XA_OK if the transaction prepared, or
 	 * XAResource.XA_RDONLY if it was a read-only transaction (and in
 	 * which case, a second phase message is not expected/required.)
 	 */
-	
+
 	public int prepare (Xid xid) throws XAException
 	{
 		try
 		{
 			TransactionImple tx = TxImporter.getImportedTransaction(xid);
-			
+
 			if (tx == null)
 				throw new XAException(XAException.XAER_INVAL);
-			
+
 			switch (tx.doPrepare())
 			{
 			case TwoPhaseOutcome.PREPARE_READONLY:
 				TxImporter.removeImportedTransaction(xid);
-				
-				return XAResource.XA_RDONLY;				
+				return XAResource.XA_RDONLY;
 			case TwoPhaseOutcome.PREPARE_NOTOK:
-				TxImporter.removeImportedTransaction(xid);  // TODO check if rollback is going to be called first
-				
-				throw new XAException(XAException.XA_RBROLLBACK);
+                // the JCA API spec limits what we can do in terms of reporting problems.
+                // try to use the exception code and cause to provide info whilst
+                // ramining API compliant.  JBTM-427.
+                Exception initCause = null;
+                int xaExceptionCode = XAException.XA_RBROLLBACK;
+                try {
+                    tx.doRollback();
+                } catch(HeuristicCommitException e) {
+                    initCause = e;
+                    xaExceptionCode = XAException.XAER_RMERR;
+                } catch (HeuristicMixedException e) {
+                    initCause = e;
+                    xaExceptionCode = XAException.XAER_RMERR;
+                } catch (SystemException e) {
+                    initCause = e;
+                    xaExceptionCode = XAException.XAER_RMERR;
+                }
+                TxImporter.removeImportedTransaction(xid);
+                XAException xaException = new XAException(xaExceptionCode);
+                if(initCause != null) {
+                    xaException.initCause(initCause);
+                }
+				throw xaException;
 			case TwoPhaseOutcome.PREPARE_OK:
 				return XAResource.XA_OK;
 			default:
@@ -184,29 +206,29 @@
 			throw ex;
 		}
 	}
-	
+
 	/**
 	 * Return a list of indoubt transactions. This may include those
 	 * transactions that are currently in-flight and running 2PC and do not need recovery
 	 * invoked on them.
-	 * 
+	 *
 	 * @param flag either XAResource.TMSTARTRSCAN to indicate the start of
 	 * a recovery scan, or XAResource.TMENDRSCAN to indicate the end of
 	 * the recovery scan.
-	 * 
+	 *
 	 * @throws XAException thrown if any error occurs.
-	 * 
+	 *
 	 * @return a list of potentially indoubt transactions or <code>null</code>.
 	 */
-	
+
 	public Xid[] recover (int flag) throws XAException
-	{	
+	{
 		/*
 		 * Requires going through the objectstore for the states of imported
 		 * transactions. Our own crash recovery takes care of transactions imported
 		 * via CORBA, Web Services etc.
 		 */
-		
+
 		switch (flag)
 		{
 		case XAResource.TMSTARTRSCAN: // check the object store
@@ -227,23 +249,23 @@
 		default:
 			throw new XAException(XAException.XAER_PROTO);
 		}
-		
+
 		// if we are here, then check the object store
-		
+
 		Xid[] indoubt = null;
-		
+
 		try
 		{
 			ObjectStore objStore = new ObjectStore(TxControl.getActionStoreType());
 			InputObjectState states = new InputObjectState();
-			
+
 			// only look in the JCA section of the object store
-			
+
 			if (objStore.allObjUids(SubordinateAtomicAction.getType(), states) && (states.notempty()))
 			{
 				Stack values = new Stack();
 				boolean finished = false;
-				
+
 				do
 				{
 					Uid uid = new Uid(Uid.nullUid());
@@ -258,29 +280,29 @@
 
 						finished = true;
 					}
-					
+
 					if (uid.notEquals(Uid.nullUid()))
 					{
 						TransactionImple tx = TxImporter.recoverTransaction(uid);
-						
+
 						if (tx != null)
 							values.push(tx);
 					}
 					else
 						finished = true;
-					
+
 				} while (!finished);
-				
+
 				if (values.size() > 0)
 				{
 					int index = 0;
 
 					indoubt = new Xid[values.size()];
-								
+
 					while (!values.empty())
 					{
 						com.arjuna.ats.internal.jta.transaction.arjunacore.subordinate.jca.TransactionImple tx = (com.arjuna.ats.internal.jta.transaction.arjunacore.subordinate.jca.TransactionImple) values.pop();
-						
+
 						indoubt[index] = tx.baseXid();
 						index++;
 					}
@@ -291,35 +313,35 @@
 		{
 			ex.printStackTrace();
 		}
-			
+
 		return indoubt;
 	}
 
 	/**
 	 * Rollback the imported transaction subordinate.
-	 * 
+	 *
 	 * @param xid the transaction to roll back.
-	 * 
+	 *
 	 * @throws XAException thrown if there are any errors.
 	 */
-	
+
 	public void rollback (Xid xid) throws XAException
 	{
 		try
 		{
 			TransactionImple tx = TxImporter.getImportedTransaction(xid);
-			
+
 			if (tx == null)
 				throw new XAException(XAException.XAER_INVAL);
-			
+
 			tx.doRollback();
-			
+
 			TxImporter.removeImportedTransaction(xid);
 		}
 		catch (XAException ex)
 		{
 			TxImporter.removeImportedTransaction(xid);
-			
+
 			throw ex;
 		}
 		catch (HeuristicCommitException ex)
@@ -333,11 +355,11 @@
 		catch (SystemException ex)
 		{
 			TxImporter.removeImportedTransaction(xid);
-			
+
 			throw new XAException(XAException.XAER_RMERR);
 		}
 	}
-	
+
 	private boolean _recoveryStarted = false;
-	
+
 }




More information about the jboss-svn-commits mailing list