[jboss-svn-commits] JBL Code SVN: r37787 - in labs/jbosstm/branches/JBOSSTS_4_16: ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/resources/arjunacore and 8 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Dec 8 11:17:15 EST 2011


Author: tomjenkinson
Date: 2011-12-08 11:17:15 -0500 (Thu, 08 Dec 2011)
New Revision: 37787

Added:
   labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/jta/recovery/SerializableXAResourceDeserializer.java
   labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/impl/ProxyXAResourceDeserializer.java
   labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResourceDeserializer.java
Modified:
   labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/recovery/arjunacore/XARecoveryModule.java
   labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/resources/arjunacore/XAResourceRecord.java
   labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/classes/com/arjuna/ats/jbossatx/jta/RecoveryManagerService.java
   labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/ExampleDistributedJTATestCase.java
   labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/IsolatableServersClassLoader.java
   labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/LocalServer.java
   labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/impl/ServerImpl.java
   labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/SimpleIsolatedServers.java
   labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/IsolatableServersClassLoader.java
   labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/LocalServer.java
   labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ServerImpl.java
Log:
JBTM-996 updated to allow a helper class to be registered to assist with deserializing XAResources that are not part of the transaction manager

Modified: labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/recovery/arjunacore/XARecoveryModule.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/recovery/arjunacore/XARecoveryModule.java	2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/recovery/arjunacore/XARecoveryModule.java	2011-12-08 16:17:15 UTC (rev 37787)
@@ -31,37 +31,46 @@
 
 package com.arjuna.ats.internal.jta.recovery.arjunacore;
 
-import com.arjuna.ats.arjuna.common.*;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.Vector;
+
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
+
+import com.arjuna.ats.arjuna.common.Uid;
+import com.arjuna.ats.arjuna.exceptions.ObjectStoreException;
 import com.arjuna.ats.arjuna.objectstore.RecoveryStore;
+import com.arjuna.ats.arjuna.objectstore.StateStatus;
 import com.arjuna.ats.arjuna.objectstore.StoreManager;
-import com.arjuna.ats.arjuna.state.*;
-import com.arjuna.ats.arjuna.objectstore.StateStatus;
 import com.arjuna.ats.arjuna.recovery.RecoveryModule;
-
-
+import com.arjuna.ats.arjuna.state.InputObjectState;
 import com.arjuna.ats.internal.arjuna.common.UidHelper;
-
 import com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord;
+import com.arjuna.ats.jta.common.jtaPropertyManager;
 import com.arjuna.ats.jta.logging.jtaLogger;
-import com.arjuna.ats.jta.common.jtaPropertyManager;
-import com.arjuna.ats.jta.recovery.*;
+import com.arjuna.ats.jta.recovery.SerializableXAResourceDeserializer;
+import com.arjuna.ats.jta.recovery.XARecoveryResource;
+import com.arjuna.ats.jta.recovery.XARecoveryResourceManager;
+import com.arjuna.ats.jta.recovery.XAResourceOrphanFilter;
+import com.arjuna.ats.jta.recovery.XAResourceRecovery;
+import com.arjuna.ats.jta.recovery.XAResourceRecoveryHelper;
 import com.arjuna.ats.jta.utils.XAHelper;
 
-import java.util.*;
-import javax.transaction.xa.*;
-
-import com.arjuna.ats.arjuna.exceptions.ObjectStoreException;
-
-import java.io.IOException;
-import javax.transaction.xa.XAException;
-
 /**
  * Designed to be able to recover any XAResource.
  */
 
 public class XARecoveryModule implements RecoveryModule
 {
-    public XARecoveryModule()
+	public XARecoveryModule()
 	{
 		this(new com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryResourceManagerImple(),
                 "Local XARecoveryModule");
@@ -97,6 +106,14 @@
             _xaResourceOrphanFilters.remove(xaResourceOrphanFilter);
         }
     }
+    
+	public void addSerializableXAResourceDeserializer(SerializableXAResourceDeserializer serializableXAResourceDeserializer) {
+		_seriablizableXAResourceDeserializers.add(serializableXAResourceDeserializer);		
+	}
+	
+	public List<SerializableXAResourceDeserializer> getSeriablizableXAResourceDeserializers() {
+		return _seriablizableXAResourceDeserializers;
+	}
 
 
 	public void periodicWorkFirstPass()
@@ -850,4 +867,6 @@
 
 	private String _logName = null;
 
+	private List<SerializableXAResourceDeserializer> _seriablizableXAResourceDeserializers = new ArrayList<SerializableXAResourceDeserializer>();
+
 }

Modified: labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/resources/arjunacore/XAResourceRecord.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/resources/arjunacore/XAResourceRecord.java	2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/resources/arjunacore/XAResourceRecord.java	2011-12-08 16:17:15 UTC (rev 37787)
@@ -31,43 +31,47 @@
 
 package com.arjuna.ats.internal.jta.resources.arjunacore;
 
-import com.arjuna.ats.internal.arjuna.common.ClassloadingUtility;
-import com.arjuna.ats.jta.recovery.*;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.NotSerializableException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
 
-import com.arjuna.ats.jta.common.jtaPropertyManager;
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
 
-import com.arjuna.ats.jta.xa.RecoverableXAConnection;
-import com.arjuna.ats.jta.xa.XidImple;
-import com.arjuna.ats.jta.utils.XAHelper;
-import com.arjuna.ats.jta.logging.*;
-import com.arjuna.ats.jta.resources.StartXAResource;
-import com.arjuna.ats.jta.resources.EndXAResource;
-
-import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple;
-import com.arjuna.ats.internal.jta.xa.TxInfo;
-import com.arjuna.ats.internal.jta.resources.XAResourceErrorHandler;
-import com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule;
-
 import com.arjuna.ats.arjuna.ObjectType;
+import com.arjuna.ats.arjuna.common.Uid;
 import com.arjuna.ats.arjuna.coordinator.AbstractRecord;
+import com.arjuna.ats.arjuna.coordinator.RecordType;
 import com.arjuna.ats.arjuna.coordinator.TwoPhaseOutcome;
-import com.arjuna.ats.arjuna.coordinator.RecordType;
 import com.arjuna.ats.arjuna.coordinator.TxControl;
-import com.arjuna.ats.arjuna.common.*;
-import com.arjuna.ats.arjuna.state.*;
+import com.arjuna.ats.arjuna.recovery.RecoveryManager;
 import com.arjuna.ats.arjuna.recovery.RecoveryModule;
-import com.arjuna.ats.arjuna.recovery.RecoveryManager;
+import com.arjuna.ats.arjuna.state.InputObjectState;
+import com.arjuna.ats.arjuna.state.OutputObjectState;
+import com.arjuna.ats.internal.arjuna.common.ClassloadingUtility;
+import com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule;
+import com.arjuna.ats.internal.jta.resources.XAResourceErrorHandler;
+import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple;
+import com.arjuna.ats.internal.jta.xa.TxInfo;
+import com.arjuna.ats.jta.common.jtaPropertyManager;
+import com.arjuna.ats.jta.logging.jtaLogger;
+import com.arjuna.ats.jta.recovery.SerializableXAResourceDeserializer;
+import com.arjuna.ats.jta.recovery.XARecoveryResource;
+import com.arjuna.ats.jta.resources.EndXAResource;
+import com.arjuna.ats.jta.resources.StartXAResource;
+import com.arjuna.ats.jta.utils.XAHelper;
+import com.arjuna.ats.jta.xa.RecoverableXAConnection;
+import com.arjuna.ats.jta.xa.XidImple;
 
-import java.util.Vector;
-import java.util.Enumeration;
-
-import java.io.*;
-
-import javax.transaction.xa.Xid;
-import javax.transaction.xa.XAResource;
-
-import javax.transaction.xa.XAException;
-
 /**
  * @author Mark Little (mark_little at hp.com)
  * @version $Id: XAResourceRecord.java 2342 2006-03-30 13:06:17Z $
@@ -826,6 +830,8 @@
                         o.close();
 
                         os.packBoolean(true);
+                        String name = _theXAResource.getClass().getName();
+                        os.packString(name);
 
                         os.packBytes(s.toByteArray());
                     }
@@ -892,12 +898,29 @@
 				{
 					try
 					{
+						// Read the classname of the serialized XAResource
+						String className = os.unpackString();
+						
 						byte[] b = os.unpackBytes();
 
 						ByteArrayInputStream s = new ByteArrayInputStream(b);
 						ObjectInputStream o = new ObjectInputStream(s);
+						
+						// Give the list of deserializers a chance to deserialize the record
+						boolean deserialized = false;
+						Iterator<SerializableXAResourceDeserializer> iterator = seriablizableXAResourceDeserializers.iterator();
+						while (iterator.hasNext()) {
+							SerializableXAResourceDeserializer proxyXAResourceDeserializer = iterator.next();
+							if (proxyXAResourceDeserializer.canDeserialze(className)) {
+								_theXAResource = proxyXAResourceDeserializer.deserialze(o);
+								deserialized = true;
+							}
+						}
 
-						_theXAResource = (XAResource) o.readObject();
+						// Give it a go ourselves
+						if (!deserialized) {
+							_theXAResource = (XAResource) o.readObject();
+						}
 						o.close();
 
 						if (jtaLogger.logger.isTraceEnabled()) {
@@ -1079,6 +1102,14 @@
 		_valid = true;
 		_theTransaction = null;
 		_recovered = true;
+		
+		for (RecoveryModule recoveryModule : RecoveryManager.manager().getModules()) {
+			if (recoveryModule instanceof XARecoveryModule) {
+				XARecoveryModule xaRecoveryModule = (XARecoveryModule) recoveryModule;
+				seriablizableXAResourceDeserializers.addAll(xaRecoveryModule.getSeriablizableXAResourceDeserializers());
+				break;
+			}
+		}
 	}
 
 	public XAResourceRecord(Uid u)
@@ -1207,6 +1238,8 @@
 
 	private static boolean _rollbackOptimization = false;
     private static boolean _assumedComplete = false;
+    
+	private List<SerializableXAResourceDeserializer> seriablizableXAResourceDeserializers = new ArrayList<SerializableXAResourceDeserializer>();
 
 	static
 	{

Added: labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/jta/recovery/SerializableXAResourceDeserializer.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/jta/recovery/SerializableXAResourceDeserializer.java	                        (rev 0)
+++ labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/jta/recovery/SerializableXAResourceDeserializer.java	2011-12-08 16:17:15 UTC (rev 37787)
@@ -0,0 +1,61 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package com.arjuna.ats.jta.recovery;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+
+import javax.transaction.xa.XAResource;
+
+/**
+ * This is an additional recovery helper that allows clients of the transaction
+ * manager to provide a deserializer for their Serializable XAResources. We need
+ * this as otherwise the transaction manager may not be able to see the
+ * transports classes, for instance in an application server environment.
+ */
+public interface SerializableXAResourceDeserializer {
+
+	/**
+	 * Can this {@link SerializableXAResourceDeserializer} handle the specified
+	 * classname.
+	 * 
+	 * @param className
+	 *            The name of the class to deserialize.
+	 * 
+	 * @return A flag to indicate where the deserializer is aware of the
+	 *         Serializable XAResource.
+	 */
+	public boolean canDeserialze(String className);
+
+	/**
+	 * Deserialize the XAResource.
+	 * 
+	 * @param ois
+	 *            The input stream to read from.
+	 * @return An {@link XAResource}
+	 * @throws IOException
+	 *             If the {@link ObjectInputStream.readObject()} fails.
+	 * @throws ClassNotFoundException
+	 *             If the {@link ObjectInputStream.readObject()} fails.
+	 */
+	public XAResource deserialze(ObjectInputStream ois) throws IOException, ClassNotFoundException;
+}

Modified: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/classes/com/arjuna/ats/jbossatx/jta/RecoveryManagerService.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/classes/com/arjuna/ats/jbossatx/jta/RecoveryManagerService.java	2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/classes/com/arjuna/ats/jbossatx/jta/RecoveryManagerService.java	2011-12-08 16:17:15 UTC (rev 37787)
@@ -20,18 +20,19 @@
  */
 package com.arjuna.ats.jbossatx.jta;
 
+import java.util.Vector;
+
+import org.jboss.tm.XAResourceRecovery;
+import org.jboss.tm.XAResourceRecoveryRegistry;
+
 import com.arjuna.ats.arjuna.recovery.RecoveryManager;
 import com.arjuna.ats.arjuna.recovery.RecoveryModule;
+import com.arjuna.ats.internal.jbossatx.jta.XAResourceRecoveryHelperWrapper;
 import com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule;
-import com.arjuna.ats.internal.jbossatx.jta.XAResourceRecoveryHelperWrapper;
 import com.arjuna.ats.jbossatx.logging.jbossatxLogger;
+import com.arjuna.ats.jta.recovery.SerializableXAResourceDeserializer;
 import com.arjuna.common.util.ConfigurationInfo;
 
-import org.jboss.tm.XAResourceRecovery;
-import org.jboss.tm.XAResourceRecoveryRegistry;
-
-import java.util.Vector;
-
 /**
  * JBoss Transaction Recovery Service.
  *
@@ -115,4 +116,22 @@
 
         xaRecoveryModule.removeXAResourceRecoveryHelper(new XAResourceRecoveryHelperWrapper(xaResourceRecovery));
     }
+
+	public void addSerializableXAResourceDeserializer(SerializableXAResourceDeserializer serializableXAResourceDeserializer) {
+
+        XARecoveryModule xaRecoveryModule = null;
+        for(RecoveryModule recoveryModule : ((Vector<RecoveryModule>)_recoveryManager.getModules())) {
+            if(recoveryModule instanceof XARecoveryModule) {
+                xaRecoveryModule = (XARecoveryModule)recoveryModule;
+                break;
+            }
+        }
+
+        if(xaRecoveryModule == null) {
+            throw new IllegalStateException(jbossatxLogger.i18NLogger.get_jta_RecoveryManagerService_norecoverymodule());
+        }
+
+        xaRecoveryModule.addSerializableXAResourceDeserializer(serializableXAResourceDeserializer);
+		
+	}
 }

Modified: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/ExampleDistributedJTATestCase.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/ExampleDistributedJTATestCase.java	2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/ExampleDistributedJTATestCase.java	2011-12-08 16:17:15 UTC (rev 37787)
@@ -121,10 +121,13 @@
 			// done within the scope of this classloader, this is to simulate a
 			// transports different address space
 			ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
-			IsolatableServersClassLoader classLoader = new IsolatableServersClassLoader("com.arjuna.jta.distributed.example.server", contextClassLoader);
+			IsolatableServersClassLoader classLoaderForTransactionManager = new IsolatableServersClassLoader(null, ExampleDistributedJTATestCase.class
+					.getPackage().getName(), contextClassLoader);
+			IsolatableServersClassLoader classLoader = new IsolatableServersClassLoader(ExampleDistributedJTATestCase.class.getPackage().getName(), null,
+					classLoaderForTransactionManager);
 			localServers[i] = (LocalServer) classLoader.loadClass("com.arjuna.jta.distributed.example.server.impl.ServerImpl").newInstance();
-			Thread.currentThread().setContextClassLoader(localServers[i].getClass().getClassLoader());
-			localServers[i].initialise(lookupProvider, serverNodeNames[i], serverPortOffsets[i], clusterBuddies[i]);
+			Thread.currentThread().setContextClassLoader(localServers[i].getClassLoader());
+			localServers[i].initialise(lookupProvider, serverNodeNames[i], serverPortOffsets[i], clusterBuddies[i], classLoaderForTransactionManager);
 			// This is a short cut, normally remote servers would not be the
 			// same as the local servers and would be a tranport layer
 			// abstraction
@@ -171,7 +174,7 @@
 		// Access to this local server must be done by its own classloader to
 		// ensure the servers remain separate
 		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-		Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+		Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
 
 		// THIS SIMULATES NORMAL BUSINESS LOGIC IN BMT/CMT (interceptors?)
 		{
@@ -296,7 +299,7 @@
 		int index = (Integer.valueOf(currentServerName) / 1000) - 1;
 		LocalServer currentServer = localServers[index];
 		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-		Thread.currentThread().setContextClassLoader(currentServer.getClass().getClassLoader());
+		Thread.currentThread().setContextClassLoader(currentServer.getClassLoader());
 
 		// Check if this server has seen this transaction before - this is
 		// crucial to ensure that calling servers will only lay down a proxy if

Modified: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/IsolatableServersClassLoader.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/IsolatableServersClassLoader.java	2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/IsolatableServersClassLoader.java	2011-12-08 16:17:15 UTC (rev 37787)
@@ -36,10 +36,11 @@
  * basically).
  */
 public class IsolatableServersClassLoader extends ClassLoader {
-
 	private Map<String, Class<?>> clazzMap = new HashMap<String, Class<?>>();
 	private URLClassPath ucp;
 	private String ignoredPackage;
+	private String includedPackage;
+	private String otherIgnoredPackage;
 
 	/**
 	 * Create the classloader.
@@ -53,9 +54,13 @@
 	 * @throws NoSuchMethodException
 	 * @throws MalformedURLException
 	 */
-	public IsolatableServersClassLoader(String ignoredPackage, ClassLoader parent) throws SecurityException, NoSuchMethodException, MalformedURLException {
+
+	public IsolatableServersClassLoader(String includedPackage, String ignoredPackage, ClassLoader parent) throws SecurityException, NoSuchMethodException,
+			MalformedURLException {
 		super(parent);
-		this.ignoredPackage = ignoredPackage;
+		this.includedPackage = includedPackage;
+		this.otherIgnoredPackage = ignoredPackage;
+		this.ignoredPackage = IsolatableServersClassLoader.class.getPackage().getName();
 		String property = System.getProperty("java.class.path");
 		String[] split = property.split(System.getProperty("path.separator"));
 		URL[] urls = new URL[split.length];
@@ -79,6 +84,9 @@
 	}
 
 	public Class<?> loadClass(String name) throws ClassNotFoundException {
+		if (!name.matches(ignoredPackage + ".[A-Za-z0-9]*") && otherIgnoredPackage != null && name.startsWith(otherIgnoredPackage)) {
+			throw new ClassNotFoundException(name);
+		}
 		Class<?> clazz = null;
 		if (clazzMap.containsKey(name)) {
 			clazz = clazzMap.get(name);
@@ -87,8 +95,9 @@
 		if (clazz != null) {
 			System.err.println("Already loaded: " + name);
 		} else {
-			if (!name.startsWith("com.arjuna") || (ignoredPackage != null && name.matches(ignoredPackage + ".[A-Za-z0-9]*"))) {
-				clazz = super.loadClass(name);
+			if (!name.startsWith("com.arjuna") || name.matches(ignoredPackage + ".[A-Za-z0-9]*")
+					|| (includedPackage != null && !name.startsWith(includedPackage))) {
+				clazz = getParent().loadClass(name);
 			} else {
 
 				String path = name.replace('.', '/').concat(".class");

Modified: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/LocalServer.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/LocalServer.java	2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/LocalServer.java	2011-12-08 16:17:15 UTC (rev 37787)
@@ -46,8 +46,10 @@
 	 * Initialize this server, this will create a transaction manager service
 	 * and a recovery manager service.
 	 * 
-	 * @param lookupProvider
-	 * @param nodeName
+	 * @param classLoaderForTransactionManager
+	 *            This is the classloader that the transaction manager would
+	 *            normally have access to.
+	 * 
 	 * @throws CoreEnvironmentBeanException
 	 * @throws IOException
 	 * @throws SecurityException
@@ -55,8 +57,9 @@
 	 * @throws IllegalArgumentException
 	 * @throws IllegalAccessException
 	 */
-	public void initialise(LookupProvider lookupProvider, String nodeName, int portOffset, String[] clusterCompatriots) throws CoreEnvironmentBeanException,
-			IOException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException;
+	public void initialise(LookupProvider lookupProvider, String nodeName, int portOffset, String[] clusterCompatriots,
+			ClassLoader classLoaderForTransactionManager) throws CoreEnvironmentBeanException, IOException, SecurityException, NoSuchFieldException,
+			IllegalArgumentException, IllegalAccessException;
 
 	/**
 	 * Get the local transaction managers node name.
@@ -163,4 +166,12 @@
 	 * @return
 	 */
 	public RemoteServer connectTo();
+
+	/**
+	 * This is used by the test to ensure that the servers classloader is set on
+	 * a thread.
+	 * 
+	 * @return
+	 */
+	public ClassLoader getClassLoader();
 }

Added: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/impl/ProxyXAResourceDeserializer.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/impl/ProxyXAResourceDeserializer.java	                        (rev 0)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/impl/ProxyXAResourceDeserializer.java	2011-12-08 16:17:15 UTC (rev 37787)
@@ -0,0 +1,32 @@
+package com.arjuna.jta.distributed.example.server.impl;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+
+import javax.transaction.xa.XAResource;
+
+import com.arjuna.ats.jta.recovery.SerializableXAResourceDeserializer;
+
+/**
+ * This is an additional recovery helper that allows a transport to provide a
+ * deserializer for its ProxyXAResource. We need this as otherwise the
+ * transaction manager would not be able to see the transports classes. Check
+ * out the Javadocs on {@link SerializableXAResourceDeserializer}
+ */
+public class ProxyXAResourceDeserializer implements SerializableXAResourceDeserializer {
+
+	@Override
+	public boolean canDeserialze(String className) {
+		if (className.equals(ProxyXAResource.class.getName())) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	@Override
+	public XAResource deserialze(ObjectInputStream ois) throws IOException, ClassNotFoundException {
+		return (XAResource) ois.readObject();
+	}
+
+}

Modified: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/impl/ServerImpl.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/impl/ServerImpl.java	2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/impl/ServerImpl.java	2011-12-08 16:17:15 UTC (rev 37787)
@@ -76,13 +76,18 @@
 	private TransactionManagerService transactionManagerService;
 	private Map<SubordinateXidImple, TransactionImple> rootTransactionsAsSubordinate = new HashMap<SubordinateXidImple, TransactionImple>();
 	private RecoveryManager _recoveryManager;
+	private ClassLoader classLoaderForTransactionManager;
 
 	/**
 	 * This is typically done by the application server.
+	 * 
+	 * The addition required for the distributed JTA code is:
+	 * RecoveryManagerService::addSerializableXAResourceDeserializer()
 	 */
-	public void initialise(LookupProvider lookupProvider, String nodeName, int portOffset, String[] clusterBuddies) throws CoreEnvironmentBeanException,
-			IOException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
+	public void initialise(LookupProvider lookupProvider, String nodeName, int portOffset, String[] clusterBuddies, ClassLoader classLoaderForTransactionManager)
+			throws CoreEnvironmentBeanException, IOException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
 		this.nodeName = nodeName;
+		this.classLoaderForTransactionManager = classLoaderForTransactionManager;
 
 		RecoveryEnvironmentBean recoveryEnvironmentBean = com.arjuna.ats.arjuna.common.recoveryPropertyManager.getRecoveryEnvironmentBean();
 		recoveryEnvironmentBean.setRecoveryBackoffPeriod(1);
@@ -154,6 +159,7 @@
 		recoveryManagerService.create();
 		recoveryManagerService.addXAResourceRecovery(new ProxyXAResourceRecovery(nodeName, clusterBuddies));
 		recoveryManagerService.addXAResourceRecovery(new TestResourceRecovery(nodeName));
+		recoveryManagerService.addSerializableXAResourceDeserializer(new ProxyXAResourceDeserializer());
 
 		// recoveryManagerService.start();
 		_recoveryManager = RecoveryManager.manager();
@@ -168,6 +174,11 @@
 	}
 
 	@Override
+	public ClassLoader getClassLoader() {
+		return classLoaderForTransactionManager;
+	}
+
+	@Override
 	public RemoteServer connectTo() {
 		return new RemoteServerImpl();
 	}

Modified: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/SimpleIsolatedServers.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/SimpleIsolatedServers.java	2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/SimpleIsolatedServers.java	2011-12-08 16:17:15 UTC (rev 37787)
@@ -25,7 +25,6 @@
 import static org.junit.Assert.fail;
 
 import java.io.IOException;
-import java.net.MalformedURLException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Iterator;
@@ -80,7 +79,7 @@
 	public static void tearDown() throws Exception {
 		for (int i = 0; i < localServers.length; i++) {
 			ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
-			Thread.currentThread().setContextClassLoader(localServers[i].getClass().getClassLoader());
+			Thread.currentThread().setContextClassLoader(localServers[i].getClassLoader());
 			localServers[i].shutdown();
 			Thread.currentThread().setContextClassLoader(contextClassLoader);
 		}
@@ -91,7 +90,7 @@
 		for (int i = 0; i < localServers.length; i++) {
 			if (localServers[i].getNodeName().equals(serverName)) {
 				ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
-				Thread.currentThread().setContextClassLoader(localServers[i].getClass().getClassLoader());
+				Thread.currentThread().setContextClassLoader(localServers[i].getClassLoader());
 				localServers[i].shutdown();
 				Thread.currentThread().setContextClassLoader(contextClassLoader);
 
@@ -102,12 +101,17 @@
 
 	}
 
-	private static void boot(int index) throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, CoreEnvironmentBeanException, IOException, NoSuchFieldException {
+	private static void boot(int index) throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException,
+			ClassNotFoundException, IllegalArgumentException, CoreEnvironmentBeanException, IOException, NoSuchFieldException {
 		ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
-		IsolatableServersClassLoader classLoader = new IsolatableServersClassLoader("com.arjuna.ats.jta.distributed.server", contextClassLoader);
+		IsolatableServersClassLoader classLoaderForTransactionManager = new IsolatableServersClassLoader(null, SimpleIsolatedServers.class.getPackage()
+				.getName(), contextClassLoader);
+		IsolatableServersClassLoader classLoader = new IsolatableServersClassLoader(SimpleIsolatedServers.class.getPackage().getName(), null,
+				classLoaderForTransactionManager);
 		localServers[index] = (LocalServer) classLoader.loadClass("com.arjuna.ats.jta.distributed.server.impl.ServerImpl").newInstance();
-		Thread.currentThread().setContextClassLoader(localServers[index].getClass().getClassLoader());
-		localServers[index].initialise(lookupProvider, serverNodeNames[index], serverPortOffsets[index], clusterBuddies[index]);
+		Thread.currentThread().setContextClassLoader(localServers[index].getClassLoader());
+		localServers[index].initialise(lookupProvider, serverNodeNames[index], serverPortOffsets[index], clusterBuddies[index],
+				classLoaderForTransactionManager);
 		lookupProvider.bind(index, localServers[index].connectTo());
 		Thread.currentThread().setContextClassLoader(contextClassLoader);
 	}
@@ -139,7 +143,7 @@
 					try {
 						LocalServer originalServer = getLocalServer("1000");
 						ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-						Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+						Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
 						TransactionManager transactionManager = originalServer.getTransactionManager();
 						transactionManager.setTransactionTimeout(startingTimeout);
 						transactionManager.begin();
@@ -187,7 +191,7 @@
 					try {
 						LocalServer originalServer = getLocalServer("2000");
 						ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-						Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+						Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
 						TransactionManager transactionManager = originalServer.getTransactionManager();
 						transactionManager.setTransactionTimeout(startingTimeout);
 						transactionManager.begin();
@@ -278,7 +282,7 @@
 				try {
 					LocalServer originalServer = getLocalServer("1000");
 					ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-					Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+					Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
 					TransactionManager transactionManager = originalServer.getTransactionManager();
 					transactionManager.setTransactionTimeout(startingTimeout);
 					transactionManager.begin();
@@ -361,7 +365,7 @@
 				try {
 					LocalServer originalServer = getLocalServer("1000");
 					ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-					Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+					Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
 					TransactionManager transactionManager = originalServer.getTransactionManager();
 					transactionManager.setTransactionTimeout(startingTimeout);
 					transactionManager.begin();
@@ -444,7 +448,7 @@
 				try {
 					LocalServer originalServer = getLocalServer("1000");
 					ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-					Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+					Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
 					TransactionManager transactionManager = originalServer.getTransactionManager();
 					transactionManager.setTransactionTimeout(startingTimeout);
 					transactionManager.begin();
@@ -532,7 +536,7 @@
 				try {
 					LocalServer originalServer = getLocalServer("1000");
 					ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-					Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+					Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
 					TransactionManager transactionManager = originalServer.getTransactionManager();
 					transactionManager.setTransactionTimeout(startingTimeout);
 					transactionManager.begin();
@@ -648,7 +652,7 @@
 		setup();
 		LocalServer originalServer = getLocalServer("1000");
 		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-		Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+		Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
 		TransactionManager transactionManager = originalServer.getTransactionManager();
 		transactionManager.setTransactionTimeout(0);
 		transactionManager.begin();
@@ -679,7 +683,7 @@
 		setup();
 		LocalServer originalServer = getLocalServer("1000");
 		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-		Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+		Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
 		TransactionManager transactionManager = originalServer.getTransactionManager();
 		transactionManager.setTransactionTimeout(0);
 		transactionManager.begin();
@@ -766,7 +770,7 @@
 		int subordinateTimeout = 1;
 		LocalServer originalServer = getLocalServer("1000");
 		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-		Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+		Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
 		TransactionManager transactionManager = originalServer.getTransactionManager();
 		transactionManager.setTransactionTimeout(rootTimeout);
 		transactionManager.begin();
@@ -779,7 +783,7 @@
 		// Migrate a transaction
 		LocalServer currentServer = getLocalServer("2000");
 		ClassLoader parentsClassLoader = Thread.currentThread().getContextClassLoader();
-		Thread.currentThread().setContextClassLoader(currentServer.getClass().getClassLoader());
+		Thread.currentThread().setContextClassLoader(currentServer.getClassLoader());
 		Xid migratedXid = currentServer.locateOrImportTransactionThenResumeIt(subordinateTimeout, currentXid);
 		currentServer.getTransactionManager().getTransaction().enlistResource(new TestResource(currentServer.getNodeName(), false));
 		currentServer.getTransactionManager().suspend();
@@ -811,7 +815,7 @@
 		int rootTimeout = 5;
 		LocalServer originalServer = getLocalServer("1000");
 		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-		Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+		Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
 		TransactionManager transactionManager = originalServer.getTransactionManager();
 		transactionManager.setTransactionTimeout(rootTimeout);
 		transactionManager.begin();
@@ -825,7 +829,7 @@
 		// Migrate a transaction
 		LocalServer currentServer = getLocalServer("2000");
 		ClassLoader parentsClassLoader = Thread.currentThread().getContextClassLoader();
-		Thread.currentThread().setContextClassLoader(currentServer.getClass().getClassLoader());
+		Thread.currentThread().setContextClassLoader(currentServer.getClassLoader());
 		Xid migratedXid = currentServer.locateOrImportTransactionThenResumeIt(subordinateTimeout, currentXid);
 		currentServer.getTransactionManager().getTransaction().enlistResource(new TestResource(currentServer.getNodeName(), false));
 		currentServer.getTransactionManager().suspend();
@@ -863,7 +867,7 @@
 		String startingServer = nodesToFlowTo.get(0);
 		LocalServer originalServer = getLocalServer(startingServer);
 		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-		Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+		Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
 		TransactionManager transactionManager = originalServer.getTransactionManager();
 		transactionManager.setTransactionTimeout(startingTimeout);
 		transactionManager.begin();
@@ -919,7 +923,7 @@
 		System.out.println("Flowed to " + currentServerName);
 
 		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-		Thread.currentThread().setContextClassLoader(currentServer.getClass().getClassLoader());
+		Thread.currentThread().setContextClassLoader(currentServer.getClassLoader());
 
 		Xid requiresProxyAtPreviousServer = currentServer.locateOrImportTransactionThenResumeIt(remainingTimeout, toMigrate);
 

Modified: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/IsolatableServersClassLoader.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/IsolatableServersClassLoader.java	2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/IsolatableServersClassLoader.java	2011-12-08 16:17:15 UTC (rev 37787)
@@ -35,10 +35,15 @@
 	private Map<String, Class<?>> clazzMap = new HashMap<String, Class<?>>();
 	private URLClassPath ucp;
 	private String ignoredPackage;
+	private String includedPackage;
+	private String otherIgnoredPackage;
 
-	public IsolatableServersClassLoader(String ignoredPackage, ClassLoader parent) throws SecurityException, NoSuchMethodException, MalformedURLException {
+	public IsolatableServersClassLoader(String includedPackage, String ignoredPackage, ClassLoader parent) throws SecurityException, NoSuchMethodException,
+			MalformedURLException {
 		super(parent);
-		this.ignoredPackage = ignoredPackage;
+		this.includedPackage = includedPackage;
+		this.otherIgnoredPackage = ignoredPackage;
+		this.ignoredPackage = IsolatableServersClassLoader.class.getPackage().getName();
 		String property = System.getProperty("java.class.path");
 		String[] split = property.split(System.getProperty("path.separator"));
 		URL[] urls = new URL[split.length];
@@ -62,6 +67,9 @@
 	}
 
 	public Class<?> loadClass(String name) throws ClassNotFoundException {
+		if (!name.matches(ignoredPackage + ".[A-Za-z0-9]*") && otherIgnoredPackage != null && name.startsWith(otherIgnoredPackage)) {
+			throw new ClassNotFoundException(name);
+		}
 		Class<?> clazz = null;
 		if (clazzMap.containsKey(name)) {
 			clazz = clazzMap.get(name);
@@ -70,8 +78,9 @@
 		if (clazz != null) {
 			System.err.println("Already loaded: " + name);
 		} else {
-			if (!name.startsWith("com.arjuna") || (ignoredPackage != null && name.matches(ignoredPackage + ".[A-Za-z0-9]*"))) {
-				clazz = super.loadClass(name);
+			if (!name.startsWith("com.arjuna") || name.matches(ignoredPackage + ".[A-Za-z0-9]*")
+					|| (includedPackage != null && !name.startsWith(includedPackage))) {
+				clazz = getParent().loadClass(name);
 			} else {
 
 				String path = name.replace('.', '/').concat(".class");

Modified: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/LocalServer.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/LocalServer.java	2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/LocalServer.java	2011-12-08 16:17:15 UTC (rev 37787)
@@ -37,9 +37,11 @@
 
 public interface LocalServer {
 
-	public void initialise(LookupProvider lookupProvider, String nodeName, int portOffset, String[] clusterBuddies) throws CoreEnvironmentBeanException,
-			IOException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException;
+	public void initialise(LookupProvider lookupProvider, String nodeName, int portOffset, String[] clusterBuddies, ClassLoader classLoaderForTransactionManager)
+			throws CoreEnvironmentBeanException, IOException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException;
 
+	public ClassLoader getClassLoader();
+
 	public String getNodeName();
 
 	public TransactionManager getTransactionManager() throws NotSupportedException, SystemException;

Added: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResourceDeserializer.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResourceDeserializer.java	                        (rev 0)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResourceDeserializer.java	2011-12-08 16:17:15 UTC (rev 37787)
@@ -0,0 +1,26 @@
+package com.arjuna.ats.jta.distributed.server.impl;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+
+import javax.transaction.xa.XAResource;
+
+import com.arjuna.ats.jta.recovery.SerializableXAResourceDeserializer;
+
+public class ProxyXAResourceDeserializer implements SerializableXAResourceDeserializer {
+
+	@Override
+	public boolean canDeserialze(String className) {
+		if (className.equals(ProxyXAResource.class.getName())) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	@Override
+	public XAResource deserialze(ObjectInputStream ois) throws IOException, ClassNotFoundException {
+		return (XAResource) ois.readObject();
+	}
+
+}

Modified: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ServerImpl.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ServerImpl.java	2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ServerImpl.java	2011-12-08 16:17:15 UTC (rev 37787)
@@ -69,10 +69,12 @@
 	private TransactionManagerService transactionManagerService;
 	private Map<SubordinateXidImple, TransactionImple> rootTransactionsAsSubordinate = new HashMap<SubordinateXidImple, TransactionImple>();
 	private RecoveryManager _recoveryManager;
+	private ClassLoader classLoaderForTransactionManager;
 
-	public void initialise(LookupProvider lookupProvider, String nodeName, int portOffset, String[] clusterBuddies) throws CoreEnvironmentBeanException,
-			IOException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
+	public void initialise(LookupProvider lookupProvider, String nodeName, int portOffset, String[] clusterBuddies, ClassLoader classLoaderForTransactionManager)
+			throws CoreEnvironmentBeanException, IOException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
 		this.nodeName = nodeName;
+		this.classLoaderForTransactionManager = classLoaderForTransactionManager;
 
 		RecoveryEnvironmentBean recoveryEnvironmentBean = com.arjuna.ats.arjuna.common.recoveryPropertyManager.getRecoveryEnvironmentBean();
 		recoveryEnvironmentBean.setRecoveryBackoffPeriod(1);
@@ -144,6 +146,7 @@
 		recoveryManagerService.create();
 		recoveryManagerService.addXAResourceRecovery(new ProxyXAResourceRecovery(nodeName, clusterBuddies));
 		recoveryManagerService.addXAResourceRecovery(new TestResourceRecovery(nodeName));
+		recoveryManagerService.addSerializableXAResourceDeserializer(new ProxyXAResourceDeserializer());
 
 		// recoveryManagerService.start();
 		_recoveryManager = RecoveryManager.manager();
@@ -158,6 +161,11 @@
 	}
 
 	@Override
+	public ClassLoader getClassLoader() {
+		return classLoaderForTransactionManager;
+	}
+
+	@Override
 	public void shutdown() throws Exception {
 		recoveryManagerService.stop();
 		TransactionReaper.transactionReaper().terminate(false);
@@ -166,8 +174,7 @@
 	@Override
 	public void doRecoveryManagerScan(boolean hackSafetyInterval) {
 		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-		ClassLoader serversClassLoader = this.getClass().getClassLoader();
-		Thread.currentThread().setContextClassLoader(serversClassLoader);
+		Thread.currentThread().setContextClassLoader(getClassLoader());
 		int originalSafetyInterval = -1;
 
 		if (hackSafetyInterval) {



More information about the jboss-svn-commits mailing list