Author: rmannibucau
Date: Mon Jul 23 08:04:26 2012
New Revision: 1364538
URL: http://svn.apache.org/viewvc?rev=1364538&view=rev
Log:
fixing compile with j7
Added:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/Reflections.java
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/RoutedDataSource.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedConnection.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedDataSource.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedXADataSource.java
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/ManagedDataSourceTest.java
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/RoutedDataSource.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/RoutedDataSource.java?rev=1364538&r1=1364537&r2=1364538&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/RoutedDataSource.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/RoutedDataSource.java
Mon Jul 23 08:04:26 2012
@@ -30,6 +30,7 @@ import javax.sql.DataSource;
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.resource.jdbc.router.Router;
import org.apache.openejb.spi.ContainerSystem;
+import org.apache.openejb.util.reflection.Reflections;
public class RoutedDataSource implements DataSource {
private static final String OPENEJB_RESOURCE_PREFIX = "openejb:Resource/";
@@ -90,12 +91,11 @@ public class RoutedDataSource implements
return getTargetDataSource().getLoginTimeout();
}
- @SuppressWarnings("unchecked")
public <T> T unwrap(Class<T> iface) throws SQLException {
if (getTargetDataSource() == null) {
return null;
}
- return (T) callByReflection(getTargetDataSource(), "unwrap",
+ return (T) Reflections.invokeByReflection(getTargetDataSource(),
"unwrap",
new Class<?>[]{Class.class}, new Object[]{iface});
}
@@ -103,14 +103,14 @@ public class RoutedDataSource implements
if (getTargetDataSource() == null) {
return null;
}
- return (Logger) callByReflection(getTargetDataSource(),
"getParentLogger", new Class<?>[0], null);
+ return (Logger) Reflections.invokeByReflection(getTargetDataSource(),
"getParentLogger", new Class<?>[0], null);
}
public boolean isWrapperFor(Class<?> iface) throws SQLException {
if (getTargetDataSource() == null) {
return false;
}
- return (Boolean) callByReflection(getTargetDataSource(),
"isWrapperFor",
+ return (Boolean) Reflections.invokeByReflection(getTargetDataSource(),
"isWrapperFor",
new Class<?>[]{Class.class}, new Object[]{iface});
}
@@ -133,25 +133,4 @@ public class RoutedDataSource implements
private DataSource getTargetDataSource() {
return getDelegate().getDataSource();
}
-
- /**
- * This method is used to avoir to fork two projects to implement
- * datasource of the jre5 and jre6
- *
- * @param ds the wrapped datasource
- * @param mtdName the method to call
- * @param paramTypes the parameter type
- * @param args the arguments
- * @return the return value of the method
- */
- private Object callByReflection(DataSource ds, String mtdName, Class<?>[]
paramTypes, Object[] args) {
- Method mtd;
- try {
- mtd = ds.getClass().getDeclaredMethod(mtdName, paramTypes);
- return mtd.invoke(ds, args);
-
- } catch (Exception e) {
- throw new IllegalArgumentException(e);
- }
- }
}
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedConnection.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedConnection.java?rev=1364538&r1=1364537&r2=1364538&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedConnection.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedConnection.java
Mon Jul 23 08:04:26 2012
@@ -1,29 +1,22 @@
package org.apache.openejb.resource.jdbc.managed;
+import org.apache.openejb.OpenEJB;
import org.apache.openejb.resource.jdbc.managed.local.LocalXAResource;
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
import javax.transaction.xa.XAResource;
-import java.sql.Array;
-import java.sql.Blob;
-import java.sql.CallableStatement;
-import java.sql.Clob;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.NClob;
-import java.sql.PreparedStatement;
-import java.sql.SQLClientInfoException;
import java.sql.SQLException;
-import java.sql.SQLWarning;
-import java.sql.SQLXML;
-import java.sql.Savepoint;
-import java.sql.Statement;
-import java.sql.Struct;
-import java.util.Map;
-import java.util.Properties;
-public class ManagedConnection implements Connection {
+public class ManagedConnection implements InvocationHandler {
protected final Connection delegate;
protected final XAResource xaResource;
+ private boolean previousAutoCommit;
protected ManagedConnection(final Connection connection, final XAResource
resource) {
delegate = connection;
@@ -35,247 +28,59 @@ public class ManagedConnection implement
}
@Override
- public Statement createStatement() throws SQLException {
- return delegate.createStatement();
- }
-
- @Override
- public PreparedStatement prepareStatement(final String sql) throws
SQLException {
- return delegate.prepareStatement(sql);
- }
-
- @Override
- public CallableStatement prepareCall(final String sql) throws SQLException
{
- return delegate.prepareCall(sql);
- }
-
- @Override
- public String nativeSQL(final String sql) throws SQLException {
- return delegate.nativeSQL(sql);
- }
-
- @Override
- public void setAutoCommit(boolean autoCommit) throws SQLException {
- delegate.setAutoCommit(autoCommit);
- }
-
- @Override
- public boolean getAutoCommit() throws SQLException {
- return delegate.getAutoCommit();
- }
-
- @Override
- public void commit() throws SQLException {
- delegate.commit();
- }
-
- @Override
- public void rollback() throws SQLException {
- delegate.rollback();
- }
-
- @Override
- public void close() throws SQLException {
- delegate.close();
- }
-
- @Override
- public boolean isClosed() throws SQLException {
- return delegate.isClosed();
- }
-
- @Override
- public DatabaseMetaData getMetaData() throws SQLException {
- return delegate.getMetaData();
- }
-
- @Override
- public void setReadOnly(boolean readOnly) throws SQLException {
- delegate.setReadOnly(readOnly);
- }
-
- @Override
- public boolean isReadOnly() throws SQLException {
- return delegate.isReadOnly();
- }
-
- @Override
- public void setCatalog(final String catalog) throws SQLException {
- delegate.setCatalog(catalog);
- }
-
- @Override
- public String getCatalog() throws SQLException {
- return delegate.getCatalog();
- }
-
- @Override
- public void setTransactionIsolation(int level) throws SQLException {
- delegate.setTransactionIsolation(level);
- }
-
- @Override
- public int getTransactionIsolation() throws SQLException {
- return delegate.getTransactionIsolation();
- }
-
- @Override
- public SQLWarning getWarnings() throws SQLException {
- return delegate.getWarnings();
- }
-
- @Override
- public void clearWarnings() throws SQLException {
- delegate.clearWarnings();
- }
-
- @Override
- public Statement createStatement(int resultSetType, int
resultSetConcurrency) throws SQLException {
- return delegate.createStatement(resultSetType, resultSetConcurrency);
- }
-
- @Override
- public PreparedStatement prepareStatement(final String sql, int
resultSetType, int resultSetConcurrency) throws SQLException {
- return delegate.prepareStatement(sql, resultSetType,
resultSetConcurrency);
- }
-
- @Override
- public CallableStatement prepareCall(final String sql, int resultSetType,
int resultSetConcurrency) throws SQLException {
- return delegate.prepareCall(sql, resultSetType, resultSetConcurrency);
- }
-
- @Override
- public Map<String, Class<?>> getTypeMap() throws SQLException {
- return delegate.getTypeMap();
- }
-
- @Override
- public void setTypeMap(final Map<String, Class<?>> map) throws
SQLException {
- delegate.setTypeMap(map);
- }
-
- @Override
- public void setHoldability(int holdability) throws SQLException {
- delegate.setHoldability(holdability);
- }
-
- @Override
- public int getHoldability() throws SQLException {
- return delegate.getHoldability();
- }
-
- @Override
- public Savepoint setSavepoint() throws SQLException {
- return delegate.setSavepoint();
- }
-
- @Override
- public Savepoint setSavepoint(String name) throws SQLException {
- return delegate.setSavepoint(name);
- }
-
- @Override
- public void rollback(final Savepoint savepoint) throws SQLException {
- delegate.rollback(savepoint);
- }
-
- @Override
- public void releaseSavepoint(Savepoint savepoint) throws SQLException {
- delegate.releaseSavepoint(savepoint);
- }
-
- @Override
- public Statement createStatement(int resultSetType, int
resultSetConcurrency, int resultSetHoldability) throws SQLException {
- return delegate.createStatement(resultSetType, resultSetConcurrency,
resultSetHoldability);
- }
-
- @Override
- public PreparedStatement prepareStatement(String sql, int resultSetType,
int resultSetConcurrency, int resultSetHoldability) throws SQLException {
- return delegate.prepareStatement(sql, resultSetType,
resultSetConcurrency, resultSetHoldability);
- }
-
- @Override
- public CallableStatement prepareCall(String sql, int resultSetType, int
resultSetConcurrency, int resultSetHoldability) throws SQLException {
- return delegate.prepareCall(sql, resultSetType, resultSetConcurrency,
resultSetHoldability);
- }
-
- @Override
- public PreparedStatement prepareStatement(String sql, int
autoGeneratedKeys) throws SQLException {
- return delegate.prepareStatement(sql, autoGeneratedKeys);
- }
-
- @Override
- public PreparedStatement prepareStatement(String sql, int[] columnIndexes)
throws SQLException {
- return delegate.prepareStatement(sql, columnIndexes);
- }
-
- @Override
- public PreparedStatement prepareStatement(String sql, String[]
columnNames) throws SQLException {
- return delegate.prepareStatement(sql, columnNames);
- }
-
- @Override
- public Clob createClob() throws SQLException {
- return delegate.createClob();
- }
-
- @Override
- public Blob createBlob() throws SQLException {
- return delegate.createBlob();
- }
-
- @Override
- public NClob createNClob() throws SQLException {
- return delegate.createNClob();
- }
-
- @Override
- public SQLXML createSQLXML() throws SQLException {
- return delegate.createSQLXML();
- }
-
- @Override
- public boolean isValid(int timeout) throws SQLException {
- return delegate.isValid(timeout);
- }
-
- @Override
- public void setClientInfo(final String name, final String value) throws
SQLClientInfoException {
- delegate.setClientInfo(name, value);
- }
-
- @Override
- public void setClientInfo(final Properties properties) throws
SQLClientInfoException {
- delegate.setClientInfo(properties);
- }
-
- @Override
- public String getClientInfo(final String name) throws SQLException {
- return delegate.getClientInfo(name);
- }
-
- @Override
- public Properties getClientInfo() throws SQLException {
- return delegate.getClientInfo();
- }
-
- @Override
- public Array createArrayOf(final String typeName, final Object[] elements)
throws SQLException {
- return delegate.createArrayOf(typeName, elements);
- }
-
- @Override
- public Struct createStruct(final String typeName, final Object[]
attributes) throws SQLException {
- return delegate.createStruct(typeName, attributes);
- }
-
- @Override
- public <T> T unwrap(final Class<T> iface) throws SQLException {
- return delegate.unwrap(iface);
- }
-
- @Override
- public boolean isWrapperFor(final Class<?> iface) throws SQLException {
- return delegate.isWrapperFor(iface);
+ public Object invoke(final Object proxy, final Method method, final
Object[] args) throws Throwable {
+ final TransactionManager transactionManager =
OpenEJB.getTransactionManager();
+ final Transaction transaction = transactionManager.getTransaction();
+ if (transaction == null) { // shouldn't be possible
+ return method.invoke(delegate, args);
+ }
+
+ int status = transaction.getStatus();
+ if (status != Status.STATUS_ACTIVE && status !=
Status.STATUS_MARKED_ROLLBACK) {
+ return method.invoke(delegate, args);
+ }
+
+ // TODO: manage it properly
+ previousAutoCommit = delegate.getAutoCommit();
+ delegate.setAutoCommit(false);
+
+ final String mtdName = method.getName();
+ if ("setAutoCommit".equals(mtdName)) {
+ throw new SQLException("TODO");
+ } else if ("commit".equals(mtdName)) {
+ throw new SQLException("TODO");
+ } else if ("rollback".equals(mtdName)) {
+ throw new SQLException("TODO");
+ } else if ("setReadOnly".equals(mtdName)) {
+ throw new SQLException("TODO");
+ }
+
+ // TODO: manage share connection
+
+ transaction.registerSynchronization(new
ClosingSynchronization(delegate));
+
+ return method.invoke(delegate, args);
+ }
+
+ private static class ClosingSynchronization implements Synchronization {
+ private final Connection connection;
+
+ public ClosingSynchronization(final Connection delegate) {
+ connection = delegate;
+ }
+
+ @Override
+ public void beforeCompletion() {
+ // no-op
+ }
+
+ @Override
+ public void afterCompletion(int status) {
+ try {
+ connection.close();
+ } catch (SQLException e) {
+ // no-op
+ }
+ }
}
}
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedDataSource.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedDataSource.java?rev=1364538&r1=1364537&r2=1364538&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedDataSource.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedDataSource.java
Mon Jul 23 08:04:26 2012
@@ -1,11 +1,25 @@
package org.apache.openejb.resource.jdbc.managed;
+import org.apache.openejb.OpenEJB;
+import org.apache.openejb.resource.jdbc.managed.local.LocalXAResource;
+import org.apache.openejb.util.reflection.Reflections;
+
import javax.sql.DataSource;
+import javax.transaction.RollbackException;
+import javax.transaction.SystemException;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+import javax.transaction.xa.XAResource;
import java.io.PrintWriter;
+import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
+import java.util.logging.Logger;
public class ManagedDataSource implements DataSource {
+ private static final Class<?>[] CONNECTION_CLASS = new Class<?>[] {
Connection.class };
+
protected final DataSource delegate;
public ManagedDataSource(final DataSource ds) {
@@ -14,12 +28,35 @@ public class ManagedDataSource implement
@Override
public Connection getConnection() throws SQLException {
- return new ManagedConnection(delegate.getConnection());
+ final Connection connection = delegate.getConnection();
+ final XAResource xaResource = new LocalXAResource(connection);
+ final TransactionManager transactionManager =
OpenEJB.getTransactionManager();
+ final Transaction transaction;
+ try {
+ transaction = transactionManager.getTransaction();
+ } catch (SystemException e) {
+ return managed(connection);
+ }
+ if (transaction != null) {
+ try {
+ transaction.enlistResource(xaResource);
+ } catch (RollbackException e) {
+ e.printStackTrace(); //To change body of catch statement use
File | Settings | File Templates.
+ } catch (SystemException e) {
+ e.printStackTrace(); //To change body of catch statement use
File | Settings | File Templates.
+ }
+ }
+
+ return managed(connection);
}
@Override
public Connection getConnection(final String username, final String
password) throws SQLException {
- return new ManagedConnection(delegate.getConnection(username,
password));
+ return managed(delegate.getConnection(username, password));
+ }
+
+ private Connection managed(final Connection connection) {
+ return (Connection)
Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
CONNECTION_CLASS, new ManagedConnection(connection));
}
@Override
@@ -42,6 +79,11 @@ public class ManagedDataSource implement
return delegate.getLoginTimeout();
}
+ // @Override
+ public Logger getParentLogger() throws SQLFeatureNotSupportedException {
+ return (Logger) Reflections.invokeByReflection(delegate,
"getParentLogger", new Class<?>[0], null);
+ }
+
@Override
public <T> T unwrap(final Class<T> iface) throws SQLException {
return delegate.unwrap(iface);
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedXADataSource.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedXADataSource.java?rev=1364538&r1=1364537&r2=1364538&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedXADataSource.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedXADataSource.java
Mon Jul 23 08:04:26 2012
@@ -5,10 +5,14 @@ import javax.sql.XAConnection;
import javax.sql.XADataSource;
import javax.transaction.xa.XAResource;
import java.io.PrintWriter;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.SQLException;
public class ManagedXADataSource extends ManagedDataSource {
+ private static final Class<?>[] CONNECTION_CLASS = new Class<?>[] {
XAConnection.class };
+
private final XADataSource xaDataSource;
public ManagedXADataSource(final DataSource ds) {
@@ -18,11 +22,15 @@ public class ManagedXADataSource extends
@Override
public Connection getConnection() throws SQLException {
- return new
ManagedXAConnection(xaDataSource.getXAConnection().getConnection());
+ return managed(xaDataSource.getXAConnection().getConnection());
}
@Override
public Connection getConnection(final String username, final String
password) throws SQLException {
- return new ManagedXAConnection(xaDataSource.getXAConnection(username,
password).getConnection());
+ return managed(xaDataSource.getXAConnection(username,
password).getConnection());
+ }
+
+ private Connection managed(final Connection connection) throws
SQLException {
+ return (Connection)
Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
CONNECTION_CLASS, new ManagedXAConnection(connection));
}
}
Added:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/Reflections.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/Reflections.java?rev=1364538&view=auto
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/Reflections.java
(added)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/Reflections.java
Mon Jul 23 08:04:26 2012
@@ -0,0 +1,19 @@
+package org.apache.openejb.util.reflection;
+
+import java.lang.reflect.Method;
+
+public final class Reflections {
+ private Reflections() {
+ // no-op
+ }
+
+ public static Object invokeByReflection(final Object obj, final String
mtdName, final Class<?>[] paramTypes, final Object[] args) {
+ Method mtd;
+ try {
+ mtd = obj.getClass().getDeclaredMethod(mtdName, paramTypes);
+ return mtd.invoke(obj, args);
+ } catch (Exception e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+}
Modified:
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/ManagedDataSourceTest.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/ManagedDataSourceTest.java?rev=1364538&r1=1364537&r2=1364538&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/ManagedDataSourceTest.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/ManagedDataSourceTest.java
Mon Jul 23 08:04:26 2012
@@ -26,7 +26,7 @@ import java.util.Properties;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-@Ignore("to implement")
+//@Ignore("to implement")
@RunWith(ApplicationComposer.class)
public class ManagedDataSourceTest {
private static final String URL = "jdbc:hsqldb:mem:managed";