[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