[tx-control] Switch dependencies to release versions

git-svn-id: https://svn.apache.org/repos/asf/aries/trunk/tx-control@1748528 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/tx-control-itests/pom.xml b/tx-control-itests/pom.xml
index 034efc7..f524f64 100644
--- a/tx-control-itests/pom.xml
+++ b/tx-control-itests/pom.xml
@@ -124,12 +124,6 @@
 			<version>3.1.4.RELEASE</version>
 			<scope>test</scope>
 		</dependency>
-		<dependency>
-			<groupId>org.apache.aries.testsupport</groupId>
-			<artifactId>org.apache.aries.testsupport.unit</artifactId>
-			<version>2.0.0-SNAPSHOT</version>
-			<scope>test</scope>
-		</dependency>
 
 		<!-- pax exam -->
 		<dependency>
diff --git a/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/AbstractTransactionTest.java b/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/AbstractTransactionTest.java
index ec0df99..e7e340c 100644
--- a/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/AbstractTransactionTest.java
+++ b/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/AbstractTransactionTest.java
@@ -29,10 +29,14 @@
 import java.sql.Connection;

 import java.sql.SQLException;

 import java.sql.Statement;

+import java.util.ArrayList;

 import java.util.Hashtable;

+import java.util.List;

+import java.util.NoSuchElementException;

 import java.util.Properties;

 

-import org.apache.aries.itest.AbstractIntegrationTest;

+import javax.inject.Inject;

+

 import org.h2.tools.Server;

 import org.junit.After;

 import org.junit.Before;

@@ -43,30 +47,41 @@
 import org.ops4j.pax.exam.junit.PaxExam;

 import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;

 import org.ops4j.pax.exam.spi.reactors.PerClass;

+import org.osgi.framework.BundleContext;

+import org.osgi.framework.Filter;

+import org.osgi.framework.FrameworkUtil;

+import org.osgi.framework.InvalidSyntaxException;

+import org.osgi.framework.ServiceReference;

 import org.osgi.service.cm.ConfigurationAdmin;

 import org.osgi.service.jdbc.DataSourceFactory;

 import org.osgi.service.transaction.control.TransactionControl;

 import org.osgi.service.transaction.control.jdbc.JDBCConnectionProvider;

 import org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory;

+import org.osgi.util.tracker.ServiceTracker;

 

 @RunWith(PaxExam.class)

 @ExamReactorStrategy(PerClass.class)

-public abstract class AbstractTransactionTest extends AbstractIntegrationTest {

-

+public abstract class AbstractTransactionTest {

+	

 	private static final String TX_CONTROL_FILTER = "org.apache.aries.tx.control.itests.filter";

 	private static final String REMOTE_DB_PROPERTY = "org.apache.aries.tx.control.itests.remotedb";

 	private static final String CONFIGURED_PROVIDER_PROPERTY = "org.apache.aries.tx.control.itests.configured";

 

+	@Inject

+	BundleContext context;

+	

 	protected TransactionControl txControl;

 

 	protected Connection connection;

 

 	private Server server;

+	

+	private final List<ServiceTracker<?,?>> trackers = new ArrayList<>();

 

 	@Before

 	public void setUp() throws Exception {

 		

-		txControl = context().getService(TransactionControl.class, 

+		txControl = getService(TransactionControl.class, 

 				System.getProperty(TX_CONTROL_FILTER), 5000);

 		

 		Properties jdbc = new Properties();

@@ -99,12 +114,43 @@
 			});

 	}

 

+	private <T> T getService(Class<T> clazz, long timeout) {

+		try {

+			return getService(clazz, null, timeout);

+		} catch (InvalidSyntaxException e) {

+			throw new IllegalArgumentException(e);

+		}

+	}

+

+	private <T> T getService(Class<T> clazz, String filter, long timeout) throws InvalidSyntaxException {

+		Filter f = FrameworkUtil.createFilter(filter == null ? "(|(foo=bar)(!(foo=bar)))" : filter); 

+		

+		ServiceTracker<T, T> tracker = new ServiceTracker<T, T>(context, clazz, null) {

+			@Override

+			public T addingService(ServiceReference<T> reference) {

+				return f.match(reference) ? super.addingService(reference) : null;

+			}

+		};

+

+		tracker.open();

+		try {

+			T t = tracker.waitForService(timeout);

+			if(t == null) {

+				throw new NoSuchElementException(clazz.getName());

+			}

+			return t;

+		} catch (InterruptedException e) {

+			throw new RuntimeException("Error waiting for service " + clazz.getName(), e);

+		} finally {

+			trackers.add(tracker);

+		}

+	}

+	

 	private Connection programaticConnection(Properties jdbc) {

 		

-		JDBCConnectionProviderFactory resourceProviderFactory = context()

-				.getService(JDBCConnectionProviderFactory.class, 5000);

+		JDBCConnectionProviderFactory resourceProviderFactory = getService(JDBCConnectionProviderFactory.class, 5000);

 		

-		DataSourceFactory dsf = context().getService(DataSourceFactory.class, 5000);

+		DataSourceFactory dsf = getService(DataSourceFactory.class, 5000);

 		

 		return resourceProviderFactory.getProviderFor(dsf, jdbc, null).getResource(txControl);

 	}

@@ -115,7 +161,7 @@
 		String type = System.getProperty(CONFIGURED_PROVIDER_PROPERTY);

 		

 		jdbc.setProperty(DataSourceFactory.OSGI_JDBC_DRIVER_CLASS, "org.h2.Driver");

-		ConfigurationAdmin cm = context().getService(ConfigurationAdmin.class, 5000);

+		ConfigurationAdmin cm = getService(ConfigurationAdmin.class, 5000);

 		

 		String pid = "local".equals(type) ? "org.apache.aries.tx.control.jdbc.local" 

 				: "org.apache.aries.tx.control.jdbc.xa";

@@ -126,7 +172,7 @@
 				pid, null);

 		config.update((Hashtable)jdbc);

 		

-		return context().getService(JDBCConnectionProvider.class, 5000).getResource(txControl);

+		return getService(JDBCConnectionProvider.class, 5000).getResource(txControl);

 	}

 	

 	@After

@@ -143,12 +189,14 @@
 		if(server != null) {

 			server.stop();

 		}

+		

+		trackers.stream().forEach(ServiceTracker::close);

 

 		connection = null;

 	}

 

 	private void clearConfiguration() {

-		ConfigurationAdmin cm = context().getService(ConfigurationAdmin.class, 5000);

+		ConfigurationAdmin cm = getService(ConfigurationAdmin.class, 5000);

 		org.osgi.service.cm.Configuration[] cfgs = null;

 		try {

 			cfgs = cm.listConfigurations(null);

@@ -184,7 +232,6 @@
 		return options(junitBundles(), systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("INFO"),

 				when(localRepo != null)

 						.useOptions(CoreOptions.vmOption("-Dorg.ops4j.pax.url.mvn.localRepository=" + localRepo)),

-				mavenBundle("org.apache.aries.testsupport", "org.apache.aries.testsupport.unit").versionAsInProject(),

 				localTxControlService(),

 				localJdbcResourceProviderWithH2(),

 				when(testSpecificOptions != null).useOptions(testSpecificOptions),

@@ -207,7 +254,6 @@
 		return options(junitBundles(), systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("INFO"),

 				when(localRepo != null)

 				.useOptions(CoreOptions.vmOption("-Dorg.ops4j.pax.url.mvn.localRepository=" + localRepo)),

-				mavenBundle("org.apache.aries.testsupport", "org.apache.aries.testsupport.unit").versionAsInProject(),

 				localTxControlService(),

 				localJdbcResourceProviderWithH2(),

 				systemProperty(REMOTE_DB_PROPERTY).value(getRemoteDBPath()),

@@ -231,7 +277,6 @@
 		return options(junitBundles(), systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("INFO"),

 				when(localRepo != null)

 				.useOptions(CoreOptions.vmOption("-Dorg.ops4j.pax.url.mvn.localRepository=" + localRepo)),

-				mavenBundle("org.apache.aries.testsupport", "org.apache.aries.testsupport.unit").versionAsInProject(),

 				localTxControlService(),

 				localJdbcResourceProviderWithH2(),

 				systemProperty(REMOTE_DB_PROPERTY).value(getRemoteDBPath()),

@@ -257,7 +302,6 @@
 		return options(junitBundles(), systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("INFO"),

 				when(localRepo != null)

 						.useOptions(CoreOptions.vmOption("-Dorg.ops4j.pax.url.mvn.localRepository=" + localRepo)),

-				mavenBundle("org.apache.aries.testsupport", "org.apache.aries.testsupport.unit").versionAsInProject(),

 				xaTxControlService(),

 				localJdbcResourceProviderWithH2(),

 				when(testSpecificOptions != null).useOptions(testSpecificOptions),

@@ -280,7 +324,6 @@
 		return options(junitBundles(), systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("INFO"),

 				when(localRepo != null)

 				.useOptions(CoreOptions.vmOption("-Dorg.ops4j.pax.url.mvn.localRepository=" + localRepo)),

-				mavenBundle("org.apache.aries.testsupport", "org.apache.aries.testsupport.unit").versionAsInProject(),

 				xaTxControlService(),

 				localJdbcResourceProviderWithH2(),

 				systemProperty(REMOTE_DB_PROPERTY).value(getRemoteDBPath()),

@@ -304,7 +347,6 @@
 		return options(junitBundles(), systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("INFO"),

 				when(localRepo != null)

 				.useOptions(CoreOptions.vmOption("-Dorg.ops4j.pax.url.mvn.localRepository=" + localRepo)),

-				mavenBundle("org.apache.aries.testsupport", "org.apache.aries.testsupport.unit").versionAsInProject(),

 				xaTxControlService(),

 				localJdbcResourceProviderWithH2(),

 				systemProperty(REMOTE_DB_PROPERTY).value(getRemoteDBPath()),

@@ -330,7 +372,6 @@
 		return options(junitBundles(), systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("INFO"),

 				when(localRepo != null)

 				.useOptions(CoreOptions.vmOption("-Dorg.ops4j.pax.url.mvn.localRepository=" + localRepo)),

-				mavenBundle("org.apache.aries.testsupport", "org.apache.aries.testsupport.unit").versionAsInProject(),

 				xaTxControlService(),

 				xaJdbcResourceProviderWithH2(),

 				systemProperty(REMOTE_DB_PROPERTY).value(getRemoteDBPath()),

@@ -354,7 +395,6 @@
 		return options(junitBundles(), systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("INFO"),

 				when(localRepo != null)

 				.useOptions(CoreOptions.vmOption("-Dorg.ops4j.pax.url.mvn.localRepository=" + localRepo)),

-				mavenBundle("org.apache.aries.testsupport", "org.apache.aries.testsupport.unit").versionAsInProject(),

 				xaTxControlService(),

 				xaJdbcResourceProviderWithH2(),

 				systemProperty(REMOTE_DB_PROPERTY).value(getRemoteDBPath()),

diff --git a/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/XATransactionTest.java b/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/XATransactionTest.java
index ff4fe6b..e22708d 100644
--- a/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/XATransactionTest.java
+++ b/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/XATransactionTest.java
@@ -38,7 +38,6 @@
 import javax.transaction.xa.XAResource;

 import javax.transaction.xa.Xid;

 

-import org.apache.aries.itest.AbstractIntegrationTest;

 import org.h2.tools.Server;

 import org.junit.After;

 import org.junit.Before;

@@ -58,7 +57,7 @@
 

 @RunWith(PaxExam.class)

 @ExamReactorStrategy(PerClass.class)

-public class XATransactionTest extends AbstractIntegrationTest {

+public class XATransactionTest {

 

 	@Inject

 	@Filter("(osgi.xa.enabled=true)")

@@ -67,6 +66,10 @@
 	@Inject

 	@Filter("(osgi.xa.enabled=true)")

 	private JDBCConnectionProviderFactory factory;

+

+	@Inject

+	@Filter("(osgi.jdbc.driver.class=org.h2.Driver)")

+	private DataSourceFactory dsf;

 	

 	protected Connection connection1;

 	protected Connection connection2;

@@ -88,10 +91,10 @@
 		String jdbcUrl2 = "jdbc:h2:tcp://127.0.0.1:" + server2.getPort() + "/" + getRemoteDBPath("db2");

 		

 		jdbc.setProperty(DataSourceFactory.JDBC_URL, jdbcUrl1);

-		connection1 = programaticConnection(jdbc);

+		connection1 = factory.getProviderFor(dsf, jdbc, null).getResource(txControl);

 		

 		jdbc.setProperty(DataSourceFactory.JDBC_URL, jdbcUrl2);

-		connection2 = programaticConnection(jdbc);

+		connection2 = factory.getProviderFor(dsf, jdbc, null).getResource(txControl);

 		

 		txControl.required(() -> {

 				Statement s = connection1.createStatement();

@@ -111,16 +114,6 @@
 			});

 	}

 

-	private Connection programaticConnection(Properties jdbc) {

-		

-		JDBCConnectionProviderFactory resourceProviderFactory = context()

-				.getService(JDBCConnectionProviderFactory.class, 5000);

-		

-		DataSourceFactory dsf = context().getService(DataSourceFactory.class, 5000);

-		

-		return resourceProviderFactory.getProviderFor(dsf, jdbc, null).getResource(txControl);

-	}

-

 	@After

 	public void tearDown() {

 

@@ -230,7 +223,6 @@
 		return options(junitBundles(), systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("INFO"),

 				when(localRepo != null)

 				.useOptions(CoreOptions.vmOption("-Dorg.ops4j.pax.url.mvn.localRepository=" + localRepo)),

-				mavenBundle("org.apache.aries.testsupport", "org.apache.aries.testsupport.unit").versionAsInProject(),

 				mavenBundle("org.apache.aries.tx-control", "tx-control-service-xa").versionAsInProject(),

 				mavenBundle("com.h2database", "h2").versionAsInProject(),

 				mavenBundle("org.apache.aries.tx-control", "tx-control-provider-jdbc-xa").versionAsInProject(),

diff --git a/tx-control-jpa-itests/pom.xml b/tx-control-jpa-itests/pom.xml
index 66aea46..7119389 100644
--- a/tx-control-jpa-itests/pom.xml
+++ b/tx-control-jpa-itests/pom.xml
@@ -94,12 +94,6 @@
 			<version>1.4.191</version>
 			<scope>test</scope>
 		</dependency>
-		<dependency>
-			<groupId>org.apache.aries.testsupport</groupId>
-			<artifactId>org.apache.aries.testsupport.unit</artifactId>
-			<version>2.0.0-SNAPSHOT</version>
-			<scope>test</scope>
-		</dependency>
 
 		<!-- pax exam -->
 		<dependency>
diff --git a/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/AbstractJPATransactionTest.java b/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/AbstractJPATransactionTest.java
index 0c66fbf..39c1d32 100644
--- a/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/AbstractJPATransactionTest.java
+++ b/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/AbstractJPATransactionTest.java
@@ -27,12 +27,15 @@
 

 import java.io.File;

 import java.io.IOException;

+import java.util.ArrayList;

 import java.util.Dictionary;

 import java.util.Hashtable;

+import java.util.List;

+import java.util.NoSuchElementException;

 

+import javax.inject.Inject;

 import javax.persistence.EntityManager;

 

-import org.apache.aries.itest.AbstractIntegrationTest;

 import org.h2.tools.Server;

 import org.junit.After;

 import org.junit.Before;

@@ -45,30 +48,41 @@
 import org.ops4j.pax.exam.junit.PaxExam;

 import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;

 import org.ops4j.pax.exam.spi.reactors.PerClass;

+import org.osgi.framework.BundleContext;

+import org.osgi.framework.Filter;

+import org.osgi.framework.FrameworkUtil;

+import org.osgi.framework.InvalidSyntaxException;

+import org.osgi.framework.ServiceReference;

 import org.osgi.service.cm.ConfigurationAdmin;

 import org.osgi.service.jdbc.DataSourceFactory;

 import org.osgi.service.jpa.EntityManagerFactoryBuilder;

 import org.osgi.service.transaction.control.TransactionControl;

 import org.osgi.service.transaction.control.jpa.JPAEntityManagerProvider;

+import org.osgi.util.tracker.ServiceTracker;

 

 @RunWith(PaxExam.class)

 @ExamReactorStrategy(PerClass.class)

-public abstract class AbstractJPATransactionTest extends AbstractIntegrationTest {

+public abstract class AbstractJPATransactionTest {

 

 	protected static final String TX_CONTROL_FILTER = "tx.control.filter";

 	protected static final String ARIES_EMF_BUILDER_TARGET_FILTER = "aries.emf.builder.target.filter";

 	protected static final String IS_XA = "aries.test.is.xa";

 

+	@Inject

+	BundleContext context;

+	

 	protected TransactionControl txControl;

 

 	protected EntityManager em;

 

 	private Server server;

+	

+	private final List<ServiceTracker<?,?>> trackers = new ArrayList<>();

 

 	@Before

 	public void setUp() throws Exception {

 		

-		txControl = context().getService(TransactionControl.class, System.getProperty(TX_CONTROL_FILTER), 5000);

+		txControl = getService(TransactionControl.class, System.getProperty(TX_CONTROL_FILTER), 5000);

 		

 		server = Server.createTcpServer("-tcpPort", "0");

 		server.start();

@@ -78,6 +92,38 @@
 		em = configuredEntityManager(jdbcUrl);

 	}

 

+	private <T> T getService(Class<T> clazz, long timeout) {

+		try {

+			return getService(clazz, null, timeout);

+		} catch (InvalidSyntaxException e) {

+			throw new IllegalArgumentException(e);

+		}

+	}

+

+	private <T> T getService(Class<T> clazz, String filter, long timeout) throws InvalidSyntaxException {

+		Filter f = FrameworkUtil.createFilter(filter == null ? "(|(foo=bar)(!(foo=bar)))" : filter); 

+		

+		ServiceTracker<T, T> tracker = new ServiceTracker<T, T>(context, clazz, null) {

+			@Override

+			public T addingService(ServiceReference<T> reference) {

+				return f.match(reference) ? super.addingService(reference) : null;

+			}

+		};

+

+		tracker.open();

+		try {

+			T t = tracker.waitForService(timeout);

+			if(t == null) {

+				throw new NoSuchElementException(clazz.getName());

+			}

+			return t;

+		} catch (InterruptedException e) {

+			throw new RuntimeException("Error waiting for service " + clazz.getName(), e);

+		} finally {

+			trackers.add(tracker);

+		}

+	}

+	

 	private String getRemoteDBPath() {

 		String fullResourceName = getClass().getName().replace('.', '/') + ".class";

 		

@@ -102,7 +148,7 @@
 			props.put(ARIES_EMF_BUILDER_TARGET_FILTER, filter);

 		}

 		

-		ConfigurationAdmin cm = context().getService(ConfigurationAdmin.class, 5000);

+		ConfigurationAdmin cm = getService(ConfigurationAdmin.class, 5000);

 		

 		String pid = getBoolean(IS_XA) ? "org.apache.aries.tx.control.jpa.xa" :

 				"org.apache.aries.tx.control.jpa.local"; 

@@ -113,7 +159,7 @@
 				pid, null);

 		config.update(props);

 		

-		return context().getService(JPAEntityManagerProvider.class, 5000).getResource(txControl);

+		return getService(JPAEntityManagerProvider.class, 5000).getResource(txControl);

 	}

 

 	protected Dictionary<String, Object> getBaseProperties() {

@@ -129,11 +175,13 @@
 			server.stop();

 		}

 

+		trackers.stream().forEach(ServiceTracker::close);

+		

 		em = null;

 	}

 

 	private void clearConfiguration() {

-		ConfigurationAdmin cm = context().getService(ConfigurationAdmin.class, 5000);

+		ConfigurationAdmin cm = getService(ConfigurationAdmin.class, 5000);

 		org.osgi.service.cm.Configuration[] cfgs = null;

 		try {

 			cfgs = cm.listConfigurations(null);

@@ -174,7 +222,6 @@
 		return options(junitBundles(), systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("INFO"),

 				when(localRepo != null)

 				.useOptions(CoreOptions.vmOption("-Dorg.ops4j.pax.url.mvn.localRepository=" + localRepo)),

-				mavenBundle("org.apache.aries.testsupport", "org.apache.aries.testsupport.unit").versionAsInProject(),

 				localTxControlService(),

 				localJpaResourceProviderWithH2(),

 				jpaProvider(),

@@ -197,7 +244,6 @@
 		return options(junitBundles(), systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("INFO"),

 				when(localRepo != null)

 				.useOptions(CoreOptions.vmOption("-Dorg.ops4j.pax.url.mvn.localRepository=" + localRepo)),

-				mavenBundle("org.apache.aries.testsupport", "org.apache.aries.testsupport.unit").versionAsInProject(),

 				systemProperty(IS_XA).value(Boolean.TRUE.toString()),

 				xaTxControlService(),

 				xaJpaResourceProviderWithH2(),

diff --git a/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/SimpleEclipseLink_2_6_0_Test.java b/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/SimpleEclipseLink_2_6_0_Test.java
index 664c5e0..c91d78b 100644
--- a/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/SimpleEclipseLink_2_6_0_Test.java
+++ b/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/SimpleEclipseLink_2_6_0_Test.java
@@ -44,7 +44,7 @@
 				mavenBundle("org.eclipse.persistence", "org.eclipse.persistence.asm", "2.6.0"),
 				mavenBundle("org.eclipse.persistence", "org.eclipse.persistence.antlr", "2.6.0"),
 				mavenBundle("org.eclipse.persistence", "org.eclipse.persistence.jpa.jpql", "2.6.0"),
-				mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.eclipselink.adapter", "2.4.0-SNAPSHOT"));
+				mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.eclipselink.adapter", "2.4.0"));
 	}
 
 }
diff --git a/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/SimpleHibernate_5_0_9_Test.java b/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/SimpleHibernate_5_0_9_Test.java
index 8c2a6be..4ea9306 100644
--- a/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/SimpleHibernate_5_0_9_Test.java
+++ b/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/SimpleHibernate_5_0_9_Test.java
@@ -29,7 +29,7 @@
 public class SimpleHibernate_5_0_9_Test extends AbstractSimpleTransactionTest {
 
 	protected String ariesJPAVersion() {
-		return "2.4.0-SNAPSHOT";
+		return "2.4.0";
 	}
 	
 	@Override
diff --git a/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/SimpleOpenJPA_2_4_1_Test.java b/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/SimpleOpenJPA_2_4_1_Test.java
index 44d1c64..a701fe7 100644
--- a/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/SimpleOpenJPA_2_4_1_Test.java
+++ b/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/SimpleOpenJPA_2_4_1_Test.java
@@ -32,7 +32,7 @@
 public class SimpleOpenJPA_2_4_1_Test extends AbstractSimpleTransactionTest {
 
 	protected String ariesJPAVersion() {
-		return "2.4.0-SNAPSHOT";
+		return "2.4.0";
 	}
 	
 	protected Dictionary<String, Object> getBaseProperties() {
diff --git a/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAEclipseLink_2_6_0_Test.java b/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAEclipseLink_2_6_0_Test.java
index 04480ab..ff0c749 100644
--- a/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAEclipseLink_2_6_0_Test.java
+++ b/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAEclipseLink_2_6_0_Test.java
@@ -44,7 +44,7 @@
 				mavenBundle("org.eclipse.persistence", "org.eclipse.persistence.asm", "2.6.0"),
 				mavenBundle("org.eclipse.persistence", "org.eclipse.persistence.antlr", "2.6.0"),
 				mavenBundle("org.eclipse.persistence", "org.eclipse.persistence.jpa.jpql", "2.6.0"),
-				mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.eclipselink.adapter", "2.4.0-SNAPSHOT"));
+				mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.eclipselink.adapter", "2.4.0"));
 	}
 
 }
diff --git a/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAHibernate_5_0_9_Test.java b/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAHibernate_5_0_9_Test.java
index 0292860..8e33063 100644
--- a/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAHibernate_5_0_9_Test.java
+++ b/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAHibernate_5_0_9_Test.java
@@ -29,7 +29,7 @@
 public class XAHibernate_5_0_9_Test extends XAJPATransactionTest {
 
 	protected String ariesJPAVersion() {
-		return "2.4.0-SNAPSHOT";
+		return "2.4.0";
 	}
 	
 	@Override
diff --git a/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAJPATransactionTest.java b/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAJPATransactionTest.java
index 9f2f787..43ecd56 100644
--- a/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAJPATransactionTest.java
+++ b/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAJPATransactionTest.java
@@ -28,12 +28,14 @@
 import static org.ops4j.pax.exam.CoreOptions.when;

 

 import java.io.File;

-import java.io.IOException;

 import java.io.InputStream;

 import java.lang.reflect.Field;

+import java.util.ArrayList;

 import java.util.Arrays;

 import java.util.Dictionary;

 import java.util.Hashtable;

+import java.util.List;

+import java.util.NoSuchElementException;

 

 import javax.inject.Inject;

 import javax.persistence.EntityManager;

@@ -43,7 +45,6 @@
 import javax.transaction.xa.XAResource;

 import javax.transaction.xa.Xid;

 

-import org.apache.aries.itest.AbstractIntegrationTest;

 import org.apache.aries.tx.control.itests.entity.Message;

 import org.h2.tools.Server;

 import org.junit.After;

@@ -60,16 +61,21 @@
 import org.ops4j.pax.exam.spi.reactors.PerClass;

 import org.ops4j.pax.exam.util.Filter;

 import org.ops4j.pax.tinybundles.core.TinyBundles;

+import org.osgi.framework.BundleContext;

+import org.osgi.framework.FrameworkUtil;

+import org.osgi.framework.InvalidSyntaxException;

+import org.osgi.framework.ServiceReference;

 import org.osgi.service.cm.ConfigurationAdmin;

 import org.osgi.service.jdbc.DataSourceFactory;

 import org.osgi.service.jpa.EntityManagerFactoryBuilder;

 import org.osgi.service.transaction.control.TransactionControl;

 import org.osgi.service.transaction.control.TransactionRolledBackException;

 import org.osgi.service.transaction.control.jpa.JPAEntityManagerProvider;

+import org.osgi.util.tracker.ServiceTracker;

 

 @RunWith(PaxExam.class)

 @ExamReactorStrategy(PerClass.class)

-public abstract class XAJPATransactionTest  extends AbstractIntegrationTest {

+public abstract class XAJPATransactionTest {

 

 	static final String XA_TEST_UNIT_1 = "xa-test-unit-1";

 	static final String XA_TEST_UNIT_2 = "xa-test-unit-2";

@@ -77,6 +83,9 @@
 	protected static final String ARIES_EMF_BUILDER_TARGET_FILTER = "aries.emf.builder.target.filter";

 	

 	@Inject

+	BundleContext context;

+	

+	@Inject

 	@Filter("(osgi.xa.enabled=true)")

 	protected TransactionControl txControl;

 

@@ -85,6 +94,8 @@
 

 	private Server server1;

 	private Server server2;

+	

+	private final List<ServiceTracker<?,?>> trackers = new ArrayList<>();

 

 	@Before

 	public void setUp() throws Exception {

@@ -111,7 +122,7 @@
 		return new File(testClassesDir.getParentFile(), "testdb/" + dbName).getAbsolutePath();

 	}

 	

-	private EntityManager configuredEntityManager(String jdbcUrl, String unit) throws IOException {

+	private EntityManager configuredEntityManager(String jdbcUrl, String unit) throws Exception {

 		

 		Dictionary<String, Object> props = getBaseProperties();

 		

@@ -125,17 +136,49 @@
 			props.put(ARIES_EMF_BUILDER_TARGET_FILTER, "(&(osgi.unit.name=" + unit + ")" + filter + ")");

 		}

 		

-		ConfigurationAdmin cm = context().getService(ConfigurationAdmin.class, 5000);

+		ConfigurationAdmin cm = getService(ConfigurationAdmin.class, 5000);

 		

 		org.osgi.service.cm.Configuration config = cm.createFactoryConfiguration(

 				"org.apache.aries.tx.control.jpa.xa", null);

 		config.update(props);

 		

-		return context().getService(JPAEntityManagerProvider.class,

+		return getService(JPAEntityManagerProvider.class,

 				"(" + EntityManagerFactoryBuilder.JPA_UNIT_NAME + "=" + unit + ")",

 				5000).getResource(txControl);

 	}

 

+	private <T> T getService(Class<T> clazz, long timeout) {

+		try {

+			return getService(clazz, null, timeout);

+		} catch (InvalidSyntaxException e) {

+			throw new IllegalArgumentException(e);

+		}

+	}

+

+	private <T> T getService(Class<T> clazz, String filter, long timeout) throws InvalidSyntaxException {

+		org.osgi.framework.Filter f = FrameworkUtil.createFilter(filter == null ? "(|(foo=bar)(!(foo=bar)))" : filter); 

+		

+		ServiceTracker<T, T> tracker = new ServiceTracker<T, T>(context, clazz, null) {

+			@Override

+			public T addingService(ServiceReference<T> reference) {

+				return f.match(reference) ? super.addingService(reference) : null;

+			}

+		};

+

+		tracker.open();

+		try {

+			T t = tracker.waitForService(timeout);

+			if(t == null) {

+				throw new NoSuchElementException(clazz.getName());

+			}

+			return t;

+		} catch (InterruptedException e) {

+			throw new RuntimeException("Error waiting for service " + clazz.getName(), e);

+		} finally {

+			trackers.add(tracker);

+		}

+	}

+	

 	protected Dictionary<String, Object> getBaseProperties() {

 		return new Hashtable<>();

 	}

@@ -152,12 +195,14 @@
 			server2.stop();

 		}

 

+		trackers.stream().forEach(ServiceTracker::close);

+		

 		em1 = null;

 		em2 = null;

 	}

 

 	private void clearConfiguration() {

-		ConfigurationAdmin cm = context().getService(ConfigurationAdmin.class, 5000);

+		ConfigurationAdmin cm = getService(ConfigurationAdmin.class, 5000);

 		org.osgi.service.cm.Configuration[] cfgs = null;

 		try {

 			cfgs = cm.listConfigurations(null);

@@ -196,7 +241,6 @@
 		return options(junitBundles(), systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("INFO"),

 				when(localRepo != null)

 				.useOptions(CoreOptions.vmOption("-Dorg.ops4j.pax.url.mvn.localRepository=" + localRepo)),

-				mavenBundle("org.apache.aries.testsupport", "org.apache.aries.testsupport.unit").versionAsInProject(),

 				mavenBundle("org.apache.aries.tx-control", "tx-control-service-xa").versionAsInProject(),

 				mavenBundle("com.h2database", "h2").versionAsInProject(),

 				mavenBundle("org.apache.aries.tx-control", "tx-control-provider-jpa-xa").versionAsInProject(),

@@ -308,8 +352,16 @@
 	}

 	

 	Object getMessageEntityFrom(String unit) throws Exception {

-		Class<?> clz = context().getBundleByName(unit).loadClass(

-				"org.apache.aries.tx.control.itests.entity.Message");

+		Class<?> clz = Arrays.stream(context.getBundles())

+					.filter(b -> unit.equals(b.getSymbolicName()))

+					.map(b -> {

+							try {

+								return b.loadClass("org.apache.aries.tx.control.itests.entity.Message");

+							} catch (ClassNotFoundException e) {

+								throw new RuntimeException(e);

+							}

+						})

+					.findFirst().orElseThrow(() -> new IllegalArgumentException(unit));

 		return clz.newInstance();

 	}

 	

diff --git a/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAOpenJPA_2_4_1_Test.java b/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAOpenJPA_2_4_1_Test.java
index cab28c6..1c08f8f 100644
--- a/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAOpenJPA_2_4_1_Test.java
+++ b/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAOpenJPA_2_4_1_Test.java
@@ -33,7 +33,7 @@
 
 	@Override
 	protected String ariesJPAVersion() {
-		return "2.4.0-SNAPSHOT";
+		return "2.4.0";
 	}
 	
 	@Override