Author: rmannibucau
Date: Wed Sep 25 16:00:02 2013
New Revision: 1526213

URL: http://svn.apache.org/r1526213
Log:
completing xa test (hsqldb doesnt support it) + adding a way to get a xa 
datasource in our dbcp datasources from our resources

Modified:
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.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/test/java/org/apache/openejb/resource/jdbc/XADataSourceTest.java

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1526213&r1=1526212&r2=1526213&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 Wed Sep 25 16:00:02 2013
@@ -2071,8 +2071,12 @@ public class Assembler extends Assembler
 
     public void createResource(final ResourceInfo serviceInfo) throws 
OpenEJBException {
         final ObjectRecipe serviceRecipe = createRecipe(serviceInfo);
-        serviceRecipe.setProperty("transactionManager", transactionManager);
-        serviceRecipe.setProperty("ServiceId", serviceInfo.id);
+        if 
("false".equalsIgnoreCase(serviceInfo.properties.getProperty("SkipImplicitAttributes",
 "false"))) {
+            serviceRecipe.setProperty("transactionManager", 
transactionManager);
+            serviceRecipe.setProperty("ServiceId", serviceInfo.id);
+        }
+        serviceInfo.properties.remove("SkipImplicitAttributes");
+
         serviceRecipe.setProperty("properties", new UnsetPropertiesRecipe());
 
         final Properties props = 
PropertyPlaceHolderHelper.holds(serviceInfo.properties);
@@ -2501,6 +2505,12 @@ public class Assembler extends Assembler
     private static void logUnusedProperties(final Map<String, Object> 
unsetProperties, final ServiceInfo info) {
         for (final String property : unsetProperties.keySet()) {
             //TODO: DMB: Make more robust later
+            if (property.equalsIgnoreCase("Definition")) {
+                return;
+            }
+            if (property.equalsIgnoreCase("SkipImplicitAttributes")) {
+                return;
+            }
             if (property.equalsIgnoreCase("JndiName")) {
                 return;
             }

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=1526213&r1=1526212&r2=1526213&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
 Wed Sep 25 16:00:02 2013
@@ -16,17 +16,25 @@
  */
 package org.apache.openejb.resource.jdbc.dbcp;
 
+import org.apache.commons.dbcp.ConnectionFactory;
+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;
 import org.apache.openejb.resource.jdbc.cipher.PasswordCipher;
 import org.apache.openejb.resource.jdbc.plugin.DataSourcePlugin;
 
+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;
 
@@ -51,6 +59,52 @@ public class BasicManagedDataSource exte
         registerAsMbean(name);
     }
 
+    @Override
+    protected ConnectionFactory createConnectionFactory() throws SQLException {
+        final String xaDataSource = getXADataSource();
+        if (xaDataSource != null & getXaDataSourceInstance() == null) {
+            try {
+                try {
+                    
Thread.currentThread().getContextClassLoader().loadClass(xaDataSource);
+                } catch (final ClassNotFoundException cnfe) {
+                    setJndiXaDataSource(xaDataSource);
+                } catch (final NoClassDefFoundError ncdfe) {
+                    setJndiXaDataSource(xaDataSource);
+                }
+            } catch (final Throwable th) {
+                // no-op
+            }
+        }
+        return super.createConnectionFactory();
+    }
+
+    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);
+                }
+            })));
+
+        if (getTransactionManager() == null) {
+            setTransactionManager(OpenEJB.getTransactionManager());
+        }
+    }
+
     private void registerAsMbean(final String name) {
         try {
             jmxDs = new JMXBasicDataSource(name, this);

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=1526213&r1=1526212&r2=1526213&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
 Wed Sep 25 16:00:02 2013
@@ -22,8 +22,6 @@ 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;
@@ -69,14 +67,23 @@ public class XADataSourceTest {
         }
 
         final Properties p = new Properties();
-        p.put(DataSourceCreator.class.getName(), 
DbcpDataSourceCreator.class.getName());
+        // p.put(DataSourceCreator.class.getName(), 
DbcpDataSourceCreator.class.getName()); // not xa compatible
 
         p.put("txMgr", "new://TransactionManager?type=TransactionManager");
         p.put("txMgr.txRecovery", "true");
         p.put("txMgr.logFileDir", "target/test/xa/howl");
 
+        /*
+        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("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", "");


Reply via email to