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);
}
}
}