Repository: commons-dbcp
Updated Branches:
  refs/heads/master c6fe04676 -> bc7a3969c


[DBCP-515] Do not try to register synchronization when the transaction
is no longer active. Applied a different, more compact, version of the
patch. The test is the same though. Closes #16.

Project: http://git-wip-us.apache.org/repos/asf/commons-dbcp/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-dbcp/commit/bc7a3969
Tree: http://git-wip-us.apache.org/repos/asf/commons-dbcp/tree/bc7a3969
Diff: http://git-wip-us.apache.org/repos/asf/commons-dbcp/diff/bc7a3969

Branch: refs/heads/master
Commit: bc7a3969c039f179d5a73c8aff19cfe19d511503
Parents: c6fe046
Author: Gary Gregory <ggreg...@apache.org>
Authored: Wed Jul 25 17:12:03 2018 -0600
Committer: Gary Gregory <ggreg...@apache.org>
Committed: Wed Jul 25 17:12:03 2018 -0600

----------------------------------------------------------------------
 src/changes/changes.xml                         |  3 ++
 .../dbcp2/managed/TransactionContext.java       |  6 +++
 .../managed/TestManagedDataSourceInTx.java      | 49 ++++++++++++++++----
 3 files changed, 49 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/bc7a3969/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 8f1de55..4ca3102 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -67,6 +67,9 @@ The <action> type attribute can be add,update,fix,remove.
       <action dev="ggregory" type="update" issue="DBCP-517" due-to="Gary 
Gregory">
         Make defensive copies of char[] passwords.
       </action>
+      <action dev="ggregory" type="update" issue="DBCP-515" due-to="Tom 
Jenkinson, Gary Gregory">
+        Do not try to register synchronization when the transaction is no 
longer active.
+      </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/bc7a3969/src/main/java/org/apache/commons/dbcp2/managed/TransactionContext.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/commons/dbcp2/managed/TransactionContext.java 
b/src/main/java/org/apache/commons/dbcp2/managed/TransactionContext.java
index 486ffcd..2af9365 100644
--- a/src/main/java/org/apache/commons/dbcp2/managed/TransactionContext.java
+++ b/src/main/java/org/apache/commons/dbcp2/managed/TransactionContext.java
@@ -130,6 +130,12 @@ public class TransactionContext {
      */
     public void addTransactionContextListener(final TransactionContextListener 
listener) throws SQLException {
         try {
+            if (!isActive()) {
+                Transaction transaction = this.transactionRef.get();
+                listener.afterCompletion(TransactionContext.this,
+                        transaction == null ? false : transaction.getStatus() 
== Status.STATUS_COMMITTED);
+                return;
+            }
             final Synchronization s = new Synchronization() {
                 @Override
                 public void beforeCompletion() {

http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/bc7a3969/src/test/java/org/apache/commons/dbcp2/managed/TestManagedDataSourceInTx.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/commons/dbcp2/managed/TestManagedDataSourceInTx.java 
b/src/test/java/org/apache/commons/dbcp2/managed/TestManagedDataSourceInTx.java
index a8d45a9..c3283ae 100644
--- 
a/src/test/java/org/apache/commons/dbcp2/managed/TestManagedDataSourceInTx.java
+++ 
b/src/test/java/org/apache/commons/dbcp2/managed/TestManagedDataSourceInTx.java
@@ -23,23 +23,24 @@ import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import org.apache.commons.dbcp2.DelegatingConnection;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
 import java.sql.CallableStatement;
 import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
-import java.sql.ResultSet;
-import java.sql.PreparedStatement;
 
+import javax.transaction.Synchronization;
 import javax.transaction.Transaction;
 
+import org.apache.commons.dbcp2.DelegatingConnection;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
 /**
- * TestSuite for ManagedDataSource with an active transaction in progress.
+ * Tests ManagedDataSource with an active transaction in progress.
  */
 public class TestManagedDataSourceInTx extends TestManagedDataSource {
 
@@ -98,6 +99,36 @@ public class TestManagedDataSourceInTx extends 
TestManagedDataSource {
         }
     }
 
+    @Test
+    public void testGetConnectionInAfterCompletion() throws Exception {
+
+        final DelegatingConnection<?> connection = (DelegatingConnection<?>) 
newConnection();
+        // Don't close so we can check it for warnings in afterCompletion
+        transactionManager.getTransaction().registerSynchronization(new 
Synchronization() {
+            @Override
+            public void beforeCompletion() {
+                // empty
+            }
+
+            @Override
+            public void afterCompletion(int i) {
+                try {
+                    Connection connection1 = ds.getConnection();
+                    try {
+                        connection1.getWarnings();
+                        fail("Could operate on closed connection");
+                    } catch (SQLException e) {
+                        // This is expected
+                    }
+                } catch (SQLException e) {
+                    fail("Should have been able to get connection");
+                }
+            }
+        });
+        connection.close();
+        transactionManager.commit();
+    }
+
     @Override
     @Test
     public void testHashCode() throws Exception {

Reply via email to