Add in support for XA drivers and connections.
authorfhanik <fhanik@13f79535-47bb-0310-9956-ffa450edef68>
Wed, 5 Aug 2009 15:42:55 +0000 (15:42 +0000)
committerfhanik <fhanik@13f79535-47bb-0310-9956-ffa450edef68>
Wed, 5 Aug 2009 15:42:55 +0000 (15:42 +0000)
Update version

git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@801270 13f79535-47bb-0310-9956-ffa450edef68

modules/jdbc-pool/build.properties.default
modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSource.java
modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java
modules/jdbc-pool/sign.sh

index 31eda6c..da1cc01 100644 (file)
@@ -27,7 +27,7 @@
 # ----- Vesion Control Flags -----
 version.major=1
 version.minor=0
-version.build=7
+version.build=8
 version.patch=
 version.suffix=
 
index dd0ebbc..b433222 100644 (file)
@@ -35,6 +35,8 @@ import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import javax.sql.XAConnection;
+
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 
@@ -275,7 +277,7 @@ public class ConnectionPool {
         }
 
         try {
-            getProxyConstructor();
+            getProxyConstructor(con.getConnection() instanceof XAConnection);
             //create the proxy
             //TODO possible optimization, keep track if this connection was returned properly, and don't generate a new facade
             Connection connection = (Connection)proxyClassConstructor.newInstance(new Object[] { handler });
@@ -295,10 +297,12 @@ public class ConnectionPool {
      * @return constructor used to instantiate the wrapper object
      * @throws NoSuchMethodException
      */
-    public Constructor<?> getProxyConstructor() throws NoSuchMethodException {
+    public Constructor<?> getProxyConstructor(boolean xa) throws NoSuchMethodException {
         //cache the constructor
         if (proxyClassConstructor == null ) {
-            Class<?> proxyClass = Proxy.getProxyClass(ConnectionPool.class.getClassLoader(), new Class[] {java.sql.Connection.class,javax.sql.PooledConnection.class});
+            Class<?> proxyClass = xa ?
+                Proxy.getProxyClass(ConnectionPool.class.getClassLoader(), new Class[] {java.sql.Connection.class,javax.sql.PooledConnection.class, javax.sql.XAConnection.class}) :
+                Proxy.getProxyClass(ConnectionPool.class.getClassLoader(), new Class[] {java.sql.Connection.class,javax.sql.PooledConnection.class});
             proxyClassConstructor = proxyClass.getConstructor(new Class[] { InvocationHandler.class });
         }
         return proxyClassConstructor;
index 490654e..ad5df28 100644 (file)
@@ -24,6 +24,7 @@ import javax.management.MBeanRegistration;
 import javax.management.MBeanServer;
 import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
+import javax.sql.XADataSource;
 
 
 /**
@@ -33,7 +34,7 @@ import javax.management.ObjectName;
  * @author Filip Hanik
  * @version 1.0
  */
-public class DataSource extends DataSourceProxy implements MBeanRegistration,javax.sql.DataSource, org.apache.tomcat.jdbc.pool.jmx.ConnectionPoolMBean {
+public class DataSource extends DataSourceProxy implements MBeanRegistration,javax.sql.DataSource,XADataSource, org.apache.tomcat.jdbc.pool.jmx.ConnectionPoolMBean {
 
     /**
      * Constructor for reflection only. A default set of pool properties will be created.
index 11924d7..ff291aa 100644 (file)
@@ -19,10 +19,13 @@ package org.apache.tomcat.jdbc.pool;
 import java.io.PrintWriter;
 import java.sql.Connection;
 import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
 import java.util.Iterator;
 import java.util.Properties;
 import java.util.concurrent.Future;
 
+import javax.sql.XAConnection;
+
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.jdbc.pool.PoolProperties.InterceptorDefinition;
@@ -114,6 +117,33 @@ public class DataSourceProxy implements PoolConfiguration {
             return createPool().getConnectionAsync();
         return pool.getConnectionAsync();
     }
+    
+    /**
+     * {@link javax.sql.XADataSource#getXAConnection()} 
+     */
+    public XAConnection getXAConnection() throws SQLException {
+        Connection con = getConnection();
+        if (con instanceof XAConnection) {
+            return (XAConnection)con;
+        } else {
+            try {con.close();} catch (Exception ignore){}
+            throw new SQLException("Connection from pool does not implement javax.sql.XAConnection");
+        }
+    }
+    
+    /**
+     * {@link javax.sql.XADataSource#getXAConnection(String, String)} 
+     */
+    public XAConnection getXAConnection(String username, String password) throws SQLException {
+        Connection con = getConnection(username, password);
+        if (con instanceof XAConnection) {
+            return (XAConnection)con;
+        } else {
+            try {con.close();} catch (Exception ignore){}
+            throw new SQLException("Connection from pool does not implement javax.sql.XAConnection");
+        }
+    }
+
 
     /**
      * {@link javax.sql.DataSource#getConnection()}
index c35d320..1828514 100755 (executable)
@@ -15,7 +15,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-VERSION=v1.0.7
+VERSION=v1.0.8
 for i in $(find output/release/$VERSION -name "*.zip" -o -name "*.tar.gz"); do
   echo Signing $i
   echo $1|gpg --passphrase-fd 0 -a -b $i