You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by ti...@apache.org on 2016/12/16 18:31:33 UTC
svn commit: r1774648 - in /aries/trunk/tx-control:
tx-control-api/src/main/java/org/osgi/service/transaction/control/jdbc/
tx-control-api/src/main/java/org/osgi/service/transaction/control/jpa/
tx-control-itests/src/test/java/org/apache/aries/tx/contro...
Author: timothyjward
Date: Fri Dec 16 18:31:32 2016
New Revision: 1774648
URL: http://svn.apache.org/viewvc?rev=1774648&view=rev
Log:
[tx-control] Add support for releasing resource providers to the factories
Modified:
aries/trunk/tx-control/tx-control-api/src/main/java/org/osgi/service/transaction/control/jdbc/JDBCConnectionProviderFactory.java
aries/trunk/tx-control/tx-control-api/src/main/java/org/osgi/service/transaction/control/jpa/JPAEntityManagerProviderFactory.java
aries/trunk/tx-control/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/AbstractTransactionTest.java
aries/trunk/tx-control/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/ConnectionLifecycleTest.java
aries/trunk/tx-control/tx-control-provider-common/src/main/java/org/apache/aries/tx/control/resource/common/impl/TrackingResourceProviderFactory.java
aries/trunk/tx-control/tx-control-provider-common/src/test/java/org/apache/aries/tx/control/resource/common/impl/TrackingResourceProviderFactoryTest.java
aries/trunk/tx-control/tx-control-provider-jdbc-common/src/main/java/org/apache/aries/tx/control/jdbc/common/impl/AbstractJDBCConnectionProvider.java
aries/trunk/tx-control/tx-control-provider-jdbc-common/src/main/java/org/apache/aries/tx/control/jdbc/common/impl/InternalJDBCConnectionProviderFactory.java
aries/trunk/tx-control/tx-control-provider-jdbc-common/src/main/java/org/apache/aries/tx/control/jdbc/common/impl/ResourceTrackingJDBCConnectionProviderFactory.java
aries/trunk/tx-control/tx-control-provider-jdbc-local/src/main/java/org/apache/aries/tx/control/jdbc/local/impl/JDBCConnectionProviderFactoryImpl.java
aries/trunk/tx-control/tx-control-provider-jdbc-local/src/main/java/org/apache/aries/tx/control/jdbc/local/impl/JDBCConnectionProviderImpl.java
aries/trunk/tx-control/tx-control-provider-jdbc-local/src/main/java/org/apache/aries/tx/control/jdbc/local/impl/TxContextBindingConnection.java
aries/trunk/tx-control/tx-control-provider-jdbc-local/src/test/java/org/apache/aries/tx/control/jdbc/local/impl/TxContextBindingConnectionTest.java
aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/main/java/org/apache/aries/tx/control/jdbc/xa/impl/JDBCConnectionProviderFactoryImpl.java
aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/main/java/org/apache/aries/tx/control/jdbc/xa/impl/JDBCConnectionProviderImpl.java
aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/main/java/org/apache/aries/tx/control/jdbc/xa/impl/RecoverableXAResourceImpl.java
aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/main/java/org/apache/aries/tx/control/jdbc/xa/impl/XAEnabledTxContextBindingConnection.java
aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/test/java/org/apache/aries/tx/control/jdbc/xa/impl/XAEnabledTxContextBindingConnectionTest.java
aries/trunk/tx-control/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/AbstractJPAEntityManagerProvider.java
aries/trunk/tx-control/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/InternalJPAEntityManagerProviderFactory.java
aries/trunk/tx-control/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/ResourceTrackingJPAEntityManagerProviderFactory.java
aries/trunk/tx-control/tx-control-provider-jpa-local/src/main/java/org/apache/aries/tx/control/jpa/local/impl/JPAEntityManagerProviderFactoryImpl.java
aries/trunk/tx-control/tx-control-provider-jpa-local/src/main/java/org/apache/aries/tx/control/jpa/local/impl/JPAEntityManagerProviderImpl.java
aries/trunk/tx-control/tx-control-provider-jpa-local/src/main/java/org/apache/aries/tx/control/jpa/local/impl/TxContextBindingEntityManager.java
aries/trunk/tx-control/tx-control-provider-jpa-local/src/test/java/org/apache/aries/tx/control/jpa/local/impl/TxContextBindingEntityManagerTest.java
aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl.java
aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderImpl.java
aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/XATxContextBindingEntityManager.java
aries/trunk/tx-control/tx-control-provider-jpa-xa/src/test/java/org/apache/aries/tx/control/jpa/xa/impl/XATxContextBindingEntityManagerTest.java
Modified: aries/trunk/tx-control/tx-control-api/src/main/java/org/osgi/service/transaction/control/jdbc/JDBCConnectionProviderFactory.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-api/src/main/java/org/osgi/service/transaction/control/jdbc/JDBCConnectionProviderFactory.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-api/src/main/java/org/osgi/service/transaction/control/jdbc/JDBCConnectionProviderFactory.java (original)
+++ aries/trunk/tx-control/tx-control-api/src/main/java/org/osgi/service/transaction/control/jdbc/JDBCConnectionProviderFactory.java Fri Dec 16 18:31:32 2016
@@ -147,4 +147,18 @@ public interface JDBCConnectionProviderF
JDBCConnectionProvider getProviderFor(XADataSource ds,
Map<String,Object> resourceProviderProperties);
+ /**
+ * Release a {@link JDBCConnectionProvider} instance that has been created
+ * by this factory. Released instances are eligible to be shut down and have
+ * any remaining open connections closed.
+ * <p>
+ * Note that all {@link JDBCConnectionProvider} instances created by this
+ * factory service are implicitly released when the factory service is
+ * released by this bundle.
+ *
+ * @param provider
+ * @throws IllegalArgumentException if the supplied resource was not created
+ * by this factory service instance.
+ */
+ void releaseProvider(JDBCConnectionProvider provider);
}
Modified: aries/trunk/tx-control/tx-control-api/src/main/java/org/osgi/service/transaction/control/jpa/JPAEntityManagerProviderFactory.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-api/src/main/java/org/osgi/service/transaction/control/jpa/JPAEntityManagerProviderFactory.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-api/src/main/java/org/osgi/service/transaction/control/jpa/JPAEntityManagerProviderFactory.java (original)
+++ aries/trunk/tx-control/tx-control-api/src/main/java/org/osgi/service/transaction/control/jpa/JPAEntityManagerProviderFactory.java Fri Dec 16 18:31:32 2016
@@ -88,4 +88,18 @@ public interface JPAEntityManagerProvide
JPAEntityManagerProvider getProviderFor(EntityManagerFactory emf,
Map<String,Object> resourceProviderProperties);
+ /**
+ * Release a {@link JPAEntityManagerProvider} instance that has been created
+ * by this factory. Released instances are eligible to be shut down and have
+ * any remaining open connections closed.
+ * <p>
+ * Note that all {@link JPAEntityManagerProvider} instances created by this
+ * factory service are implicitly released when the factory service is
+ * released by this bundle.
+ *
+ * @param provider
+ * @throws IllegalArgumentException if the supplied resource was not created
+ * by this factory service instance.
+ */
+ void releaseProvider(JPAEntityManagerProvider provider);
}
Modified: aries/trunk/tx-control/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/AbstractTransactionTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/AbstractTransactionTest.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/AbstractTransactionTest.java (original)
+++ aries/trunk/tx-control/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/AbstractTransactionTest.java Fri Dec 16 18:31:32 2016
@@ -76,6 +76,8 @@ public abstract class AbstractTransactio
protected TransactionControl txControl;
+ protected JDBCConnectionProvider provider;
+
protected Connection connection;
private Server server;
@@ -165,8 +167,8 @@ public abstract class AbstractTransactio
DataSourceFactory dsf = getService(DataSourceFactory.class, 5000);
- return resourceProviderFactory.getProviderFor(dsf, jdbc, resourceProviderConfig())
- .getResource(txControl);
+ provider = resourceProviderFactory.getProviderFor(dsf, jdbc, resourceProviderConfig());
+ return provider.getResource(txControl);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@@ -189,7 +191,8 @@ public abstract class AbstractTransactio
pid, "?");
config.update((Hashtable)jdbc);
- return getService(JDBCConnectionProvider.class, 5000).getResource(txControl);
+ provider = getService(JDBCConnectionProvider.class, 5000);
+ return provider.getResource(txControl);
}
@After
Modified: aries/trunk/tx-control/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/ConnectionLifecycleTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/ConnectionLifecycleTest.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/ConnectionLifecycleTest.java (original)
+++ aries/trunk/tx-control/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/ConnectionLifecycleTest.java Fri Dec 16 18:31:32 2016
@@ -234,6 +234,39 @@ public class ConnectionLifecycleTest ext
}
@Test
+ public void testReleaseOfFactoryCreatedService() {
+ Assume.assumeFalse("Not a factory test", isConfigured());
+
+ txControl.required(
+ () -> connection.createStatement().execute("Insert into TEST_TABLE values ( 'Hello World!' )"));
+
+ assertEquals("Hello World!", txControl.notSupported(() -> {
+ ResultSet rs = connection.createStatement().executeQuery("Select * from TEST_TABLE");
+ rs.next();
+ return rs.getString(1);
+ }));
+
+ JDBCConnectionProviderFactory factory = (JDBCConnectionProviderFactory) trackers.stream()
+ .filter(t -> t.getService() instanceof JDBCConnectionProviderFactory)
+ .findFirst()
+ .get().getService();
+
+ factory.releaseProvider(provider);
+
+ try {
+ assertEquals("Hello World!", txControl.notSupported(() -> {
+ ResultSet rs = connection.createStatement().executeQuery("Select * from TEST_TABLE");
+ rs.next();
+ return rs.getString(1);
+ }));
+ fail("Should not be accessible");
+ } catch (ScopedWorkException swe) {
+ assertTrue(swe.getCause().toString(), swe.getCause() instanceof TransactionException);
+ assertEquals("There was a problem getting hold of a database connection", swe.getCause().getMessage());
+ }
+ }
+
+ @Test
public void testPoolLifecycle() throws Exception {
Set<String> allIds = new TreeSet<>();
Modified: aries/trunk/tx-control/tx-control-provider-common/src/main/java/org/apache/aries/tx/control/resource/common/impl/TrackingResourceProviderFactory.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-common/src/main/java/org/apache/aries/tx/control/resource/common/impl/TrackingResourceProviderFactory.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-common/src/main/java/org/apache/aries/tx/control/resource/common/impl/TrackingResourceProviderFactory.java (original)
+++ aries/trunk/tx-control/tx-control-provider-common/src/main/java/org/apache/aries/tx/control/resource/common/impl/TrackingResourceProviderFactory.java Fri Dec 16 18:31:32 2016
@@ -18,8 +18,10 @@
*/
package org.apache.aries.tx.control.resource.common.impl;
-import java.util.ArrayList;
-import java.util.List;
+import static java.util.Collections.newSetFromMap;
+
+import java.util.IdentityHashMap;
+import java.util.Set;
import java.util.concurrent.Callable;
import org.osgi.framework.ServiceException;
@@ -30,7 +32,7 @@ public abstract class TrackingResourcePr
private static final Logger LOG = LoggerFactory.getLogger(TrackingResourceProviderFactory.class);
- private final List<T> toClose = new ArrayList<>();
+ private final Set<T> toClose = newSetFromMap(new IdentityHashMap<>());
private boolean closed;
@@ -79,4 +81,19 @@ public abstract class TrackingResourcePr
toClose.clear();
}
+
+ protected void release(T t) {
+ synchronized (toClose) {
+ if(closed) {
+ throw new IllegalStateException("This resource factory is closed");
+ }
+
+ if (!toClose.remove(t)) {
+ throw new IllegalArgumentException("The resource " + t + " is not managed by this factory");
+ }
+ }
+ try {
+ t.close();
+ } catch (Exception e) {}
+ }
}
\ No newline at end of file
Modified: aries/trunk/tx-control/tx-control-provider-common/src/test/java/org/apache/aries/tx/control/resource/common/impl/TrackingResourceProviderFactoryTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-common/src/test/java/org/apache/aries/tx/control/resource/common/impl/TrackingResourceProviderFactoryTest.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-common/src/test/java/org/apache/aries/tx/control/resource/common/impl/TrackingResourceProviderFactoryTest.java (original)
+++ aries/trunk/tx-control/tx-control-provider-common/src/test/java/org/apache/aries/tx/control/resource/common/impl/TrackingResourceProviderFactoryTest.java Fri Dec 16 18:31:32 2016
@@ -34,4 +34,34 @@ public class TrackingResourceProviderFac
Mockito.verify(result).close();
}
+
+ @Test
+ public void testReleaseResource() throws Exception {
+ TrackingResourceProviderFactory<AutoCloseable> trpf = new TrackingResourceProviderFactory<AutoCloseable>(){};
+
+ AutoCloseable result = trpf.doGetResult(() -> Mockito.mock(AutoCloseable.class));
+
+ trpf.release(result);
+
+ Mockito.verify(result).close();
+ }
+
+ @Test(expected=IllegalArgumentException.class)
+ public void testReleaseResourceNotFromThisFactory() throws Exception {
+ TrackingResourceProviderFactory<AutoCloseable> trpf = new TrackingResourceProviderFactory<AutoCloseable>(){};
+
+ AutoCloseable result = Mockito.mock(AutoCloseable.class);
+
+ trpf.release(result);
+ }
+
+ @Test(expected=IllegalStateException.class)
+ public void testReleaseAfterFactoryClosed() throws Exception {
+ TrackingResourceProviderFactory<AutoCloseable> trpf = new TrackingResourceProviderFactory<AutoCloseable>(){};
+ trpf.closeAll();
+
+ AutoCloseable result = Mockito.mock(AutoCloseable.class);
+
+ trpf.release(result);
+ }
}
Modified: aries/trunk/tx-control/tx-control-provider-jdbc-common/src/main/java/org/apache/aries/tx/control/jdbc/common/impl/AbstractJDBCConnectionProvider.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jdbc-common/src/main/java/org/apache/aries/tx/control/jdbc/common/impl/AbstractJDBCConnectionProvider.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jdbc-common/src/main/java/org/apache/aries/tx/control/jdbc/common/impl/AbstractJDBCConnectionProvider.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jdbc-common/src/main/java/org/apache/aries/tx/control/jdbc/common/impl/AbstractJDBCConnectionProvider.java Fri Dec 16 18:31:32 2016
@@ -19,6 +19,8 @@
package org.apache.aries.tx.control.jdbc.common.impl;
import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.concurrent.atomic.AtomicBoolean;
import javax.sql.DataSource;
@@ -32,7 +34,9 @@ public abstract class AbstractJDBCConnec
private static final Logger LOG = LoggerFactory.getLogger(AbstractJDBCConnectionProvider.class);
- protected final DataSource dataSource;
+ private final DataSource dataSource;
+
+ private final AtomicBoolean closed = new AtomicBoolean(false);
public AbstractJDBCConnectionProvider(DataSource dataSource) {
this.dataSource = dataSource;
@@ -43,7 +47,18 @@ public abstract class AbstractJDBCConnec
throws TransactionException;
+ public Connection getConnection() throws SQLException {
+ if(closed.get()) throw new IllegalStateException("This resource provider is no longer in use");
+ return dataSource.getConnection();
+ }
+
+ public Connection getConnection(String recoveryUser, String recoveryPw) throws SQLException {
+ if(closed.get()) throw new IllegalStateException("This resource provider is no longer in use");
+ return dataSource.getConnection(recoveryUser, recoveryPw);
+ }
+
public void close() {
+ closed.set(true);
if(dataSource instanceof AutoCloseable) {
try {
((AutoCloseable) dataSource).close();
Modified: aries/trunk/tx-control/tx-control-provider-jdbc-common/src/main/java/org/apache/aries/tx/control/jdbc/common/impl/InternalJDBCConnectionProviderFactory.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jdbc-common/src/main/java/org/apache/aries/tx/control/jdbc/common/impl/InternalJDBCConnectionProviderFactory.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jdbc-common/src/main/java/org/apache/aries/tx/control/jdbc/common/impl/InternalJDBCConnectionProviderFactory.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jdbc-common/src/main/java/org/apache/aries/tx/control/jdbc/common/impl/InternalJDBCConnectionProviderFactory.java Fri Dec 16 18:31:32 2016
@@ -26,17 +26,14 @@ import javax.sql.DataSource;
import javax.sql.XADataSource;
import org.osgi.service.jdbc.DataSourceFactory;
-import org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory;
-public interface InternalJDBCConnectionProviderFactory extends JDBCConnectionProviderFactory {
+public interface InternalJDBCConnectionProviderFactory {
- @Override
AbstractJDBCConnectionProvider getProviderFor(DataSourceFactory dsf, Properties jdbcProperties,
Map<String, Object> resourceProviderProperties);
AbstractJDBCConnectionProvider getProviderFor(DataSource ds, Map<String, Object> resourceProviderProperties);
- @Override
AbstractJDBCConnectionProvider getProviderFor(Driver driver, Properties jdbcProperties,
Map<String, Object> resourceProviderProperties);
Modified: aries/trunk/tx-control/tx-control-provider-jdbc-common/src/main/java/org/apache/aries/tx/control/jdbc/common/impl/ResourceTrackingJDBCConnectionProviderFactory.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jdbc-common/src/main/java/org/apache/aries/tx/control/jdbc/common/impl/ResourceTrackingJDBCConnectionProviderFactory.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jdbc-common/src/main/java/org/apache/aries/tx/control/jdbc/common/impl/ResourceTrackingJDBCConnectionProviderFactory.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jdbc-common/src/main/java/org/apache/aries/tx/control/jdbc/common/impl/ResourceTrackingJDBCConnectionProviderFactory.java Fri Dec 16 18:31:32 2016
@@ -65,4 +65,14 @@ public class ResourceTrackingJDBCConnect
return doGetResult(() -> factory.getProviderFor(ds,
resourceProviderProperties));
}
+
+ @Override
+ public void releaseProvider(JDBCConnectionProvider provider) {
+ if(provider instanceof AbstractJDBCConnectionProvider) {
+ release((AbstractJDBCConnectionProvider)provider);
+ } else {
+ throw new IllegalArgumentException(
+ "The supplied JDBCConnectionProvider was not created by this JDBCConnectionProviderFactory");
+ }
+ }
}
\ No newline at end of file
Modified: aries/trunk/tx-control/tx-control-provider-jdbc-local/src/main/java/org/apache/aries/tx/control/jdbc/local/impl/JDBCConnectionProviderFactoryImpl.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jdbc-local/src/main/java/org/apache/aries/tx/control/jdbc/local/impl/JDBCConnectionProviderFactoryImpl.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jdbc-local/src/main/java/org/apache/aries/tx/control/jdbc/local/impl/JDBCConnectionProviderFactoryImpl.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jdbc-local/src/main/java/org/apache/aries/tx/control/jdbc/local/impl/JDBCConnectionProviderFactoryImpl.java Fri Dec 16 18:31:32 2016
@@ -22,6 +22,15 @@ import static java.util.Optional.ofNulla
import static java.util.concurrent.TimeUnit.HOURS;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.osgi.service.jdbc.DataSourceFactory.JDBC_URL;
+import static org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory.CONNECTION_LIFETIME;
+import static org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory.CONNECTION_POOLING_ENABLED;
+import static org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory.CONNECTION_TIMEOUT;
+import static org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory.IDLE_TIMEOUT;
+import static org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory.LOCAL_ENLISTMENT_ENABLED;
+import static org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory.MAX_CONNECTIONS;
+import static org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory.MIN_CONNECTIONS;
+import static org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory.USE_DRIVER;
+import static org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory.XA_ENLISTMENT_ENABLED;
import java.sql.Driver;
import java.sql.SQLException;
@@ -37,12 +46,11 @@ import org.apache.aries.tx.control.jdbc.
import org.apache.aries.tx.control.jdbc.common.impl.InternalJDBCConnectionProviderFactory;
import org.osgi.service.jdbc.DataSourceFactory;
import org.osgi.service.transaction.control.TransactionException;
-import org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
-public class JDBCConnectionProviderFactoryImpl implements JDBCConnectionProviderFactory, InternalJDBCConnectionProviderFactory {
+public class JDBCConnectionProviderFactoryImpl implements InternalJDBCConnectionProviderFactory {
@Override
public AbstractJDBCConnectionProvider getProviderFor(DataSourceFactory dsf, Properties jdbcProperties,
Modified: aries/trunk/tx-control/tx-control-provider-jdbc-local/src/main/java/org/apache/aries/tx/control/jdbc/local/impl/JDBCConnectionProviderImpl.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jdbc-local/src/main/java/org/apache/aries/tx/control/jdbc/local/impl/JDBCConnectionProviderImpl.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jdbc-local/src/main/java/org/apache/aries/tx/control/jdbc/local/impl/JDBCConnectionProviderImpl.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jdbc-local/src/main/java/org/apache/aries/tx/control/jdbc/local/impl/JDBCConnectionProviderImpl.java Fri Dec 16 18:31:32 2016
@@ -38,6 +38,6 @@ public class JDBCConnectionProviderImpl
@Override
public Connection getResource(TransactionControl txControl)
throws TransactionException {
- return new TxContextBindingConnection(txControl, dataSource , uuid);
+ return new TxContextBindingConnection(txControl, this , uuid);
}
}
Modified: aries/trunk/tx-control/tx-control-provider-jdbc-local/src/main/java/org/apache/aries/tx/control/jdbc/local/impl/TxContextBindingConnection.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jdbc-local/src/main/java/org/apache/aries/tx/control/jdbc/local/impl/TxContextBindingConnection.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jdbc-local/src/main/java/org/apache/aries/tx/control/jdbc/local/impl/TxContextBindingConnection.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jdbc-local/src/main/java/org/apache/aries/tx/control/jdbc/local/impl/TxContextBindingConnection.java Fri Dec 16 18:31:32 2016
@@ -24,8 +24,7 @@ import java.sql.Connection;
import java.sql.SQLException;
import java.util.UUID;
-import javax.sql.DataSource;
-
+import org.apache.aries.tx.control.jdbc.common.impl.AbstractJDBCConnectionProvider;
import org.apache.aries.tx.control.jdbc.common.impl.ConnectionWrapper;
import org.apache.aries.tx.control.jdbc.common.impl.ScopedConnectionWrapper;
import org.apache.aries.tx.control.jdbc.common.impl.TxConnectionWrapper;
@@ -36,14 +35,14 @@ import org.osgi.service.transaction.cont
public class TxContextBindingConnection extends ConnectionWrapper {
- private final TransactionControl txControl;
- private final UUID resourceId;
- private final DataSource dataSource;
+ private final TransactionControl txControl;
+ private final UUID resourceId;
+ private final AbstractJDBCConnectionProvider provider;
public TxContextBindingConnection(TransactionControl txControl,
- DataSource dataSource, UUID resourceId) {
+ AbstractJDBCConnectionProvider provider, UUID resourceId) {
this.txControl = txControl;
- this.dataSource = dataSource;
+ this.provider = provider;
this.resourceId = resourceId;
}
@@ -53,7 +52,7 @@ public class TxContextBindingConnection
TransactionContext txContext = txControl.getCurrentContext();
if (txContext == null) {
- throw new TransactionException("The resource " + dataSource
+ throw new TransactionException("The resource " + provider
+ " cannot be accessed outside of an active Transaction Context");
}
@@ -68,10 +67,10 @@ public class TxContextBindingConnection
try {
if (txContext.getTransactionStatus() == NO_TRANSACTION) {
- toClose = dataSource.getConnection();
+ toClose = provider.getConnection();
toReturn = new ScopedConnectionWrapper(toClose);
} else if (txContext.supportsLocal()) {
- toClose = dataSource.getConnection();
+ toClose = provider.getConnection();
toReturn = new TxConnectionWrapper(toClose);
txContext.registerLocalResource(getLocalResource(toClose));
} else {
Modified: aries/trunk/tx-control/tx-control-provider-jdbc-local/src/test/java/org/apache/aries/tx/control/jdbc/local/impl/TxContextBindingConnectionTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jdbc-local/src/test/java/org/apache/aries/tx/control/jdbc/local/impl/TxContextBindingConnectionTest.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jdbc-local/src/test/java/org/apache/aries/tx/control/jdbc/local/impl/TxContextBindingConnectionTest.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jdbc-local/src/test/java/org/apache/aries/tx/control/jdbc/local/impl/TxContextBindingConnectionTest.java Fri Dec 16 18:31:32 2016
@@ -30,6 +30,7 @@ import java.util.UUID;
import javax.sql.DataSource;
+import org.apache.aries.tx.control.jdbc.common.impl.AbstractJDBCConnectionProvider;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -62,6 +63,8 @@ public class TxContextBindingConnectionT
UUID id = UUID.randomUUID();
TxContextBindingConnection conn;
+
+ private AbstractJDBCConnectionProvider provider;
@Before
public void setUp() throws SQLException {
@@ -72,7 +75,9 @@ public class TxContextBindingConnectionT
Mockito.when(context.getScopedValue(Mockito.any()))
.thenAnswer(i -> variables.get(i.getArguments()[0]));
- conn = new TxContextBindingConnection(control, dataSource, id);
+ provider = new JDBCConnectionProviderImpl(dataSource);
+
+ conn = new TxContextBindingConnection(control, provider, id);
}
private void setupNoTransaction() {
@@ -151,4 +156,12 @@ public class TxContextBindingConnectionT
conn.isValid(500);
}
+ @Test(expected=TransactionException.class)
+ public void testActiveTransactionClosedProvider() throws SQLException {
+ setupActiveTransaction();
+
+ provider.close();
+ conn.isValid(500);
+ }
+
}
Modified: aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/main/java/org/apache/aries/tx/control/jdbc/xa/impl/JDBCConnectionProviderFactoryImpl.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/main/java/org/apache/aries/tx/control/jdbc/xa/impl/JDBCConnectionProviderFactoryImpl.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/main/java/org/apache/aries/tx/control/jdbc/xa/impl/JDBCConnectionProviderFactoryImpl.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/main/java/org/apache/aries/tx/control/jdbc/xa/impl/JDBCConnectionProviderFactoryImpl.java Fri Dec 16 18:31:32 2016
@@ -22,6 +22,16 @@ import static java.util.Optional.ofNulla
import static java.util.concurrent.TimeUnit.HOURS;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.osgi.service.jdbc.DataSourceFactory.JDBC_URL;
+import static org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory.CONNECTION_LIFETIME;
+import static org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory.CONNECTION_POOLING_ENABLED;
+import static org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory.CONNECTION_TIMEOUT;
+import static org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory.IDLE_TIMEOUT;
+import static org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory.LOCAL_ENLISTMENT_ENABLED;
+import static org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory.MAX_CONNECTIONS;
+import static org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory.MIN_CONNECTIONS;
+import static org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory.OSGI_RECOVERY_IDENTIFIER;
+import static org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory.USE_DRIVER;
+import static org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory.XA_ENLISTMENT_ENABLED;
import java.sql.Driver;
import java.sql.SQLException;
@@ -32,19 +42,19 @@ import java.util.concurrent.TimeUnit;
import javax.sql.DataSource;
import javax.sql.XADataSource;
+import org.apache.aries.tx.control.jdbc.common.impl.AbstractJDBCConnectionProvider;
import org.apache.aries.tx.control.jdbc.common.impl.DriverDataSource;
import org.apache.aries.tx.control.jdbc.common.impl.InternalJDBCConnectionProviderFactory;
import org.apache.aries.tx.control.jdbc.xa.connection.impl.XADataSourceMapper;
import org.osgi.service.jdbc.DataSourceFactory;
import org.osgi.service.transaction.control.TransactionException;
-import org.osgi.service.transaction.control.jdbc.JDBCConnectionProviderFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
-public class JDBCConnectionProviderFactoryImpl implements JDBCConnectionProviderFactory, InternalJDBCConnectionProviderFactory {
+public class JDBCConnectionProviderFactoryImpl implements InternalJDBCConnectionProviderFactory {
private static final Logger LOG = LoggerFactory.getLogger(ManagedServiceFactoryImpl.class);
@@ -91,7 +101,7 @@ public class JDBCConnectionProviderFacto
}
@Override
- public JDBCConnectionProviderImpl getProviderFor(DataSource ds, Map<String, Object> resourceProviderProperties) {
+ public AbstractJDBCConnectionProvider getProviderFor(DataSource ds, Map<String, Object> resourceProviderProperties) {
boolean xaEnabled = toBoolean(resourceProviderProperties, XA_ENLISTMENT_ENABLED, true);
boolean localEnabled = toBoolean(resourceProviderProperties, LOCAL_ENLISTMENT_ENABLED, true);
@@ -108,7 +118,7 @@ public class JDBCConnectionProviderFacto
}
@Override
- public JDBCConnectionProviderImpl getProviderFor(Driver driver, Properties jdbcProperties,
+ public AbstractJDBCConnectionProvider getProviderFor(Driver driver, Properties jdbcProperties,
Map<String, Object> resourceProviderProperties) {
boolean xaEnabled = toBoolean(resourceProviderProperties, XA_ENLISTMENT_ENABLED, false);
@@ -124,7 +134,7 @@ public class JDBCConnectionProviderFacto
}
@Override
- public JDBCConnectionProviderImpl getProviderFor(XADataSource ds, Map<String, Object> resourceProviderProperties) {
+ public AbstractJDBCConnectionProvider getProviderFor(XADataSource ds, Map<String, Object> resourceProviderProperties) {
boolean xaEnabled = toBoolean(resourceProviderProperties, XA_ENLISTMENT_ENABLED, true);
boolean localEnabled = toBoolean(resourceProviderProperties, LOCAL_ENLISTMENT_ENABLED, true);
Modified: aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/main/java/org/apache/aries/tx/control/jdbc/xa/impl/JDBCConnectionProviderImpl.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/main/java/org/apache/aries/tx/control/jdbc/xa/impl/JDBCConnectionProviderImpl.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/main/java/org/apache/aries/tx/control/jdbc/xa/impl/JDBCConnectionProviderImpl.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/main/java/org/apache/aries/tx/control/jdbc/xa/impl/JDBCConnectionProviderImpl.java Fri Dec 16 18:31:32 2016
@@ -48,12 +48,7 @@ public class JDBCConnectionProviderImpl
@Override
public Connection getResource(TransactionControl txControl)
throws TransactionException {
- return new XAEnabledTxContextBindingConnection(txControl, dataSource , uuid,
+ return new XAEnabledTxContextBindingConnection(txControl, this, uuid,
xaEnabled, localEnabled, recoveryIdentifier);
}
-
- public DataSource getRawDataSource() {
- return dataSource;
- }
-
}
Modified: aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/main/java/org/apache/aries/tx/control/jdbc/xa/impl/RecoverableXAResourceImpl.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/main/java/org/apache/aries/tx/control/jdbc/xa/impl/RecoverableXAResourceImpl.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/main/java/org/apache/aries/tx/control/jdbc/xa/impl/RecoverableXAResourceImpl.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/main/java/org/apache/aries/tx/control/jdbc/xa/impl/RecoverableXAResourceImpl.java Fri Dec 16 18:31:32 2016
@@ -21,7 +21,6 @@ package org.apache.aries.tx.control.jdbc
import java.sql.Connection;
import java.sql.SQLException;
-import javax.sql.DataSource;
import javax.transaction.xa.XAException;
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;
@@ -53,13 +52,11 @@ public class RecoverableXAResourceImpl i
@Override
public XAResource getXAResource() throws Exception {
- DataSource rawDataSource = providerImpl.getRawDataSource();
-
Connection recoveryConn;
if(recoveryUser != null) {
- recoveryConn = rawDataSource.getConnection(recoveryUser, recoveryPw);
+ recoveryConn = providerImpl.getConnection(recoveryUser, recoveryPw);
} else {
- recoveryConn = rawDataSource.getConnection();
+ recoveryConn = providerImpl.getConnection();
}
return new CloseableXAResource(recoveryConn);
Modified: aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/main/java/org/apache/aries/tx/control/jdbc/xa/impl/XAEnabledTxContextBindingConnection.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/main/java/org/apache/aries/tx/control/jdbc/xa/impl/XAEnabledTxContextBindingConnection.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/main/java/org/apache/aries/tx/control/jdbc/xa/impl/XAEnabledTxContextBindingConnection.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/main/java/org/apache/aries/tx/control/jdbc/xa/impl/XAEnabledTxContextBindingConnection.java Fri Dec 16 18:31:32 2016
@@ -24,9 +24,9 @@ import java.sql.Connection;
import java.sql.SQLException;
import java.util.UUID;
-import javax.sql.DataSource;
import javax.transaction.xa.XAResource;
+import org.apache.aries.tx.control.jdbc.common.impl.AbstractJDBCConnectionProvider;
import org.apache.aries.tx.control.jdbc.common.impl.ConnectionWrapper;
import org.apache.aries.tx.control.jdbc.common.impl.ScopedConnectionWrapper;
import org.apache.aries.tx.control.jdbc.common.impl.TxConnectionWrapper;
@@ -38,18 +38,18 @@ import org.osgi.service.transaction.cont
public class XAEnabledTxContextBindingConnection extends ConnectionWrapper {
- private final TransactionControl txControl;
- private final UUID resourceId;
- private final DataSource dataSource;
- private final boolean xaEnabled;
- private final boolean localEnabled;
- private final String recoveryIdentifier;
+ private final TransactionControl txControl;
+ private final UUID resourceId;
+ private final AbstractJDBCConnectionProvider provider;
+ private final boolean xaEnabled;
+ private final boolean localEnabled;
+ private final String recoveryIdentifier;
public XAEnabledTxContextBindingConnection(TransactionControl txControl,
- DataSource dataSource, UUID resourceId, boolean xaEnabled, boolean localEnabled,
+ AbstractJDBCConnectionProvider provider, UUID resourceId, boolean xaEnabled, boolean localEnabled,
String recoveryIdentifier) {
this.txControl = txControl;
- this.dataSource = dataSource;
+ this.provider = provider;
this.resourceId = resourceId;
this.xaEnabled = xaEnabled;
this.localEnabled = localEnabled;
@@ -62,7 +62,7 @@ public class XAEnabledTxContextBindingCo
TransactionContext txContext = txControl.getCurrentContext();
if (txContext == null) {
- throw new TransactionException("The resource " + dataSource
+ throw new TransactionException("The resource " + provider
+ " cannot be accessed outside of an active Transaction Context");
}
@@ -77,14 +77,14 @@ public class XAEnabledTxContextBindingCo
try {
if (txContext.getTransactionStatus() == NO_TRANSACTION) {
- toClose = dataSource.getConnection();
+ toClose = provider.getConnection();
toReturn = new ScopedConnectionWrapper(toClose);
} else if (txContext.supportsXA() && xaEnabled) {
- toClose = dataSource.getConnection();
+ toClose = provider.getConnection();
toReturn = new TxConnectionWrapper(toClose);
txContext.registerXAResource(getXAResource(toClose), recoveryIdentifier);
} else if (txContext.supportsLocal() && localEnabled) {
- toClose = dataSource.getConnection();
+ toClose = provider.getConnection();
toReturn = new TxConnectionWrapper(toClose);
txContext.registerLocalResource(getLocalResource(toClose));
} else {
Modified: aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/test/java/org/apache/aries/tx/control/jdbc/xa/impl/XAEnabledTxContextBindingConnectionTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/test/java/org/apache/aries/tx/control/jdbc/xa/impl/XAEnabledTxContextBindingConnectionTest.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/test/java/org/apache/aries/tx/control/jdbc/xa/impl/XAEnabledTxContextBindingConnectionTest.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jdbc-xa/src/test/java/org/apache/aries/tx/control/jdbc/xa/impl/XAEnabledTxContextBindingConnectionTest.java Fri Dec 16 18:31:32 2016
@@ -33,6 +33,7 @@ import javax.sql.XAConnection;
import javax.sql.XADataSource;
import javax.transaction.xa.XAResource;
+import org.apache.aries.tx.control.jdbc.common.impl.AbstractJDBCConnectionProvider;
import org.apache.aries.tx.control.jdbc.xa.connection.impl.XADataSourceMapper;
import org.junit.Before;
import org.junit.Test;
@@ -74,6 +75,9 @@ public class XAEnabledTxContextBindingCo
UUID id = UUID.randomUUID();
+
+ AbstractJDBCConnectionProvider localProvider;
+ AbstractJDBCConnectionProvider xaProvider;
XAEnabledTxContextBindingConnection localConn;
XAEnabledTxContextBindingConnection xaConn;
@@ -90,8 +94,13 @@ public class XAEnabledTxContextBindingCo
Mockito.when(xaMock.getConnection()).thenReturn(rawConnection);
Mockito.when(xaMock.getXAResource()).thenReturn(xaResource);
- localConn = new XAEnabledTxContextBindingConnection(control, dataSource, id, false, true, null);
- xaConn = new XAEnabledTxContextBindingConnection(control, new XADataSourceMapper(xaDataSource),
+ localProvider = new JDBCConnectionProviderImpl(dataSource, false, true, null);
+ xaProvider = new JDBCConnectionProviderImpl(new XADataSourceMapper(xaDataSource),
+ true, false, null);
+
+ localConn = new XAEnabledTxContextBindingConnection(control, localProvider,
+ id, false, true, null);
+ xaConn = new XAEnabledTxContextBindingConnection(control, xaProvider,
id, true, false, null);
}
@@ -194,6 +203,14 @@ public class XAEnabledTxContextBindingCo
Mockito.when(context.supportsLocal()).thenReturn(false);
localConn.isValid(500);
}
+
+ @Test(expected=TransactionException.class)
+ public void testLocalResourceProviderClosed() throws SQLException {
+ setupLocalTransaction();
+
+ localProvider.close();
+ localConn.isValid(500);
+ }
@Test(expected=TransactionException.class)
public void testLocalConnWithXATransaction() throws SQLException {
@@ -239,5 +256,14 @@ public class XAEnabledTxContextBindingCo
xaConn.isValid(500);
}
+
+ @Test(expected=TransactionException.class)
+ public void testRemoteResourceProviderClosed() throws SQLException {
+ setupXATransaction();
+
+ xaProvider.close();
+
+ xaConn.isValid(500);
+ }
}
Modified: aries/trunk/tx-control/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/AbstractJPAEntityManagerProvider.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/AbstractJPAEntityManagerProvider.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/AbstractJPAEntityManagerProvider.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/AbstractJPAEntityManagerProvider.java Fri Dec 16 18:31:32 2016
@@ -18,6 +18,8 @@
*/
package org.apache.aries.tx.control.jpa.common.impl;
+import java.util.concurrent.atomic.AtomicBoolean;
+
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
@@ -31,10 +33,12 @@ public abstract class AbstractJPAEntityM
private static final Logger LOG = LoggerFactory.getLogger(AbstractJPAEntityManagerProvider.class);
- protected final EntityManagerFactory emf;
+ private final EntityManagerFactory emf;
private final Runnable onClose;
+ private final AtomicBoolean closed = new AtomicBoolean(false);
+
public AbstractJPAEntityManagerProvider(EntityManagerFactory emf, Runnable onClose) {
this.emf = emf;
this.onClose = onClose;
@@ -45,7 +49,13 @@ public abstract class AbstractJPAEntityM
throws TransactionException;
+ public EntityManager createEntityManager() {
+ if(closed.get()) throw new IllegalStateException("This resource provider is no longer in use");
+ return emf.createEntityManager();
+ }
+
public void close() {
+ closed.set(true);
if(onClose != null) {
try {
onClose.run();
Modified: aries/trunk/tx-control/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/InternalJPAEntityManagerProviderFactory.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/InternalJPAEntityManagerProviderFactory.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/InternalJPAEntityManagerProviderFactory.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/InternalJPAEntityManagerProviderFactory.java Fri Dec 16 18:31:32 2016
@@ -23,15 +23,12 @@ import java.util.Map;
import javax.persistence.EntityManagerFactory;
import org.osgi.service.jpa.EntityManagerFactoryBuilder;
-import org.osgi.service.transaction.control.jpa.JPAEntityManagerProviderFactory;
-public interface InternalJPAEntityManagerProviderFactory extends JPAEntityManagerProviderFactory {
+public interface InternalJPAEntityManagerProviderFactory {
- @Override
AbstractJPAEntityManagerProvider getProviderFor(EntityManagerFactoryBuilder emfb,
Map<String, Object> jpaProperties, Map<String, Object> resourceProviderProperties);
- @Override
AbstractJPAEntityManagerProvider getProviderFor(EntityManagerFactory emf,
Map<String, Object> resourceProviderProperties);
Modified: aries/trunk/tx-control/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/ResourceTrackingJPAEntityManagerProviderFactory.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/ResourceTrackingJPAEntityManagerProviderFactory.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/ResourceTrackingJPAEntityManagerProviderFactory.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/ResourceTrackingJPAEntityManagerProviderFactory.java Fri Dec 16 18:31:32 2016
@@ -49,4 +49,14 @@ public class ResourceTrackingJPAEntityMa
return doGetResult(() -> factory.getProviderFor(emf,
resourceProviderProperties));
}
+
+ @Override
+ public void releaseProvider(JPAEntityManagerProvider provider) {
+ if(provider instanceof AbstractJPAEntityManagerProvider) {
+ release((AbstractJPAEntityManagerProvider)provider);
+ } else {
+ throw new IllegalArgumentException(
+ "The supplied JPAEntityManagerProvider was not created by this JPAEntityManagerProviderFactory");
+ }
+ }
}
\ No newline at end of file
Modified: aries/trunk/tx-control/tx-control-provider-jpa-local/src/main/java/org/apache/aries/tx/control/jpa/local/impl/JPAEntityManagerProviderFactoryImpl.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jpa-local/src/main/java/org/apache/aries/tx/control/jpa/local/impl/JPAEntityManagerProviderFactoryImpl.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jpa-local/src/main/java/org/apache/aries/tx/control/jpa/local/impl/JPAEntityManagerProviderFactoryImpl.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jpa-local/src/main/java/org/apache/aries/tx/control/jpa/local/impl/JPAEntityManagerProviderFactoryImpl.java Fri Dec 16 18:31:32 2016
@@ -20,6 +20,8 @@ package org.apache.aries.tx.control.jpa.
import static java.util.Optional.ofNullable;
import static javax.persistence.spi.PersistenceUnitTransactionType.RESOURCE_LOCAL;
+import static org.osgi.service.transaction.control.jpa.JPAEntityManagerProviderFactory.LOCAL_ENLISTMENT_ENABLED;
+import static org.osgi.service.transaction.control.jpa.JPAEntityManagerProviderFactory.XA_ENLISTMENT_ENABLED;
import java.util.Map;
Modified: aries/trunk/tx-control/tx-control-provider-jpa-local/src/main/java/org/apache/aries/tx/control/jpa/local/impl/JPAEntityManagerProviderImpl.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jpa-local/src/main/java/org/apache/aries/tx/control/jpa/local/impl/JPAEntityManagerProviderImpl.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jpa-local/src/main/java/org/apache/aries/tx/control/jpa/local/impl/JPAEntityManagerProviderImpl.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jpa-local/src/main/java/org/apache/aries/tx/control/jpa/local/impl/JPAEntityManagerProviderImpl.java Fri Dec 16 18:31:32 2016
@@ -37,6 +37,6 @@ public class JPAEntityManagerProviderImp
@Override
public EntityManager getResource(TransactionControl txControl) throws TransactionException {
- return new TxContextBindingEntityManager(txControl, emf, uuid);
+ return new TxContextBindingEntityManager(txControl, this, uuid);
}
}
Modified: aries/trunk/tx-control/tx-control-provider-jpa-local/src/main/java/org/apache/aries/tx/control/jpa/local/impl/TxContextBindingEntityManager.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jpa-local/src/main/java/org/apache/aries/tx/control/jpa/local/impl/TxContextBindingEntityManager.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jpa-local/src/main/java/org/apache/aries/tx/control/jpa/local/impl/TxContextBindingEntityManager.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jpa-local/src/main/java/org/apache/aries/tx/control/jpa/local/impl/TxContextBindingEntityManager.java Fri Dec 16 18:31:32 2016
@@ -23,9 +23,9 @@ import static org.osgi.service.transacti
import java.util.UUID;
import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceException;
+import org.apache.aries.tx.control.jpa.common.impl.AbstractJPAEntityManagerProvider;
import org.apache.aries.tx.control.jpa.common.impl.EntityManagerWrapper;
import org.apache.aries.tx.control.jpa.common.impl.ScopedEntityManagerWrapper;
import org.apache.aries.tx.control.jpa.common.impl.TxEntityManagerWrapper;
@@ -36,14 +36,14 @@ import org.osgi.service.transaction.cont
public class TxContextBindingEntityManager extends EntityManagerWrapper {
- private final TransactionControl txControl;
- private final UUID resourceId;
- private final EntityManagerFactory emf;
+ private final TransactionControl txControl;
+ private final UUID resourceId;
+ private final AbstractJPAEntityManagerProvider provider;
public TxContextBindingEntityManager(TransactionControl txControl,
- EntityManagerFactory emf, UUID resourceId) {
+ AbstractJPAEntityManagerProvider provider, UUID resourceId) {
this.txControl = txControl;
- this.emf = emf;
+ this.provider = provider;
this.resourceId = resourceId;
}
@@ -53,7 +53,7 @@ public class TxContextBindingEntityManag
TransactionContext txContext = txControl.getCurrentContext();
if (txContext == null) {
- throw new TransactionException("The resource " + emf
+ throw new TransactionException("The resource " + provider
+ " cannot be accessed outside of an active Transaction Context");
}
@@ -68,10 +68,10 @@ public class TxContextBindingEntityManag
try {
if (txContext.getTransactionStatus() == NO_TRANSACTION) {
- toClose = emf.createEntityManager();
+ toClose = provider.createEntityManager();
toReturn = new ScopedEntityManagerWrapper(toClose);
} else if (txContext.supportsLocal()) {
- toClose = emf.createEntityManager();
+ toClose = provider.createEntityManager();
toReturn = new TxEntityManagerWrapper(toClose);
txContext.registerLocalResource(getLocalResource(toClose));
toClose.getTransaction().begin();
Modified: aries/trunk/tx-control/tx-control-provider-jpa-local/src/test/java/org/apache/aries/tx/control/jpa/local/impl/TxContextBindingEntityManagerTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jpa-local/src/test/java/org/apache/aries/tx/control/jpa/local/impl/TxContextBindingEntityManagerTest.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jpa-local/src/test/java/org/apache/aries/tx/control/jpa/local/impl/TxContextBindingEntityManagerTest.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jpa-local/src/test/java/org/apache/aries/tx/control/jpa/local/impl/TxContextBindingEntityManagerTest.java Fri Dec 16 18:31:32 2016
@@ -32,6 +32,7 @@ import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
+import org.apache.aries.tx.control.jpa.common.impl.AbstractJPAEntityManagerProvider;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -66,6 +67,8 @@ public class TxContextBindingEntityManag
UUID id = UUID.randomUUID();
+ AbstractJPAEntityManagerProvider provider;
+
TxContextBindingEntityManager em;
@Before
@@ -79,7 +82,9 @@ public class TxContextBindingEntityManag
Mockito.when(context.getScopedValue(Mockito.any()))
.thenAnswer(i -> variables.get(i.getArguments()[0]));
- em = new TxContextBindingEntityManager(control, emf, id);
+ provider = new JPAEntityManagerProviderImpl(emf, null);
+
+ em = new TxContextBindingEntityManager(control, provider, id);
}
private void setupNoTransaction() {
@@ -167,4 +172,13 @@ public class TxContextBindingEntityManag
em.isOpen();
}
+ @Test(expected=TransactionException.class)
+ public void testClosedProvider() throws SQLException {
+ setupActiveTransaction();
+
+ provider.close();
+
+ em.isOpen();
+ }
+
}
Modified: aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl.java Fri Dec 16 18:31:32 2016
@@ -21,6 +21,9 @@ package org.apache.aries.tx.control.jpa.
import static java.util.Optional.ofNullable;
import static javax.persistence.spi.PersistenceUnitTransactionType.JTA;
import static org.osgi.service.transaction.control.TransactionStatus.NO_TRANSACTION;
+import static org.osgi.service.transaction.control.jpa.JPAEntityManagerProviderFactory.LOCAL_ENLISTMENT_ENABLED;
+import static org.osgi.service.transaction.control.jpa.JPAEntityManagerProviderFactory.PRE_ENLISTED_DB_CONNECTION;
+import static org.osgi.service.transaction.control.jpa.JPAEntityManagerProviderFactory.XA_ENLISTMENT_ENABLED;
import java.io.PrintWriter;
import java.sql.Connection;
Modified: aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderImpl.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderImpl.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderImpl.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderImpl.java Fri Dec 16 18:31:32 2016
@@ -41,6 +41,6 @@ public class JPAEntityManagerProviderImp
@Override
public EntityManager getResource(TransactionControl txControl) throws TransactionException {
- return new XATxContextBindingEntityManager(txControl, emf, uuid, tx);
+ return new XATxContextBindingEntityManager(txControl, this, uuid, tx);
}
}
Modified: aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/XATxContextBindingEntityManager.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/XATxContextBindingEntityManager.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/XATxContextBindingEntityManager.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/XATxContextBindingEntityManager.java Fri Dec 16 18:31:32 2016
@@ -23,9 +23,9 @@ import static org.osgi.service.transacti
import java.util.UUID;
import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceException;
+import org.apache.aries.tx.control.jpa.common.impl.AbstractJPAEntityManagerProvider;
import org.apache.aries.tx.control.jpa.common.impl.EntityManagerWrapper;
import org.apache.aries.tx.control.jpa.common.impl.ScopedEntityManagerWrapper;
import org.apache.aries.tx.control.jpa.common.impl.TxEntityManagerWrapper;
@@ -35,16 +35,17 @@ import org.osgi.service.transaction.cont
public class XATxContextBindingEntityManager extends EntityManagerWrapper {
- private final TransactionControl txControl;
- private final UUID resourceId;
- private final EntityManagerFactory emf;
- private final ThreadLocal<TransactionControl> commonTxStore;
+ private final TransactionControl txControl;
+ private final UUID resourceId;
+ private final AbstractJPAEntityManagerProvider provider;
+ private final ThreadLocal<TransactionControl> commonTxStore;
public XATxContextBindingEntityManager(TransactionControl txControl,
- EntityManagerFactory emf, UUID resourceId, ThreadLocal<TransactionControl> commonTxStore) {
+ AbstractJPAEntityManagerProvider provider, UUID resourceId,
+ ThreadLocal<TransactionControl> commonTxStore) {
this.txControl = txControl;
- this.emf = emf;
+ this.provider = provider;
this.resourceId = resourceId;
this.commonTxStore = commonTxStore;
}
@@ -55,7 +56,7 @@ public class XATxContextBindingEntityMan
TransactionContext txContext = txControl.getCurrentContext();
if (txContext == null) {
- throw new TransactionException("The resource " + emf
+ throw new TransactionException("The resource " + provider
+ " cannot be accessed outside of an active Transaction Context");
}
@@ -73,10 +74,10 @@ public class XATxContextBindingEntityMan
try {
if (txContext.getTransactionStatus() == NO_TRANSACTION) {
- toClose = emf.createEntityManager();
+ toClose = provider.createEntityManager();
toReturn = new ScopedEntityManagerWrapper(toClose);
} else if (txContext.supportsXA()) {
- toClose = emf.createEntityManager();
+ toClose = provider.createEntityManager();
toReturn = new TxEntityManagerWrapper(toClose);
toClose.joinTransaction();
} else {
Modified: aries/trunk/tx-control/tx-control-provider-jpa-xa/src/test/java/org/apache/aries/tx/control/jpa/xa/impl/XATxContextBindingEntityManagerTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jpa-xa/src/test/java/org/apache/aries/tx/control/jpa/xa/impl/XATxContextBindingEntityManagerTest.java?rev=1774648&r1=1774647&r2=1774648&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jpa-xa/src/test/java/org/apache/aries/tx/control/jpa/xa/impl/XATxContextBindingEntityManagerTest.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jpa-xa/src/test/java/org/apache/aries/tx/control/jpa/xa/impl/XATxContextBindingEntityManagerTest.java Fri Dec 16 18:31:32 2016
@@ -38,6 +38,7 @@ import javax.sql.XAConnection;
import javax.transaction.xa.XAResource;
import org.apache.aries.tx.control.jdbc.xa.connection.impl.XAConnectionWrapper;
+import org.apache.aries.tx.control.jpa.common.impl.AbstractJPAEntityManagerProvider;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -76,6 +77,8 @@ public class XATxContextBindingEntityMan
ThreadLocal<TransactionControl> commonTxControl = new ThreadLocal<>();
+ AbstractJPAEntityManagerProvider provider;
+
@Before
public void setUp() throws SQLException {
Mockito.when(emf.createEntityManager()).thenReturn(rawEm).thenReturn(null);
@@ -85,7 +88,9 @@ public class XATxContextBindingEntityMan
Mockito.when(context.getScopedValue(Mockito.any()))
.thenAnswer(i -> variables.get(i.getArguments()[0]));
- em = new XATxContextBindingEntityManager(control, emf, id, commonTxControl);
+ provider = new JPAEntityManagerProviderImpl(emf, commonTxControl, null);
+
+ em = new XATxContextBindingEntityManager(control, provider, id, commonTxControl);
}
private void setupNoTransaction() {
@@ -225,6 +230,14 @@ public class XATxContextBindingEntityMan
em.isOpen();
}
+ @Test(expected=TransactionException.class)
+ public void testResourceProviderClosed() throws SQLException {
+ setupActiveTransaction();
+
+ provider.close();
+ em.isOpen();
+ }
+
@Test
public void testActiveTransactionWithPreviousCommonTxControl() throws SQLException {