Author: rmannibucau
Date: Tue Jul 24 10:20:20 2012
New Revision: 1364961

URL: http://svn.apache.org/viewvc?rev=1364961&view=rev
Log:
ability to use a custom datasourcecreator by datasource

Added:
    
openejb/branches/openejb-pool/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/CustomPoolDataSourceTest.java
Modified:
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.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=1364961&r1=1364960&r2=1364961&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 10:20:20 2012
@@ -20,6 +20,8 @@ import org.apache.openejb.loader.IO;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.resource.XAResourceWrapper;
 import org.apache.openejb.resource.jdbc.pool.DataSourceCreator;
+import org.apache.openejb.util.LogCategory;
+import org.apache.openejb.util.Logger;
 import org.apache.xbean.recipe.ObjectRecipe;
 import org.apache.xbean.recipe.Option;
 
@@ -31,11 +33,14 @@ import java.util.Properties;
  * @version $Rev$ $Date$
  */
 public class DataSourceFactory {
+    private static final Logger LOGGER = 
Logger.getInstance(LogCategory.OPENEJB, DataSourceFactory.class);
+
     public static final String POOL_PROPERTY = "openejb.datasource.pool";
 
     public static DataSource create(final String name, final boolean managed, 
final Class impl, final String definition) throws IllegalAccessException, 
InstantiationException, IOException {
         final Properties properties = asProperties(definition);
-        final DataSourceCreator creator = 
SystemInstance.get().getComponent(DataSourceCreator.class);
+        final DataSourceCreator creator = creator(properties);
+
 
         if (createDataSourceFromClass(impl)) { // opposed to "by driver"
             trimNotSupportedDataSourceProperties(properties);
@@ -75,6 +80,19 @@ public class DataSourceFactory {
         }
     }
 
+    private static DataSourceCreator creator(final Properties properties) {
+        final DataSourceCreator defaultCreator = 
SystemInstance.get().getComponent(DataSourceCreator.class);
+        Object creatorName = properties.remove("DataSourceCreator");
+        if (creatorName != null && creatorName instanceof String && 
!creatorName.equals(defaultCreator.getClass().getName())) {
+            try {
+                return (DataSourceCreator) 
Thread.currentThread().getContextClassLoader().loadClass((String) 
creatorName).newInstance();
+            } catch (Throwable e) {
+                LOGGER.error("can't create '" + creatorName + "', the default 
one will be used: " + defaultCreator, e);
+            }
+        }
+        return defaultCreator;
+    }
+
     private static boolean createDataSourceFromClass(final Class<?> impl) {
         return DataSource.class.isAssignableFrom(impl) && 
!SystemInstance.get().getOptions().get("org.apache.openejb.resource.jdbc.hot.deploy",
 false);
     }

Added: 
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=1364961&view=auto
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/CustomPoolDataSourceTest.java
 (added)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/CustomPoolDataSourceTest.java
 Tue Jul 24 10:20:20 2012
@@ -0,0 +1,105 @@
+package org.apache.openejb.resource.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.apache.openejb.resource.jdbc.pool.DbcpDataSourceCreator;
+import org.apache.openejb.resource.jdbc.pool.PoolDataSourceCreator;
+import org.junit.After;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.annotation.Resource;
+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.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+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.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+@RunWith(ApplicationComposer.class)
+public class CustomPoolDataSourceTest {
+    @Resource
+    private DataSource ds;
+
+
+    @Configuration
+    public Properties config() {
+        final Properties p = new Properties();
+        p.put("managed", "new://Resource?type=DataSource");
+        p.put("managed.DataSourceCreator", CustomCreator.class.getName());
+        p.put("managed.JtaManaged", "false");
+        p.put("managed.Name", "custom");
+        return p;
+    }
+
+    @Module
+    public EjbJar app() throws Exception {
+        return new EjbJar();
+    }
+
+    @Test
+    public void checkCustomCreatorIsUsed() throws SQLException {
+        assertNotNull(ds);
+        assertTrue(Proxy.isProxyClass(ds.getClass()));
+        assertTrue(ds instanceof CustomDataSource);
+        assertEquals("custom", ((CustomDataSource) ds).name());
+    }
+
+    public static class CustomCreator extends PoolDataSourceCreator {
+        @Override
+        protected boolean hasReallyCreated(final Object object) {
+            return false; // no need
+        }
+
+        @Override
+        protected void doDestroy(final DataSource dataSource) throws Throwable 
{
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public DataSource pool(String name, DataSource ds) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public DataSource pool(final String name, final String driver, final 
Properties properties) {
+            return (CustomDataSource) 
Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
+                    new Class<?>[] { CustomDataSource.class },
+                    new InvocationHandler() {
+                        @Override
+                        public Object invoke(Object proxy, Method method, 
Object[] args) throws Throwable {
+                            if (method.getName().equals("name")) {
+                                return properties.getProperty("Name");
+                            }
+                            return null;
+                        }
+                    });
+        }
+    }
+
+    public static interface CustomDataSource extends DataSource {
+        String name();
+    }
+}


Reply via email to