[jboss-svn-commits] JBL Code SVN: r37544 - in labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats: internal/jta/transaction/arjunacore/jca and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Oct 14 19:41:35 EDT 2011


Author: tomjenkinson
Date: 2011-10-14 19:41:34 -0400 (Fri, 14 Oct 2011)
New Revision: 37544

Modified:
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca/TransactionImporterImple.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/subordinate/TransactionImple.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/jta/xa/XidImple.java
Log:
JBTM-916 updated to allow SubordinateTransactions to create new XIDs if the format ID is one that we understand and can therefore edit reliably

Modified: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java	2011-10-14 23:30:14 UTC (rev 37543)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java	2011-10-14 23:41:34 UTC (rev 37544)
@@ -45,6 +45,7 @@
 import com.arjuna.ats.jta.exceptions.InvalidTerminationStateException;
 import com.arjuna.ats.jta.resources.LastResourceCommitOptimisation;
 import com.arjuna.ats.jta.utils.XAHelper;
+import com.arjuna.ats.jta.xa.XATxConverter;
 import com.arjuna.ats.jta.xa.XidImple;
 import com.arjuna.ats.jta.logging.*;
 import com.arjuna.ats.jta.xa.XAModifier;
@@ -1483,20 +1484,15 @@
 		return null;
 	}
 
-	private final Xid createXid(boolean branch, XAModifier theModifier, XAResource xaResource)
+	protected Xid createXid(boolean branch, XAModifier theModifier, XAResource xaResource)
 	{
-		Xid xid = baseXid();
-
-		if (xid != null)
-			return xid;
-
         String eisName = null;
         if(branch) {
             if(_xaResourceRecordWrappingPlugin != null) {
                 eisName = _xaResourceRecordWrappingPlugin.getEISName(xaResource);
             }
         }
-		xid = new XidImple(_theTransaction, branch, eisName);
+		Xid xid = new XidImple(_theTransaction, branch, eisName);
 
 		if (theModifier != null)
 		{
@@ -1597,7 +1593,7 @@
 
 	private static final Class LAST_RESOURCE_OPTIMISATION_INTERFACE;
 
-    private static final XAResourceRecordWrappingPlugin _xaResourceRecordWrappingPlugin;
+    protected static final XAResourceRecordWrappingPlugin _xaResourceRecordWrappingPlugin;
 
 	static
 	{

Modified: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca/TransactionImporterImple.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca/TransactionImporterImple.java	2011-10-14 23:30:14 UTC (rev 37543)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca/TransactionImporterImple.java	2011-10-14 23:41:34 UTC (rev 37544)
@@ -31,12 +31,15 @@
 
 package com.arjuna.ats.internal.jta.transaction.arjunacore.jca;
 
+import java.util.Iterator;
 import java.util.concurrent.ConcurrentHashMap;
 
-import javax.transaction.xa.*;
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.Xid;
 
 import com.arjuna.ats.arjuna.common.Uid;
 import com.arjuna.ats.internal.jta.transaction.arjunacore.subordinate.jca.TransactionImple;
+import com.arjuna.ats.internal.jta.xa.XID;
 import com.arjuna.ats.jta.xa.XidImple;
 
 public class TransactionImporterImple implements TransactionImporter
@@ -92,7 +95,7 @@
 		{
 			imported = new TransactionImple(timeout, xid);
 
-			_transactions.put(new XidImple(xid), imported);
+			_transactions.put(new SubordinateXidImple(xid), imported);
 		}
 
 		return imported;
@@ -130,8 +133,9 @@
 
 		if (tx == null)
 		{
-			_transactions.put(recovered.baseXid(), recovered);
 
+			Xid baseXid = recovered.baseXid();
+			_transactions.put(new SubordinateXidImple(baseXid), recovered);
 			recovered.recordTransaction();
 
 			return recovered;
@@ -162,7 +166,7 @@
 		if (xid == null)
 			throw new IllegalArgumentException();
 
-		SubordinateTransaction tx = _transactions.get(new XidImple(xid));
+		SubordinateTransaction tx = _transactions.get(new SubordinateXidImple(xid));
 
 		if (tx == null)
 			return null;
@@ -192,9 +196,46 @@
 		if (xid == null)
 			throw new IllegalArgumentException();
 
-		_transactions.remove(new XidImple(xid));
+		_transactions.remove(new SubordinateXidImple(xid));
 	}
 
-	private static ConcurrentHashMap<Xid, SubordinateTransaction> _transactions = new ConcurrentHashMap<Xid, SubordinateTransaction>();
+	private static ConcurrentHashMap<SubordinateXidImple, SubordinateTransaction> _transactions = new ConcurrentHashMap<SubordinateXidImple, SubordinateTransaction>();
+	
+	private class SubordinateXidImple extends XidImple {
+		public SubordinateXidImple(Xid xid) {
+			super(xid);
+		}
 
-}
\ No newline at end of file
+		/**
+		 * Test equality as being part of the same global transaction
+		 */
+		@Override
+		public boolean equals(Object obj) {
+			boolean toReturn = false;
+			if (obj instanceof SubordinateXidImple)
+			{
+				toReturn = isSameTransaction(((SubordinateXidImple)obj));
+			}
+			return toReturn;
+		}
+
+		/**
+		 * Generate the hash code for the xid, subordinates are diffed on the gtrid only.
+		 * 
+		 * @param xid
+		 *            The xid.
+		 * @return The hash code.
+		 */
+		@Override
+		protected int getHash(final XID xid) {
+			if (xid == null) {
+				return 0;
+			}
+			return generateHash(xid.formatID, xid.data, 0,
+					xid.gtrid_length);
+		}
+		
+	}
+
+}
+

Modified: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/subordinate/TransactionImple.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/subordinate/TransactionImple.java	2011-10-14 23:30:14 UTC (rev 37543)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/subordinate/TransactionImple.java	2011-10-14 23:41:34 UTC (rev 37544)
@@ -38,17 +38,21 @@
 import com.arjuna.ats.jta.exceptions.InvalidTerminationStateException;
 import com.arjuna.ats.jta.exceptions.UnexpectedConditionException;
 import com.arjuna.ats.jta.logging.*;
+import com.arjuna.ats.jta.xa.XAModifier;
+import com.arjuna.ats.jta.xa.XATxConverter;
+import com.arjuna.ats.jta.xa.XidImple;
 
 import java.lang.IllegalStateException;
 
 import javax.transaction.*;
+import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
 
 // https://jira.jboss.org/jira/browse/JBTM-384
 
 public class TransactionImple extends
 		com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple
 {
-
 	/**
 	 * Create a new transaction with the specified timeout.
 	 */
@@ -356,4 +360,36 @@
     	return true;
     }
 
+	@Override
+	protected Xid createXid(boolean branch, XAModifier theModifier, XAResource xaResource)
+	{
+		Xid xid = baseXid();
+
+		// We can have subordinate XIDs that can be editted
+		if (xid.getFormatId() != XATxConverter.FORMAT_ID)
+			return xid;
+
+        String eisName = null;
+        if(branch) {
+            if(_xaResourceRecordWrappingPlugin != null) {
+                eisName = _xaResourceRecordWrappingPlugin.getEISName(xaResource);
+            }
+        }
+		xid = new XidImple(xid, branch, eisName);
+
+		if (theModifier != null)
+		{
+			try
+			{
+				xid = theModifier.createXid((XidImple) xid);
+			}
+			catch (Exception e)
+			{
+				e.printStackTrace();
+			}
+		}
+
+		return xid;
+	}
+
 }

Modified: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/jta/xa/XidImple.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/jta/xa/XidImple.java	2011-10-14 23:30:14 UTC (rev 37543)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/jta/xa/XidImple.java	2011-10-14 23:41:34 UTC (rev 37544)
@@ -62,10 +62,7 @@
 	}
 
 	public XidImple(Xid xid) {
-		_theXid = null;
-
-		copy(xid);
-		hashCode = getHash(_theXid);
+		this(xid, false);
 	}
 
 	public XidImple (Xid xid, boolean subordinate)
@@ -74,17 +71,11 @@
 
 		copy(xid);
 		
+		// If this is a subordinate transaction and it is one of ours, bump up the parent node name
 		if (subordinate && _theXid.formatID == XATxConverter.FORMAT_ID) {
-			int offset = Uid.UID_SIZE + 4 + Uid.UID_SIZE;
-			_theXid.data[offset + 4] = _theXid.data[offset + 0];
-			_theXid.data[offset + 5] = _theXid.data[offset + 1];
-			_theXid.data[offset + 6] = _theXid.data[offset + 2];
-			_theXid.data[offset + 7] = _theXid.data[offset + 3];
-			int xaNodeName = TxControl.getXANodeName();
-			_theXid.data[offset + 0] = (byte) (xaNodeName >>> 24);
-			_theXid.data[offset + 1] = (byte) (xaNodeName >>> 16);
-			_theXid.data[offset + 2] = (byte) (xaNodeName >>> 8);
-			_theXid.data[offset + 3] = (byte) (xaNodeName >>> 0);
+			int parentNodeName = XATxConverter.getSubordinateNodeName(_theXid);
+			XATxConverter.setParentNodeName(_theXid, parentNodeName);
+			XATxConverter.setSubordinateNodeName(_theXid, TxControl.getXANodeName());
 		}
 		hashCode = getHash(_theXid) ;
 	}
@@ -97,6 +88,14 @@
 		this(c.get_uid(), branch, eisName);
 	}
 
+	public XidImple(Xid xid, boolean branch, String eisName) {
+		this(xid, true);
+		if (branch) {
+			XATxConverter.setBranchUID(_theXid, new Uid());
+		}
+		XATxConverter.setEisName(_theXid, eisName);
+	}
+
 	public XidImple(Uid id) {
 		this(id, false, null);
 	}
@@ -187,6 +186,14 @@
 		return XATxConverter.getNodeName(_theXid);
 	}
 
+	public final int getSubordinateNodeName() {
+		return XATxConverter.getSubordinateNodeName(_theXid);
+	}
+
+	public final int getParentNodeName() {
+		return XATxConverter.getParentNodeName(_theXid);
+	}
+
 	public final XID getXID() {
 		return _theXid;
 	}
@@ -380,7 +387,7 @@
 	 *            The xid.
 	 * @return The hash code.
 	 */
-	private static int getHash(final XID xid) {
+	protected int getHash(final XID xid) {
 		if (xid == null) {
 			return 0;
 		}
@@ -398,7 +405,7 @@
 	 *            The bytes to include in the hash.
 	 * @return The new hash code.
 	 */
-	private static int generateHash(int hash, final byte[] bytes,
+	protected static int generateHash(int hash, final byte[] bytes,
 			final int start, final int length) {
 		for (int count = start; count < length; count++) {
 			hash = 31 * hash + bytes[count];



More information about the jboss-svn-commits mailing list