Author: rmannibucau
Date: Tue Jul 24 23:08:34 2012
New Revision: 1365339

URL: http://svn.apache.org/viewvc?rev=1365339&view=rev
Log:
weird tomcat-jdbc doesn't manage hashCode properly

Modified:
    
openejb/branches/openejb-pool/arquillian/arquillian-tomee-tests/src/test/java/org/apache/openejb/arquillian/tests/Runner.java
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java
    
openejb/branches/openejb-pool/tomee/tomee-jdbc/src/main/java/org/apache/tomee/jdbc/TomEEDataSourceCreator.java

Modified: 
openejb/branches/openejb-pool/arquillian/arquillian-tomee-tests/src/test/java/org/apache/openejb/arquillian/tests/Runner.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/arquillian/arquillian-tomee-tests/src/test/java/org/apache/openejb/arquillian/tests/Runner.java?rev=1365339&r1=1365338&r2=1365339&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/arquillian/arquillian-tomee-tests/src/test/java/org/apache/openejb/arquillian/tests/Runner.java
 (original)
+++ 
openejb/branches/openejb-pool/arquillian/arquillian-tomee-tests/src/test/java/org/apache/openejb/arquillian/tests/Runner.java
 Tue Jul 24 23:08:34 2012
@@ -46,6 +46,7 @@ public class Runner {
                     method.invoke(obj);
                     writer.println("true");
                 } catch (Throwable e) {
+                    e.printStackTrace();
                     writer.println("false");
                 }
             }

Modified: 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java?rev=1365339&r1=1365338&r2=1365339&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java
 (original)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java
 Tue Jul 24 23:08:34 2012
@@ -23,10 +23,16 @@ public class ManagedConnection implement
     protected Connection delegate;
     private final TransactionManager transactionManager;
     private Transaction currentTransaction;
+    private int hashCode = -1;
 
     public ManagedConnection(final Connection connection, final 
TransactionManager txMgr) {
         delegate = connection;
         transactionManager = txMgr;
+        try { // do it now since if used after close that's often too late
+            hashCode = delegate.hashCode();
+        } catch (RuntimeException ignored) {
+            hashCode = (int) System.nanoTime(); // well try to put something 
not constant, shouldn't occur btw
+        }
     }
 
     public XAResource getXAResource() throws SQLException {
@@ -41,7 +47,7 @@ public class ManagedConnection implement
             return "ManagedConnection{" + delegate + "}";
         }
         if ("hashCode".equals(mtdName)) {
-            return delegate.hashCode();
+            return hashCode;
         }
         if ("equals".equals(mtdName)) {
             return delegate.equals(args[0]);
@@ -100,6 +106,8 @@ public class ManagedConnection implement
         } catch (InvocationTargetException ite) {
             throw ite.getTargetException();
         }
+
+
     }
 
     private static Object invokeUnderTransaction(final Connection delegate, 
final Method method, final Object[] args) throws Exception {

Modified: 
openejb/branches/openejb-pool/tomee/tomee-jdbc/src/main/java/org/apache/tomee/jdbc/TomEEDataSourceCreator.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/tomee/tomee-jdbc/src/main/java/org/apache/tomee/jdbc/TomEEDataSourceCreator.java?rev=1365339&r1=1365338&r2=1365339&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/tomee/tomee-jdbc/src/main/java/org/apache/tomee/jdbc/TomEEDataSourceCreator.java
 (original)
+++ 
openejb/branches/openejb-pool/tomee/tomee-jdbc/src/main/java/org/apache/tomee/jdbc/TomEEDataSourceCreator.java
 Tue Jul 24 23:08:34 2012
@@ -9,6 +9,10 @@ import org.apache.tomcat.jdbc.pool.PoolP
 
 import javax.management.ObjectName;
 import javax.sql.DataSource;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.sql.Connection;
 import java.sql.SQLException;
 import java.util.Map;
 import java.util.Properties;
@@ -27,30 +31,19 @@ public class TomEEDataSourceCreator exte
         } catch (SQLException e) {
             throw new IllegalStateException(e);
         }
-        return build(TomEEDataSource.class, new TomEEDataSource(pool), 
properties);
+        return build(TomEEDataSource.class, new TomEEDataSource(pool, name), 
properties);
     }
 
     @Override
     public DataSource pool(final String name, final String driver, final 
Properties properties) {
         final Properties converted = new Properties();
         converted.setProperty("name", name);
-        // some compatibility with old dbcp style
         updateProperties(properties, converted, driver);
-        final org.apache.tomcat.jdbc.pool.DataSource ds = new 
org.apache.tomcat.jdbc.pool.DataSource(DataSourceFactory.parsePoolProperties(converted));
-        try { // just to force the pool to be created
-            ds.getConnection().close();
-        } catch (Throwable ignored) {
-            // no-op
-        }
-        try {
-            ds.preRegister(LocalMBeanServer.get(), new ObjectName("openejb", 
"name", name));
-        } catch (Exception ignored) {
-            // ignored
-        }
-        return ds;
+        return new 
TomEEDataSource(DataSourceFactory.parsePoolProperties(converted), name);
     }
 
     private void updateProperties(final Properties properties, final 
Properties converted, final String driver) {
+        // some compatibility with old dbcp style
         if (driver != null) {
             converted.setProperty("driverClassName", driver);
         }
@@ -76,8 +69,59 @@ public class TomEEDataSourceCreator exte
     }
 
     public static class TomEEDataSource extends 
org.apache.tomcat.jdbc.pool.DataSource {
-        public TomEEDataSource(final ConnectionPool pool) {
+        public TomEEDataSource(final ConnectionPool pool, final String name) {
             this.pool = pool;
+            try {
+                preRegister(LocalMBeanServer.get(), new ObjectName("openejb", 
"name", name));
+            } catch (Exception ignored) {
+                // ignored
+            }
+        }
+
+        public TomEEDataSource(final PoolConfiguration poolConfiguration, 
final String name) {
+            super(poolConfiguration);
+            try { // just to force the pool to be created
+                getConnection().close();
+            } catch (Throwable ignored) {
+                // no-op
+            }
+            try {
+                preRegister(LocalMBeanServer.get(), new ObjectName("openejb", 
"name", name));
+            } catch (Exception ignored) {
+                // ignored
+            }
+        }
+
+        @Override
+        public Connection getConnection() throws SQLException {
+            final Connection connection = super.getConnection();
+            return (Connection) 
Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
+                    new Class<?>[] { Connection.class }, new 
ContantHashCodeHandler(connection, connection.hashCode()));
+        }
+
+        @Override
+        public Connection getConnection(final String u, final String p) throws 
SQLException {
+            final Connection connection = super.getConnection(u, p);
+            return (Connection) 
Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
+                    new Class<?>[] { Connection.class }, new 
ContantHashCodeHandler(connection, connection.hashCode()));
+        }
+    }
+
+    private static class ContantHashCodeHandler implements InvocationHandler {
+        private final Object delegate;
+        private final int hashCode;
+
+        public ContantHashCodeHandler(final Object object, int hashCode) {
+            this.delegate = object;
+            this.hashCode = hashCode;
+        }
+
+        @Override
+        public Object invoke(Object proxy, Method method, Object[] args) 
throws Throwable {
+            if ("hashCode".equals(method.getName())) {
+                return hashCode;
+            }
+            return method.invoke(delegate, args);
         }
     }
 }


Reply via email to