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";


Reply via email to