Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
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;
Expand Down Expand Up @@ -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;

/**
Expand Down Expand Up @@ -198,7 +199,7 @@ protected ConnectionFactory createConnectionFactory() throws SQLException {

// 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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,28 @@
*/
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;
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
*/
Expand Down Expand Up @@ -171,4 +176,46 @@ public void testSetNullXaDataSourceInstance() throws SQLException, XAException {
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();
}
}
}