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();
+ }
+}