You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2013/09/26 10:29:22 UTC

svn commit: r1526415 - in /tomee/tomee/trunk: ./ container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/ container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/ container/openejb-core/src/main/java/org/apache/openejb/...

Author: rmannibucau
Date: Thu Sep 26 08:29:22 2013
New Revision: 1526415

URL: http://svn.apache.org/r1526415
Log:
TOMEE-1049 xa datasource support in default datasource creator

Added:
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/CommonDataSourceAdapter.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/DataSourceXADataSource.java
      - copied, changed from r1526202, tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXADataSource.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/XADataSourceResource.java
    tomee/tomee/trunk/server/openejb-bonecp/src/test/java/org/apache/openejb/bonecp/XABoneCPTest.java
    tomee/tomee/trunk/tomee/tomee-jdbc/src/test/java/org/apache/tomee/jdbc/TomcatXADataSourceTest.java
Modified:
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceHelper.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicDataSource.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicManagedDataSource.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/DbcpDataSourceCreator.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/DbcpManagedDataSource.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/logging/LoggingSqlDataSource.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedDataSource.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXAConnection.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXADataSource.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DataSourceCreator.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/PoolDataSourceCreator.java
    tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/CustomPoolDataSourceTest.java
    tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/XADataSourceTest.java
    tomee/tomee/trunk/pom.xml
    tomee/tomee/trunk/server/openejb-bonecp/src/main/java/org/apache/openejb/bonecp/BoneCPDataSourceCreator.java
    tomee/tomee/trunk/tomee/tomee-jdbc/src/main/java/org/apache/tomee/jdbc/TomEEDataSourceCreator.java

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java?rev=1526415&r1=1526414&r2=1526415&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java Thu Sep 26 08:29:22 2013
@@ -30,6 +30,7 @@ import org.apache.openejb.util.SuperProp
 import org.apache.xbean.recipe.ObjectRecipe;
 import org.apache.xbean.recipe.Option;
 
+import javax.sql.CommonDataSource;
 import javax.sql.DataSource;
 import java.io.IOException;
 import java.lang.reflect.InvocationHandler;
@@ -52,7 +53,7 @@ public class DataSourceFactory {
     public static final String POOL_PROPERTY = "openejb.datasource.pool";
     public static final String DATA_SOURCE_CREATOR_PROP = "DataSourceCreator";
 
-    private static final Map<DataSource, DataSourceCreator> creatorByDataSource = new HashMap<DataSource, DataSourceCreator>();
+    private static final Map<CommonDataSource, DataSourceCreator> creatorByDataSource = new HashMap<CommonDataSource, DataSourceCreator>();
     private static final Map<String, String> KNOWN_CREATORS = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER) {{
         put("dbcp", "org.apache.openejb.resource.jdbc.pool.DefaultDataSourceCreator"); // the original one
         put("dbcp-alternative", "org.apache.openejb.resource.jdbc.dbcp.DbcpDataSourceCreator"); // dbcp for the ds pool only
@@ -60,7 +61,7 @@ public class DataSourceFactory {
         put("bonecp", "org.apache.openejb.bonecp.BoneCPDataSourceCreator"); // bonecp
     }};
 
-    public static DataSource create(final String name,
+    public static CommonDataSource create(final String name,
                                     final boolean configuredManaged,
                                     final Class impl,
                                     final String definition,
@@ -94,7 +95,7 @@ public class DataSourceFactory {
         }
 
         try {
-            DataSource ds;
+            CommonDataSource ds;
             if (createDataSourceFromClass(impl)) { // opposed to "by driver"
                 trimNotSupportedDataSourceProperties(properties);
 
@@ -219,7 +220,7 @@ public class DataSourceFactory {
     }
 
     public static boolean knows(final Object object) {
-        return object instanceof DataSource && creatorByDataSource.containsKey(object);
+        return object instanceof CommonDataSource && creatorByDataSource.containsKey(object);
     }
 
     // TODO: should we get a get and a clear method instead of a single one?

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceHelper.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceHelper.java?rev=1526415&r1=1526414&r2=1526415&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceHelper.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceHelper.java Thu Sep 26 08:29:22 2013
@@ -16,7 +16,7 @@
  */
 package org.apache.openejb.resource.jdbc;
 
-import javax.sql.DataSource;
+import javax.sql.CommonDataSource;
 import java.lang.reflect.Method;
 
 public final class DataSourceHelper {
@@ -24,14 +24,14 @@ public final class DataSourceHelper {
         // no-op
     }
 
-    public static void setUrl(final DataSource dataSource, final String url, final ClassLoader classLoader, final String clazz, final String method) throws Exception {
+    public static void setUrl(final CommonDataSource dataSource, final String url, final ClassLoader classLoader, final String clazz, final String method) throws Exception {
         final Class<?> loadedClass = classLoader.loadClass(clazz);
         final Method setUrl = loadedClass.getMethod(method, String.class);
         setUrl.setAccessible(true);
         setUrl.invoke(dataSource, url);
     }
 
-    public static void setUrl(final DataSource dataSource, final String url) throws Exception {
+    public static void setUrl(final CommonDataSource dataSource, final String url) throws Exception {
         // TODO This is a big whole and we will need to rework this
         if (url.contains("jdbc:derby:")) {
             DataSourceHelper.setUrl(dataSource, url.replace("jdbc:derby:", ""), dataSource.getClass().getClassLoader(), "org.apache.derby.jdbc.EmbeddedDataSource", "setDatabaseName");

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicDataSource.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicDataSource.java?rev=1526415&r1=1526414&r2=1526415&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicDataSource.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicDataSource.java Thu Sep 26 08:29:22 2013
@@ -16,6 +16,10 @@
  */
 package org.apache.openejb.resource.jdbc.dbcp;
 
+import org.apache.commons.dbcp.ConnectionFactory;
+import org.apache.commons.dbcp.DataSourceConnectionFactory;
+import org.apache.commons.dbcp.managed.DataSourceXAConnectionFactory;
+import org.apache.openejb.OpenEJB;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.resource.jdbc.BasicDataSourceUtil;
 import org.apache.openejb.resource.jdbc.IsolationLevels;
@@ -23,7 +27,9 @@ import org.apache.openejb.resource.jdbc.
 import org.apache.openejb.resource.jdbc.plugin.DataSourcePlugin;
 import org.apache.openejb.util.reflection.Reflections;
 
+import javax.sql.CommonDataSource;
 import javax.sql.DataSource;
+import javax.sql.XADataSource;
 import java.io.File;
 import java.sql.SQLException;
 import java.sql.SQLFeatureNotSupportedException;
@@ -47,6 +53,7 @@ public class BasicDataSource extends org
      */
     private String passwordCipher = null;
     private JMXBasicDataSource jmxDs = null;
+    private CommonDataSource delegate = null;
 
     public BasicDataSource() {
         // no-op
@@ -56,6 +63,21 @@ public class BasicDataSource extends org
         setName(name);
     }
 
+    public void setDelegate(final CommonDataSource delegate) {
+        this.delegate = delegate;
+    }
+
+    @Override
+    protected ConnectionFactory createConnectionFactory() throws SQLException {
+        if (delegate != null) {
+            if (XADataSource.class.isInstance(delegate)) {
+                return new DataSourceXAConnectionFactory(OpenEJB.getTransactionManager(), XADataSource.class.cast(delegate), username, password);
+            }
+            return new DataSourceConnectionFactory(DataSource.class.cast(delegate), username, password);
+        }
+        return super.createConnectionFactory();
+    }
+
     private void registerAsMbean(final String name) {
         try {
             jmxDs = new JMXBasicDataSource(name, this);

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicManagedDataSource.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicManagedDataSource.java?rev=1526415&r1=1526414&r2=1526415&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicManagedDataSource.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicManagedDataSource.java Thu Sep 26 08:29:22 2013
@@ -23,18 +23,13 @@ import org.apache.openejb.resource.jdbc.
 import org.apache.openejb.resource.jdbc.IsolationLevels;
 import org.apache.openejb.resource.jdbc.cipher.PasswordCipher;
 import org.apache.openejb.resource.jdbc.plugin.DataSourcePlugin;
+import org.apache.openejb.resource.jdbc.pool.XADataSourceResource;
 
-import javax.naming.InitialContext;
 import javax.sql.DataSource;
-import javax.sql.XADataSource;
 import java.io.File;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
 import java.sql.SQLException;
 import java.sql.SQLFeatureNotSupportedException;
 import java.util.Properties;
-import java.util.concurrent.atomic.AtomicReference;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.logging.Logger;
 
@@ -79,26 +74,8 @@ public class BasicManagedDataSource exte
     }
 
     private void setJndiXaDataSource(final String xaDataSource) {
-        final AtomicReference<XADataSource> ref = new AtomicReference<XADataSource>();
         setXaDataSourceInstance( // proxy cause we don't know if this datasource was created before or not the delegate
-            XADataSource.class.cast(Proxy.newProxyInstance(getDriverClassLoader() != null ? getDriverClassLoader() : Thread.currentThread().getContextClassLoader(),
-            new Class<?>[] { XADataSource.class },
-            new InvocationHandler() {
-                @Override
-                public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
-                    XADataSource instance = ref.get();
-                    if (instance == null) {
-                        synchronized (this) {
-                            instance = ref.get();
-                            if (instance == null) {
-                                instance = XADataSource.class.cast(new InitialContext().lookup("openejb:Resource/" + xaDataSource));
-                                ref.set(instance);
-                            }
-                        }
-                    }
-                    return method.invoke(instance, args);
-                }
-            })));
+            XADataSourceResource.proxy(getDriverClassLoader() != null ? getDriverClassLoader() : Thread.currentThread().getContextClassLoader(), xaDataSource));
 
         if (getTransactionManager() == null) {
             setTransactionManager(OpenEJB.getTransactionManager());

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/DbcpDataSourceCreator.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/DbcpDataSourceCreator.java?rev=1526415&r1=1526414&r2=1526415&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/DbcpDataSourceCreator.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/DbcpDataSourceCreator.java Thu Sep 26 08:29:22 2013
@@ -17,8 +17,11 @@
 package org.apache.openejb.resource.jdbc.dbcp;
 
 import org.apache.openejb.resource.jdbc.pool.PoolDataSourceCreator;
+import org.apache.openejb.resource.jdbc.pool.XADataSourceResource;
 
+import javax.sql.CommonDataSource;
 import javax.sql.DataSource;
+import javax.sql.XADataSource;
 import java.util.Properties;
 
 // just a sample showing how to implement a datasourcecreator
@@ -30,7 +33,7 @@ public class DbcpDataSourceCreator exten
     }
 
     @Override
-    public DataSource pool(final String name, final String driver, final Properties properties) {
+    public CommonDataSource pool(final String name, final String driver, final Properties properties) {
         if (!properties.containsKey("JdbcDriver")) {
             properties.setProperty("driverClassName", driver);
         }
@@ -38,11 +41,20 @@ public class DbcpDataSourceCreator exten
 
         final BasicDataSource ds = build(BasicDataSource.class, properties);
         ds.setDriverClassName(driver);
+
+        final String xa = String.class.cast(properties.remove("XaDataSource"));
+        if (xa != null) {
+            cleanProperty(ds, "xadatasource");
+
+            final XADataSource xaDs = XADataSourceResource.proxy(Thread.currentThread().getContextClassLoader(), xa);
+            ds.setDelegate(xaDs);
+        }
+
         return ds;
     }
 
     @Override
-    protected void doDestroy(DataSource dataSource) throws Throwable {
+    protected void doDestroy(final CommonDataSource dataSource) throws Throwable {
         ((org.apache.commons.dbcp.BasicDataSource) dataSource).close();
     }
 }

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/DbcpManagedDataSource.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/DbcpManagedDataSource.java?rev=1526415&r1=1526414&r2=1526415&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/DbcpManagedDataSource.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/DbcpManagedDataSource.java Thu Sep 26 08:29:22 2013
@@ -24,6 +24,7 @@ import org.apache.commons.dbcp.managed.T
 import org.apache.commons.dbcp.managed.XAConnectionFactory;
 import org.apache.openejb.resource.jdbc.DataSourceHelper;
 
+import javax.sql.CommonDataSource;
 import javax.sql.DataSource;
 import javax.sql.XADataSource;
 import java.lang.reflect.Field;
@@ -31,11 +32,14 @@ import java.sql.SQLException;
 
 public class DbcpManagedDataSource extends BasicManagedDataSource {
 
-    private final DataSource ds;
+    private final CommonDataSource ds;
 
-    public DbcpManagedDataSource(final String name, final DataSource dataSource) {
+    public DbcpManagedDataSource(final String name, final CommonDataSource dataSource) {
         super(name);
         this.ds = dataSource;
+        if (XADataSource.class.isInstance(dataSource)) {
+            setXaDataSourceInstance(XADataSource.class.cast(ds));
+        }
     }
 
     @Override
@@ -49,26 +53,24 @@ public class DbcpManagedDataSource exten
 
     @Override
     protected ConnectionFactory createConnectionFactory() throws SQLException {
-
-        if (this.ds instanceof XADataSource) {
+        if (ds instanceof XADataSource) {
 
             // Create the XAConectionFactory using the XA data source
-            XADataSource xaDataSourceInstance = (XADataSource) this.ds;
+            XADataSource xaDataSourceInstance = (XADataSource) ds;
             XAConnectionFactory xaConnectionFactory = new DataSourceXAConnectionFactory(getTransactionManager(), xaDataSourceInstance, username, password);
             setTransactionRegistry(xaConnectionFactory.getTransactionRegistry());
             return xaConnectionFactory;
 
-        } else {
-
-            // If xa data source is not specified a DriverConnectionFactory is created and wrapped with a LocalXAConnectionFactory
-            ConnectionFactory connectionFactory = new DataSourceConnectionFactory(this.ds, username, password);
-            XAConnectionFactory xaConnectionFactory = new LocalXAConnectionFactory(getTransactionManager(), connectionFactory);
-            setTransactionRegistry(xaConnectionFactory.getTransactionRegistry());
-            return xaConnectionFactory;
         }
+
+        // If xa data source is not specified a DriverConnectionFactory is created and wrapped with a LocalXAConnectionFactory
+        ConnectionFactory connectionFactory = new DataSourceConnectionFactory(DataSource.class.cast(ds), username, password);
+        XAConnectionFactory xaConnectionFactory = new LocalXAConnectionFactory(getTransactionManager(), connectionFactory);
+        setTransactionRegistry(xaConnectionFactory.getTransactionRegistry());
+        return xaConnectionFactory;
     }
 
-    public void setTransactionRegistry(TransactionRegistry registry) {
+    public void setTransactionRegistry(final TransactionRegistry registry) {
         try {
             final Field field = org.apache.commons.dbcp.managed.BasicManagedDataSource.class.getDeclaredField("transactionRegistry");
             field.setAccessible(true);

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/logging/LoggingSqlDataSource.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/logging/LoggingSqlDataSource.java?rev=1526415&r1=1526414&r2=1526415&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/logging/LoggingSqlDataSource.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/logging/LoggingSqlDataSource.java Thu Sep 26 08:29:22 2013
@@ -16,7 +16,7 @@
  */
 package org.apache.openejb.resource.jdbc.logging;
 
-import javax.sql.DataSource;
+import javax.sql.CommonDataSource;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -26,9 +26,9 @@ import java.sql.Connection;
 public class LoggingSqlDataSource implements InvocationHandler {
     private static final Class<?>[] INTERFACES = new Class<?>[]{ Connection.class };
 
-    private DataSource delegate;
+    private CommonDataSource delegate;
 
-    public LoggingSqlDataSource(final DataSource ds) {
+    public LoggingSqlDataSource(final CommonDataSource ds) {
         delegate = ds;
     }
 
@@ -48,7 +48,7 @@ public class LoggingSqlDataSource implem
         return result;
     }
 
-    public DataSource getDelegate() {
+    public CommonDataSource getDelegate() {
         return delegate;
     }
 }

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java?rev=1526415&r1=1526414&r2=1526415&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java Thu Sep 26 08:29:22 2013
@@ -17,8 +17,10 @@
 package org.apache.openejb.resource.jdbc.managed.local;
 
 import org.apache.openejb.OpenEJB;
+import org.apache.openejb.util.LogCategory;
+import org.apache.openejb.util.Logger;
 
-import javax.sql.DataSource;
+import javax.sql.CommonDataSource;
 import javax.transaction.RollbackException;
 import javax.transaction.Status;
 import javax.transaction.Synchronization;
@@ -35,7 +37,9 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 public class ManagedConnection implements InvocationHandler {
-    private static final Map<DataSource, Map<Transaction, Connection>> CONNECTION_BY_TX_BY_DS = new ConcurrentHashMap<DataSource, Map<Transaction, Connection>>();
+    private static final Logger LOGGER = Logger.getInstance(LogCategory.OPENEJB.OPENEJB_RESOURCE_JDBC,ManagedConnection.class);
+
+    private static final Map<Integer, Map<Transaction, Connection>> CONNECTION_BY_TX_BY_DS = new ConcurrentHashMap<Integer, Map<Transaction, Connection>>();
 
     private final TransactionManager transactionManager;
     private final LocalXAResource xaResource;
@@ -45,12 +49,12 @@ public class ManagedConnection implement
 
     private final Map<Transaction, Connection> connectionByTx;
 
-    public ManagedConnection(final DataSource ds, final Connection connection, final TransactionManager txMgr) {
+    public ManagedConnection(final CommonDataSource ds, final Connection connection, final TransactionManager txMgr) {
         delegate = connection;
         transactionManager = txMgr;
         closed = false;
         xaResource = new LocalXAResource(delegate);
-        connectionByTx = CONNECTION_BY_TX_BY_DS.get(ds);
+        connectionByTx = CONNECTION_BY_TX_BY_DS.get(ds.hashCode());
     }
 
     public XAResource getXAResource() throws SQLException {
@@ -113,7 +117,16 @@ public class ManagedConnection implement
 
                         transaction.registerSynchronization(new ClosingSynchronization(delegate, connectionByTx));
 
-                        delegate.setAutoCommit(false);
+                        try {
+                            delegate.setAutoCommit(false);
+                        } catch (final SQLException xae) { // we are alreay in a transaction so this can't be called from a user perspective - some XA DataSource prevents it in their code
+                            final String message = "Can't set auto commit to false cause the XA datasource doesn't support it, this is likely an issue";
+                            if (LOGGER.isDebugEnabled()) { // we don't want to print the exception by default
+                                LOGGER.warning(message, xae);
+                            } else {
+                                LOGGER.warning(message);
+                            }
+                        }
                     }
                 }
 
@@ -177,12 +190,12 @@ public class ManagedConnection implement
         }
     }
 
-    public static void pushDataSource(final DataSource ds) {
-        CONNECTION_BY_TX_BY_DS.put(ds, new ConcurrentHashMap<Transaction, Connection>());
+    public static void pushDataSource(final CommonDataSource ds) {
+        CONNECTION_BY_TX_BY_DS.put(ds.hashCode(), new ConcurrentHashMap<Transaction, Connection>());
     }
 
-    public static void cleanDataSource(final DataSource ds) {
-        final Map<Transaction, Connection> map = CONNECTION_BY_TX_BY_DS.remove(ds);
+    public static void cleanDataSource(final CommonDataSource ds) {
+        final Map<Transaction, Connection> map = CONNECTION_BY_TX_BY_DS.remove(ds.hashCode());
         if (map != null) {
             map.clear();
         }

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedDataSource.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedDataSource.java?rev=1526415&r1=1526414&r2=1526415&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedDataSource.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedDataSource.java Thu Sep 26 08:29:22 2013
@@ -18,6 +18,7 @@ package org.apache.openejb.resource.jdbc
 
 import org.apache.openejb.util.reflection.Reflections;
 
+import javax.sql.CommonDataSource;
 import javax.sql.DataSource;
 import javax.transaction.TransactionManager;
 import java.io.PrintWriter;
@@ -32,13 +33,19 @@ public class ManagedDataSource implement
 
     protected final DataSource delegate;
     protected final TransactionManager transactionManager;
+    protected final int hashCode;
 
-    public ManagedDataSource(final DataSource ds, final TransactionManager txMgr) {
+    protected ManagedDataSource(final DataSource ds, final TransactionManager txMgr, final int hc) {
         delegate = ds;
+        hashCode = hc;
         transactionManager = txMgr;
         ManagedConnection.pushDataSource(this);
     }
 
+    public ManagedDataSource(final DataSource ds, final TransactionManager txMgr) {
+        this(ds, txMgr, ds.hashCode());
+    }
+
     @Override
     public Connection getConnection() throws SQLException {
         return managed(delegate.getConnection());
@@ -95,4 +102,14 @@ public class ManagedDataSource implement
     public void clean() {
         ManagedConnection.cleanDataSource(this);
     }
+
+    @Override
+    public boolean equals(final Object o) {
+        return CommonDataSource.class.isInstance(o) && hashCode == o.hashCode();
+    }
+
+    @Override
+    public int hashCode() {
+        return hashCode;
+    }
 }

Added: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/CommonDataSourceAdapter.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/CommonDataSourceAdapter.java?rev=1526415&view=auto
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/CommonDataSourceAdapter.java (added)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/CommonDataSourceAdapter.java Thu Sep 26 08:29:22 2013
@@ -0,0 +1,24 @@
+package org.apache.openejb.resource.jdbc.managed.xa;
+
+import javax.sql.CommonDataSource;
+import javax.sql.DataSource;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+public class CommonDataSourceAdapter implements InvocationHandler {
+    private final CommonDataSource delegate;
+
+    public CommonDataSourceAdapter(final CommonDataSource ds) {
+        this.delegate = ds;
+    }
+
+    public static DataSource wrap(final CommonDataSource ds) {
+        return DataSource.class.cast(Proxy.newProxyInstance(ds.getClass().getClassLoader(), new Class<?>[] { DataSource.class }, new CommonDataSourceAdapter(ds)));
+    }
+
+    @Override
+    public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
+        return method.invoke(delegate, args); // we suppose missing methods are not called - it is the case thanks to ManagedXADataSource
+    }
+}

Copied: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/DataSourceXADataSource.java (from r1526202, tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXADataSource.java)
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/DataSourceXADataSource.java?p2=tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/DataSourceXADataSource.java&p1=tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXADataSource.java&r1=1526202&r2=1526415&rev=1526415&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXADataSource.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/DataSourceXADataSource.java Thu Sep 26 08:29:22 2013
@@ -18,35 +18,30 @@ package org.apache.openejb.resource.jdbc
 
 import org.apache.openejb.resource.jdbc.managed.local.ManagedDataSource;
 
-import javax.sql.DataSource;
+import javax.sql.CommonDataSource;
 import javax.sql.XAConnection;
 import javax.sql.XADataSource;
 import javax.transaction.TransactionManager;
-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 };
-
+public class DataSourceXADataSource extends ManagedDataSource {
     private final XADataSource xaDataSource;
 
-    public ManagedXADataSource(final DataSource ds, final TransactionManager txMgr) {
-        super(ds, txMgr);
-        xaDataSource = (XADataSource) ds;
+    public DataSourceXADataSource(final CommonDataSource ds, final TransactionManager txMgr) {
+        super(CommonDataSourceAdapter.wrap(ds), txMgr, ds.hashCode());
+        xaDataSource = XADataSource.class.cast(ds);
     }
 
     @Override
     public Connection getConnection() throws SQLException {
-        return managedXA(xaDataSource.getXAConnection().getConnection());
+        final XAConnection xaConnection = xaDataSource.getXAConnection();
+        return xaConnection.getConnection();
     }
 
     @Override
     public Connection getConnection(final String username, final String password) throws SQLException {
-        return managedXA(xaDataSource.getXAConnection(username, password).getConnection());
-    }
-
-    private Connection managedXA(final Connection connection) throws SQLException {
-        return (Connection) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), CONNECTION_CLASS, new ManagedXAConnection(delegate, connection, transactionManager));
+        final XAConnection xaConnection = xaDataSource.getXAConnection(username, password);
+        return xaConnection.getConnection();
     }
 }

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXAConnection.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXAConnection.java?rev=1526415&r1=1526414&r2=1526415&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXAConnection.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXAConnection.java Thu Sep 26 08:29:22 2013
@@ -26,12 +26,15 @@ import java.sql.Connection;
 import java.sql.SQLException;
 
 public class ManagedXAConnection extends ManagedConnection {
-    public ManagedXAConnection(final DataSource ds, final Connection connection, final TransactionManager txMgr) throws SQLException {
+    private final XAConnection xaConnection;
+
+    public ManagedXAConnection(final DataSource ds, final XAConnection xa, final Connection connection, final TransactionManager txMgr) throws SQLException {
         super(ds, connection, txMgr);
+        this.xaConnection = xa;
     }
 
     @Override
     public XAResource getXAResource() throws SQLException {
-        return ((XAConnection) delegate).getXAResource();
+        return xaConnection.getXAResource();
     }
 }

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXADataSource.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXADataSource.java?rev=1526415&r1=1526414&r2=1526415&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXADataSource.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXADataSource.java Thu Sep 26 08:29:22 2013
@@ -18,7 +18,7 @@ package org.apache.openejb.resource.jdbc
 
 import org.apache.openejb.resource.jdbc.managed.local.ManagedDataSource;
 
-import javax.sql.DataSource;
+import javax.sql.CommonDataSource;
 import javax.sql.XAConnection;
 import javax.sql.XADataSource;
 import javax.transaction.TransactionManager;
@@ -27,26 +27,28 @@ import java.sql.Connection;
 import java.sql.SQLException;
 
 public class ManagedXADataSource extends ManagedDataSource {
-    private static final Class<?>[] CONNECTION_CLASS = new Class<?>[] { XAConnection.class };
+    private static final Class<?>[] CONNECTION_CLASS = new Class<?>[] { Connection.class };
 
     private final XADataSource xaDataSource;
 
-    public ManagedXADataSource(final DataSource ds, final TransactionManager txMgr) {
-        super(ds, txMgr);
-        xaDataSource = (XADataSource) ds;
+    public ManagedXADataSource(final CommonDataSource ds, final TransactionManager txMgr) {
+        super(CommonDataSourceAdapter.wrap(ds), txMgr, ds.hashCode());
+        xaDataSource = XADataSource.class.cast(ds);
     }
 
     @Override
     public Connection getConnection() throws SQLException {
-        return managedXA(xaDataSource.getXAConnection().getConnection());
+        final XAConnection xaConnection = xaDataSource.getXAConnection();
+        return managedXA(xaConnection, xaConnection.getConnection());
     }
 
     @Override
     public Connection getConnection(final String username, final String password) throws SQLException {
-        return managedXA(xaDataSource.getXAConnection(username, password).getConnection());
+        final XAConnection xaConnection = xaDataSource.getXAConnection(username, password);
+        return managedXA(xaConnection, xaConnection.getConnection());
     }
 
-    private Connection managedXA(final Connection connection) throws SQLException {
-        return (Connection) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), CONNECTION_CLASS, new ManagedXAConnection(delegate, connection, transactionManager));
+    private Connection managedXA(final XAConnection xaConnection, final Connection connection) throws SQLException {
+        return Connection.class.cast(Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), CONNECTION_CLASS, new ManagedXAConnection(delegate, xaConnection, connection, transactionManager)));
     }
 }

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DataSourceCreator.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DataSourceCreator.java?rev=1526415&r1=1526414&r2=1526415&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DataSourceCreator.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DataSourceCreator.java Thu Sep 26 08:29:22 2013
@@ -19,6 +19,7 @@ package org.apache.openejb.resource.jdbc
 import org.apache.openejb.resource.XAResourceWrapper;
 import org.apache.xbean.recipe.ObjectRecipe;
 
+import javax.sql.CommonDataSource;
 import javax.sql.DataSource;
 import java.util.Properties;
 
@@ -28,12 +29,12 @@ import java.util.Properties;
 // to be able to use DBCP "as before"
 // in fact all managed method are done through the previous abstraction
 public interface DataSourceCreator {
-    DataSource managed(String name, DataSource ds);
+    DataSource managed(String name, CommonDataSource 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);
+    CommonDataSource pool(String name, String driver, Properties properties);
 
     void destroy(Object object) throws Throwable;
     ObjectRecipe clearRecipe(Object object);

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java?rev=1526415&r1=1526414&r2=1526415&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java Thu Sep 26 08:29:22 2013
@@ -23,15 +23,15 @@ import org.apache.openejb.resource.jdbc.
 import org.apache.openejb.resource.jdbc.dbcp.DbcpDataSourceCreator;
 import org.apache.openejb.resource.jdbc.dbcp.DbcpManagedDataSource;
 import org.apache.openejb.resource.jdbc.dbcp.ManagedDataSourceWithRecovery;
-import org.apache.xbean.recipe.ObjectRecipe;
 
+import javax.sql.CommonDataSource;
 import javax.sql.DataSource;
 import java.util.Properties;
 
 // TODO: remove it and replace it with org.apache.openejb.resource.jdbc.dbcp.DbcpDataSourceCreator
 public class DefaultDataSourceCreator extends DbcpDataSourceCreator {
     @Override
-    public DataSource managed(final String name, final DataSource ds) {
+    public DataSource managed(final String name, final CommonDataSource ds) {
         return new DbcpManagedDataSource(name, ds);
     }
 
@@ -75,7 +75,7 @@ public class DefaultDataSourceCreator ex
     }
 
     @Override
-    protected void doDestroy(final DataSource dataSource) throws Throwable {
+    protected void doDestroy(final CommonDataSource dataSource) throws Throwable {
         ((org.apache.commons.dbcp.BasicDataSource) dataSource).close();
     }
 }

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/PoolDataSourceCreator.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/PoolDataSourceCreator.java?rev=1526415&r1=1526414&r2=1526415&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/PoolDataSourceCreator.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/PoolDataSourceCreator.java Thu Sep 26 08:29:22 2013
@@ -25,33 +25,46 @@ import org.apache.openejb.util.Passthrou
 import org.apache.xbean.recipe.ObjectRecipe;
 import org.apache.xbean.recipe.Option;
 
+import javax.sql.CommonDataSource;
 import javax.sql.DataSource;
 import javax.sql.XADataSource;
 import javax.transaction.TransactionManager;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Properties;
 
 public abstract class PoolDataSourceCreator implements DataSourceCreator {
-    private final Map<Object, ObjectRecipe> recipes = new HashMap<Object, ObjectRecipe>();
+    protected final Map<Object, ObjectRecipe> recipes = new HashMap<Object, ObjectRecipe>();
+
+    protected void cleanProperty(final Object ds, final String name) {
+        final Map<String, Object> unsetProperties = recipes.get(ds).getUnsetProperties();
+        final Iterator<Map.Entry<String,Object>> iterator = unsetProperties.entrySet().iterator();
+        while (iterator.hasNext()) {
+            final Map.Entry<String, Object> entry = iterator.next();
+            if (entry.getKey().equalsIgnoreCase(name)) {
+                iterator.remove();
+            }
+        }
+    }
 
     @Override
-    public DataSource managed(final String name, final DataSource ds) {
+    public DataSource managed(final String name, final CommonDataSource ds) {
         final TransactionManager transactionManager = OpenEJB.getTransactionManager();
         if (ds instanceof XADataSource) {
             return new ManagedXADataSource(ds, transactionManager);
         }
-        return new ManagedDataSource(ds, transactionManager);
+        return new ManagedDataSource(DataSource.class.cast(ds), transactionManager);
     }
 
     @Override
     public DataSource poolManagedWithRecovery(final String name, final XAResourceWrapper xaResourceWrapper, final String driver, final Properties properties) {
         final TransactionManager transactionManager = new TransactionManagerWrapper(OpenEJB.getTransactionManager(), name, xaResourceWrapper);
-        final DataSource ds = pool(name, driver, properties);
+        final CommonDataSource ds = pool(name, driver, properties);
         if (ds instanceof XADataSource) {
             return new ManagedXADataSource(ds, transactionManager);
-    }
-        return new ManagedDataSource(ds, transactionManager);
+        }
+        return new ManagedDataSource(DataSource.class.cast(ds), transactionManager);
     }
 
     @Override
@@ -73,7 +86,7 @@ public abstract class PoolDataSourceCrea
         }
     }
 
-    protected abstract void doDestroy(DataSource dataSource) throws Throwable;
+    protected abstract void doDestroy(CommonDataSource dataSource) throws Throwable;
 
     protected <T> T build(final Class<T> clazz, final Properties properties) {
         final ObjectRecipe serviceRecipe = new ObjectRecipe(clazz);

Added: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/XADataSourceResource.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/XADataSourceResource.java?rev=1526415&view=auto
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/XADataSourceResource.java (added)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/XADataSourceResource.java Thu Sep 26 08:29:22 2013
@@ -0,0 +1,48 @@
+package org.apache.openejb.resource.jdbc.pool;
+
+import javax.naming.InitialContext;
+import javax.sql.XADataSource;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.concurrent.atomic.AtomicReference;
+
+public final class XADataSourceResource {
+    private static final Class<?>[] XA_DATASOURCE_API = new Class<?>[]{ XADataSource.class };
+
+    public static XADataSource proxy(final ClassLoader loader, final String xaDataSource) {
+        return javax.sql.XADataSource.class.cast(Proxy.newProxyInstance(loader, XA_DATASOURCE_API, new LazyXADataSourceHandler(xaDataSource)));
+    }
+
+    private static class LazyXADataSourceHandler implements InvocationHandler {
+        private final String name;
+        private final AtomicReference<XADataSource> ref = new AtomicReference<XADataSource>();
+
+        public LazyXADataSourceHandler(final String xaDataSource) {
+            if (xaDataSource.startsWith("openejb:") || xaDataSource.startsWith("java:global")) {
+                name = xaDataSource;
+            } else {
+                name = "openejb:Resource/" + xaDataSource;
+            }
+        }
+
+        @Override
+        public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
+            XADataSource instance = ref.get();
+            if (instance == null) {
+                synchronized (this) {
+                    instance = ref.get();
+                    if (instance == null) {
+                        instance = XADataSource.class.cast(new InitialContext().lookup(name));
+                        ref.set(instance);
+                    }
+                }
+            }
+            return method.invoke(instance, args);
+        }
+    }
+
+    private XADataSourceResource() {
+        // no-op
+    }
+}

Modified: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/CustomPoolDataSourceTest.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/CustomPoolDataSourceTest.java?rev=1526415&r1=1526414&r2=1526415&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/CustomPoolDataSourceTest.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/CustomPoolDataSourceTest.java Thu Sep 26 08:29:22 2013
@@ -25,6 +25,7 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 
 import javax.annotation.Resource;
+import javax.sql.CommonDataSource;
 import javax.sql.DataSource;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
@@ -67,7 +68,7 @@ public class CustomPoolDataSourceTest {
 
     public static class CustomCreator extends PoolDataSourceCreator {
         @Override
-        protected void doDestroy(final DataSource dataSource) throws Throwable {
+        protected void doDestroy(final CommonDataSource dataSource) throws Throwable {
             throw new UnsupportedOperationException();
         }
 
@@ -77,7 +78,7 @@ public class CustomPoolDataSourceTest {
         }
 
         @Override
-        public DataSource pool(final String name, final String driver, final Properties properties) {
+        public CommonDataSource pool(final String name, final String driver, final Properties properties) {
             return (CustomDataSource) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
                     new Class<?>[] { CustomDataSource.class },
                     new InvocationHandler() {

Modified: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/XADataSourceTest.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/XADataSourceTest.java?rev=1526415&r1=1526414&r2=1526415&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/XADataSourceTest.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/XADataSourceTest.java Thu Sep 26 08:29:22 2013
@@ -22,6 +22,8 @@ import org.apache.openejb.jee.jpa.unit.P
 import org.apache.openejb.jee.jpa.unit.PersistenceUnit;
 import org.apache.openejb.junit.ApplicationComposer;
 import org.apache.openejb.loader.Files;
+import org.apache.openejb.resource.jdbc.dbcp.DbcpDataSourceCreator;
+import org.apache.openejb.resource.jdbc.pool.DataSourceCreator;
 import org.apache.openejb.testing.Configuration;
 import org.apache.openejb.testing.Module;
 import org.hsqldb.jdbc.pool.JDBCXADataSource;
@@ -67,28 +69,35 @@ public class XADataSourceTest {
         }
 
         final Properties p = new Properties();
-        // p.put(DataSourceCreator.class.getName(), DbcpDataSourceCreator.class.getName()); // not xa compatible
+        p.put(DataSourceCreator.class.getName(), DbcpDataSourceCreator.class.getName()); // default dbcp pool supports xaDataSource config, not our proxy layer
 
         p.put("txMgr", "new://TransactionManager?type=TransactionManager");
         p.put("txMgr.txRecovery", "true");
         p.put("txMgr.logFileDir", "target/test/xa/howl");
 
-        /*
+        // real XA datasources
         p.put("xa", "new://Resource?class-name=" + JDBCXADataSource.class.getName());
         p.put("xa.url", "jdbc:hsqldb:mem:xa");
         p.put("xa.user", "sa");
         p.put("xa.password", "");
         p.put("xa.SkipImplicitAttributes", "true"); // conflict with connectionProperties
-        */
 
+        p.put("xa2", "new://Resource?class-name=" + JDBCXADataSource.class.getName());
+        p.put("xa2.url", "jdbc:hsqldb:mem:xa2");
+        p.put("xa2.user", "sa");
+        p.put("xa2.password", "");
+        p.put("xa2.SkipImplicitAttributes", "true");
+
+        // pooled "XA" datasources
         p.put("xadb", "new://Resource?type=DataSource");
-        p.put("xadb.JdbcDriver", JDBCXADataSource.class.getName());
-        // p.put("xadb.xaDataSource", "xa");// to be xa
-        p.put("xadb.JdbcUrl", "jdbc:hsqldb:mem:xa");
-        p.put("xadb.UserName", "sa");
-        p.put("xadb.Password", "");
+        p.put("xadb.xaDataSource", "xa");// to be xa
         p.put("xadb.JtaManaged", "true");
 
+        p.put("xadb2", "new://Resource?type=DataSource");
+        p.put("xadb2.xaDataSource", "xa2");// to be xa
+        p.put("xadb2.JtaManaged", "true");
+
+        // non jta datasources
         p.put("xadbn", "new://Resource?type=DataSource");
         p.put("xadbn.JdbcDriver", JDBCXADataSource.class.getName());
         p.put("xadbn.JdbcUrl", "jdbc:hsqldb:mem:xa");
@@ -96,19 +105,13 @@ public class XADataSourceTest {
         p.put("xadbn.Password", "");
         p.put("xadbn.JtaManaged", "false");
 
-        p.put("xadb2", "new://Resource?type=DataSource");
-        p.put("xadb2.JdbcDriver", JDBCXADataSource.class.getName());
-        p.put("xadb2.JdbcUrl", "jdbc:hsqldb:mem:xa2");
-        p.put("xadb2.UserName", "sa");
-        p.put("xadb2.Password", "");
-        p.put("xadb2.JtaManaged", "true");
-
         p.put("xadbn2", "new://Resource?type=DataSource");
         p.put("xadbn2.JdbcDriver", JDBCXADataSource.class.getName());
         p.put("xadbn2.JdbcUrl", "jdbc:hsqldb:mem:xa2");
         p.put("xadbn2.UserName", "sa");
         p.put("xadbn2.Password", "");
         p.put("xadbn2.JtaManaged", "false");
+
         return p;
     }
 

Modified: tomee/tomee/trunk/pom.xml
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/pom.xml?rev=1526415&r1=1526414&r2=1526415&view=diff
==============================================================================
--- tomee/tomee/trunk/pom.xml (original)
+++ tomee/tomee/trunk/pom.xml Thu Sep 26 08:29:22 2013
@@ -155,7 +155,7 @@
     <slf4j.version>1.7.5</slf4j.version>
     <log4j.version>1.2.17</log4j.version>
     <osgi.framework.version>4.2.0</osgi.framework.version>
-    <hsqldb.version>2.2.9</hsqldb.version>
+    <hsqldb.version>2.3.0</hsqldb.version>
 
     <!-- Apache Commons -->
     <commons-beanutils.version>1.8.3</commons-beanutils.version>

Modified: tomee/tomee/trunk/server/openejb-bonecp/src/main/java/org/apache/openejb/bonecp/BoneCPDataSourceCreator.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-bonecp/src/main/java/org/apache/openejb/bonecp/BoneCPDataSourceCreator.java?rev=1526415&r1=1526414&r2=1526415&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-bonecp/src/main/java/org/apache/openejb/bonecp/BoneCPDataSourceCreator.java (original)
+++ tomee/tomee/trunk/server/openejb-bonecp/src/main/java/org/apache/openejb/bonecp/BoneCPDataSourceCreator.java Thu Sep 26 08:29:22 2013
@@ -19,14 +19,19 @@ package org.apache.openejb.bonecp;
 import com.jolbox.bonecp.BoneCP;
 import com.jolbox.bonecp.BoneCPConfig;
 import com.jolbox.bonecp.BoneCPDataSource;
+import org.apache.openejb.OpenEJB;
 import org.apache.openejb.OpenEJBRuntimeException;
 import org.apache.openejb.resource.jdbc.BasicDataSourceUtil;
+import org.apache.openejb.resource.jdbc.managed.xa.ManagedXADataSource;
 import org.apache.openejb.resource.jdbc.plugin.DataSourcePlugin;
 import org.apache.openejb.resource.jdbc.pool.PoolDataSourceCreator;
+import org.apache.openejb.resource.jdbc.pool.XADataSourceResource;
 import org.apache.openejb.util.Duration;
 import org.apache.openejb.util.Strings;
 
+import javax.sql.CommonDataSource;
 import javax.sql.DataSource;
+import javax.sql.XADataSource;
 import java.lang.reflect.Field;
 import java.sql.SQLException;
 import java.sql.SQLFeatureNotSupportedException;
@@ -37,7 +42,7 @@ import java.util.logging.Logger;
 
 public class BoneCPDataSourceCreator extends PoolDataSourceCreator {
     @Override
-    protected void doDestroy(final DataSource dataSource) throws Throwable {
+    protected void doDestroy(final CommonDataSource dataSource) throws Throwable {
         ((BoneCPDataSource) dataSource).close();
     }
 
@@ -105,7 +110,7 @@ public class BoneCPDataSourceCreator ext
     }
 
     @Override
-    public DataSource pool(final String name, final String driver, final Properties properties) {
+    public CommonDataSource pool(final String name, final String driver, final Properties properties) {
         // bonecp already have a kind of ObjectRecipe so simply giving it the values
         final Properties props = new Properties();
         props.put("properties", prefixedProps(properties));
@@ -117,6 +122,15 @@ public class BoneCPDataSourceCreator ext
         if (ds.getPoolName() == null || ds.getPoolName().isEmpty()) {
             ds.setPoolName(name);
         }
+
+        final String xa = String.class.cast(properties.remove("XaDataSource"));
+        if (xa != null) {
+            cleanProperty(ds, "xadatasource");
+
+            final XADataSource xaDs = XADataSourceResource.proxy(Thread.currentThread().getContextClassLoader(), xa);
+            ds.setDatasourceBean(new ManagedXADataSource(xaDs, OpenEJB.getTransactionManager()));
+        }
+
         return ds;
     }
 

Added: tomee/tomee/trunk/server/openejb-bonecp/src/test/java/org/apache/openejb/bonecp/XABoneCPTest.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-bonecp/src/test/java/org/apache/openejb/bonecp/XABoneCPTest.java?rev=1526415&view=auto
==============================================================================
--- tomee/tomee/trunk/server/openejb-bonecp/src/test/java/org/apache/openejb/bonecp/XABoneCPTest.java (added)
+++ tomee/tomee/trunk/server/openejb-bonecp/src/test/java/org/apache/openejb/bonecp/XABoneCPTest.java Thu Sep 26 08:29:22 2013
@@ -0,0 +1,81 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.bonecp;
+
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.testing.Configuration;
+import org.apache.openejb.testing.Module;
+import org.apache.openejb.testng.PropertiesBuilder;
+import org.hsqldb.jdbc.pool.JDBCXAConnectionWrapper;
+import org.hsqldb.jdbc.pool.JDBCXADataSource;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Properties;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+
+@RunWith(ApplicationComposer.class)
+public class XABoneCPTest {
+    @Resource(name = "xadb")
+    private DataSource ds;
+
+    @Module
+    public EjbJar mandatory() {
+        return new EjbJar();
+    }
+
+    @Configuration
+    public Properties props() {
+        return new PropertiesBuilder()
+            .p("openejb.jdbc.datasource-creator", BoneCPDataSourceCreator.class.getName())
+
+            .p("txMgr", "new://TransactionManager?type=TransactionManager")
+            .p("txMgr.txRecovery", "true")
+            .p("txMgr.logFileDir", "target/test/xa/howl")
+
+            // real XA datasources
+            .p("xa", "new://Resource?class-name=" + JDBCXADataSource.class.getName())
+            .p("xa.url", "jdbc:hsqldb:mem:tomcat-xa")
+            .p("xa.user", "sa")
+            .p("xa.password", "")
+            .p("xa.SkipImplicitAttributes", "true")
+
+            .p("xadb", "new://Resource?type=DataSource")
+            .p("xadb.xaDataSource", "xa")
+            .p("xadb.JtaManaged", "true")
+
+            .build();
+    }
+
+    @Test
+    public void check() throws SQLException {
+        assertNotNull(ds);
+        final Connection c = ds.getConnection();
+        assertNotNull(c);
+        assertThat(c.getMetaData().getConnection(), instanceOf(JDBCXAConnectionWrapper.class));
+        c.close();
+
+    }
+}

Modified: tomee/tomee/trunk/tomee/tomee-jdbc/src/main/java/org/apache/tomee/jdbc/TomEEDataSourceCreator.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-jdbc/src/main/java/org/apache/tomee/jdbc/TomEEDataSourceCreator.java?rev=1526415&r1=1526414&r2=1526415&view=diff
==============================================================================
--- tomee/tomee/trunk/tomee/tomee-jdbc/src/main/java/org/apache/tomee/jdbc/TomEEDataSourceCreator.java (original)
+++ tomee/tomee/trunk/tomee/tomee-jdbc/src/main/java/org/apache/tomee/jdbc/TomEEDataSourceCreator.java Thu Sep 26 08:29:22 2013
@@ -24,6 +24,7 @@ import org.apache.openejb.resource.jdbc.
 import org.apache.openejb.resource.jdbc.cipher.PasswordCipher;
 import org.apache.openejb.resource.jdbc.plugin.DataSourcePlugin;
 import org.apache.openejb.resource.jdbc.pool.PoolDataSourceCreator;
+import org.apache.openejb.resource.jdbc.pool.XADataSourceResource;
 import org.apache.openejb.util.Duration;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
@@ -36,7 +37,9 @@ import org.apache.tomcat.jdbc.pool.PoolP
 import org.apache.tomcat.jdbc.pool.PooledConnection;
 
 import javax.management.ObjectName;
+import javax.sql.CommonDataSource;
 import javax.sql.DataSource;
+import javax.sql.XADataSource;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
@@ -67,7 +70,7 @@ public class TomEEDataSourceCreator exte
     }
 
     @Override
-    public DataSource pool(final String name, final String driver, final Properties properties) {
+    public CommonDataSource pool(final String name, final String driver, final Properties properties) {
         final Properties converted = new Properties();
         converted.setProperty("name", name);
 
@@ -76,7 +79,17 @@ public class TomEEDataSourceCreator exte
 
         updateProperties(prop, converted, driver);
         final PoolConfiguration config = build(PoolProperties.class, converted);
-        return build(TomEEDataSource.class, new TomEEDataSource(config, name), converted);
+        final TomEEDataSource ds = build(TomEEDataSource.class, new TomEEDataSource(config, name), converted);
+
+        final String xa = String.class.cast(properties.remove("XaDataSource"));
+        if (xa != null) {
+            cleanProperty(ds, "xadatasource");
+
+            final XADataSource xaDs = XADataSourceResource.proxy(Thread.currentThread().getContextClassLoader(), xa);
+            ds.setDataSource(xaDs);
+        }
+
+        return ds;
     }
 
     private void updateProperties(final SuperProperties properties, final Properties converted, final String driver) {
@@ -302,9 +315,13 @@ public class TomEEDataSourceCreator exte
 
         @Override
         public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
-            if (!(method.getName().startsWith("set") && args != null && args.length == 1 && Void.TYPE.equals(method.getReturnType()))) {
+            final String name = method.getName();
+            if (!(name.startsWith("set") && args != null && args.length == 1 && Void.TYPE.equals(method.getReturnType()))) {
                 return method.invoke(delegate, args);
             }
+            if (name.equals("setDataSource")) {
+                delegate.setDataSource(args[0]);
+            }
             return null;
         }
     }

Added: tomee/tomee/trunk/tomee/tomee-jdbc/src/test/java/org/apache/tomee/jdbc/TomcatXADataSourceTest.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-jdbc/src/test/java/org/apache/tomee/jdbc/TomcatXADataSourceTest.java?rev=1526415&view=auto
==============================================================================
--- tomee/tomee/trunk/tomee/tomee-jdbc/src/test/java/org/apache/tomee/jdbc/TomcatXADataSourceTest.java (added)
+++ tomee/tomee/trunk/tomee/tomee-jdbc/src/test/java/org/apache/tomee/jdbc/TomcatXADataSourceTest.java Thu Sep 26 08:29:22 2013
@@ -0,0 +1,81 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.tomee.jdbc;
+
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.testing.Configuration;
+import org.apache.openejb.testing.Module;
+import org.apache.openejb.testng.PropertiesBuilder;
+import org.hsqldb.jdbc.pool.JDBCXAConnectionWrapper;
+import org.hsqldb.jdbc.pool.JDBCXADataSource;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Properties;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+
+@RunWith(ApplicationComposer.class)
+public class TomcatXADataSourceTest {
+    @Resource(name = "xadb")
+    private DataSource ds;
+
+    @Module
+    public EjbJar mandatory() {
+        return new EjbJar();
+    }
+
+    @Configuration
+    public Properties props() {
+        return new PropertiesBuilder()
+            .p("openejb.jdbc.datasource-creator", TomEEDataSourceCreator.class.getName())
+
+            .p("txMgr", "new://TransactionManager?type=TransactionManager")
+            .p("txMgr.txRecovery", "true")
+            .p("txMgr.logFileDir", "target/test/xa/howl")
+
+                // real XA datasources
+            .p("xa", "new://Resource?class-name=" + JDBCXADataSource.class.getName())
+            .p("xa.url", "jdbc:hsqldb:mem:tomcat-xa")
+            .p("xa.user", "sa")
+            .p("xa.password", "")
+            .p("xa.SkipImplicitAttributes", "true")
+
+            .p("xadb", "new://Resource?type=DataSource")
+            .p("xadb.xaDataSource", "xa")
+            .p("xadb.JtaManaged", "true")
+
+            .build();
+    }
+
+    @Test
+    public void check() throws SQLException {
+        assertNotNull(ds);
+        final Connection c = ds.getConnection();
+        assertNotNull(c);
+        assertThat(c.getMetaData().getConnection(), instanceOf(JDBCXAConnectionWrapper.class));
+        c.close();
+
+    }
+}