[jboss-svn-commits] JBL Code SVN: r30075 - in labs/jbosstm/trunk: ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils and 5 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Nov 9 13:32:34 EST 2009


Author: jhalliday
Date: 2009-11-09 13:32:34 -0500 (Mon, 09 Nov 2009)
New Revision: 30075

Modified:
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/xa/XID.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/XATxConverter.java
   labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/recovery/arjunacore/XARecoveryModule.java
   labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/utils/XAUtils.java
   labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/jta/xa/XidImple.java
   labs/jbosstm/trunk/ArjunaJTA/tsmx/bin/com/arjuna/ats/tools/objectstorebrowser/ToolInitializer.java
   labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/utils/Utility.java
Log:
Refactoring of Xid handling. JBTM-653


Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/xa/XID.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/xa/XID.java	2009-11-09 15:42:37 UTC (rev 30074)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/xa/XID.java	2009-11-09 18:32:34 UTC (rev 30075)
@@ -31,6 +31,8 @@
 
 package com.arjuna.ats.arjuna.xa;
 
+import com.arjuna.ats.internal.arjuna.utils.XATxConverter;
+
 import java.io.Serializable;
 
 /**
@@ -141,6 +143,13 @@
 	{
         // controversial and not too robust. see JBTM-297 before messing with this.
 
+        if(formatID == XATxConverter.FORMAT_ID) {
+            // it's one of ours, we know how to inspect it:
+            return XATxConverter.getXIDString(this);
+        }
+
+        // it's a foreign id format, use a general algorithm:
+
         StringBuilder stringBuilder = new StringBuilder();
         stringBuilder.append("< ");
         stringBuilder.append(formatID);
@@ -149,11 +158,16 @@
         stringBuilder.append(", ");
         stringBuilder.append(bqual_length);
         stringBuilder.append(", ");
-        stringBuilder.append(new String(data, 0, gtrid_length)); // gtrid
+
+        for (int i = 0; i < gtrid_length; i++) {
+            stringBuilder.append(data[i]);
+        }
         stringBuilder.append(", ");
-        stringBuilder.append(new String(data, gtrid_length, bqual_length)); // the bqual
+        for (int i = 0; i < bqual_length; i++) {
+            stringBuilder.append(gtrid_length+data[i]);
+        }
+
         stringBuilder.append(" >");
-
         return stringBuilder.toString();
 	}
 

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/XATxConverter.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/XATxConverter.java	2009-11-09 15:42:37 UTC (rev 30074)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/XATxConverter.java	2009-11-09 18:32:34 UTC (rev 30075)
@@ -35,6 +35,8 @@
 import com.arjuna.ats.arjuna.xa.XID;
 import com.arjuna.ats.arjuna.coordinator.TxControl;
 
+import java.io.UnsupportedEncodingException;
+
 /**
  * @author Mark Little (mark.little at arjuna.com)
  * @version $Id: XATxConverter.java 2342 2006-03-30 13:06:17Z  $
@@ -43,79 +45,77 @@
 
 public class XATxConverter
 {
+    public static final int FORMAT_ID = 131076; // different from JTS ones.
 
-    public static final int FORMAT_ID = 131075; // different from JTS ones.
-    public static final char NODE_SEPARATOR = '#';
-
     public static XID getXid (Uid uid, boolean branch) throws IllegalStateException
     {
-	return getXid(uid, branch, FORMAT_ID);
+        return getXid(uid, branch, FORMAT_ID);
     }
 
     public static XID getXid (Uid uid, boolean branch, int formatId) throws IllegalStateException
     {
-	if (branch)
-	    return getXid(uid, new Uid(), formatId);
-	else
-	    return getXid(uid, Uid.nullUid(), formatId);
+        if (branch)
+            return getXid(uid, new Uid(), formatId, null);
+        else
+            return getXid(uid, Uid.nullUid(), formatId, null);
     }
 
-    public static XID getXid (Uid uid, Uid branch, int formatId) throws IllegalStateException
+    private static XID getXid(Uid uid, Uid branch, int formatId, String eisNameString) throws IllegalStateException
     {
-	if (uid == null)
-	    throw new IllegalStateException();
-	
-	byte[] nodeName = TxControl.getXANodeName();
-	String s = uid.stringForm();
-	int uidLen = s.length()+nodeName.length+1;
+        if (uid == null) {
+    	    throw new IllegalStateException();
+        }
 
-	if (uidLen > com.arjuna.ats.arjuna.xa.XID.MAXGTRIDSIZE)  // Uid is too long!!!!
-	{
-	    throw new IllegalStateException();
-	}
-	else
-	{
-	    try
-	    {
-		XID xid = new XID();
-		    
-		xid.formatID = formatId;
-		xid.gtrid_length = uidLen;
+        XID xid = new XID();
+        xid.formatID = formatId;
 
-		/*
-		 * Copy in the XA node identifier first.
-		 */
+        // gtrid is uid byte form followed by as many chars of the node name as will fit.
+        byte[] gtridUid = uid.getBytes();
 
-		System.arraycopy(nodeName, 0, xid.data, 0, nodeName.length);
-		
-		xid.data[nodeName.length] = NODE_SEPARATOR;
-		
-		byte[] b = s.getBytes();
+        if (gtridUid.length > XID.MAXBQUALSIZE) {
+            throw new IllegalStateException(); // Uid is too long!!!!
+        }
 
-		/*
-		 * Which way round do we fill in the structure?
-		 */
+        int spareGtridBytes = XID.MAXGTRIDSIZE - gtridUid.length;
+        byte[] nodeName = TxControl.getXANodeName();
+        int nodeNameLengthToUse =  nodeName.length;
+        if( nodeName.length > spareGtridBytes) {
+            nodeNameLengthToUse = spareGtridBytes;
+        }
+        xid.gtrid_length = gtridUid.length+nodeNameLengthToUse;
 
-		System.arraycopy(b, 0, xid.data, nodeName.length+1, b.length);
-		    
-		if (branch.notEquals(Uid.nullUid()))
+        // src, srcPos, dest, destPos, length
+        System.arraycopy(gtridUid, 0, xid.data, 0, gtridUid.length);
+        System.arraycopy(nodeName, 0, xid.data, gtridUid.length, nodeNameLengthToUse);
+
+        
+        if (branch.notEquals(Uid.nullUid()))
 		{
-		    String bs = branch.stringForm();
-		    int bsLen = bs.length();
-		    
-		    b = bs.getBytes();
+            // bqual is uid byte form plus EIS name.
+            byte[] bqualUid = branch.getBytes();
 
-		    if (bsLen > XID.MAXBQUALSIZE) // Uid is too long!!!!
-			throw new IllegalStateException();
-		    else
-		    {
-			xid.bqual_length = bsLen;
-		    
-			System.arraycopy (b, 0, xid.data, xid.gtrid_length, bsLen);
-		    }
-		
-		    bs = null;
-		}
+            if (bqualUid.length > XID.MAXBQUALSIZE) {
+                throw new IllegalStateException(); // Uid is too long!!!!
+            }
+
+            int spareBqualBytes = XID.MAXBQUALSIZE - bqualUid.length;
+            byte[] eisName;
+            try {
+                // caution: we may truncate the byte[] to fit, so double byte encodings are best avoided.
+                eisName = (eisNameString == null ? new byte[0] : eisNameString.getBytes("US-ASCII"));
+            } catch(UnsupportedEncodingException e) {
+                eisName = new byte[0];
+            }
+            int eisNameLengthToUse = eisName.length;
+            if( eisName.length > spareBqualBytes) {
+                eisNameLengthToUse = spareBqualBytes;
+            }
+            xid.bqual_length = bqualUid.length+eisNameLengthToUse;
+
+            // src, srcPos, dest, destPos, length
+            System.arraycopy (bqualUid, 0, xid.data, xid.gtrid_length, bqualUid.length);
+            System.arraycopy (eisName, 0, xid.data, xid.gtrid_length+bqualUid.length, eisNameLengthToUse);
+        }
 		else
 		{
 		    /*
@@ -125,64 +125,88 @@
 		     * it appears as though it must always be 64.
 		     * (At least for zero branches.)
 		     */
-
 		    xid.data[xid.gtrid_length] = (byte) 0;
 		    xid.bqual_length = 64;
 		}
-		    
-		b = null;
-		s = null;
 
-		return xid;
-	    }
-	    catch (Exception e)
-	    {
-		e.printStackTrace();
-		
-		throw new IllegalStateException(e.toString());
-	    }
-	}
+        return xid;
     }
 
-    public static Uid getUid (com.arjuna.ats.arjuna.xa.XID xid)
+    public static Uid getUid(XID xid)
     {
-	if (xid == null)
-	    return Uid.nullUid();
-	
-	if ((xid.formatID == -1) || (xid.gtrid_length <= 0)) // means null XID
-	{
-	    return Uid.nullUid();
-	}
-	else
-	{
-	    int nodeNameIndex = 0;
-	    
-	    for (int i = 0; i < xid.gtrid_length; i++)
-	    {
-		if (xid.data[i] == NODE_SEPARATOR)
-		{
-		    nodeNameIndex = i+1;
-		    break;
-		}
-	    }
-	    
-	    byte[] buff = new byte[xid.gtrid_length-nodeNameIndex];
+        if (xid == null || xid.formatID != FORMAT_ID) {
+            return Uid.nullUid();
+        }
 
-	    System.arraycopy(xid.data, nodeNameIndex, buff, 0, buff.length);
+        // The Uid byte are the first in the data array, so we just pass
+        // in the whole thing and the additional trailing data is ignored.
+        Uid tx = new Uid(xid.data);
+        return tx;
+    }
 
-	    Uid tx = new Uid(new String(buff), true);
+    public static String getNodeName(XID xid)
+    {
+        if(xid.formatID != FORMAT_ID) {
+            return null;
+        }
 
-	    buff = null;
+        // the node name follows the Uid with no separator, so the only
+        // way to tell where it starts is to figure out how long the Uid is.
+        Uid uid = getUid(xid);
+        int uidLength = uid.getBytes().length;
+        int nameLength = xid.gtrid_length-uidLength;
+        byte[] nodeName = new byte[nameLength];
+        System.arraycopy(xid.data, uidLength, nodeName, 0, nodeName.length);
+        
+        try {
+            return new String(nodeName, "US-ASCII");
+        } catch(UnsupportedEncodingException e) {
+            // should never happen, we use a required charset.
+            return "<failed to get nodename>";
+        }
+    }
 
-	    return tx;
-	}
+    private static Uid getBranchUid(XID xid)
+    {
+        if (xid == null || xid.formatID != FORMAT_ID) {
+            return Uid.nullUid();
+        }
+
+        byte[] bqual = new byte[xid.bqual_length];
+        System.arraycopy(xid.data, xid.gtrid_length, bqual, 0, xid.bqual_length);
+
+        // The Uid byte are the first in the data array, so we just pass
+        // in the whole thing and the additional trailing data is ignored.
+        Uid tx = new Uid(bqual);
+        return tx;
     }
 
-    public static Uid getBranch (com.arjuna.ats.arjuna.xa.XID xid)
+    private static String getEISName(XID xid)
     {
-        // TODO check why null.
-        
-	return null;
+        return "unknown eis name"; // TODO
     }
-    
+
+    public static String getXIDString(XID xid)
+    {
+        // companion method to XID.toString - try to keep them in sync.
+
+        StringBuilder stringBuilder = new StringBuilder();
+        stringBuilder.append("< formatId=");
+        stringBuilder.append(xid.formatID);
+        stringBuilder.append(", gtrid_length=");
+        stringBuilder.append(xid.gtrid_length);
+        stringBuilder.append(", bqual_length=");
+        stringBuilder.append(xid.bqual_length);
+        stringBuilder.append(", tx_uid=");
+        stringBuilder.append(getUid(xid).stringForm());
+        stringBuilder.append(", node_name=");
+        stringBuilder.append(getNodeName(xid));
+        stringBuilder.append(", branch_uid=");
+        stringBuilder.append(getBranchUid(xid));
+        stringBuilder.append(", eis_name=");
+        stringBuilder.append(getEISName(xid));
+        stringBuilder.append(" >");
+
+        return stringBuilder.toString();
+    }
 }

Modified: labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/recovery/arjunacore/XARecoveryModule.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/recovery/arjunacore/XARecoveryModule.java	2009-11-09 15:42:37 UTC (rev 30074)
+++ labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/recovery/arjunacore/XARecoveryModule.java	2009-11-09 18:32:34 UTC (rev 30075)
@@ -1195,8 +1195,7 @@
 		}
 
 		XidImple theXid = new XidImple(xid);
-		Uid u = com.arjuna.ats.internal.arjuna.utils.XATxConverter
-				.getUid(theXid.getXID());
+		Uid u = theXid.getTransactionUid();
 
 		if (!u.equals(Uid.nullUid()))
 		{

Modified: labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/utils/XAUtils.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/utils/XAUtils.java	2009-11-09 15:42:37 UTC (rev 30074)
+++ labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/utils/XAUtils.java	2009-11-09 18:32:34 UTC (rev 30075)
@@ -31,7 +31,7 @@
 
 package com.arjuna.ats.internal.jta.utils;
 
-import com.arjuna.ats.internal.arjuna.utils.XATxConverter;
+import com.arjuna.ats.jta.xa.XidImple;
 
 import javax.transaction.xa.*;
 
@@ -76,22 +76,13 @@
 
 	public static final String getXANodeName (Xid xid)
 	{
-		byte[] gid = xid.getGlobalTransactionId();
-		int nodeIndex = -1;
-
-		for (int i = 0; i < gid.length; i++)
-		{
-			if (gid[i] == XATxConverter.NODE_SEPARATOR)
-			{
-				nodeIndex = i;
-				break;
-			}
-		}
-
-		if (nodeIndex != -1)
-			return new String(gid, 0, nodeIndex);
-		else
-			return null;
+        XidImple xidImple;
+        if(xid instanceof XidImple) {
+            xidImple = (XidImple)xid;
+        } else {
+            xidImple = new XidImple(xid);
+        }
+        return xidImple.getNodeName();
 	}
 
 	private static final String ORACLE = "oracle";

Modified: labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/jta/xa/XidImple.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/jta/xa/XidImple.java	2009-11-09 15:42:37 UTC (rev 30074)
+++ labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/jta/xa/XidImple.java	2009-11-09 18:32:34 UTC (rev 30075)
@@ -102,21 +102,6 @@
 		hashCode = getHash(_theXid) ;
 	}
 
-	public XidImple (Uid id, Uid branch, int formatId)
-	{
-		try
-		{
-			_theXid = XATxConverter.getXid(id, branch, formatId);
-		}
-		catch (Exception e)
-		{
-			_theXid = null;
-
-			// abort or throw exception?
-		}
-		hashCode = getHash(_theXid) ;
-	}
-
 	public XidImple (com.arjuna.ats.arjuna.xa.XID x)
 	{
 		_theXid = x;
@@ -200,6 +185,14 @@
 			return null;
 	}
 
+    public final Uid getTransactionUid() {
+        return XATxConverter.getUid(_theXid);
+    }
+
+    public final String getNodeName() {
+        return XATxConverter.getNodeName(_theXid);
+    }
+
 	public final com.arjuna.ats.arjuna.xa.XID getXID ()
 	{
 		return _theXid;

Modified: labs/jbosstm/trunk/ArjunaJTA/tsmx/bin/com/arjuna/ats/tools/objectstorebrowser/ToolInitializer.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTA/tsmx/bin/com/arjuna/ats/tools/objectstorebrowser/ToolInitializer.java	2009-11-09 15:42:37 UTC (rev 30074)
+++ labs/jbosstm/trunk/ArjunaJTA/tsmx/bin/com/arjuna/ats/tools/objectstorebrowser/ToolInitializer.java	2009-11-09 18:32:34 UTC (rev 30075)
@@ -5,7 +5,6 @@
 import com.arjuna.ats.tools.objectstorebrowser.stateviewers.viewers.UidInfo;
 import com.arjuna.ats.arjuna.common.Uid;
 import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple;
-import com.arjuna.ats.internal.arjuna.utils.XATxConverter;
 import com.arjuna.ats.jta.xa.XidImple;
 import com.arjuna.ats.jta.common.jtaPropertyManager;
 
@@ -51,8 +50,9 @@
 
             public Uid toUid(Xid xid)
             {
-                if (xid instanceof XidImple)
-                    return XATxConverter.getUid(((XidImple) xid).getXID());
+                if (xid instanceof XidImple) {
+                    ((XidImple)xid).getTransactionUid();
+                }
 
                 return null;
             }

Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/utils/Utility.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/utils/Utility.java	2009-11-09 15:42:37 UTC (rev 30074)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/utils/Utility.java	2009-11-09 18:32:34 UTC (rev 30075)
@@ -34,7 +34,6 @@
 import com.arjuna.ats.arjuna.common.Uid;
 import com.arjuna.ats.arjuna.coordinator.BasicAction;
 import com.arjuna.ats.arjuna.coordinator.TxControl;
-import com.arjuna.ats.arjuna.xa.XID;
 
 import com.arjuna.ats.internal.arjuna.utils.XATxConverter;
 
@@ -181,11 +180,6 @@
 	}
     }
 
-    public static Uid getUid (XID xid)
-    {
-	return XATxConverter.getUid(xid);
-    }
-
     /**
      * If this control refers to an JBoss transaction then return its native
      * Uid representation. Otherwise return Uid.nullUid().



More information about the jboss-svn-commits mailing list