Repository: commons-dbcp Updated Branches: refs/heads/master 5d46f2481 -> d49d45eba
[DBCP-520] BasicManagedDataSource needs to pass the TSR with creating DataSourceXAConnectionFactory. Closes #18. Project: http://git-wip-us.apache.org/repos/asf/commons-dbcp/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-dbcp/commit/d49d45eb Tree: http://git-wip-us.apache.org/repos/asf/commons-dbcp/tree/d49d45eb Diff: http://git-wip-us.apache.org/repos/asf/commons-dbcp/diff/d49d45eb Branch: refs/heads/master Commit: d49d45eba50fae24715a78df93bf5d951c82c6ac Parents: 5d46f24 Author: Gary Gregory <ggreg...@rocketsoftware.com> Authored: Wed Sep 5 15:07:14 2018 -0600 Committer: Gary Gregory <ggreg...@rocketsoftware.com> Committed: Wed Sep 5 15:07:14 2018 -0600 ---------------------------------------------------------------------- src/changes/changes.xml | 3 + .../dbcp2/managed/BasicManagedDataSource.java | 5 +- .../managed/TestBasicManagedDataSource.java | 67 +++++++++++++++++--- 3 files changed, 63 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/d49d45eb/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 8d69d58..c0b2c3c 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -79,6 +79,9 @@ The <action> type attribute can be add,update,fix,remove. <action dev="ggregory" type="add" issue="DBCP-519" due-to="Gary Gregory"> Add some toString() methods for debugging (never printing passwords.) </action> + <action dev="ggregory" type="update" issue="DBCP-520" due-to="Zheng Feng"> + BasicManagedDataSource needs to pass the TSR with creating DataSourceXAConnectionFactory. + </action> </release> <release version="2.5.0" date="2018-07-15" description="This is a minor release, including bug fixes and enhancements."> <action dev="ggregory" type="update" issue="DBCP-505" due-to="Gary Gregory"> http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/d49d45eb/src/main/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java b/src/main/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java index 769fe5d..723f41a 100644 --- a/src/main/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java +++ b/src/main/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java @@ -22,6 +22,7 @@ import org.apache.commons.dbcp2.ConnectionFactory; import org.apache.commons.dbcp2.PoolableConnection; import org.apache.commons.dbcp2.PoolableConnectionFactory; import org.apache.commons.dbcp2.PoolingDataSource; +import org.apache.commons.dbcp2.Utils; import javax.sql.DataSource; import javax.sql.XADataSource; @@ -63,7 +64,7 @@ public class BasicManagedDataSource extends BasicDataSource { /** XA data source instance */ private XADataSource xaDataSourceInstance; - /** Transaction Manager */ + /** Transaction Synchronization Registry */ private transient TransactionSynchronizationRegistry transactionSynchronizationRegistry; /** @@ -198,7 +199,7 @@ public class BasicManagedDataSource extends BasicDataSource { // finally, create the XAConnectionFactory using the XA data source final XAConnectionFactory xaConnectionFactory = new DataSourceXAConnectionFactory(getTransactionManager(), - xaDataSourceInstance, getUsername(), getPassword()); + xaDataSourceInstance, getUsername(), Utils.toCharArray(getPassword()), getTransactionSynchronizationRegistry()); transactionRegistry = xaConnectionFactory.getTransactionRegistry(); return xaConnectionFactory; } http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/d49d45eb/src/test/java/org/apache/commons/dbcp2/managed/TestBasicManagedDataSource.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/dbcp2/managed/TestBasicManagedDataSource.java b/src/test/java/org/apache/commons/dbcp2/managed/TestBasicManagedDataSource.java index 95dc424..8293ef4 100644 --- a/src/test/java/org/apache/commons/dbcp2/managed/TestBasicManagedDataSource.java +++ b/src/test/java/org/apache/commons/dbcp2/managed/TestBasicManagedDataSource.java @@ -17,16 +17,8 @@ */ package org.apache.commons.dbcp2.managed; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.fail; - -import java.sql.SQLException; - -import javax.sql.XADataSource; -import javax.transaction.xa.XAException; - +import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple; +import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionSynchronizationRegistryImple; import org.apache.commons.dbcp2.BasicDataSource; import org.apache.commons.dbcp2.TestBasicDataSource; import org.apache.geronimo.transaction.manager.TransactionManagerImpl; @@ -34,6 +26,19 @@ import org.h2.Driver; import org.h2.jdbcx.JdbcDataSource; import org.junit.Test; +import javax.sql.XADataSource; +import javax.transaction.Synchronization; +import javax.transaction.TransactionManager; +import javax.transaction.TransactionSynchronizationRegistry; +import javax.transaction.xa.XAException; +import java.sql.Connection; +import java.sql.SQLException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.fail; + /** * TestSuite for BasicManagedDataSource */ @@ -171,4 +176,46 @@ public class TestBasicManagedDataSource extends TestBasicDataSource { assertNull(basicManagedDataSource.getXaDataSourceInstance()); } } + + @Test + public void testTransactionSynchronizationRegistry() throws Exception { + try (final BasicManagedDataSource basicManagedDataSource = new BasicManagedDataSource()) { + basicManagedDataSource.setTransactionManager(new TransactionManagerImple()); + TransactionSynchronizationRegistry tsr = new TransactionSynchronizationRegistryImple(); + basicManagedDataSource.setTransactionSynchronizationRegistry(tsr); + JdbcDataSource xaDataSource = new JdbcDataSource(); + xaDataSource.setUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"); + basicManagedDataSource.setXaDataSourceInstance(xaDataSource); + basicManagedDataSource.setMaxIdle(1); + + TransactionManager tm = basicManagedDataSource.getTransactionManager(); + tm.begin(); + tsr.registerInterposedSynchronization(new Synchronization() { + @Override + public void beforeCompletion() { + Connection connection = null; + try { + connection = basicManagedDataSource.getConnection(); + assertNotNull(connection); + } catch (SQLException e) { + fail(e.getMessage()); + } finally { + if (connection != null) { + try { + connection.close(); + } catch (SQLException e) { + fail(e.getMessage()); + } + } + } + } + + @Override + public void afterCompletion(int i) { + + } + }); + tm.commit(); + } + } }