From 89de362d26b8e4c13631cae06e1d9872be23fff0 Mon Sep 17 00:00:00 2001 From: fhanik Date: Mon, 22 Dec 2008 22:11:41 +0000 Subject: [PATCH] Implemented a way to get a delegate using standard APIs rather than custom handling git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@728806 13f79535-47bb-0310-9956-ffa450edef68 --- modules/jdbc-pool/.classpath | 2 +- modules/jdbc-pool/build.xml | 2 +- .../apache/tomcat/jdbc/pool/ConnectionPool.java | 2 +- .../apache/tomcat/jdbc/pool/JdbcInterceptor.java | 7 ++++--- .../apache/tomcat/jdbc/pool/ProxyConnection.java | 2 ++ .../apache/tomcat/jdbc/test/TestGetConnection.java | 23 ++++++++++++++++++++++ 6 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/TestGetConnection.java diff --git a/modules/jdbc-pool/.classpath b/modules/jdbc-pool/.classpath index 9930b5a99..861273b74 100644 --- a/modules/jdbc-pool/.classpath +++ b/modules/jdbc-pool/.classpath @@ -2,10 +2,10 @@ - + diff --git a/modules/jdbc-pool/build.xml b/modules/jdbc-pool/build.xml index 0cf0bba13..cffd9fa6d 100644 --- a/modules/jdbc-pool/build.xml +++ b/modules/jdbc-pool/build.xml @@ -23,7 +23,7 @@ - + diff --git a/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java b/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java index afaebf64a..b6f07e2b5 100644 --- a/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java +++ b/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java @@ -248,7 +248,7 @@ public class ConnectionPool { public Constructor getProxyConstructor() throws NoSuchMethodException { //cache the constructor if (proxyClassConstructor == null ) { - Class proxyClass = Proxy.getProxyClass(ConnectionPool.class.getClassLoader(), new Class[] {java.sql.Connection.class}); + Class proxyClass = Proxy.getProxyClass(ConnectionPool.class.getClassLoader(), new Class[] {java.sql.Connection.class,javax.sql.PooledConnection.class}); proxyClassConstructor = proxyClass.getConstructor(new Class[] { InvocationHandler.class }); } return proxyClassConstructor; diff --git a/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/JdbcInterceptor.java b/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/JdbcInterceptor.java index 6c568420a..7d14c42b3 100644 --- a/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/JdbcInterceptor.java +++ b/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/JdbcInterceptor.java @@ -29,9 +29,10 @@ import org.apache.tomcat.jdbc.pool.PoolProperties.InterceptorProperty; * @version 1.0 */ public abstract class JdbcInterceptor implements InvocationHandler { - public static final String CLOSE_VAL = "close"; - public static final String TOSTRING_VAL = "toString"; - public static final String ISCLOSED_VAL = "isClosed"; + public static final String CLOSE_VAL = "close"; + public static final String TOSTRING_VAL = "toString"; + public static final String ISCLOSED_VAL = "isClosed"; + public static final String GETCONNECTION_VAL = "getConnection"; protected Map properties = null; diff --git a/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ProxyConnection.java b/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ProxyConnection.java index a3094da3b..da62ebb9a 100644 --- a/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ProxyConnection.java +++ b/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ProxyConnection.java @@ -80,6 +80,8 @@ public class ProxyConnection extends JdbcInterceptor { return null; } else if (compare(TOSTRING_VAL,method)) { return this.toString(); + } else if (compare(GETCONNECTION_VAL,method) && connection!=null) { + return connection.getConnection(); } if (isClosed()) throw new SQLException("Connection has already been closed."); return method.invoke(connection.getConnection(),args); diff --git a/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/TestGetConnection.java b/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/TestGetConnection.java new file mode 100644 index 000000000..4bf2c276e --- /dev/null +++ b/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/TestGetConnection.java @@ -0,0 +1,23 @@ +package org.apache.tomcat.jdbc.test; + +import java.sql.Connection; + +import javax.sql.PooledConnection; + +public class TestGetConnection extends DefaultTestCase { + + public TestGetConnection(String name) { + super(name); + } + + public void testGetConnection() throws Exception { + this.init(); + Connection con = this.datasource.getConnection(); + assertTrue("Connection should implement javax.sql.PooledConnection",con instanceof PooledConnection); + Connection actual = ((PooledConnection)con).getConnection(); + assertNotNull("Connection delegate should not be null.",actual); + System.out.println("Actual connection:"+actual.getClass().getName()); + + } + +} -- 2.11.0