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/25 18:00:03 UTC
svn commit: r1526213 - in /tomee/tomee/trunk/container/openejb-core/src:
main/java/org/apache/openejb/assembler/classic/
main/java/org/apache/openejb/resource/jdbc/dbcp/
test/java/org/apache/openejb/resource/jdbc/
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", "");