Author: rmannibucau
Date: Tue Jul 24 15:35:02 2012
New Revision: 1365136

URL: http://svn.apache.org/viewvc?rev=1365136&view=rev
Log:
refactoring datasourcecreator to manage their own recipes. adding bonecp module

Added:
    openejb/branches/openejb-pool/server/openejb-bonecp/
    openejb/branches/openejb-pool/server/openejb-bonecp/pom.xml
    openejb/branches/openejb-pool/server/openejb-bonecp/src/
    openejb/branches/openejb-pool/server/openejb-bonecp/src/main/
    openejb/branches/openejb-pool/server/openejb-bonecp/src/main/java/
    openejb/branches/openejb-pool/server/openejb-bonecp/src/main/java/org/
    
openejb/branches/openejb-pool/server/openejb-bonecp/src/main/java/org/apache/
    
openejb/branches/openejb-pool/server/openejb-bonecp/src/main/java/org/apache/openejb/
    
openejb/branches/openejb-pool/server/openejb-bonecp/src/main/java/org/apache/openejb/bonecp/
    
openejb/branches/openejb-pool/server/openejb-bonecp/src/main/java/org/apache/openejb/bonecp/BoneCPDataSourceCreator.java
    openejb/branches/openejb-pool/server/openejb-bonecp/src/test/
    openejb/branches/openejb-pool/server/openejb-bonecp/src/test/java/
Modified:
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/DbcpDataSourceCreator.java
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DataSourceCreator.java
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java
    
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/test/java/org/apache/openejb/resource/jdbc/CustomPoolDataSourceTest.java
    openejb/branches/openejb-pool/server/pom.xml
    
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/DataSourceFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java?rev=1365136&r1=1365135&r2=1365136&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java
 (original)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java
 Tue Jul 24 15:35:02 2012
@@ -67,13 +67,13 @@ public class DataSourceFactory {
 
             if (managed) {
                 if (useDbcp(properties)) {
-                    ds = creator.poolManaged(name, dataSource);
+                    ds = creator.poolManaged(name, dataSource, properties);
                 } else {
-                    ds = creator.managed(name, dataSource);
+                    ds = creator.managed(name, dataSource, properties);
                 }
             } else {
                 if (useDbcp(properties)) {
-                    ds = creator.pool(name, dataSource);
+                    ds = creator.pool(name, dataSource, properties);
                 } else {
                     ds = dataSource;
                 }

Modified: 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/DbcpDataSourceCreator.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/DbcpDataSourceCreator.java?rev=1365136&r1=1365135&r2=1365136&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/DbcpDataSourceCreator.java
 (original)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/DbcpDataSourceCreator.java
 Tue Jul 24 15:35:02 2012
@@ -1,8 +1,6 @@
 package org.apache.openejb.resource.jdbc.dbcp;
 
 import org.apache.openejb.resource.jdbc.pool.PoolDataSourceCreator;
-import org.apache.xbean.recipe.ObjectRecipe;
-import org.apache.xbean.recipe.Option;
 
 import javax.sql.DataSource;
 import java.util.Properties;
@@ -11,22 +9,18 @@ import java.util.Properties;
 // this one will probably not be used since dbcp has already the integration 
we need
 public class DbcpDataSourceCreator extends PoolDataSourceCreator {
     @Override
-    public DataSource pool(final String name, final DataSource ds) {
-        return new DbcpDataSource(name, ds);
+    public DataSource pool(final String name, final DataSource ds, Properties 
properties) {
+        return build(DbcpDataSource.class, new DbcpDataSource(name, ds), 
properties);
     }
 
     @Override
     public DataSource pool(final String name, final String driver, final 
Properties properties) {
-        final ObjectRecipe serviceRecipe = new 
ObjectRecipe(BasicDataSource.class.getName());
-        serviceRecipe.allow(Option.CASE_INSENSITIVE_PROPERTIES);
-        serviceRecipe.allow(Option.IGNORE_MISSING_PROPERTIES);
-        serviceRecipe.setProperty("name", name);
         if (!properties.containsKey("JdbcDriver")) {
             properties.setProperty("driverClassName", driver);
         }
-        serviceRecipe.setAllProperties(properties);
+        properties.setProperty("name", name);
 
-        final BasicDataSource ds = (BasicDataSource) serviceRecipe.create(); 
// new BasicDataSource(name);
+        final BasicDataSource ds = build(BasicDataSource.class, properties);
         ds.setDriverClassName(driver);
         return ds;
     }

Modified: 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DataSourceCreator.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DataSourceCreator.java?rev=1365136&r1=1365135&r2=1365136&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DataSourceCreator.java
 (original)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DataSourceCreator.java
 Tue Jul 24 15:35:02 2012
@@ -12,8 +12,8 @@ import java.util.Properties;
 // in fact all managed method are done through the previous abstraction
 public interface DataSourceCreator {
     DataSource managed(String name, DataSource ds);
-    DataSource poolManaged(String name, DataSource ds);
-    DataSource pool(String name, DataSource ds);
+    DataSource poolManaged(String name, DataSource ds, Properties properties);
+    DataSource pool(String name, DataSource ds, Properties properties);
     DataSource poolManagedWithRecovery(String name, XAResourceWrapper 
xaResourceWrapper, String driver, Properties properties);
     DataSource poolManaged(String name, String driver, Properties properties);
     DataSource pool(String name, String driver, Properties properties);

Modified: 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java?rev=1365136&r1=1365135&r2=1365136&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java
 (original)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java
 Tue Jul 24 15:35:02 2012
@@ -11,13 +11,13 @@ import javax.sql.DataSource;
 import java.util.Properties;
 
 public class DefaultDataSourceCreator implements DataSourceCreator {
-    @Override // TODO: remove dbcp from here
+    @Override
     public DataSource managed(final String name, final DataSource ds) {
         return new DbcpManagedDataSource(name, ds);
     }
 
     @Override
-    public DataSource poolManaged(final String name, final DataSource ds) {
+    public DataSource poolManaged(final String name, final DataSource ds, 
Properties properties) {
         return new DbcpManagedDataSource(name, ds);
     }
 
@@ -36,7 +36,7 @@ public class DefaultDataSourceCreator im
     }
 
     @Override
-    public DataSource pool(final String name, final DataSource ds) {
+    public DataSource pool(final String name, final DataSource ds, Properties 
properties) {
         return new DbcpDataSource(name, ds);
     }
 

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=1365136&r1=1365135&r2=1365136&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 15:35:02 2012
@@ -5,6 +5,9 @@ import org.apache.openejb.resource.Trans
 import org.apache.openejb.resource.XAResourceWrapper;
 import org.apache.openejb.resource.jdbc.managed.local.ManagedDataSource;
 import org.apache.openejb.resource.jdbc.managed.xa.ManagedXADataSource;
+import org.apache.openejb.util.PassthroughFactory;
+import org.apache.xbean.recipe.ObjectRecipe;
+import org.apache.xbean.recipe.Option;
 
 import javax.sql.DataSource;
 import javax.sql.XADataSource;
@@ -32,8 +35,8 @@ public abstract class PoolDataSourceCrea
     }
 
     @Override
-    public DataSource poolManaged(final String name, final DataSource ds) {
-        return managed(name, pool(name, ds));
+    public DataSource poolManaged(final String name, final DataSource ds, 
final Properties properties) {
+        return managed(name, pool(name, ds, properties));
     }
 
     @Override
@@ -51,4 +54,27 @@ public abstract class PoolDataSourceCrea
     }
 
     protected abstract void doDestroy(DataSource dataSource) throws Throwable;
+
+    protected <T> T build(final Class<T> clazz, final Properties properties) {
+        final ObjectRecipe serviceRecipe = new ObjectRecipe(clazz);
+        recipeOptions(serviceRecipe);
+        serviceRecipe.setAllProperties(properties);
+        return (T) serviceRecipe.create();
+    }
+
+    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);
+        recipeOptions(recipe);
+        recipe.setAllProperties(properties);
+        return (T) recipe.create();
+    }
+
+    private void recipeOptions(final ObjectRecipe recipe) {
+        recipe.allow(Option.CASE_INSENSITIVE_PROPERTIES);
+        recipe.allow(Option.IGNORE_MISSING_PROPERTIES);
+    }
 }

Modified: 
openejb/branches/openejb-pool/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/CustomPoolDataSourceTest.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/CustomPoolDataSourceTest.java?rev=1365136&r1=1365135&r2=1365136&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/CustomPoolDataSourceTest.java
 (original)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/CustomPoolDataSourceTest.java
 Tue Jul 24 15:35:02 2012
@@ -56,7 +56,7 @@ public class CustomPoolDataSourceTest {
         }
 
         @Override
-        public DataSource pool(String name, DataSource ds) {
+        public DataSource pool(String name, DataSource ds, Properties 
properties) {
             throw new UnsupportedOperationException();
         }
 

Added: openejb/branches/openejb-pool/server/openejb-bonecp/pom.xml
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/server/openejb-bonecp/pom.xml?rev=1365136&view=auto
==============================================================================
--- openejb/branches/openejb-pool/server/openejb-bonecp/pom.xml (added)
+++ openejb/branches/openejb-pool/server/openejb-bonecp/pom.xml Tue Jul 24 
15:35:02 2012
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+  <parent>
+    <artifactId>server</artifactId>
+    <groupId>org.apache.openejb</groupId>
+    <version>4.1.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>openejb-bonecp</artifactId>
+  <name>OpenEJB :: Server :: BoneCP</name>
+
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.openejb</groupId>
+      <artifactId>openejb-core</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.jolbox</groupId>
+      <artifactId>bonecp</artifactId>
+      <version>0.7.1.RELEASE</version>
+      <exclusions>
+        <exclusion>
+          <groupId>com.google.guava</groupId>
+          <artifactId>guava</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>${slf4j.version}</version>
+      <scope>provided</scope>
+    </dependency>
+  </dependencies>
+</project>

Added: 
openejb/branches/openejb-pool/server/openejb-bonecp/src/main/java/org/apache/openejb/bonecp/BoneCPDataSourceCreator.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/server/openejb-bonecp/src/main/java/org/apache/openejb/bonecp/BoneCPDataSourceCreator.java?rev=1365136&view=auto
==============================================================================
--- 
openejb/branches/openejb-pool/server/openejb-bonecp/src/main/java/org/apache/openejb/bonecp/BoneCPDataSourceCreator.java
 (added)
+++ 
openejb/branches/openejb-pool/server/openejb-bonecp/src/main/java/org/apache/openejb/bonecp/BoneCPDataSourceCreator.java
 Tue Jul 24 15:35:02 2012
@@ -0,0 +1,62 @@
+package org.apache.openejb.bonecp;
+
+import com.jolbox.bonecp.BoneCP;
+import com.jolbox.bonecp.BoneCPConfig;
+import com.jolbox.bonecp.BoneCPDataSource;
+import org.apache.openejb.OpenEJBRuntimeException;
+import org.apache.openejb.resource.jdbc.pool.PoolDataSourceCreator;
+
+import javax.sql.DataSource;
+import java.lang.reflect.Field;
+import java.util.Properties;
+
+public class BoneCPDataSourceCreator extends PoolDataSourceCreator {
+    @Override
+    protected void doDestroy(final DataSource dataSource) throws Throwable {
+        ((BoneCPDataSource) dataSource).close();
+    }
+
+    @Override
+    public DataSource pool(final String name, final DataSource ds, final 
Properties properties) {
+        final BoneCPConfig config;
+        final BoneCP pool;
+        try {
+            config = new BoneCPConfig(properties);
+            pool = new BoneCP(config);
+        } catch (Exception e) {
+            throw new IllegalArgumentException(e);
+        }
+        return new BoneCPDataSourceProvidedPool(pool);
+    }
+
+    @Override
+    public DataSource pool(final String name, final String driver, final 
Properties properties) {
+        final BoneCPDataSource ds = build(BoneCPDataSource.class, properties);
+        if (ds.getDriverClass() == null || ds.getDriverClass().isEmpty()) {
+            ds.setDriverClass(driver);
+        }
+        if (ds.getPoolName() == null || ds.getPoolName().isEmpty()) {
+            ds.setPoolName(name);
+        }
+        return ds;
+    }
+
+    private static final class BoneCPDataSourceProvidedPool extends 
BoneCPDataSource {
+        private static final Field POOL_FIELD;
+        static {
+            try {
+                POOL_FIELD = BoneCPDataSource.class.getDeclaredField("pool");
+            } catch (NoSuchFieldException e) {
+                throw new OpenEJBRuntimeException(e);
+            }
+        }
+
+        public BoneCPDataSourceProvidedPool(final BoneCP pool) {
+            try {
+                POOL_FIELD.set(this, pool);
+            } catch (IllegalAccessException e) {
+                throw new OpenEJBRuntimeException(e);
+            }
+        }
+    }
+}

Modified: openejb/branches/openejb-pool/server/pom.xml
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/server/pom.xml?rev=1365136&r1=1365135&r2=1365136&view=diff
==============================================================================
--- openejb/branches/openejb-pool/server/pom.xml (original)
+++ openejb/branches/openejb-pool/server/pom.xml Tue Jul 24 15:35:02 2012
@@ -44,6 +44,7 @@
     <module>openejb-rest</module>
     <module>openejb-ssh</module>
     <module>openejb-common-cli</module>
+    <module>openejb-bonecp</module>
   </modules>
 </project>
 

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=1365136&r1=1365135&r2=1365136&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 15:35:02 2012
@@ -2,17 +2,28 @@ package org.apache.tomee.jdbc;
 
 import org.apache.openejb.monitoring.LocalMBeanServer;
 import org.apache.openejb.resource.jdbc.pool.PoolDataSourceCreator;
+import org.apache.tomcat.jdbc.pool.ConnectionPool;
 import org.apache.tomcat.jdbc.pool.DataSourceFactory;
+import org.apache.tomcat.jdbc.pool.PoolConfiguration;
+import org.apache.tomcat.jdbc.pool.PoolProperties;
 
 import javax.management.ObjectName;
 import javax.sql.DataSource;
+import java.sql.SQLException;
 import java.util.Map;
 import java.util.Properties;
 
 public class TomEEDataSourceCreator extends PoolDataSourceCreator {
     @Override
-    public DataSource pool(final String name, final DataSource ds) {
-        return new TomcatDbcpDataSource(ds);
+    public DataSource pool(final String name, final DataSource ds, Properties 
properties) {
+        final PoolConfiguration config = build(PoolProperties.class, 
properties);
+        final ConnectionPool pool;
+        try {
+            pool = new ConnectionPool(config);
+        } catch (SQLException e) {
+            throw new IllegalStateException(e);
+        }
+        return build(TomEEDataSource.class, new TomEEDataSource(pool), 
properties);
     }
 
     @Override
@@ -51,16 +62,18 @@ public class TomEEDataSourceCreator exte
 
     @Override
     public void doDestroy(final DataSource object) throws Throwable {
-        if (object instanceof TomcatDbcpDataSource) {
-            ((TomcatDbcpDataSource) object).close();
-        } else {
-            org.apache.tomcat.jdbc.pool.DataSource ds = 
(org.apache.tomcat.jdbc.pool.DataSource) object;
-            ds.close(true);
-            ds.postDeregister();
-        }
+        org.apache.tomcat.jdbc.pool.DataSource ds = 
(org.apache.tomcat.jdbc.pool.DataSource) object;
+        ds.close(true);
+        ds.postDeregister();
     }
 
     private static class PropertiesReader extends DataSourceFactory {
         public static final String[] KEYS = ALL_PROPERTIES;
     }
+
+    public static class TomEEDataSource extends 
org.apache.tomcat.jdbc.pool.DataSource {
+        public TomEEDataSource(final ConnectionPool pool) {
+            this.pool = pool;
+        }
+    }
 }


Reply via email to