Author: markt Date: Thu Feb 19 15:46:03 2009 New Revision: 745904 URL: http://svn.apache.org/viewvc?rev=745904&view=rev Log: Fix DBCP-235. Separate internal implementation and externally interfacing methods to allow equals and hashcode to work. Includes supporting test case.
Modified: commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/DelegatingConnection.java commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/managed/ManagedConnection.java commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/managed/TestManagedDataSource.java Modified: commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/DelegatingConnection.java URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/DelegatingConnection.java?rev=745904&r1=745903&r2=745904&view=diff ============================================================================== --- commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/DelegatingConnection.java (original) +++ commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/DelegatingConnection.java Thu Feb 19 15:46:03 2009 @@ -107,7 +107,7 @@ public String toString() { String s = null; - Connection c = this.getInnermostDelegate(); + Connection c = this.getInnermostDelegateInternal(); if (c != null) { try { if (c.isClosed()) { @@ -143,6 +143,13 @@ * @return my underlying {...@link Connection}. */ public Connection getDelegate() { + return getDelegateInternal(); + } + + /** + * Should be final but can't be for compatability with previous releases. + */ + protected Connection getDelegateInternal() { return _conn; } @@ -154,7 +161,7 @@ * @since 1.2.2 */ public boolean innermostDelegateEquals(Connection c) { - Connection innerCon = getInnermostDelegate(); + Connection innerCon = getInnermostDelegateInternal(); if (innerCon == null) { return c == null; } else { @@ -169,7 +176,7 @@ if (obj == this) { return true; } - Connection delegate = getInnermostDelegate(); + Connection delegate = getInnermostDelegateInternal(); if (delegate == null) { return false; } @@ -183,7 +190,7 @@ } public int hashCode() { - Object obj = getInnermostDelegate(); + Object obj = getInnermostDelegateInternal(); if (obj == null) { return 0; } @@ -207,16 +214,20 @@ * sure to obtain a "genuine" {...@link Connection}. */ public Connection getInnermostDelegate() { + return getInnermostDelegateInternal(); + } + + protected final Connection getInnermostDelegateInternal() { Connection c = _conn; while(c != null && c instanceof DelegatingConnection) { - c = ((DelegatingConnection)c).getDelegate(); + c = ((DelegatingConnection)c).getDelegateInternal(); if(this == c) { return null; } } return c; } - + /** Sets my delegate. */ public void setDelegate(Connection c) { _conn = c; Modified: commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/managed/ManagedConnection.java URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/managed/ManagedConnection.java?rev=745904&r1=745903&r2=745904&view=diff ============================================================================== --- commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/managed/ManagedConnection.java (original) +++ commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/managed/ManagedConnection.java Thu Feb 19 15:46:03 2009 @@ -251,17 +251,9 @@ } } - /** - * Gets the actual delegate without checking the isAccessToUnderlyingConnectionAllowed() flag. This method is for internal use only. - * @return the delegate of this connection - */ - protected Connection getDelegateInternal() { - return super.getDelegate(); - } - public Connection getInnermostDelegate() { if (isAccessToUnderlyingConnectionAllowed()) { - return super.getInnermostDelegate(); + return super.getInnermostDelegateInternal(); } else { return null; } Modified: commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/managed/TestManagedDataSource.java URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/managed/TestManagedDataSource.java?rev=745904&r1=745903&r2=745904&view=diff ============================================================================== --- commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/managed/TestManagedDataSource.java (original) +++ commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/managed/TestManagedDataSource.java Thu Feb 19 15:46:03 2009 @@ -126,6 +126,28 @@ connectionB.close(); } + public void testManagedConnectionEqualsSameDelegateNoUnderlyingAccess() throws Exception { + // Get a maximal set of connections from the pool + Connection[] c = new Connection[getMaxActive()]; + for (int i = 0; i < c.length; i++) { + c[i] = newConnection(); + } + // Close the delegate of one wrapper in the pool + ((DelegatingConnection) c[0]).getDelegate().close(); + + // Disable access for the new connection + ds.setAccessToUnderlyingConnectionAllowed(false); + // Grab a new connection - should get c[0]'s closed connection + // so should be delegate-equivalent, so equal + Connection con = newConnection(); + assertTrue(c[0].equals(con)); + assertTrue(con.equals(c[0])); + for (int i = 0; i < c.length; i++) { + c[i].close(); + } + ds.setAccessToUnderlyingConnectionAllowed(true); + } + public void testManagedConnectionEqualsSameDelegate() throws Exception { // Get a maximal set of connections from the pool Connection[] c = new Connection[getMaxActive()]; @@ -145,6 +167,7 @@ } } + /* * JIRA: DBCP-198 */