Author: rmannibucau
Date: Tue Jul 24 17:39:18 2012
New Revision: 1365189

URL: http://svn.apache.org/viewvc?rev=1365189&view=rev
Log:
fixing passthroughproxy usage

Added:
    
openejb/branches/openejb-pool/tomee/tomee-jdbc/src/test/java/org/apache/tomee/jdbc/TomcatDataSourceFromPoolTest.java
Removed:
    
openejb/branches/openejb-pool/tomee/tomee-jdbc/src/main/java/org/apache/tomee/jdbc/TomcatDbcpDataSource.java
Modified:
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/PoolDataSourceCreator.java
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/util/PassthroughFactory.java
    
openejb/branches/openejb-pool/tomee/tomee-jdbc/src/main/java/org/apache/tomee/jdbc/TomEEDataSourceCreator.java

Modified: 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/PoolDataSourceCreator.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/PoolDataSourceCreator.java?rev=1365189&r1=1365188&r2=1365189&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/PoolDataSourceCreator.java
 (original)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/PoolDataSourceCreator.java
 Tue Jul 24 17:39:18 2012
@@ -63,11 +63,7 @@ public abstract class PoolDataSourceCrea
     }
 
     protected <T> T build(final Class<T> clazz, final Object instance, final 
Properties properties) {
-        final ObjectRecipe recipe = new ObjectRecipe(PassthroughFactory.class);
-        final String param = "instance" + recipe.hashCode();
-        recipe.setFactoryMethod("create");
-        recipe.setConstructorArgNames(new String[]{ param });
-        recipe.setProperty(param, instance);
+        final ObjectRecipe recipe = PassthroughFactory.recipe(instance);
         recipeOptions(recipe);
         recipe.setAllProperties(properties);
         return (T) recipe.create();

Modified: 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/util/PassthroughFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/util/PassthroughFactory.java?rev=1365189&r1=1365188&r2=1365189&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/util/PassthroughFactory.java
 (original)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/util/PassthroughFactory.java
 Tue Jul 24 17:39:18 2012
@@ -21,7 +21,7 @@ import org.apache.openejb.InjectionProce
 
 /**
  * @version $Rev$ $Date$
-*/
+ */
 public class PassthroughFactory {
 
     /**
@@ -51,4 +51,4 @@ public class PassthroughFactory {
 
         return recipe;
     }
-}
+}
\ No newline at end of file

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=1365189&r1=1365188&r2=1365189&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 17:39:18 2012
@@ -16,7 +16,11 @@ import java.util.Properties;
 public class TomEEDataSourceCreator extends PoolDataSourceCreator {
     @Override
     public DataSource pool(final String name, final DataSource ds, Properties 
properties) {
-        final PoolConfiguration config = build(PoolProperties.class, 
properties);
+        final Properties converted = new Properties();
+        updateProperties(properties, converted, null);
+
+        final PoolConfiguration config = build(PoolProperties.class, 
converted);
+        config.setDataSource(ds);
         final ConnectionPool pool;
         try {
             pool = new ConnectionPool(config);
@@ -31,12 +35,31 @@ public class TomEEDataSourceCreator exte
         final Properties converted = new Properties();
         converted.setProperty("name", name);
         // some compatibility with old dbcp style
-        if (properties.containsKey("JdbcDriver")) {
+        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;
+    }
+
+    private void updateProperties(final Properties properties, final 
Properties converted, final String driver) {
+        if (driver != null) {
             converted.setProperty("driverClassName", driver);
         }
         if (properties.containsKey("JdbcUrl")) {
             converted.setProperty("url", properties.getProperty("JdbcUrl"));
         }
+        if (properties.containsKey("user")) {
+            converted.setProperty("username", properties.getProperty("user"));
+        }
         for (Map.Entry<Object, Object> entry : properties.entrySet()) {
             for (String key : PropertiesReader.KEYS) {
                 final String thisKey = entry.getKey().toString();
@@ -46,18 +69,6 @@ public class TomEEDataSourceCreator exte
                 }
             }
         }
-        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;
     }
 
     @Override

Added: 
openejb/branches/openejb-pool/tomee/tomee-jdbc/src/test/java/org/apache/tomee/jdbc/TomcatDataSourceFromPoolTest.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/tomee/tomee-jdbc/src/test/java/org/apache/tomee/jdbc/TomcatDataSourceFromPoolTest.java?rev=1365189&view=auto
==============================================================================
--- 
openejb/branches/openejb-pool/tomee/tomee-jdbc/src/test/java/org/apache/tomee/jdbc/TomcatDataSourceFromPoolTest.java
 (added)
+++ 
openejb/branches/openejb-pool/tomee/tomee-jdbc/src/test/java/org/apache/tomee/jdbc/TomcatDataSourceFromPoolTest.java
 Tue Jul 24 17:39:18 2012
@@ -0,0 +1,213 @@
+package org.apache.tomee.jdbc;
+
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.SingletonBean;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.junit.Configuration;
+import org.apache.openejb.junit.Module;
+import org.apache.openejb.resource.jdbc.managed.local.ManagedConnection;
+import org.junit.After;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.annotation.Resource;
+import javax.annotation.sql.DataSourceDefinition;
+import javax.ejb.EJB;
+import javax.ejb.EJBContext;
+import javax.ejb.LocalBean;
+import javax.ejb.Singleton;
+import javax.ejb.TransactionAttribute;
+import javax.ejb.TransactionAttributeType;
+import javax.sql.DataSource;
+import java.lang.reflect.Field;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+
+@RunWith(ApplicationComposer.class)
+public class TomcatDataSourceFromPoolTest {
+    private static final String URL = 
"jdbc:hsqldb:mem:managed;hsqldb.tx=MVCC"; // mvcc otherwise multiple 
transaction tests will fail
+    private static final String USER = "sa";
+    private static final String PASSWORD = "";
+    private static final String TABLE = "PUBLIC.MANAGED_DATASOURCE_TEST";
+
+    @EJB
+    private Persister persistManager;
+
+    @BeforeClass
+    public static void createTable() throws SQLException, 
ClassNotFoundException {
+        Class.forName("org.hsqldb.jdbcDriver");
+
+        final Connection connection = DriverManager.getConnection(URL, USER, 
PASSWORD);
+        final Statement statement = connection.createStatement();
+        statement.execute("CREATE TABLE " + TABLE + "(ID INTEGER)");
+        statement.close();
+        connection.commit();
+        connection.close();
+    }
+
+    @Configuration
+    public Properties config() {
+        final Properties p = new Properties();
+        p.put("openejb.jdbc.datasource-creator", "tomcat");
+        return p;
+    }
+
+    @Module
+    public EjbJar app() throws Exception {
+        return new EjbJar()
+                .enterpriseBean(new SingletonBean(Persister.class).localBean())
+                .enterpriseBean(new 
SingletonBean(OtherPersister.class).localBean());
+    }
+
+    @LocalBean
+    @Singleton
+    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
+    public static class OtherPersister {
+        @Resource(name = "managed")
+        private DataSource ds;
+
+        @Resource
+        private EJBContext context;
+
+        public void save() throws SQLException {
+            TomcatDataSourceFromPoolTest.save(ds, 10);
+        }
+
+        public void saveAndRollback() throws SQLException {
+            TomcatDataSourceFromPoolTest.save(ds, 11);
+            context.setRollbackOnly();
+        }
+    }
+
+    @LocalBean
+    @Singleton
+    @DataSourceDefinition(
+            name = "managed",
+            url = URL, user = USER, password = PASSWORD,
+            className = "org.hsqldb.jdbc.JDBCDataSource")
+    public static class Persister {
+        @Resource(name = "managed")
+        private DataSource ds;
+
+        @Resource
+        private EJBContext context;
+
+        @EJB
+        private OtherPersister other;
+
+        public void save() throws SQLException {
+            TomcatDataSourceFromPoolTest.save(ds, 1);
+        }
+
+        public void saveAndRollback() throws SQLException {
+            TomcatDataSourceFromPoolTest.save(ds, 2);
+            context.setRollbackOnly();
+        }
+
+        public void saveTwice() throws SQLException {
+            TomcatDataSourceFromPoolTest.save(ds, 3);
+            TomcatDataSourceFromPoolTest.save(ds, 4);
+        }
+
+        public void rollbackMultipleSave() throws SQLException {
+            TomcatDataSourceFromPoolTest.save(ds, 5);
+            TomcatDataSourceFromPoolTest.save(ds, 6);
+            context.setRollbackOnly();
+        }
+
+        public void saveInThisTxAndAnotherOne() throws SQLException {
+            TomcatDataSourceFromPoolTest.save(ds, 7);
+            other.save();
+        }
+
+        public void saveInThisTxAndRollbackInAnotherOne() throws SQLException {
+            TomcatDataSourceFromPoolTest.save(ds, 8);
+            other.saveAndRollback();
+        }
+    }
+
+    @Test
+    public void commit() throws SQLException {
+        persistManager.save();
+        assertTrue(exists(1));
+    }
+
+    @Test
+    public void rollback() throws SQLException {
+        persistManager.saveAndRollback();
+        assertFalse(exists(2));
+    }
+
+    @Test
+    public void commit2() throws SQLException {
+        persistManager.saveTwice();
+        assertTrue(exists(3));
+        assertTrue(exists(4));
+    }
+
+    @Test
+    public void rollback2() throws SQLException {
+        persistManager.rollbackMultipleSave();
+        assertFalse(exists(5));
+        assertFalse(exists(6));
+    }
+
+    @Test
+    public void saveDifferentTx() throws SQLException {
+        persistManager.saveInThisTxAndAnotherOne();
+        assertTrue(exists(7));
+        assertTrue(exists(10));
+    }
+
+    @Test
+    public void saveRollbackDifferentTx() throws SQLException {
+        persistManager.saveInThisTxAndRollbackInAnotherOne();
+        assertTrue(exists(8));
+        assertFalse(exists(12));
+    }
+
+    @After
+    public void checkTxMapIsEmpty() throws Exception { // avoid memory leak
+        final Field map = 
ManagedConnection.class.getDeclaredField("CONNECTION_BY_TX");
+        map.setAccessible(true);
+        final Map<?, ?> instance = (Map<?, ?>) map.get(null);
+        assertEquals(0, instance.size());
+    }
+
+    private static boolean exists(int id) throws SQLException {
+        final Connection connection = DriverManager.getConnection(URL, USER, 
PASSWORD);
+        final Statement statement = connection.createStatement();
+        final ResultSet result = statement.executeQuery("SELECT count(*) AS NB 
FROM " + TABLE + " WHERE ID = " + id);
+        try {
+            assertTrue(result.next());
+            return result.getInt(1) == 1;
+        } finally {
+            statement.close();
+            connection.close();
+        }
+    }
+
+    private static void save(final DataSource ds, int id) throws SQLException {
+        execute(ds, "INSERT INTO " + TABLE + "(ID) VALUES(" + id + ")");
+    }
+
+    private static void execute(final DataSource ds, final String sql) throws 
SQLException {
+        final Connection connection = ds.getConnection();
+        final Statement statement = connection.createStatement();
+        statement.executeUpdate(sql);
+        statement.close();
+        connection.close();
+    }
+}
+


Reply via email to