[jboss-svn-commits] JBL Code SVN: r37553 - in labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed: impl and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat Oct 15 07:55:21 EDT 2011


Author: tomjenkinson
Date: 2011-10-15 07:55:21 -0400 (Sat, 15 Oct 2011)
New Revision: 37553

Added:
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/DummyRemoteException.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/IsolatableServersClassLoader.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/LocalServer.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/RemoteServer.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxySynchronization.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResource.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ServerImpl.java
Removed:
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/IsolatableServersClassLoader.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/LocalServer.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/RemoteServer.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ProxySynchronization.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ProxyXAResource.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ProxyXAResourceRecovery.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ServerImpl.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxySynchronization.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResource.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ServerImpl.java
Modified:
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/SimpleIsolatedServers.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResourceRecovery.java
Log:
JBTM-916 updated to make separate functionality by classloader

Deleted: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/IsolatableServersClassLoader.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/IsolatableServersClassLoader.java	2011-10-15 11:06:44 UTC (rev 37552)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/IsolatableServersClassLoader.java	2011-10-15 11:55:21 UTC (rev 37553)
@@ -1,91 +0,0 @@
-package com.arjuna.ats.jta.distributed;
-
-import java.io.ByteArrayOutputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.HashMap;
-import java.util.Map;
-
-public class IsolatableServersClassLoader extends ClassLoader {
-
-	private Map<String, Class<?>> clazzMap = new HashMap<String, Class<?>>();
-	private Method m;
-
-	public IsolatableServersClassLoader(ClassLoader parent) throws SecurityException, NoSuchMethodException {
-		super(parent);
-		m = ClassLoader.class.getDeclaredMethod("findLoadedClass", new Class[] { String.class });
-		m.setAccessible(true);
-	}
-
-	@Override
-	protected Class<?> findClass(String name) throws ClassNotFoundException {
-		if (clazzMap.containsKey(name)) {
-			return clazzMap.get(name);
-		}
-		return super.findClass(name);
-	}
-
-	public Class<?> loadClass(String name) throws ClassNotFoundException {
-		Class<?> clazz = null;
-		if (clazzMap.containsKey(name)) {
-			clazz = clazzMap.get(name);
-		}
-
-		try {
-			ClassLoader parent2 = getParent();
-			Object test1 = m.invoke(parent2, name);
-			if (test1 != null) {
-				
-				if (!name.equals("")) {
-					clazz = super.loadClass(name);
-				}
-			} else {
-				try {
-					String url = "file:" + System.getProperty("user.dir") + "/bin/" + name.replace('.', '/') + ".class";
-					URL myUrl = new URL(url);
-					try {
-						URLConnection connection = myUrl.openConnection();
-						InputStream input = connection.getInputStream();
-						ByteArrayOutputStream buffer = new ByteArrayOutputStream();
-						int data = input.read();
-
-						while (data != -1) {
-							buffer.write(data);
-							data = input.read();
-						}
-
-						input.close();
-
-						byte[] classData = buffer.toByteArray();
-
-						clazz = defineClass(name, classData, 0, classData.length);
-						clazzMap.put(name, clazz);
-					} catch (FileNotFoundException fnfe) {
-						return super.loadClass(name);
-					}
-				} catch (MalformedURLException e) {
-					e.printStackTrace();
-				} catch (IOException e) {
-					e.printStackTrace();
-				}
-			}
-		} catch (IllegalArgumentException e1) {
-			// TODO Auto-generated catch block
-			e1.printStackTrace();
-		} catch (IllegalAccessException e1) {
-			// TODO Auto-generated catch block
-			e1.printStackTrace();
-		} catch (InvocationTargetException e1) {
-			// TODO Auto-generated catch block
-			e1.printStackTrace();
-		}
-
-		return clazz;
-	}
-}
\ No newline at end of file

Deleted: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/LocalServer.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/LocalServer.java	2011-10-15 11:06:44 UTC (rev 37552)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/LocalServer.java	2011-10-15 11:55:21 UTC (rev 37553)
@@ -1,45 +0,0 @@
-package com.arjuna.ats.jta.distributed;
-
-import java.io.IOException;
-import java.net.ConnectException;
-import java.util.List;
-
-import javax.transaction.HeuristicCommitException;
-import javax.transaction.HeuristicMixedException;
-import javax.transaction.HeuristicRollbackException;
-import javax.transaction.InvalidTransactionException;
-import javax.transaction.NotSupportedException;
-import javax.transaction.RollbackException;
-import javax.transaction.Synchronization;
-import javax.transaction.SystemException;
-import javax.transaction.TransactionManager;
-import javax.transaction.xa.XAException;
-import javax.transaction.xa.XAResource;
-import javax.transaction.xa.Xid;
-
-import com.arjuna.ats.arjuna.common.CoreEnvironmentBeanException;
-
-public interface LocalServer {
-
-	public void initialise(Integer nodeName) throws CoreEnvironmentBeanException, IOException;
-
-	public Integer getNodeName();
-
-	public TransactionManager getTransactionManager() throws NotSupportedException, SystemException;
-
-	public void doRecoveryManagerScan();
-
-	public long getTimeLeftBeforeTransactionTimeout() throws RollbackException;
-
-	public Xid getCurrentXid() throws SystemException;
-	
-	public void setOffline(boolean offline);
-
-	public XAResource generateProxyXAResource(Integer localServerName, Integer remoteServerName);
-
-	public Synchronization generateProxySynchronization(Integer localServerName, Integer remoteServerName, Xid toRegisterAgainst);
-
-	public boolean importTransaction(int remainingTimeout, Xid toImport) throws XAException, InvalidTransactionException, IllegalStateException,
-			SystemException;
-
-}

Deleted: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/RemoteServer.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/RemoteServer.java	2011-10-15 11:06:44 UTC (rev 37552)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/RemoteServer.java	2011-10-15 11:55:21 UTC (rev 37553)
@@ -1,29 +0,0 @@
-package com.arjuna.ats.jta.distributed;
-
-import java.net.ConnectException;
-import java.util.List;
-
-import javax.transaction.HeuristicCommitException;
-import javax.transaction.HeuristicMixedException;
-import javax.transaction.HeuristicRollbackException;
-import javax.transaction.SystemException;
-import javax.transaction.xa.XAException;
-import javax.transaction.xa.Xid;
-
-public interface RemoteServer {
-
-	public int propagatePrepare(Xid xid) throws XAException, ConnectException;
-
-	public void propagateCommit(Xid xid, boolean onePhase) throws IllegalStateException, HeuristicMixedException, HeuristicRollbackException,
-			HeuristicCommitException, SystemException, XAException, ConnectException;
-
-	public void propagateRollback(Xid xid) throws IllegalStateException, HeuristicMixedException, HeuristicCommitException, HeuristicRollbackException,
-			SystemException, XAException, ConnectException;
-
-	public Xid[] propagateRecover(List<Integer> startScanned, int flag) throws XAException, ConnectException;
-
-	public void propagateForget(Xid xid) throws XAException, ConnectException;
-
-	public void propagateBeforeCompletion(Xid xid) throws XAException, SystemException, ConnectException;
-
-}

Modified: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/SimpleIsolatedServers.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/SimpleIsolatedServers.java	2011-10-15 11:06:44 UTC (rev 37552)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/SimpleIsolatedServers.java	2011-10-15 11:55:21 UTC (rev 37553)
@@ -24,6 +24,9 @@
 import org.junit.Test;
 
 import com.arjuna.ats.arjuna.common.CoreEnvironmentBeanException;
+import com.arjuna.ats.jta.distributed.server.IsolatableServersClassLoader;
+import com.arjuna.ats.jta.distributed.server.LocalServer;
+import com.arjuna.ats.jta.distributed.server.RemoteServer;
 
 public class SimpleIsolatedServers {
 	private static LocalServer[] localServers = new LocalServer[3];
@@ -48,9 +51,9 @@
 		ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
 		for (int i = 0; i < localServers.length; i++) {
 			IsolatableServersClassLoader classLoader = new IsolatableServersClassLoader(contextClassLoader);
-			localServers[i] = (LocalServer) classLoader.loadClass("com.arjuna.ats.jta.distributed.impl.ServerImpl").newInstance();
+			localServers[i] = (LocalServer) classLoader.loadClass("com.arjuna.ats.jta.distributed.server.impl.ServerImpl").newInstance();
 			localServers[i].initialise((i + 1) * 1000);
-			remoteServers[i] = (RemoteServer) localServers[i];
+			remoteServers[i] = localServers[i].connectTo();
 		}
 	}
 

Deleted: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ProxySynchronization.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ProxySynchronization.java	2011-10-15 11:06:44 UTC (rev 37552)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ProxySynchronization.java	2011-10-15 11:55:21 UTC (rev 37553)
@@ -1,42 +0,0 @@
-package com.arjuna.ats.jta.distributed.impl;
-
-import java.net.ConnectException;
-
-import javax.transaction.Synchronization;
-import javax.transaction.SystemException;
-import javax.transaction.xa.XAException;
-import javax.transaction.xa.Xid;
-
-import com.arjuna.ats.jta.distributed.SimpleIsolatedServers;
-
-public class ProxySynchronization implements Synchronization {
-
-	private int localServerName;
-	private int remoteServerName;
-	private Xid toRegisterAgainst;
-
-	public ProxySynchronization(int localServerName, int remoteServerName, Xid toRegisterAgainst) {
-		this.localServerName = localServerName;
-		this.remoteServerName = remoteServerName;
-		this.toRegisterAgainst = toRegisterAgainst;
-	}
-
-	@Override
-	public void beforeCompletion() {
-		System.out.println("ProxySynchronization (" + localServerName + ":" + remoteServerName + ") beforeCompletion");
-		try {
-			SimpleIsolatedServers.lookup(remoteServerName).propagateBeforeCompletion(toRegisterAgainst);
-		} catch (XAException e) {
-			e.printStackTrace();
-		} catch (SystemException e) {
-			e.printStackTrace();
-		} catch (ConnectException e) {
-			e.printStackTrace();
-		}
-	}
-
-	@Override
-	public void afterCompletion(int status) {
-		// These are not proxied but are handled during local commits
-	}
-}

Deleted: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ProxyXAResource.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ProxyXAResource.java	2011-10-15 11:06:44 UTC (rev 37552)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ProxyXAResource.java	2011-10-15 11:55:21 UTC (rev 37553)
@@ -1,320 +0,0 @@
-package com.arjuna.ats.jta.distributed.impl;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.net.ConnectException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.transaction.HeuristicCommitException;
-import javax.transaction.HeuristicMixedException;
-import javax.transaction.HeuristicRollbackException;
-import javax.transaction.SystemException;
-import javax.transaction.xa.XAException;
-import javax.transaction.xa.XAResource;
-import javax.transaction.xa.Xid;
-
-import org.jboss.tm.XAResourceWrapper;
-
-import com.arjuna.ats.arjuna.common.Uid;
-import com.arjuna.ats.jta.distributed.SimpleIsolatedServers;
-
-public class ProxyXAResource implements XAResource, XAResourceWrapper {
-
-	public static final ThreadLocal<List<Integer>> RECOVERY_SCAN_STARTED = new ThreadLocal<List<Integer>>();
-
-	private int transactionTimeout;
-	private Xid xid;
-	private Integer remoteServerName = -1;
-	private File file;
-	private Integer localServerName;
-
-	public ProxyXAResource(Integer localServerName, Integer remoteServerName) {
-		this.localServerName = localServerName;
-		this.remoteServerName = remoteServerName;
-	}
-
-	public ProxyXAResource(Integer localServerName, File file) throws IOException {
-		this.localServerName = localServerName;
-		this.file = file;
-		DataInputStream fis = new DataInputStream(new FileInputStream(file));
-		final int formatId = fis.readInt();
-		final int gtrid_length = fis.readInt();
-		final byte[] gtrid = new byte[gtrid_length];
-		fis.read(gtrid, 0, gtrid_length);
-		final int bqual_length = fis.readInt();
-		final byte[] bqual = new byte[bqual_length];
-		fis.read(bqual, 0, bqual_length);
-		int remoteServerName = fis.readInt();
-		this.remoteServerName = remoteServerName;
-		this.xid = new Xid() {
-			@Override
-			public byte[] getGlobalTransactionId() {
-				return gtrid;
-			}
-
-			@Override
-			public int getFormatId() {
-				return formatId;
-			}
-
-			@Override
-			public byte[] getBranchQualifier() {
-				return bqual;
-			}
-
-			@Override
-			public boolean equals(Object object) {
-				Xid xid = (Xid) object;
-				if (xid == null)
-					return false;
-
-				if (xid == this)
-					return true;
-				else {
-
-					if (xid.getFormatId() == formatId) {
-						byte[] gtx = xid.getGlobalTransactionId();
-						byte[] bql = xid.getBranchQualifier();
-						final int bqlength = (bql == null ? 0 : bql.length);
-
-						if ((gtrid.length == gtx.length) && (bqual.length == bqlength)) {
-							int i;
-
-							for (i = 0; i < gtrid.length; i++) {
-								if (gtrid[i] != gtx[i])
-									return false;
-							}
-
-							for (i = 0; i < bqual.length; i++) {
-								if (bqual[i] != bql[i])
-									return false;
-							}
-
-							return true;
-						}
-					}
-				}
-
-				return false;
-			}
-		};
-	}
-
-	public Xid getXid() {
-		return xid;
-	}
-
-	@Override
-	public void start(Xid xid, int flags) throws XAException {
-		System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_START   [" + xid + "]");
-		this.xid = xid;
-	}
-
-	@Override
-	public void end(Xid xid, int flags) throws XAException {
-		System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_END     [" + xid + "]");
-		this.xid = null;
-	}
-
-	@Override
-	public synchronized int prepare(Xid xid) throws XAException {
-		System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_PREPARE [" + xid + "]");
-
-		try {
-			File dir = new File(System.getProperty("user.dir") + "/tmp/ProxyXAResource/" + localServerName + "/");
-			dir.mkdirs();
-			file = new File(dir, new Uid().fileStringForm());
-
-			file.createNewFile();
-
-			final int formatId = xid.getFormatId();
-			final byte[] gtrid = xid.getGlobalTransactionId();
-			final int gtrid_length = gtrid.length;
-			final byte[] bqual = xid.getBranchQualifier();
-			final int bqual_length = bqual.length;
-
-			DataOutputStream fos = new DataOutputStream(new FileOutputStream(file));
-			fos.writeInt(formatId);
-			fos.writeInt(gtrid_length);
-			fos.write(gtrid, 0, gtrid_length);
-			fos.writeInt(bqual_length);
-			fos.write(bqual, 0, bqual_length);
-			fos.writeInt(remoteServerName);
-		} catch (IOException e) {
-			e.printStackTrace();
-			throw new XAException(XAException.XAER_RMERR);
-		}
-
-		try {
-			int propagatePrepare = SimpleIsolatedServers.lookup(remoteServerName).propagatePrepare(xid);
-			System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_PREPARED");
-			return propagatePrepare;
-		} catch (ConnectException ce) {
-			throw new XAException(XAException.XA_RETRY);
-		}
-	}
-
-	@Override
-	public synchronized void commit(Xid xid, boolean onePhase) throws XAException {
-		System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_COMMIT  [" + xid + "]");
-
-		try {
-			SimpleIsolatedServers.lookup(remoteServerName).propagateCommit(xid, onePhase);
-			System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_COMMITED");
-		} catch (IllegalStateException e) {
-			throw new XAException(XAException.XAER_INVAL);
-		} catch (HeuristicMixedException e) {
-			throw new XAException(XAException.XA_HEURMIX);
-		} catch (HeuristicRollbackException e) {
-			throw new XAException(XAException.XA_HEURRB);
-		} catch (HeuristicCommitException e) {
-			throw new XAException(XAException.XA_HEURCOM);
-		} catch (SystemException e) {
-			throw new XAException(XAException.XAER_PROTO);
-		} catch (ConnectException ce) {
-			throw new XAException(XAException.XA_RETRY);
-		}
-
-		if (file != null) {
-			file.delete();
-		}
-	}
-
-	@Override
-	public synchronized void rollback(Xid xid) throws XAException {
-		System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_ROLLBACK[" + xid + "]");
-		try {
-			SimpleIsolatedServers.lookup(remoteServerName).propagateRollback(xid);
-			System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_ROLLBACKED");
-		} catch (IllegalStateException e) {
-			throw new XAException(XAException.XAER_INVAL);
-		} catch (HeuristicMixedException e) {
-			throw new XAException(XAException.XA_HEURMIX);
-		} catch (HeuristicCommitException e) {
-			throw new XAException(XAException.XA_HEURCOM);
-		} catch (HeuristicRollbackException e) {
-			throw new XAException(XAException.XA_HEURRB);
-		} catch (SystemException e) {
-			throw new XAException(XAException.XAER_PROTO);
-		} catch (ConnectException ce) {
-			throw new XAException(XAException.XA_RETRY);
-		}
-
-		if (file != null) {
-			file.delete();
-		}
-	}
-
-	@Override
-	public Xid[] recover(int flag) throws XAException {
-		List<Integer> startScanned = RECOVERY_SCAN_STARTED.get();
-		if (startScanned == null) {
-			startScanned = new ArrayList<Integer>();
-			RECOVERY_SCAN_STARTED.set(startScanned);
-		}
-
-		int tocheck = (flag & XAResource.TMSTARTRSCAN);
-		if (tocheck == XAResource.TMSTARTRSCAN) {
-			System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_RECOVER [XAResource.TMSTARTRSCAN]: "
-					+ remoteServerName);
-
-			if (!startScanned.contains(remoteServerName)) {
-				startScanned.add(remoteServerName);
-
-				// Make sure that the remote server has recovered all
-				// transactions
-				try {
-					SimpleIsolatedServers.lookup(remoteServerName).propagateRecover(startScanned, flag);
-				} catch (ConnectException ce) {
-					throw new XAException(XAException.XA_RETRY);
-				} finally {
-					startScanned.remove((Integer) remoteServerName);
-				}
-			}
-
-			System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_RECOVERD[XAResource.TMSTARTRSCAN]: "
-					+ remoteServerName);
-		}
-		tocheck = (flag & XAResource.TMENDRSCAN);
-		if (tocheck == XAResource.TMENDRSCAN) {
-			System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_RECOVER [XAResource.TMENDRSCAN]: "
-					+ remoteServerName);
-
-			if (!startScanned.contains(remoteServerName)) {
-				try {
-					SimpleIsolatedServers.lookup(remoteServerName).propagateRecover(startScanned, flag);
-				} catch (ConnectException ce) {
-					throw new XAException(XAException.XA_RETRY);
-				} finally {
-					startScanned.remove((Integer) remoteServerName);
-				}
-			}
-
-			System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_RECOVERD[XAResource.TMENDRSCAN]: "
-					+ remoteServerName);
-		}
-
-		return new Xid[] { xid };
-	}
-
-	@Override
-	public void forget(Xid xid) throws XAException {
-		System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_FORGET  [" + xid + "]");
-		try {
-			SimpleIsolatedServers.lookup(remoteServerName).propagateForget(xid);
-			System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_FORGETED[" + xid + "]");
-		} catch (ConnectException ce) {
-			throw new XAException(XAException.XA_RETRY);
-		}
-	}
-
-	@Override
-	public int getTransactionTimeout() throws XAException {
-		return transactionTimeout;
-	}
-
-	@Override
-	public boolean setTransactionTimeout(int seconds) throws XAException {
-		this.transactionTimeout = seconds;
-		return true;
-	}
-
-	@Override
-	public boolean isSameRM(XAResource xares) throws XAException {
-		return xares.equals(this);
-	}
-
-	/**
-	 * I don't think this is used by TM.
-	 */
-	@Override
-	public XAResource getResource() {
-		return null;
-	}
-
-	/**
-	 * I don't think this is used by TM.
-	 */
-	@Override
-	public String getProductName() {
-		return null;
-	}
-
-	/**
-	 * I don't think this is used by TM.
-	 */
-	@Override
-	public String getProductVersion() {
-		return null;
-	}
-
-	@Override
-	public String getJndiName() {
-		return "ProxyXAResource";
-	}
-}

Deleted: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ProxyXAResourceRecovery.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ProxyXAResourceRecovery.java	2011-10-15 11:06:44 UTC (rev 37552)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ProxyXAResourceRecovery.java	2011-10-15 11:55:21 UTC (rev 37553)
@@ -1,33 +0,0 @@
-package com.arjuna.ats.jta.distributed.impl;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.transaction.xa.XAResource;
-
-import org.jboss.tm.XAResourceRecovery;
-
-
-public class ProxyXAResourceRecovery implements XAResourceRecovery {
-
-	private List<ProxyXAResource> resources = new ArrayList<ProxyXAResource>();
-
-	public ProxyXAResourceRecovery(int id) throws IOException {
-		File file = new File(System.getProperty("user.dir") + "/tmp/ProxyXAResource/" + id + "/");
-		if (file.exists() && file.isDirectory()) {
-			File[] listFiles = file.listFiles();
-			for (int i = 0; i < listFiles.length; i++) {
-				File currentFile = listFiles[i];
-				resources.add(new ProxyXAResource(id, currentFile));
-			}
-		}
-	}
-
-	@Override
-	public XAResource[] getXAResources() {
-		return resources.toArray(new XAResource[] {});
-	}
-
-}

Deleted: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ServerImpl.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ServerImpl.java	2011-10-15 11:06:44 UTC (rev 37552)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ServerImpl.java	2011-10-15 11:55:21 UTC (rev 37553)
@@ -1,241 +0,0 @@
-package com.arjuna.ats.jta.distributed.impl;
-
-import java.io.IOException;
-import java.net.ConnectException;
-import java.net.InetAddress;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.transaction.HeuristicCommitException;
-import javax.transaction.HeuristicMixedException;
-import javax.transaction.HeuristicRollbackException;
-import javax.transaction.InvalidTransactionException;
-import javax.transaction.RollbackException;
-import javax.transaction.Synchronization;
-import javax.transaction.SystemException;
-import javax.transaction.TransactionManager;
-import javax.transaction.xa.XAException;
-import javax.transaction.xa.XAResource;
-import javax.transaction.xa.Xid;
-
-import org.jboss.tm.TransactionTimeoutConfiguration;
-
-import com.arjuna.ats.arjuna.common.CoordinatorEnvironmentBean;
-import com.arjuna.ats.arjuna.common.CoreEnvironmentBean;
-import com.arjuna.ats.arjuna.common.CoreEnvironmentBeanException;
-import com.arjuna.ats.arjuna.common.ObjectStoreEnvironmentBean;
-import com.arjuna.ats.arjuna.common.RecoveryEnvironmentBean;
-import com.arjuna.ats.arjuna.coordinator.TxControl;
-import com.arjuna.ats.arjuna.recovery.RecoveryManager;
-import com.arjuna.ats.arjuna.tools.osb.mbean.ObjStoreBrowser;
-import com.arjuna.ats.internal.jbossatx.jta.XAResourceRecordWrappingPluginImpl;
-import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple;
-import com.arjuna.ats.internal.jta.transaction.arjunacore.jca.SubordinateTransaction;
-import com.arjuna.ats.internal.jta.transaction.arjunacore.jca.SubordinationManager;
-import com.arjuna.ats.jbossatx.jta.RecoveryManagerService;
-import com.arjuna.ats.jbossatx.jta.TransactionManagerService;
-import com.arjuna.ats.jta.common.JTAEnvironmentBean;
-import com.arjuna.ats.jta.distributed.RemoteServer;
-import com.arjuna.ats.jta.distributed.LocalServer;
-import com.arjuna.ats.jta.distributed.TestResourceRecovery;
-
-public class ServerImpl implements LocalServer, RemoteServer {
-
-	private int nodeName;
-	private RecoveryManagerService recoveryManagerService;
-	private TransactionManagerService transactionManagerService;
-	private boolean offline;
-
-	public void initialise(Integer serverName) throws CoreEnvironmentBeanException, IOException {
-		this.nodeName = serverName;
-
-		RecoveryEnvironmentBean recoveryEnvironmentBean = com.arjuna.ats.arjuna.common.recoveryPropertyManager.getRecoveryEnvironmentBean();
-		recoveryEnvironmentBean.setRecoveryBackoffPeriod(1);
-
-		recoveryEnvironmentBean.setRecoveryInetAddress(InetAddress.getByName("localhost"));
-		recoveryEnvironmentBean.setRecoveryPort(4712 + serverName);
-		recoveryEnvironmentBean.setTransactionStatusManagerInetAddress(InetAddress.getByName("localhost"));
-		recoveryEnvironmentBean.setTransactionStatusManagerPort(4713 + serverName);
-		List<String> recoveryModuleClassNames = new ArrayList<String>();
-
-		recoveryModuleClassNames.add("com.arjuna.ats.internal.arjuna.recovery.AtomicActionRecoveryModule");
-		recoveryModuleClassNames.add("com.arjuna.ats.internal.txoj.recovery.TORecoveryModule");
-		recoveryModuleClassNames.add("com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule");
-		recoveryEnvironmentBean.setRecoveryModuleClassNames(recoveryModuleClassNames);
-		List<String> expiryScannerClassNames = new ArrayList<String>();
-		expiryScannerClassNames.add("com.arjuna.ats.internal.arjuna.recovery.ExpiredTransactionStatusManagerScanner");
-		recoveryEnvironmentBean.setExpiryScannerClassNames(expiryScannerClassNames);
-		recoveryEnvironmentBean.setRecoveryActivators(null);
-
-		CoreEnvironmentBean coreEnvironmentBean = com.arjuna.ats.arjuna.common.arjPropertyManager.getCoreEnvironmentBean();
-		coreEnvironmentBean.setSocketProcessIdPort(4714 + serverName);
-		coreEnvironmentBean.setNodeIdentifier(serverName);
-		coreEnvironmentBean.setSocketProcessIdMaxPorts(1);
-
-		CoordinatorEnvironmentBean coordinatorEnvironmentBean = com.arjuna.ats.arjuna.common.arjPropertyManager.getCoordinatorEnvironmentBean();
-		coordinatorEnvironmentBean.setEnableStatistics(false);
-		coordinatorEnvironmentBean.setDefaultTimeout(300);
-		coordinatorEnvironmentBean.setTransactionStatusManagerEnable(false);
-		coordinatorEnvironmentBean.setDefaultTimeout(0);
-
-		ObjectStoreEnvironmentBean actionStoreObjectStoreEnvironmentBean = com.arjuna.common.internal.util.propertyservice.BeanPopulator.getNamedInstance(
-				com.arjuna.ats.arjuna.common.ObjectStoreEnvironmentBean.class, "default");
-		actionStoreObjectStoreEnvironmentBean.setObjectStoreDir(System.getProperty("user.dir") + "/tmp/tx-object-store/" + serverName);
-
-		ObjectStoreEnvironmentBean stateStoreObjectStoreEnvironmentBean = com.arjuna.common.internal.util.propertyservice.BeanPopulator.getNamedInstance(
-				com.arjuna.ats.arjuna.common.ObjectStoreEnvironmentBean.class, "stateStore");
-		stateStoreObjectStoreEnvironmentBean.setObjectStoreDir(System.getProperty("user.dir") + "/tmp/tx-object-store/" + serverName);
-
-		ObjectStoreEnvironmentBean communicationStoreObjectStoreEnvironmentBean = com.arjuna.common.internal.util.propertyservice.BeanPopulator
-				.getNamedInstance(com.arjuna.ats.arjuna.common.ObjectStoreEnvironmentBean.class, "communicationStore");
-		communicationStoreObjectStoreEnvironmentBean.setObjectStoreDir(System.getProperty("user.dir") + "/tmp/tx-object-store/" + serverName);
-
-		ObjStoreBrowser objStoreBrowser = new ObjStoreBrowser();
-		Map<String, String> types = new HashMap<String, String>();
-		types.put("StateManager/BasicAction/TwoPhaseCoordinator/AtomicAction", "com.arjuna.ats.internal.jta.tools.osb.mbean.jta.JTAActionBean");
-		objStoreBrowser.setTypes(types);
-
-		JTAEnvironmentBean jTAEnvironmentBean = com.arjuna.ats.jta.common.jtaPropertyManager.getJTAEnvironmentBean();
-		jTAEnvironmentBean.setLastResourceOptimisationInterface(org.jboss.tm.LastResource.class);
-		jTAEnvironmentBean.setTransactionManagerClassName("com.arjuna.ats.jbossatx.jta.TransactionManagerDelegate");
-		jTAEnvironmentBean.setUserTransactionClassName("com.arjuna.ats.internal.jta.transaction.arjunacore.UserTransactionImple");
-		jTAEnvironmentBean
-				.setTransactionSynchronizationRegistryClassName("com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionSynchronizationRegistryImple");
-		List<Integer> xaRecoveryNodes = new ArrayList<Integer>();
-		xaRecoveryNodes.add(serverName);
-		jTAEnvironmentBean.setXaRecoveryNodes(xaRecoveryNodes);
-
-		List<String> xaResourceOrphanFilterClassNames = new ArrayList<String>();
-
-		xaResourceOrphanFilterClassNames.add("com.arjuna.ats.internal.jta.recovery.arjunacore.JTATransactionLogXAResourceOrphanFilter");
-		xaResourceOrphanFilterClassNames.add("com.arjuna.ats.internal.jta.recovery.arjunacore.JTANodeNameXAResourceOrphanFilter");
-		// xaResourceOrphanFilterClassNames.add("com.arjuna.ats.internal.jta.recovery.arjunacore.ParentNodeNameXAResourceOrphanFilter");
-		jTAEnvironmentBean.setXaResourceOrphanFilterClassNames(xaResourceOrphanFilterClassNames);
-		jTAEnvironmentBean.setXAResourceRecordWrappingPlugin(new XAResourceRecordWrappingPluginImpl());
-
-		recoveryManagerService = new RecoveryManagerService();
-		recoveryManagerService.create();
-		recoveryManagerService.addXAResourceRecovery(new ProxyXAResourceRecovery(serverName));
-		recoveryManagerService.addXAResourceRecovery(new TestResourceRecovery(serverName));
-		// recoveryManagerService.start();
-		RecoveryManager.manager().initialize();
-
-		transactionManagerService = new TransactionManagerService();
-		TxControl txControl = new com.arjuna.ats.arjuna.coordinator.TxControl();
-		transactionManagerService.setJbossXATerminator(new com.arjuna.ats.internal.jbossatx.jta.jca.XATerminator());
-		transactionManagerService
-				.setTransactionSynchronizationRegistry(new com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionSynchronizationRegistryImple());
-		transactionManagerService.create();
-
-	}
-
-	@Override
-	public void doRecoveryManagerScan() {
-		RecoveryManager.manager().scan();
-	}
-
-	@Override
-	public TransactionManager getTransactionManager() {
-		return transactionManagerService.getTransactionManager();
-	}
-
-	@Override
-	public boolean importTransaction(int remainingTimeout, Xid toResume) throws XAException, InvalidTransactionException, IllegalStateException,
-			SystemException {
-		boolean existed = true;
-		SubordinateTransaction importTransaction = SubordinationManager.getTransactionImporter().getImportedTransaction(toResume);
-		if (importTransaction == null) {
-			importTransaction = SubordinationManager.getTransactionImporter().importTransaction(toResume, remainingTimeout);
-			existed = false;
-		}
-		getTransactionManager().resume(importTransaction);
-		return existed;
-	}
-
-	@Override
-	public Integer getNodeName() {
-		return nodeName;
-	}
-
-	@Override
-	public long getTimeLeftBeforeTransactionTimeout() throws RollbackException {
-		return ((TransactionTimeoutConfiguration) transactionManagerService.getTransactionManager()).getTimeLeftBeforeTransactionTimeout(false);
-	}
-
-	@Override
-	public Xid getCurrentXid() throws SystemException {
-		TransactionImple transaction = ((TransactionImple) transactionManagerService.getTransactionManager().getTransaction());
-		return transaction.getTxId();
-	}
-
-	@Override
-	public XAResource generateProxyXAResource(Integer localServerName, Integer remoteServerName) {
-		return new ProxyXAResource(localServerName, remoteServerName);
-	}
-
-	@Override
-	public Synchronization generateProxySynchronization(Integer localServerName, Integer remoteServerName, Xid toRegisterAgainst) {
-		return new ProxySynchronization(localServerName, remoteServerName, toRegisterAgainst);
-	}
-
-	@Override
-	public int propagatePrepare(Xid xid) throws XAException, ConnectException {
-		if (offline) {
-			throw new ConnectException("Connection refused to: " + nodeName);
-		}
-		return SubordinationManager.getTransactionImporter().getImportedTransaction(xid).doPrepare();
-	}
-
-	@Override
-	public void propagateCommit(Xid xid, boolean onePhase) throws IllegalStateException, HeuristicMixedException, HeuristicRollbackException,
-			HeuristicCommitException, SystemException, XAException, ConnectException {
-		if (offline) {
-			throw new ConnectException("Connection refused to: " + nodeName);
-		}
-		SubordinationManager.getTransactionImporter().getImportedTransaction(xid).doCommit();
-	}
-
-	@Override
-	public void propagateRollback(Xid xid) throws IllegalStateException, HeuristicMixedException, HeuristicCommitException, HeuristicRollbackException,
-			SystemException, XAException, ConnectException {
-		if (offline) {
-			throw new ConnectException("Connection refused to: " + nodeName);
-		}
-		SubordinationManager.getTransactionImporter().getImportedTransaction(xid).doRollback();
-	}
-
-	@Override
-	public Xid[] propagateRecover(List<Integer> recoveryScanStarted, int flag) throws XAException, ConnectException {
-		if (offline) {
-			throw new ConnectException("Connection refused to: " + nodeName);
-		}
-		// Assumes that this thread is used by the recovery thread
-		ProxyXAResource.RECOVERY_SCAN_STARTED.set(recoveryScanStarted);
-		return SubordinationManager.getXATerminator().recover(flag);
-	}
-
-	@Override
-	public void propagateForget(Xid xid) throws XAException, ConnectException {
-		if (offline) {
-			throw new ConnectException("Connection refused to: " + nodeName);
-		}
-		SubordinationManager.getXATerminator().forget(xid);
-
-	}
-
-	@Override
-	public void propagateBeforeCompletion(Xid xid) throws XAException, SystemException, ConnectException {
-		if (offline) {
-			throw new ConnectException("Connection refused to: " + nodeName);
-		}
-		SubordinateTransaction tx = SubordinationManager.getTransactionImporter().getImportedTransaction(xid);
-		tx.doBeforeCompletion();
-	}
-
-	@Override
-	public void setOffline(boolean offline) {
-		this.offline = offline;
-	}
-}

Added: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/DummyRemoteException.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/DummyRemoteException.java	                        (rev 0)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/DummyRemoteException.java	2011-10-15 11:55:21 UTC (rev 37553)
@@ -0,0 +1,7 @@
+package com.arjuna.ats.jta.distributed.server;
+
+public class DummyRemoteException extends Exception {
+	public DummyRemoteException(String message) {
+		super(message);
+	}
+}

Copied: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/IsolatableServersClassLoader.java (from rev 37545, labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/IsolatableServersClassLoader.java)
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/IsolatableServersClassLoader.java	                        (rev 0)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/IsolatableServersClassLoader.java	2011-10-15 11:55:21 UTC (rev 37553)
@@ -0,0 +1,91 @@
+package com.arjuna.ats.jta.distributed.server;
+
+import java.io.ByteArrayOutputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.HashMap;
+import java.util.Map;
+
+public class IsolatableServersClassLoader extends ClassLoader {
+
+	private Map<String, Class<?>> clazzMap = new HashMap<String, Class<?>>();
+	private Method m;
+
+	public IsolatableServersClassLoader(ClassLoader parent) throws SecurityException, NoSuchMethodException {
+		super(parent);
+		m = ClassLoader.class.getDeclaredMethod("findLoadedClass", new Class[] { String.class });
+		m.setAccessible(true);
+	}
+
+	@Override
+	protected Class<?> findClass(String name) throws ClassNotFoundException {
+		if (clazzMap.containsKey(name)) {
+			return clazzMap.get(name);
+		}
+		return super.findClass(name);
+	}
+
+	public Class<?> loadClass(String name) throws ClassNotFoundException {
+		Class<?> clazz = null;
+		if (clazzMap.containsKey(name)) {
+			clazz = clazzMap.get(name);
+		}
+
+		try {
+			ClassLoader parent2 = getParent();
+			Object test1 = m.invoke(parent2, name);
+			if (test1 != null) {
+				
+				if (!name.equals("")) {
+					clazz = super.loadClass(name);
+				}
+			} else {
+				try {
+					String url = "file:" + System.getProperty("user.dir") + "/bin/" + name.replace('.', '/') + ".class";
+					URL myUrl = new URL(url);
+					try {
+						URLConnection connection = myUrl.openConnection();
+						InputStream input = connection.getInputStream();
+						ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+						int data = input.read();
+
+						while (data != -1) {
+							buffer.write(data);
+							data = input.read();
+						}
+
+						input.close();
+
+						byte[] classData = buffer.toByteArray();
+
+						clazz = defineClass(name, classData, 0, classData.length);
+						clazzMap.put(name, clazz);
+					} catch (FileNotFoundException fnfe) {
+						return super.loadClass(name);
+					}
+				} catch (MalformedURLException e) {
+					e.printStackTrace();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		} catch (IllegalArgumentException e1) {
+			// TODO Auto-generated catch block
+			e1.printStackTrace();
+		} catch (IllegalAccessException e1) {
+			// TODO Auto-generated catch block
+			e1.printStackTrace();
+		} catch (InvocationTargetException e1) {
+			// TODO Auto-generated catch block
+			e1.printStackTrace();
+		}
+
+		return clazz;
+	}
+}
\ No newline at end of file

Copied: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/LocalServer.java (from rev 37552, labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/LocalServer.java)
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/LocalServer.java	                        (rev 0)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/LocalServer.java	2011-10-15 11:55:21 UTC (rev 37553)
@@ -0,0 +1,42 @@
+package com.arjuna.ats.jta.distributed.server;
+
+import java.io.IOException;
+
+import javax.transaction.InvalidTransactionException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.RollbackException;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+import javax.transaction.TransactionManager;
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
+
+import com.arjuna.ats.arjuna.common.CoreEnvironmentBeanException;
+
+public interface LocalServer {
+
+	public void initialise(Integer nodeName) throws CoreEnvironmentBeanException, IOException;
+
+	public Integer getNodeName();
+
+	public TransactionManager getTransactionManager() throws NotSupportedException, SystemException;
+
+	public void doRecoveryManagerScan();
+
+	public long getTimeLeftBeforeTransactionTimeout() throws RollbackException;
+
+	public Xid getCurrentXid() throws SystemException;
+
+	public boolean importTransaction(int remainingTimeout, Xid toImport) throws XAException, InvalidTransactionException, IllegalStateException,
+			SystemException;
+
+	public RemoteServer connectTo();
+
+	public void setOffline(boolean offline);
+
+	public XAResource generateProxyXAResource(Integer localServerName, Integer remoteServerName);
+
+	public Synchronization generateProxySynchronization(Integer localServerName, Integer remoteServerName, Xid toRegisterAgainst);
+
+}

Copied: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/RemoteServer.java (from rev 37552, labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/RemoteServer.java)
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/RemoteServer.java	                        (rev 0)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/RemoteServer.java	2011-10-15 11:55:21 UTC (rev 37553)
@@ -0,0 +1,29 @@
+package com.arjuna.ats.jta.distributed.server;
+
+import java.net.ConnectException;
+import java.util.List;
+
+import javax.transaction.HeuristicCommitException;
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.SystemException;
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.Xid;
+
+public interface RemoteServer {
+
+	public int propagatePrepare(Xid xid) throws XAException, DummyRemoteException;
+
+	public void propagateCommit(Xid xid, boolean onePhase) throws IllegalStateException, HeuristicMixedException, HeuristicRollbackException,
+			HeuristicCommitException, SystemException, XAException, DummyRemoteException;
+
+	public void propagateRollback(Xid xid) throws IllegalStateException, HeuristicMixedException, HeuristicCommitException, HeuristicRollbackException,
+			SystemException, XAException, DummyRemoteException;
+
+	public Xid[] propagateRecover(List<Integer> startScanned, int flag) throws XAException, DummyRemoteException;
+
+	public void propagateForget(Xid xid) throws XAException, DummyRemoteException;
+
+	public void propagateBeforeCompletion(Xid xid) throws XAException, SystemException, DummyRemoteException;
+
+}

Deleted: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxySynchronization.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ProxySynchronization.java	2011-10-14 23:48:41 UTC (rev 37545)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxySynchronization.java	2011-10-15 11:55:21 UTC (rev 37553)
@@ -1,39 +0,0 @@
-package com.arjuna.ats.jta.distributed.impl;
-
-import javax.transaction.Synchronization;
-import javax.transaction.SystemException;
-import javax.transaction.xa.XAException;
-import javax.transaction.xa.Xid;
-
-import com.arjuna.ats.jta.distributed.SimpleIsolatedServers;
-
-public class ProxySynchronization implements Synchronization {
-
-	private int serverId;
-	private int serverIdToProxyTo;
-	private Xid toRegisterAgainst;
-
-	public ProxySynchronization(int serverId, int serverIdToProxyTo, Xid toRegisterAgainst) {
-		this.serverId = serverId;
-		this.serverIdToProxyTo = serverIdToProxyTo;
-		this.toRegisterAgainst = toRegisterAgainst;
-	}
-
-	@Override
-	public void beforeCompletion() {
-		System.out.println("ProxySynchronization (" + serverId + ":" + serverIdToProxyTo + ") beforeCompletion");
-		int index = (serverIdToProxyTo / 1000) - 1;
-		try {
-			SimpleIsolatedServers.getServers()[index].propagateBeforeCompletion(toRegisterAgainst);
-		} catch (XAException e) {
-			e.printStackTrace();
-		} catch (SystemException e) {
-			e.printStackTrace();
-		}
-	}
-
-	@Override
-	public void afterCompletion(int status) {
-		// These are not proxied but are handled during local commits
-	}
-}

Copied: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxySynchronization.java (from rev 37552, labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ProxySynchronization.java)
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxySynchronization.java	                        (rev 0)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxySynchronization.java	2011-10-15 11:55:21 UTC (rev 37553)
@@ -0,0 +1,41 @@
+package com.arjuna.ats.jta.distributed.server.impl;
+
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.Xid;
+
+import com.arjuna.ats.jta.distributed.SimpleIsolatedServers;
+import com.arjuna.ats.jta.distributed.server.DummyRemoteException;
+
+public class ProxySynchronization implements Synchronization {
+
+	private int localServerName;
+	private int remoteServerName;
+	private Xid toRegisterAgainst;
+
+	public ProxySynchronization(int localServerName, int remoteServerName, Xid toRegisterAgainst) {
+		this.localServerName = localServerName;
+		this.remoteServerName = remoteServerName;
+		this.toRegisterAgainst = toRegisterAgainst;
+	}
+
+	@Override
+	public void beforeCompletion() {
+		System.out.println("ProxySynchronization (" + localServerName + ":" + remoteServerName + ") beforeCompletion");
+		try {
+			SimpleIsolatedServers.lookup(remoteServerName).propagateBeforeCompletion(toRegisterAgainst);
+		} catch (XAException e) {
+			e.printStackTrace();
+		} catch (SystemException e) {
+			e.printStackTrace();
+		} catch (DummyRemoteException e) {
+			e.printStackTrace();
+		}
+	}
+
+	@Override
+	public void afterCompletion(int status) {
+		// These are not proxied but are handled during local commits
+	}
+}

Deleted: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResource.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ProxyXAResource.java	2011-10-14 23:48:41 UTC (rev 37545)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResource.java	2011-10-15 11:55:21 UTC (rev 37553)
@@ -1,298 +0,0 @@
-package com.arjuna.ats.jta.distributed.impl;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.transaction.HeuristicCommitException;
-import javax.transaction.HeuristicMixedException;
-import javax.transaction.HeuristicRollbackException;
-import javax.transaction.SystemException;
-import javax.transaction.xa.XAException;
-import javax.transaction.xa.XAResource;
-import javax.transaction.xa.Xid;
-
-import org.jboss.tm.XAResourceWrapper;
-
-import com.arjuna.ats.arjuna.common.Uid;
-import com.arjuna.ats.jta.distributed.Server;
-import com.arjuna.ats.jta.distributed.SimpleIsolatedServers;
-
-public class ProxyXAResource implements XAResource, XAResourceWrapper {
-
-	public static final ThreadLocal<List<Integer>> RECOVERY_SCAN_STARTED = new ThreadLocal<List<Integer>>();
-
-	private int transactionTimeout;
-	private Xid xid;
-	private int serverIdToProxyTo = -1;
-	private File file;
-	private Integer serverId;
-
-	public ProxyXAResource(int serverId, int serverIdToProxyTo) {
-		this.serverId = serverId;
-		this.serverIdToProxyTo = serverIdToProxyTo;
-	}
-
-	public ProxyXAResource(int recoverFor, File file) throws IOException {
-		this.serverId = recoverFor;
-		this.file = file;
-		DataInputStream fis = new DataInputStream(new FileInputStream(file));
-		final int formatId = fis.readInt();
-		final int gtrid_length = fis.readInt();
-		final byte[] gtrid = new byte[gtrid_length];
-		fis.read(gtrid, 0, gtrid_length);
-		final int bqual_length = fis.readInt();
-		final byte[] bqual = new byte[bqual_length];
-		fis.read(bqual, 0, bqual_length);
-		int serverIdToProxyTo = fis.readInt();
-		this.serverIdToProxyTo = serverIdToProxyTo;
-		this.xid = new Xid() {
-			@Override
-			public byte[] getGlobalTransactionId() {
-				return gtrid;
-			}
-
-			@Override
-			public int getFormatId() {
-				return formatId;
-			}
-
-			@Override
-			public byte[] getBranchQualifier() {
-				return bqual;
-			}
-
-			@Override
-			public boolean equals(Object object) {
-				Xid xid = (Xid) object;
-				if (xid == null)
-					return false;
-
-				if (xid == this)
-					return true;
-				else {
-
-					if (xid.getFormatId() == formatId) {
-						byte[] gtx = xid.getGlobalTransactionId();
-						byte[] bql = xid.getBranchQualifier();
-						final int bqlength = (bql == null ? 0 : bql.length);
-
-						if ((gtrid.length == gtx.length) && (bqual.length == bqlength)) {
-							int i;
-
-							for (i = 0; i < gtrid.length; i++) {
-								if (gtrid[i] != gtx[i])
-									return false;
-							}
-
-							for (i = 0; i < bqual.length; i++) {
-								if (bqual[i] != bql[i])
-									return false;
-							}
-
-							return true;
-						}
-					}
-				}
-
-				return false;
-			}
-		};
-	}
-
-	public Xid getXid() {
-		return xid;
-	}
-
-	@Override
-	public void start(Xid xid, int flags) throws XAException {
-		System.out.println("     ProxyXAResource (" + serverId + ":" + serverIdToProxyTo + ") XA_START   [" + xid + "]");
-		this.xid = xid;
-	}
-
-	@Override
-	public void end(Xid xid, int flags) throws XAException {
-		System.out.println("     ProxyXAResource (" + serverId + ":" + serverIdToProxyTo + ") XA_END     [" + xid + "]");
-		this.xid = null;
-	}
-
-	@Override
-	public synchronized int prepare(Xid xid) throws XAException {
-		System.out.println("     ProxyXAResource (" + serverId + ":" + serverIdToProxyTo + ") XA_PREPARE [" + xid + "]");
-
-		try {
-			File dir = new File(System.getProperty("user.dir") + "/tmp/ProxyXAResource/" + serverId + "/");
-			dir.mkdirs();
-			file = new File(dir, new Uid().fileStringForm());
-
-			file.createNewFile();
-
-			final int formatId = xid.getFormatId();
-			final byte[] gtrid = xid.getGlobalTransactionId();
-			final int gtrid_length = gtrid.length;
-			final byte[] bqual = xid.getBranchQualifier();
-			final int bqual_length = bqual.length;
-
-			DataOutputStream fos = new DataOutputStream(new FileOutputStream(file));
-			fos.writeInt(formatId);
-			fos.writeInt(gtrid_length);
-			fos.write(gtrid, 0, gtrid_length);
-			fos.writeInt(bqual_length);
-			fos.write(bqual, 0, bqual_length);
-			fos.writeInt(serverIdToProxyTo);
-		} catch (IOException e) {
-			e.printStackTrace();
-			throw new XAException(XAException.XAER_RMERR);
-		}
-
-		int propagatePrepare = getServerToProxyTo().propagatePrepare(xid);
-		System.out.println("     ProxyXAResource (" + serverId + ":" + serverIdToProxyTo + ") XA_PREPARED");
-		return propagatePrepare;
-	}
-
-	@Override
-	public synchronized void commit(Xid xid, boolean onePhase) throws XAException {
-		System.out.println("     ProxyXAResource (" + serverId + ":" + serverIdToProxyTo + ") XA_COMMIT  [" + xid + "]");
-
-		try {
-			getServerToProxyTo().propagateCommit(xid, onePhase);
-			System.out.println("     ProxyXAResource (" + serverId + ":" + serverIdToProxyTo + ") XA_COMMITED");
-		} catch (IllegalStateException e) {
-			throw new XAException(XAException.XAER_INVAL);
-		} catch (HeuristicMixedException e) {
-			throw new XAException(XAException.XA_HEURMIX);
-		} catch (HeuristicRollbackException e) {
-			throw new XAException(XAException.XA_HEURRB);
-		} catch (HeuristicCommitException e) {
-			throw new XAException(XAException.XA_HEURCOM);
-		} catch (SystemException e) {
-			throw new XAException(XAException.XAER_PROTO);
-		}
-
-		if (file != null) {
-			file.delete();
-		}
-	}
-
-	@Override
-	public synchronized void rollback(Xid xid) throws XAException {
-		System.out.println("     ProxyXAResource (" + serverId + ":" + serverIdToProxyTo + ") XA_ROLLBACK[" + xid + "]");
-		try {
-			getServerToProxyTo().propagateRollback(xid);
-			System.out.println("     ProxyXAResource (" + serverId + ":" + serverIdToProxyTo + ") XA_ROLLBACKED");
-		} catch (IllegalStateException e) {
-			throw new XAException(XAException.XAER_INVAL);
-		} catch (HeuristicMixedException e) {
-			throw new XAException(XAException.XA_HEURMIX);
-		} catch (HeuristicCommitException e) {
-			throw new XAException(XAException.XA_HEURCOM);
-		} catch (HeuristicRollbackException e) {
-			throw new XAException(XAException.XA_HEURRB);
-		} catch (SystemException e) {
-			throw new XAException(XAException.XAER_PROTO);
-		}
-
-		if (file != null) {
-			file.delete();
-		}
-	}
-
-	@Override
-	public Xid[] recover(int flag) throws XAException {
-		List<Integer> startScanned = RECOVERY_SCAN_STARTED.get();
-		if (startScanned == null) {
-			startScanned = new ArrayList<Integer>();
-			RECOVERY_SCAN_STARTED.set(startScanned);
-		}
-
-		int tocheck = (flag & XAResource.TMSTARTRSCAN);
-		if (tocheck == XAResource.TMSTARTRSCAN) {
-			System.out.println("     ProxyXAResource (" + serverId + ":" + serverIdToProxyTo + ") XA_RECOVER [XAResource.TMSTARTRSCAN]: " + serverIdToProxyTo);
-
-			if (!startScanned.contains(serverIdToProxyTo)) {
-				startScanned.add(serverIdToProxyTo);
-
-				// Make sure that the remote server has recovered all
-				// transactions
-				getServerToProxyTo().propagateRecover(startScanned, flag);
-				startScanned.remove((Integer) serverIdToProxyTo);
-			}
-
-			System.out.println("     ProxyXAResource (" + serverId + ":" + serverIdToProxyTo + ") XA_RECOVERD[XAResource.TMSTARTRSCAN]: " + serverIdToProxyTo);
-		}
-		tocheck = (flag & XAResource.TMENDRSCAN);
-		if (tocheck == XAResource.TMENDRSCAN) {
-			System.out.println("     ProxyXAResource (" + serverId + ":" + serverIdToProxyTo + ") XA_RECOVER [XAResource.TMENDRSCAN]: " + serverIdToProxyTo);
-
-			if (!startScanned.contains(serverIdToProxyTo)) {
-				getServerToProxyTo().propagateRecover(startScanned, flag);
-			}
-
-			System.out.println("     ProxyXAResource (" + serverId + ":" + serverIdToProxyTo + ") XA_RECOVERD[XAResource.TMENDRSCAN]: " + serverIdToProxyTo);
-		}
-
-		return new Xid[] { xid };
-	}
-
-	@Override
-	public void forget(Xid xid) throws XAException {
-		System.out.println("     ProxyXAResource (" + serverId + ":" + serverIdToProxyTo + ") XA_FORGET  [" + xid + "]");
-		getServerToProxyTo().propagateForget(xid);
-		System.out.println("     ProxyXAResource (" + serverId + ":" + serverIdToProxyTo + ") XA_FORGETED[" + xid + "]");
-	}
-
-	@Override
-	public int getTransactionTimeout() throws XAException {
-		return transactionTimeout;
-	}
-
-	@Override
-	public boolean setTransactionTimeout(int seconds) throws XAException {
-		this.transactionTimeout = seconds;
-		return true;
-	}
-
-	@Override
-	public boolean isSameRM(XAResource xares) throws XAException {
-		return xares.equals(this);
-	}
-
-	/**
-	 * I don't think this is used by TM.
-	 */
-	@Override
-	public XAResource getResource() {
-		return null;
-	}
-
-	/**
-	 * I don't think this is used by TM.
-	 */
-	@Override
-	public String getProductName() {
-		return null;
-	}
-
-	/**
-	 * I don't think this is used by TM.
-	 */
-	@Override
-	public String getProductVersion() {
-		return null;
-	}
-
-	@Override
-	public String getJndiName() {
-		return "ProxyXAResource";
-	}
-
-	private Server getServerToProxyTo() {
-		int index = (serverIdToProxyTo / 1000) - 1;
-		return SimpleIsolatedServers.getServers()[index];
-	}
-}

Copied: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResource.java (from rev 37552, labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ProxyXAResource.java)
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResource.java	                        (rev 0)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResource.java	2011-10-15 11:55:21 UTC (rev 37553)
@@ -0,0 +1,320 @@
+package com.arjuna.ats.jta.distributed.server.impl;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.transaction.HeuristicCommitException;
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.SystemException;
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
+
+import org.jboss.tm.XAResourceWrapper;
+
+import com.arjuna.ats.arjuna.common.Uid;
+import com.arjuna.ats.jta.distributed.SimpleIsolatedServers;
+import com.arjuna.ats.jta.distributed.server.DummyRemoteException;
+
+public class ProxyXAResource implements XAResource, XAResourceWrapper {
+
+	public static final ThreadLocal<List<Integer>> RECOVERY_SCAN_STARTED = new ThreadLocal<List<Integer>>();
+
+	private int transactionTimeout;
+	private Xid xid;
+	private Integer remoteServerName = -1;
+	private File file;
+	private Integer localServerName;
+
+	public ProxyXAResource(Integer localServerName, Integer remoteServerName) {
+		this.localServerName = localServerName;
+		this.remoteServerName = remoteServerName;
+	}
+
+	public ProxyXAResource(Integer localServerName, File file) throws IOException {
+		this.localServerName = localServerName;
+		this.file = file;
+		DataInputStream fis = new DataInputStream(new FileInputStream(file));
+		final int formatId = fis.readInt();
+		final int gtrid_length = fis.readInt();
+		final byte[] gtrid = new byte[gtrid_length];
+		fis.read(gtrid, 0, gtrid_length);
+		final int bqual_length = fis.readInt();
+		final byte[] bqual = new byte[bqual_length];
+		fis.read(bqual, 0, bqual_length);
+		int remoteServerName = fis.readInt();
+		this.remoteServerName = remoteServerName;
+		this.xid = new Xid() {
+			@Override
+			public byte[] getGlobalTransactionId() {
+				return gtrid;
+			}
+
+			@Override
+			public int getFormatId() {
+				return formatId;
+			}
+
+			@Override
+			public byte[] getBranchQualifier() {
+				return bqual;
+			}
+
+			@Override
+			public boolean equals(Object object) {
+				Xid xid = (Xid) object;
+				if (xid == null)
+					return false;
+
+				if (xid == this)
+					return true;
+				else {
+
+					if (xid.getFormatId() == formatId) {
+						byte[] gtx = xid.getGlobalTransactionId();
+						byte[] bql = xid.getBranchQualifier();
+						final int bqlength = (bql == null ? 0 : bql.length);
+
+						if ((gtrid.length == gtx.length) && (bqual.length == bqlength)) {
+							int i;
+
+							for (i = 0; i < gtrid.length; i++) {
+								if (gtrid[i] != gtx[i])
+									return false;
+							}
+
+							for (i = 0; i < bqual.length; i++) {
+								if (bqual[i] != bql[i])
+									return false;
+							}
+
+							return true;
+						}
+					}
+				}
+
+				return false;
+			}
+		};
+	}
+
+	public Xid getXid() {
+		return xid;
+	}
+
+	@Override
+	public void start(Xid xid, int flags) throws XAException {
+		System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_START   [" + xid + "]");
+		this.xid = xid;
+	}
+
+	@Override
+	public void end(Xid xid, int flags) throws XAException {
+		System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_END     [" + xid + "]");
+		this.xid = null;
+	}
+
+	@Override
+	public synchronized int prepare(Xid xid) throws XAException {
+		System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_PREPARE [" + xid + "]");
+
+		try {
+			File dir = new File(System.getProperty("user.dir") + "/tmp/ProxyXAResource/" + localServerName + "/");
+			dir.mkdirs();
+			file = new File(dir, new Uid().fileStringForm());
+
+			file.createNewFile();
+
+			final int formatId = xid.getFormatId();
+			final byte[] gtrid = xid.getGlobalTransactionId();
+			final int gtrid_length = gtrid.length;
+			final byte[] bqual = xid.getBranchQualifier();
+			final int bqual_length = bqual.length;
+
+			DataOutputStream fos = new DataOutputStream(new FileOutputStream(file));
+			fos.writeInt(formatId);
+			fos.writeInt(gtrid_length);
+			fos.write(gtrid, 0, gtrid_length);
+			fos.writeInt(bqual_length);
+			fos.write(bqual, 0, bqual_length);
+			fos.writeInt(remoteServerName);
+		} catch (IOException e) {
+			e.printStackTrace();
+			throw new XAException(XAException.XAER_RMERR);
+		}
+
+		try {
+			int propagatePrepare = SimpleIsolatedServers.lookup(remoteServerName).propagatePrepare(xid);
+			System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_PREPARED");
+			return propagatePrepare;
+		} catch (DummyRemoteException ce) {
+			throw new XAException(XAException.XA_RETRY);
+		}
+	}
+
+	@Override
+	public synchronized void commit(Xid xid, boolean onePhase) throws XAException {
+		System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_COMMIT  [" + xid + "]");
+
+		try {
+			SimpleIsolatedServers.lookup(remoteServerName).propagateCommit(xid, onePhase);
+			System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_COMMITED");
+		} catch (IllegalStateException e) {
+			throw new XAException(XAException.XAER_INVAL);
+		} catch (HeuristicMixedException e) {
+			throw new XAException(XAException.XA_HEURMIX);
+		} catch (HeuristicRollbackException e) {
+			throw new XAException(XAException.XA_HEURRB);
+		} catch (HeuristicCommitException e) {
+			throw new XAException(XAException.XA_HEURCOM);
+		} catch (SystemException e) {
+			throw new XAException(XAException.XAER_PROTO);
+		} catch (DummyRemoteException ce) {
+			throw new XAException(XAException.XA_RETRY);
+		}
+
+		if (file != null) {
+			file.delete();
+		}
+	}
+
+	@Override
+	public synchronized void rollback(Xid xid) throws XAException {
+		System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_ROLLBACK[" + xid + "]");
+		try {
+			SimpleIsolatedServers.lookup(remoteServerName).propagateRollback(xid);
+			System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_ROLLBACKED");
+		} catch (IllegalStateException e) {
+			throw new XAException(XAException.XAER_INVAL);
+		} catch (HeuristicMixedException e) {
+			throw new XAException(XAException.XA_HEURMIX);
+		} catch (HeuristicCommitException e) {
+			throw new XAException(XAException.XA_HEURCOM);
+		} catch (HeuristicRollbackException e) {
+			throw new XAException(XAException.XA_HEURRB);
+		} catch (SystemException e) {
+			throw new XAException(XAException.XAER_PROTO);
+		} catch (DummyRemoteException ce) {
+			throw new XAException(XAException.XA_RETRY);
+		}
+
+		if (file != null) {
+			file.delete();
+		}
+	}
+
+	@Override
+	public Xid[] recover(int flag) throws XAException {
+		List<Integer> startScanned = RECOVERY_SCAN_STARTED.get();
+		if (startScanned == null) {
+			startScanned = new ArrayList<Integer>();
+			RECOVERY_SCAN_STARTED.set(startScanned);
+		}
+
+		int tocheck = (flag & XAResource.TMSTARTRSCAN);
+		if (tocheck == XAResource.TMSTARTRSCAN) {
+			System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_RECOVER [XAResource.TMSTARTRSCAN]: "
+					+ remoteServerName);
+
+			if (!startScanned.contains(remoteServerName)) {
+				startScanned.add(remoteServerName);
+
+				// Make sure that the remote server has recovered all
+				// transactions
+				try {
+					SimpleIsolatedServers.lookup(remoteServerName).propagateRecover(startScanned, flag);
+				} catch (DummyRemoteException ce) {
+					throw new XAException(XAException.XA_RETRY);
+				} finally {
+					startScanned.remove((Integer) remoteServerName);
+				}
+			}
+
+			System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_RECOVERD[XAResource.TMSTARTRSCAN]: "
+					+ remoteServerName);
+		}
+		tocheck = (flag & XAResource.TMENDRSCAN);
+		if (tocheck == XAResource.TMENDRSCAN) {
+			System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_RECOVER [XAResource.TMENDRSCAN]: "
+					+ remoteServerName);
+
+			if (!startScanned.contains(remoteServerName)) {
+				try {
+					SimpleIsolatedServers.lookup(remoteServerName).propagateRecover(startScanned, flag);
+				} catch (DummyRemoteException ce) {
+					throw new XAException(XAException.XA_RETRY);
+				} finally {
+					startScanned.remove((Integer) remoteServerName);
+				}
+			}
+
+			System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_RECOVERD[XAResource.TMENDRSCAN]: "
+					+ remoteServerName);
+		}
+
+		return new Xid[] { xid };
+	}
+
+	@Override
+	public void forget(Xid xid) throws XAException {
+		System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_FORGET  [" + xid + "]");
+		try {
+			SimpleIsolatedServers.lookup(remoteServerName).propagateForget(xid);
+			System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_FORGETED[" + xid + "]");
+		} catch (DummyRemoteException ce) {
+			throw new XAException(XAException.XA_RETRY);
+		}
+	}
+
+	@Override
+	public int getTransactionTimeout() throws XAException {
+		return transactionTimeout;
+	}
+
+	@Override
+	public boolean setTransactionTimeout(int seconds) throws XAException {
+		this.transactionTimeout = seconds;
+		return true;
+	}
+
+	@Override
+	public boolean isSameRM(XAResource xares) throws XAException {
+		return xares.equals(this);
+	}
+
+	/**
+	 * I don't think this is used by TM.
+	 */
+	@Override
+	public XAResource getResource() {
+		return null;
+	}
+
+	/**
+	 * I don't think this is used by TM.
+	 */
+	@Override
+	public String getProductName() {
+		return null;
+	}
+
+	/**
+	 * I don't think this is used by TM.
+	 */
+	@Override
+	public String getProductVersion() {
+		return null;
+	}
+
+	@Override
+	public String getJndiName() {
+		return "ProxyXAResource";
+	}
+}

Modified: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResourceRecovery.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ProxyXAResourceRecovery.java	2011-10-14 23:48:41 UTC (rev 37545)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResourceRecovery.java	2011-10-15 11:55:21 UTC (rev 37553)
@@ -1,4 +1,4 @@
-package com.arjuna.ats.jta.distributed.impl;
+package com.arjuna.ats.jta.distributed.server.impl;
 
 import java.io.File;
 import java.io.IOException;

Deleted: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ServerImpl.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ServerImpl.java	2011-10-14 23:48:41 UTC (rev 37545)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ServerImpl.java	2011-10-15 11:55:21 UTC (rev 37553)
@@ -1,220 +0,0 @@
-package com.arjuna.ats.jta.distributed.impl;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.transaction.HeuristicCommitException;
-import javax.transaction.HeuristicMixedException;
-import javax.transaction.HeuristicRollbackException;
-import javax.transaction.InvalidTransactionException;
-import javax.transaction.RollbackException;
-import javax.transaction.Synchronization;
-import javax.transaction.SystemException;
-import javax.transaction.TransactionManager;
-import javax.transaction.xa.XAException;
-import javax.transaction.xa.XAResource;
-import javax.transaction.xa.Xid;
-
-import org.jboss.tm.TransactionTimeoutConfiguration;
-
-import com.arjuna.ats.arjuna.common.CoordinatorEnvironmentBean;
-import com.arjuna.ats.arjuna.common.CoreEnvironmentBean;
-import com.arjuna.ats.arjuna.common.CoreEnvironmentBeanException;
-import com.arjuna.ats.arjuna.common.ObjectStoreEnvironmentBean;
-import com.arjuna.ats.arjuna.common.RecoveryEnvironmentBean;
-import com.arjuna.ats.arjuna.coordinator.TransactionReaper;
-import com.arjuna.ats.arjuna.coordinator.TxControl;
-import com.arjuna.ats.arjuna.recovery.RecoveryManager;
-import com.arjuna.ats.arjuna.tools.osb.mbean.ObjStoreBrowser;
-import com.arjuna.ats.internal.jbossatx.jta.XAResourceRecordWrappingPluginImpl;
-import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple;
-import com.arjuna.ats.internal.jta.transaction.arjunacore.jca.SubordinateTransaction;
-import com.arjuna.ats.internal.jta.transaction.arjunacore.jca.SubordinationManager;
-import com.arjuna.ats.jbossatx.jta.RecoveryManagerService;
-import com.arjuna.ats.jbossatx.jta.TransactionManagerService;
-import com.arjuna.ats.jta.common.JTAEnvironmentBean;
-import com.arjuna.ats.jta.distributed.Server;
-import com.arjuna.ats.jta.distributed.TestResourceRecovery;
-
-public class ServerImpl implements Server {
-
-	private int id;
-	private RecoveryManagerService recoveryManagerService;
-	private TransactionManagerService transactionManagerService;
-
-	public void initialise(int id) throws CoreEnvironmentBeanException, IOException {
-		this.id = id;
-
-		RecoveryEnvironmentBean recoveryEnvironmentBean = com.arjuna.ats.arjuna.common.recoveryPropertyManager.getRecoveryEnvironmentBean();
-		recoveryEnvironmentBean.setRecoveryBackoffPeriod(1);
-
-		recoveryEnvironmentBean.setRecoveryInetAddress(InetAddress.getByName("localhost"));
-		recoveryEnvironmentBean.setRecoveryPort(4712 + id);
-		recoveryEnvironmentBean.setTransactionStatusManagerInetAddress(InetAddress.getByName("localhost"));
-		recoveryEnvironmentBean.setTransactionStatusManagerPort(4713 + id);
-		List<String> recoveryModuleClassNames = new ArrayList<String>();
-
-		recoveryModuleClassNames.add("com.arjuna.ats.internal.arjuna.recovery.AtomicActionRecoveryModule");
-		recoveryModuleClassNames.add("com.arjuna.ats.internal.txoj.recovery.TORecoveryModule");
-		recoveryModuleClassNames.add("com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule");
-		recoveryEnvironmentBean.setRecoveryModuleClassNames(recoveryModuleClassNames);
-		List<String> expiryScannerClassNames = new ArrayList<String>();
-		expiryScannerClassNames.add("com.arjuna.ats.internal.arjuna.recovery.ExpiredTransactionStatusManagerScanner");
-		recoveryEnvironmentBean.setExpiryScannerClassNames(expiryScannerClassNames);
-		recoveryEnvironmentBean.setRecoveryActivators(null);
-
-		CoreEnvironmentBean coreEnvironmentBean = com.arjuna.ats.arjuna.common.arjPropertyManager.getCoreEnvironmentBean();
-		coreEnvironmentBean.setSocketProcessIdPort(4714 + id);
-		coreEnvironmentBean.setNodeIdentifier(id);
-		coreEnvironmentBean.setSocketProcessIdMaxPorts(1);
-
-		CoordinatorEnvironmentBean coordinatorEnvironmentBean = com.arjuna.ats.arjuna.common.arjPropertyManager.getCoordinatorEnvironmentBean();
-		coordinatorEnvironmentBean.setEnableStatistics(false);
-		coordinatorEnvironmentBean.setDefaultTimeout(300);
-		coordinatorEnvironmentBean.setTransactionStatusManagerEnable(false);
-
-		ObjectStoreEnvironmentBean actionStoreObjectStoreEnvironmentBean = com.arjuna.common.internal.util.propertyservice.BeanPopulator.getNamedInstance(
-				com.arjuna.ats.arjuna.common.ObjectStoreEnvironmentBean.class, "default");
-		actionStoreObjectStoreEnvironmentBean.setObjectStoreDir(System.getProperty("user.dir") + "/tmp/tx-object-store/" + id);
-
-		ObjectStoreEnvironmentBean stateStoreObjectStoreEnvironmentBean = com.arjuna.common.internal.util.propertyservice.BeanPopulator.getNamedInstance(
-				com.arjuna.ats.arjuna.common.ObjectStoreEnvironmentBean.class, "stateStore");
-		stateStoreObjectStoreEnvironmentBean.setObjectStoreDir(System.getProperty("user.dir") + "/tmp/tx-object-store/" + id);
-
-		ObjectStoreEnvironmentBean communicationStoreObjectStoreEnvironmentBean = com.arjuna.common.internal.util.propertyservice.BeanPopulator
-				.getNamedInstance(com.arjuna.ats.arjuna.common.ObjectStoreEnvironmentBean.class, "communicationStore");
-		communicationStoreObjectStoreEnvironmentBean.setObjectStoreDir(System.getProperty("user.dir") + "/tmp/tx-object-store/" + id);
-
-		ObjStoreBrowser objStoreBrowser = new ObjStoreBrowser();
-		Map<String, String> types = new HashMap<String, String>();
-		types.put("StateManager/BasicAction/TwoPhaseCoordinator/AtomicAction", "com.arjuna.ats.internal.jta.tools.osb.mbean.jta.JTAActionBean");
-		objStoreBrowser.setTypes(types);
-
-		JTAEnvironmentBean jTAEnvironmentBean = com.arjuna.ats.jta.common.jtaPropertyManager.getJTAEnvironmentBean();
-		jTAEnvironmentBean.setLastResourceOptimisationInterface(org.jboss.tm.LastResource.class);
-		jTAEnvironmentBean.setTransactionManagerClassName("com.arjuna.ats.jbossatx.jta.TransactionManagerDelegate");
-		jTAEnvironmentBean.setUserTransactionClassName("com.arjuna.ats.internal.jta.transaction.arjunacore.UserTransactionImple");
-		jTAEnvironmentBean
-				.setTransactionSynchronizationRegistryClassName("com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionSynchronizationRegistryImple");
-		List<Integer> xaRecoveryNodes = new ArrayList<Integer>();
-		xaRecoveryNodes.add(id);
-		jTAEnvironmentBean.setXaRecoveryNodes(xaRecoveryNodes);
-
-		List<String> xaResourceOrphanFilterClassNames = new ArrayList<String>();
-
-		xaResourceOrphanFilterClassNames.add("com.arjuna.ats.internal.jta.recovery.arjunacore.JTATransactionLogXAResourceOrphanFilter");
-		xaResourceOrphanFilterClassNames.add("com.arjuna.ats.internal.jta.recovery.arjunacore.JTANodeNameXAResourceOrphanFilter");
-		// xaResourceOrphanFilterClassNames.add("com.arjuna.ats.internal.jta.recovery.arjunacore.ParentNodeNameXAResourceOrphanFilter");
-		jTAEnvironmentBean.setXaResourceOrphanFilterClassNames(xaResourceOrphanFilterClassNames);
-		jTAEnvironmentBean.setXAResourceRecordWrappingPlugin(new XAResourceRecordWrappingPluginImpl());
-
-		recoveryManagerService = new RecoveryManagerService();
-//		recoveryManagerService.create();
-		RecoveryManager.delayRecoveryManagerThread();
-		RecoveryManager.manager();
-		recoveryManagerService.addXAResourceRecovery(new ProxyXAResourceRecovery(id));
-		recoveryManagerService.addXAResourceRecovery(new TestResourceRecovery(id));
-		// recoveryManagerService.start();
-		RecoveryManager.manager().initialize();
-
-		transactionManagerService = new TransactionManagerService();
-		TxControl txControl = new com.arjuna.ats.arjuna.coordinator.TxControl();
-		txControl.setDefaultTimeout(0);
-		transactionManagerService.setJbossXATerminator(new com.arjuna.ats.internal.jbossatx.jta.jca.XATerminator());
-		transactionManagerService
-				.setTransactionSynchronizationRegistry(new com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionSynchronizationRegistryImple());
-		// starts the transaction reaper transactionManagerService.create();
-
-	}
-
-	public void doRecoveryManagerScan() {
-		RecoveryManager.manager().scan();
-	}
-
-	public void startTransactionReaper() {
-		TransactionReaper.transactionReaper();
-	}
-
-	public TransactionManager getTransactionManager() {
-		return transactionManagerService.getTransactionManager();
-	}
-
-	@Override
-	public boolean importTransaction(int remainingTimeout, Xid toResume) throws XAException, InvalidTransactionException, IllegalStateException,
-			SystemException {
-		boolean existed = true;
-		SubordinateTransaction importTransaction = SubordinationManager.getTransactionImporter().getImportedTransaction(toResume);
-		if (importTransaction == null) {
-			importTransaction = SubordinationManager.getTransactionImporter().importTransaction(toResume, remainingTimeout);
-			existed = false;
-		}
-		getTransactionManager().resume(importTransaction);
-		return existed;
-	}
-
-	@Override
-	public int propagatePrepare(Xid xid) throws XAException {
-		return SubordinationManager.getTransactionImporter().getImportedTransaction(xid).doPrepare();
-	}
-
-	@Override
-	public void propagateCommit(Xid xid, boolean onePhase) throws IllegalStateException, HeuristicMixedException, HeuristicRollbackException,
-			HeuristicCommitException, SystemException, XAException {
-		SubordinationManager.getTransactionImporter().getImportedTransaction(xid).doCommit();
-	}
-
-	@Override
-	public void propagateRollback(Xid xid) throws IllegalStateException, HeuristicMixedException, HeuristicCommitException, HeuristicRollbackException,
-			SystemException, XAException {
-		SubordinationManager.getTransactionImporter().getImportedTransaction(xid).doRollback();
-	}
-
-	@Override
-	public Xid[] propagateRecover(List<Integer> recoveryScanStarted, int flag) throws XAException {
-		// Assumes that this thread is used by the recovery thread
-		ProxyXAResource.RECOVERY_SCAN_STARTED.set(recoveryScanStarted);
-		return SubordinationManager.getXATerminator().recover(flag);
-	}
-
-	@Override
-	public void propagateForget(Xid xid) throws XAException {
-		SubordinationManager.getXATerminator().forget(xid);
-
-	}
-
-	@Override
-	public int getNodeName() {
-		return TxControl.getXANodeName();
-	}
-
-	@Override
-	public long getTimeLeftBeforeTransactionTimeout() throws RollbackException {
-		return ((TransactionTimeoutConfiguration) transactionManagerService.getTransactionManager()).getTimeLeftBeforeTransactionTimeout(false);
-	}
-
-	@Override
-	public void propagateBeforeCompletion(Xid xid) throws XAException, SystemException {
-		SubordinateTransaction tx = SubordinationManager.getTransactionImporter().getImportedTransaction(xid);
-		tx.doBeforeCompletion();
-	}
-
-	@Override
-	public Xid getCurrentXid() throws SystemException {
-		TransactionImple transaction = ((TransactionImple) transactionManagerService.getTransactionManager().getTransaction());
-		return transaction.getTxId();
-	}
-
-	@Override
-	public XAResource generateProxyXAResource(int currentNodeName, int nextNodeName) {
-		return new ProxyXAResource(currentNodeName, nextNodeName);
-	}
-
-	@Override
-	public Synchronization generateProxySynchronization(int serverId, int serverIdToProxyTo, Xid toRegisterAgainst) {
-		return new ProxySynchronization(serverId, serverIdToProxyTo, toRegisterAgainst);
-	}
-}

Copied: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ServerImpl.java (from rev 37552, labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/impl/ServerImpl.java)
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ServerImpl.java	                        (rev 0)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ServerImpl.java	2011-10-15 11:55:21 UTC (rev 37553)
@@ -0,0 +1,246 @@
+package com.arjuna.ats.jta.distributed.server.impl;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.transaction.HeuristicCommitException;
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.InvalidTransactionException;
+import javax.transaction.RollbackException;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+import javax.transaction.TransactionManager;
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
+
+import org.jboss.tm.TransactionTimeoutConfiguration;
+
+import com.arjuna.ats.arjuna.common.CoordinatorEnvironmentBean;
+import com.arjuna.ats.arjuna.common.CoreEnvironmentBean;
+import com.arjuna.ats.arjuna.common.CoreEnvironmentBeanException;
+import com.arjuna.ats.arjuna.common.ObjectStoreEnvironmentBean;
+import com.arjuna.ats.arjuna.common.RecoveryEnvironmentBean;
+import com.arjuna.ats.arjuna.coordinator.TxControl;
+import com.arjuna.ats.arjuna.recovery.RecoveryManager;
+import com.arjuna.ats.arjuna.tools.osb.mbean.ObjStoreBrowser;
+import com.arjuna.ats.internal.jbossatx.jta.XAResourceRecordWrappingPluginImpl;
+import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple;
+import com.arjuna.ats.internal.jta.transaction.arjunacore.jca.SubordinateTransaction;
+import com.arjuna.ats.internal.jta.transaction.arjunacore.jca.SubordinationManager;
+import com.arjuna.ats.jbossatx.jta.RecoveryManagerService;
+import com.arjuna.ats.jbossatx.jta.TransactionManagerService;
+import com.arjuna.ats.jta.common.JTAEnvironmentBean;
+import com.arjuna.ats.jta.distributed.TestResourceRecovery;
+import com.arjuna.ats.jta.distributed.server.DummyRemoteException;
+import com.arjuna.ats.jta.distributed.server.LocalServer;
+import com.arjuna.ats.jta.distributed.server.RemoteServer;
+
+public class ServerImpl implements LocalServer, RemoteServer {
+
+	private int nodeName;
+	private RecoveryManagerService recoveryManagerService;
+	private TransactionManagerService transactionManagerService;
+	private boolean offline;
+
+	public void initialise(Integer serverName) throws CoreEnvironmentBeanException, IOException {
+		this.nodeName = serverName;
+
+		RecoveryEnvironmentBean recoveryEnvironmentBean = com.arjuna.ats.arjuna.common.recoveryPropertyManager.getRecoveryEnvironmentBean();
+		recoveryEnvironmentBean.setRecoveryBackoffPeriod(1);
+
+		recoveryEnvironmentBean.setRecoveryInetAddress(InetAddress.getByName("localhost"));
+		recoveryEnvironmentBean.setRecoveryPort(4712 + serverName);
+		recoveryEnvironmentBean.setTransactionStatusManagerInetAddress(InetAddress.getByName("localhost"));
+		recoveryEnvironmentBean.setTransactionStatusManagerPort(4713 + serverName);
+		List<String> recoveryModuleClassNames = new ArrayList<String>();
+
+		recoveryModuleClassNames.add("com.arjuna.ats.internal.arjuna.recovery.AtomicActionRecoveryModule");
+		recoveryModuleClassNames.add("com.arjuna.ats.internal.txoj.recovery.TORecoveryModule");
+		recoveryModuleClassNames.add("com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule");
+		recoveryEnvironmentBean.setRecoveryModuleClassNames(recoveryModuleClassNames);
+		List<String> expiryScannerClassNames = new ArrayList<String>();
+		expiryScannerClassNames.add("com.arjuna.ats.internal.arjuna.recovery.ExpiredTransactionStatusManagerScanner");
+		recoveryEnvironmentBean.setExpiryScannerClassNames(expiryScannerClassNames);
+		recoveryEnvironmentBean.setRecoveryActivators(null);
+
+		CoreEnvironmentBean coreEnvironmentBean = com.arjuna.ats.arjuna.common.arjPropertyManager.getCoreEnvironmentBean();
+		coreEnvironmentBean.setSocketProcessIdPort(4714 + serverName);
+		coreEnvironmentBean.setNodeIdentifier(serverName);
+		coreEnvironmentBean.setSocketProcessIdMaxPorts(1);
+
+		CoordinatorEnvironmentBean coordinatorEnvironmentBean = com.arjuna.ats.arjuna.common.arjPropertyManager.getCoordinatorEnvironmentBean();
+		coordinatorEnvironmentBean.setEnableStatistics(false);
+		coordinatorEnvironmentBean.setDefaultTimeout(300);
+		coordinatorEnvironmentBean.setTransactionStatusManagerEnable(false);
+		coordinatorEnvironmentBean.setDefaultTimeout(0);
+
+		ObjectStoreEnvironmentBean actionStoreObjectStoreEnvironmentBean = com.arjuna.common.internal.util.propertyservice.BeanPopulator.getNamedInstance(
+				com.arjuna.ats.arjuna.common.ObjectStoreEnvironmentBean.class, "default");
+		actionStoreObjectStoreEnvironmentBean.setObjectStoreDir(System.getProperty("user.dir") + "/tmp/tx-object-store/" + serverName);
+
+		ObjectStoreEnvironmentBean stateStoreObjectStoreEnvironmentBean = com.arjuna.common.internal.util.propertyservice.BeanPopulator.getNamedInstance(
+				com.arjuna.ats.arjuna.common.ObjectStoreEnvironmentBean.class, "stateStore");
+		stateStoreObjectStoreEnvironmentBean.setObjectStoreDir(System.getProperty("user.dir") + "/tmp/tx-object-store/" + serverName);
+
+		ObjectStoreEnvironmentBean communicationStoreObjectStoreEnvironmentBean = com.arjuna.common.internal.util.propertyservice.BeanPopulator
+				.getNamedInstance(com.arjuna.ats.arjuna.common.ObjectStoreEnvironmentBean.class, "communicationStore");
+		communicationStoreObjectStoreEnvironmentBean.setObjectStoreDir(System.getProperty("user.dir") + "/tmp/tx-object-store/" + serverName);
+
+		ObjStoreBrowser objStoreBrowser = new ObjStoreBrowser();
+		Map<String, String> types = new HashMap<String, String>();
+		types.put("StateManager/BasicAction/TwoPhaseCoordinator/AtomicAction", "com.arjuna.ats.internal.jta.tools.osb.mbean.jta.JTAActionBean");
+		objStoreBrowser.setTypes(types);
+
+		JTAEnvironmentBean jTAEnvironmentBean = com.arjuna.ats.jta.common.jtaPropertyManager.getJTAEnvironmentBean();
+		jTAEnvironmentBean.setLastResourceOptimisationInterface(org.jboss.tm.LastResource.class);
+		jTAEnvironmentBean.setTransactionManagerClassName("com.arjuna.ats.jbossatx.jta.TransactionManagerDelegate");
+		jTAEnvironmentBean.setUserTransactionClassName("com.arjuna.ats.internal.jta.transaction.arjunacore.UserTransactionImple");
+		jTAEnvironmentBean
+				.setTransactionSynchronizationRegistryClassName("com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionSynchronizationRegistryImple");
+		List<Integer> xaRecoveryNodes = new ArrayList<Integer>();
+		xaRecoveryNodes.add(serverName);
+		jTAEnvironmentBean.setXaRecoveryNodes(xaRecoveryNodes);
+
+		List<String> xaResourceOrphanFilterClassNames = new ArrayList<String>();
+
+		xaResourceOrphanFilterClassNames.add("com.arjuna.ats.internal.jta.recovery.arjunacore.JTATransactionLogXAResourceOrphanFilter");
+		xaResourceOrphanFilterClassNames.add("com.arjuna.ats.internal.jta.recovery.arjunacore.JTANodeNameXAResourceOrphanFilter");
+		// xaResourceOrphanFilterClassNames.add("com.arjuna.ats.internal.jta.recovery.arjunacore.ParentNodeNameXAResourceOrphanFilter");
+		jTAEnvironmentBean.setXaResourceOrphanFilterClassNames(xaResourceOrphanFilterClassNames);
+		jTAEnvironmentBean.setXAResourceRecordWrappingPlugin(new XAResourceRecordWrappingPluginImpl());
+
+		recoveryManagerService = new RecoveryManagerService();
+		recoveryManagerService.create();
+		recoveryManagerService.addXAResourceRecovery(new ProxyXAResourceRecovery(serverName));
+		recoveryManagerService.addXAResourceRecovery(new TestResourceRecovery(serverName));
+		// recoveryManagerService.start();
+		RecoveryManager.manager().initialize();
+
+		transactionManagerService = new TransactionManagerService();
+		TxControl txControl = new com.arjuna.ats.arjuna.coordinator.TxControl();
+		transactionManagerService.setJbossXATerminator(new com.arjuna.ats.internal.jbossatx.jta.jca.XATerminator());
+		transactionManagerService
+				.setTransactionSynchronizationRegistry(new com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionSynchronizationRegistryImple());
+		transactionManagerService.create();
+
+	}
+
+	@Override
+	public void doRecoveryManagerScan() {
+		RecoveryManager.manager().scan();
+	}
+
+	@Override
+	public TransactionManager getTransactionManager() {
+		return transactionManagerService.getTransactionManager();
+	}
+
+	@Override
+	public boolean importTransaction(int remainingTimeout, Xid toResume) throws XAException, InvalidTransactionException, IllegalStateException,
+			SystemException {
+		boolean existed = true;
+		SubordinateTransaction importTransaction = SubordinationManager.getTransactionImporter().getImportedTransaction(toResume);
+		if (importTransaction == null) {
+			importTransaction = SubordinationManager.getTransactionImporter().importTransaction(toResume, remainingTimeout);
+			existed = false;
+		}
+		getTransactionManager().resume(importTransaction);
+		return existed;
+	}
+
+	@Override
+	public Integer getNodeName() {
+		return nodeName;
+	}
+
+	@Override
+	public long getTimeLeftBeforeTransactionTimeout() throws RollbackException {
+		return ((TransactionTimeoutConfiguration) transactionManagerService.getTransactionManager()).getTimeLeftBeforeTransactionTimeout(false);
+	}
+
+	@Override
+	public Xid getCurrentXid() throws SystemException {
+		TransactionImple transaction = ((TransactionImple) transactionManagerService.getTransactionManager().getTransaction());
+		return transaction.getTxId();
+	}
+
+	@Override
+	public XAResource generateProxyXAResource(Integer localServerName, Integer remoteServerName) {
+		return new ProxyXAResource(localServerName, remoteServerName);
+	}
+
+	@Override
+	public Synchronization generateProxySynchronization(Integer localServerName, Integer remoteServerName, Xid toRegisterAgainst) {
+		return new ProxySynchronization(localServerName, remoteServerName, toRegisterAgainst);
+	}
+
+	@Override
+	public void setOffline(boolean offline) {
+		this.offline = offline;
+	}
+
+	@Override
+	public RemoteServer connectTo() {
+		return this;
+	}
+
+	@Override
+	public int propagatePrepare(Xid xid) throws XAException, DummyRemoteException {
+		if (offline) {
+			throw new DummyRemoteException("Connection refused to: " + nodeName);
+		}
+		return SubordinationManager.getTransactionImporter().getImportedTransaction(xid).doPrepare();
+	}
+
+	@Override
+	public void propagateCommit(Xid xid, boolean onePhase) throws IllegalStateException, HeuristicMixedException, HeuristicRollbackException,
+			HeuristicCommitException, SystemException, XAException, DummyRemoteException {
+		if (offline) {
+			throw new DummyRemoteException("Connection refused to: " + nodeName);
+		}
+		SubordinationManager.getTransactionImporter().getImportedTransaction(xid).doCommit();
+	}
+
+	@Override
+	public void propagateRollback(Xid xid) throws IllegalStateException, HeuristicMixedException, HeuristicCommitException, HeuristicRollbackException,
+			SystemException, XAException, DummyRemoteException {
+		if (offline) {
+			throw new DummyRemoteException("Connection refused to: " + nodeName);
+		}
+		SubordinationManager.getTransactionImporter().getImportedTransaction(xid).doRollback();
+	}
+
+	@Override
+	public Xid[] propagateRecover(List<Integer> recoveryScanStarted, int flag) throws XAException, DummyRemoteException {
+		if (offline) {
+			throw new DummyRemoteException("Connection refused to: " + nodeName);
+		}
+		// Assumes that this thread is used by the recovery thread
+		ProxyXAResource.RECOVERY_SCAN_STARTED.set(recoveryScanStarted);
+		return SubordinationManager.getXATerminator().recover(flag);
+	}
+
+	@Override
+	public void propagateForget(Xid xid) throws XAException, DummyRemoteException {
+		if (offline) {
+			throw new DummyRemoteException("Connection refused to: " + nodeName);
+		}
+		SubordinationManager.getXATerminator().forget(xid);
+
+	}
+
+	@Override
+	public void propagateBeforeCompletion(Xid xid) throws XAException, SystemException, DummyRemoteException {
+		if (offline) {
+			throw new DummyRemoteException("Connection refused to: " + nodeName);
+		}
+		SubordinateTransaction tx = SubordinationManager.getTransactionImporter().getImportedTransaction(xid);
+		tx.doBeforeCompletion();
+	}
+}



More information about the jboss-svn-commits mailing list