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