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", "");