Author: rmannibucau
Date: Sun Jul 22 21:48:32 2012
New Revision: 1364440

URL: http://svn.apache.org/viewvc?rev=1364440&view=rev
Log:
preparing stuff for managed datasource, no real feature in this commit

Added:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedConnection.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedDataSource.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedXAConnection.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedXADataSource.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/LocalXAResource.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DbcpDataSourceCreator.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/PoolDataSourceCreator.java
    
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/ManagedDataSourceTest.java
Modified:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicDataSource.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/ManagedDataSourceWithRecovery.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DataSourceCreator.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1364440&r1=1364439&r2=1364440&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 Sun Jul 22 21:48:32 2012
@@ -1577,7 +1577,7 @@ public class Assembler extends Assembler
         serviceRecipe.setProperty("transactionManager", transactionManager);
         serviceRecipe.setProperty("ServiceId", serviceInfo.id);
         serviceRecipe.setProperty("properties", new UnsetPropertiesRecipe());
-        if (!serviceRecipe.getProperties().containsKey("Definition")) {
+        if (!serviceRecipe.getProperties().containsKey("Definition") || 
((String) serviceRecipe.getProperty("Definition")).isEmpty()) {
             serviceRecipe.setProperty("Definition", 
PropertiesHelper.propertiesToString(PropertyPlaceHolderHelper.holds(serviceInfo.properties)));
         }
 

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java?rev=1364440&r1=1364439&r2=1364440&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
 Sun Jul 22 21:48:32 2012
@@ -145,7 +145,19 @@ public class ConfigurationFactory implem
 
         final Options options = SystemInstance.get().getOptions();
         if (SystemInstance.get().getComponent(DataSourceCreator.class) == 
null) {
-            SystemInstance.get().setComponent(DataSourceCreator.class, new 
DefaultDataSourceCreator());
+            final String creator = 
SystemInstance.get().getOptions().get("openejb.jdbc.datasource-creator", 
(String) null);
+            if (creator == null) {
+                SystemInstance.get().setComponent(DataSourceCreator.class, new 
DefaultDataSourceCreator());
+            } else {
+                try {
+                    SystemInstance.get().setComponent(DataSourceCreator.class,
+                            (DataSourceCreator) 
Thread.currentThread().getContextClassLoader().loadClass(creator)
+                                    .newInstance());
+                } catch (Exception e) {
+                    logger.error("can't load " + creator + " will use the 
default creator", e);
+                    SystemInstance.get().setComponent(DataSourceCreator.class, 
new DefaultDataSourceCreator());
+                }
+            }
         }
 
         final Chain chain = new Chain();

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java?rev=1364440&r1=1364439&r2=1364440&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java
 Sun Jul 22 21:48:32 2012
@@ -73,7 +73,7 @@ public class DataSourceFactory {
                     ds = creator.poolManaged(name, impl.getName(), properties);
                 }
             } else {
-                ds = creator.pool(name, impl.getName());
+                ds = creator.pool(name, impl.getName(), properties);
             }
         }
 

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicDataSource.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicDataSource.java?rev=1364440&r1=1364439&r2=1364440&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicDataSource.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicDataSource.java
 Sun Jul 22 21:48:32 2012
@@ -48,8 +48,12 @@ public class BasicDataSource extends org
     private String passwordCipher = null;
     private JMXBasicDataSource jmxDs = null;
 
+    public BasicDataSource() {
+        // no-op
+    }
+
     public BasicDataSource(final String name) {
-        registerAsMbean(name);
+        setName(name);
     }
 
     private void registerAsMbean(final String name) {
@@ -265,4 +269,7 @@ public class BasicDataSource extends org
         }
     }
 
+    public void setName(final String name) {
+        registerAsMbean(name);
+    }
 }

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/ManagedDataSourceWithRecovery.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/ManagedDataSourceWithRecovery.java?rev=1364440&r1=1364439&r2=1364440&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/ManagedDataSourceWithRecovery.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/ManagedDataSourceWithRecovery.java
 Sun Jul 22 21:48:32 2012
@@ -16,6 +16,8 @@
  */
 package org.apache.openejb.resource.jdbc.dbcp;
 
+import org.apache.openejb.resource.XAResourceWrapper;
+
 import javax.transaction.HeuristicMixedException;
 import javax.transaction.HeuristicRollbackException;
 import javax.transaction.InvalidTransactionException;
@@ -27,9 +29,6 @@ import javax.transaction.Transaction;
 import javax.transaction.TransactionManager;
 import javax.transaction.xa.XAResource;
 
-import org.apache.openejb.resource.XAResourceWrapper;
-import org.apache.openejb.resource.jdbc.dbcp.BasicManagedDataSource;
-
 public class ManagedDataSourceWithRecovery extends BasicManagedDataSource {
     private TransactionManager suppliedTransactionManager;
     private final XAResourceWrapper xaResourceWrapper;

Added: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedConnection.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedConnection.java?rev=1364440&view=auto
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedConnection.java
 (added)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedConnection.java
 Sun Jul 22 21:48:32 2012
@@ -0,0 +1,281 @@
+package org.apache.openejb.resource.jdbc.managed;
+
+import org.apache.openejb.resource.jdbc.managed.local.LocalXAResource;
+
+import javax.transaction.xa.XAResource;
+import java.sql.Array;
+import java.sql.Blob;
+import java.sql.CallableStatement;
+import java.sql.Clob;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.NClob;
+import java.sql.PreparedStatement;
+import java.sql.SQLClientInfoException;
+import java.sql.SQLException;
+import java.sql.SQLWarning;
+import java.sql.SQLXML;
+import java.sql.Savepoint;
+import java.sql.Statement;
+import java.sql.Struct;
+import java.util.Map;
+import java.util.Properties;
+
+public class ManagedConnection implements Connection {
+    protected final Connection delegate;
+    protected final XAResource xaResource;
+
+    protected ManagedConnection(final Connection connection, final XAResource 
resource) {
+        delegate = connection;
+        xaResource = resource;
+    }
+
+    public ManagedConnection(final Connection connection) {
+        this(connection, new LocalXAResource(connection));
+    }
+
+    @Override
+    public Statement createStatement() throws SQLException {
+        return delegate.createStatement();
+    }
+
+    @Override
+    public PreparedStatement prepareStatement(final String sql) throws 
SQLException {
+        return delegate.prepareStatement(sql);
+    }
+
+    @Override
+    public CallableStatement prepareCall(final String sql) throws SQLException 
{
+        return delegate.prepareCall(sql);
+    }
+
+    @Override
+    public String nativeSQL(final String sql) throws SQLException {
+        return delegate.nativeSQL(sql);
+    }
+
+    @Override
+    public void setAutoCommit(boolean autoCommit) throws SQLException {
+        delegate.setAutoCommit(autoCommit);
+    }
+
+    @Override
+    public boolean getAutoCommit() throws SQLException {
+        return delegate.getAutoCommit();
+    }
+
+    @Override
+    public void commit() throws SQLException {
+        delegate.commit();
+    }
+
+    @Override
+    public void rollback() throws SQLException {
+        delegate.rollback();
+    }
+
+    @Override
+    public void close() throws SQLException {
+        delegate.close();
+    }
+
+    @Override
+    public boolean isClosed() throws SQLException {
+        return delegate.isClosed();
+    }
+
+    @Override
+    public DatabaseMetaData getMetaData() throws SQLException {
+        return delegate.getMetaData();
+    }
+
+    @Override
+    public void setReadOnly(boolean readOnly) throws SQLException {
+        delegate.setReadOnly(readOnly);
+    }
+
+    @Override
+    public boolean isReadOnly() throws SQLException {
+        return delegate.isReadOnly();
+    }
+
+    @Override
+    public void setCatalog(final String catalog) throws SQLException {
+        delegate.setCatalog(catalog);
+    }
+
+    @Override
+    public String getCatalog() throws SQLException {
+        return delegate.getCatalog();
+    }
+
+    @Override
+    public void setTransactionIsolation(int level) throws SQLException {
+        delegate.setTransactionIsolation(level);
+    }
+
+    @Override
+    public int getTransactionIsolation() throws SQLException {
+        return delegate.getTransactionIsolation();
+    }
+
+    @Override
+    public SQLWarning getWarnings() throws SQLException {
+        return delegate.getWarnings();
+    }
+
+    @Override
+    public void clearWarnings() throws SQLException {
+        delegate.clearWarnings();
+    }
+
+    @Override
+    public Statement createStatement(int resultSetType, int 
resultSetConcurrency) throws SQLException {
+        return delegate.createStatement(resultSetType, resultSetConcurrency);
+    }
+
+    @Override
+    public PreparedStatement prepareStatement(final String sql, int 
resultSetType, int resultSetConcurrency) throws SQLException {
+        return delegate.prepareStatement(sql, resultSetType, 
resultSetConcurrency);
+    }
+
+    @Override
+    public CallableStatement prepareCall(final String sql, int resultSetType, 
int resultSetConcurrency) throws SQLException {
+        return delegate.prepareCall(sql, resultSetType, resultSetConcurrency);
+    }
+
+    @Override
+    public Map<String, Class<?>> getTypeMap() throws SQLException {
+        return delegate.getTypeMap();
+    }
+
+    @Override
+    public void setTypeMap(final Map<String, Class<?>> map) throws 
SQLException {
+        delegate.setTypeMap(map);
+    }
+
+    @Override
+    public void setHoldability(int holdability) throws SQLException {
+        delegate.setHoldability(holdability);
+    }
+
+    @Override
+    public int getHoldability() throws SQLException {
+        return delegate.getHoldability();
+    }
+
+    @Override
+    public Savepoint setSavepoint() throws SQLException {
+        return delegate.setSavepoint();
+    }
+
+    @Override
+    public Savepoint setSavepoint(String name) throws SQLException {
+        return delegate.setSavepoint(name);
+    }
+
+    @Override
+    public void rollback(final Savepoint savepoint) throws SQLException {
+        delegate.rollback(savepoint);
+    }
+
+    @Override
+    public void releaseSavepoint(Savepoint savepoint) throws SQLException {
+        delegate.releaseSavepoint(savepoint);
+    }
+
+    @Override
+    public Statement createStatement(int resultSetType, int 
resultSetConcurrency, int resultSetHoldability) throws SQLException {
+        return delegate.createStatement(resultSetType, resultSetConcurrency, 
resultSetHoldability);
+    }
+
+    @Override
+    public PreparedStatement prepareStatement(String sql, int resultSetType, 
int resultSetConcurrency, int resultSetHoldability) throws SQLException {
+        return delegate.prepareStatement(sql, resultSetType, 
resultSetConcurrency, resultSetHoldability);
+    }
+
+    @Override
+    public CallableStatement prepareCall(String sql, int resultSetType, int 
resultSetConcurrency, int resultSetHoldability) throws SQLException {
+        return delegate.prepareCall(sql, resultSetType, resultSetConcurrency, 
resultSetHoldability);
+    }
+
+    @Override
+    public PreparedStatement prepareStatement(String sql, int 
autoGeneratedKeys) throws SQLException {
+        return delegate.prepareStatement(sql, autoGeneratedKeys);
+    }
+
+    @Override
+    public PreparedStatement prepareStatement(String sql, int[] columnIndexes) 
throws SQLException {
+        return delegate.prepareStatement(sql, columnIndexes);
+    }
+
+    @Override
+    public PreparedStatement prepareStatement(String sql, String[] 
columnNames) throws SQLException {
+        return delegate.prepareStatement(sql, columnNames);
+    }
+
+    @Override
+    public Clob createClob() throws SQLException {
+        return delegate.createClob();
+    }
+
+    @Override
+    public Blob createBlob() throws SQLException {
+        return delegate.createBlob();
+    }
+
+    @Override
+    public NClob createNClob() throws SQLException {
+        return delegate.createNClob();
+    }
+
+    @Override
+    public SQLXML createSQLXML() throws SQLException {
+        return delegate.createSQLXML();
+    }
+
+    @Override
+    public boolean isValid(int timeout) throws SQLException {
+        return delegate.isValid(timeout);
+    }
+
+    @Override
+    public void setClientInfo(final String name, final String value) throws 
SQLClientInfoException {
+        delegate.setClientInfo(name, value);
+    }
+
+    @Override
+    public void setClientInfo(final Properties properties) throws 
SQLClientInfoException {
+        delegate.setClientInfo(properties);
+    }
+
+    @Override
+    public String getClientInfo(final String name) throws SQLException {
+        return delegate.getClientInfo(name);
+    }
+
+    @Override
+    public Properties getClientInfo() throws SQLException {
+        return delegate.getClientInfo();
+    }
+
+    @Override
+    public Array createArrayOf(final String typeName, final Object[] elements) 
throws SQLException {
+        return delegate.createArrayOf(typeName, elements);
+    }
+
+    @Override
+    public Struct createStruct(final String typeName, final Object[] 
attributes) throws SQLException {
+        return delegate.createStruct(typeName, attributes);
+    }
+
+    @Override
+    public <T> T unwrap(final Class<T> iface) throws SQLException {
+        return delegate.unwrap(iface);
+    }
+
+    @Override
+    public boolean isWrapperFor(final Class<?> iface) throws SQLException {
+        return delegate.isWrapperFor(iface);
+    }
+}

Added: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedDataSource.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedDataSource.java?rev=1364440&view=auto
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedDataSource.java
 (added)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedDataSource.java
 Sun Jul 22 21:48:32 2012
@@ -0,0 +1,54 @@
+package org.apache.openejb.resource.jdbc.managed;
+
+import javax.sql.DataSource;
+import java.io.PrintWriter;
+import java.sql.Connection;
+import java.sql.SQLException;
+
+public class ManagedDataSource implements DataSource {
+    protected final DataSource delegate;
+
+    public ManagedDataSource(final DataSource ds) {
+        delegate = ds;
+    }
+
+    @Override
+    public Connection getConnection() throws SQLException {
+        return new ManagedConnection(delegate.getConnection());
+    }
+
+    @Override
+    public Connection getConnection(final String username, final String 
password) throws SQLException {
+        return new ManagedConnection(delegate.getConnection(username, 
password));
+    }
+
+    @Override
+    public PrintWriter getLogWriter() throws SQLException {
+        return delegate.getLogWriter();
+    }
+
+    @Override
+    public void setLogWriter(final PrintWriter out) throws SQLException {
+        delegate.setLogWriter(out);
+    }
+
+    @Override
+    public void setLoginTimeout(int seconds) throws SQLException {
+        delegate.setLoginTimeout(seconds);
+    }
+
+    @Override
+    public int getLoginTimeout() throws SQLException {
+        return delegate.getLoginTimeout();
+    }
+
+    @Override
+    public <T> T unwrap(final Class<T> iface) throws SQLException {
+        return delegate.unwrap(iface);
+    }
+
+    @Override
+    public boolean isWrapperFor(final Class<?> iface) throws SQLException {
+        return delegate.isWrapperFor(iface);
+    }
+}

Added: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedXAConnection.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedXAConnection.java?rev=1364440&view=auto
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedXAConnection.java
 (added)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedXAConnection.java
 Sun Jul 22 21:48:32 2012
@@ -0,0 +1,11 @@
+package org.apache.openejb.resource.jdbc.managed;
+
+import javax.sql.XAConnection;
+import java.sql.Connection;
+import java.sql.SQLException;
+
+public class ManagedXAConnection extends ManagedConnection {
+    public ManagedXAConnection(final Connection connection) throws 
SQLException {
+        super(connection, ((XAConnection) connection).getXAResource());
+    }
+}

Added: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedXADataSource.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedXADataSource.java?rev=1364440&view=auto
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedXADataSource.java
 (added)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedXADataSource.java
 Sun Jul 22 21:48:32 2012
@@ -0,0 +1,28 @@
+package org.apache.openejb.resource.jdbc.managed;
+
+import javax.sql.DataSource;
+import javax.sql.XAConnection;
+import javax.sql.XADataSource;
+import javax.transaction.xa.XAResource;
+import java.io.PrintWriter;
+import java.sql.Connection;
+import java.sql.SQLException;
+
+public class ManagedXADataSource extends ManagedDataSource {
+    private final XADataSource xaDataSource;
+
+    public ManagedXADataSource(final DataSource ds) {
+        super(ds);
+        xaDataSource = (XADataSource) ds;
+    }
+
+    @Override
+    public Connection getConnection() throws SQLException {
+        return new 
ManagedXAConnection(xaDataSource.getXAConnection().getConnection());
+    }
+
+    @Override
+    public Connection getConnection(final String username, final String 
password) throws SQLException {
+        return new ManagedXAConnection(xaDataSource.getXAConnection(username, 
password).getConnection());
+    }
+}

Added: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/LocalXAResource.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/LocalXAResource.java?rev=1364440&view=auto
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/LocalXAResource.java
 (added)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/LocalXAResource.java
 Sun Jul 22 21:48:32 2012
@@ -0,0 +1,150 @@
+package org.apache.openejb.resource.jdbc.managed.local;
+
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
+import java.sql.Connection;
+import java.sql.SQLException;
+
+public class LocalXAResource implements XAResource {
+    private final Connection connection;
+    private Xid currentXid;
+    private boolean originalAutoCommit;
+
+    public LocalXAResource(final Connection localTransaction) {
+        this.connection = localTransaction;
+    }
+
+    public synchronized Xid getXid() {
+        return currentXid;
+    }
+
+    @Override
+    public synchronized void start(final Xid xid, int flag) throws XAException 
{
+        if (flag == XAResource.TMNOFLAGS) {
+            if (this.currentXid != null) {
+                throw new XAException("Already enlisted in another transaction 
with xid " + xid);
+            }
+
+            // save off the current auto commit flag so it can be restored 
after the transaction completes
+            try {
+                originalAutoCommit = connection.getAutoCommit();
+            } catch (SQLException ignored) {
+                originalAutoCommit = true;
+            }
+
+            try {
+                connection.setAutoCommit(false);
+            } catch (SQLException e) {
+                throw (XAException) new XAException("Count not turn off auto 
commit for a XA transaction").initCause(e);
+            }
+
+            this.currentXid = xid;
+        } else if (flag == XAResource.TMRESUME) {
+            if (xid != this.currentXid) {
+                throw new XAException("Attempting to resume in different 
transaction: expected " + this.currentXid + ", but was " + xid);
+            }
+        } else {
+            throw new XAException("Unknown start flag " + flag);
+        }
+    }
+
+    @Override
+    public synchronized void end(final Xid xid, int flag) throws XAException {
+        if (xid == null) {
+            throw new NullPointerException("xid is null");
+        }
+        if (!this.currentXid.equals(xid)) {
+            throw new XAException("Invalid Xid: expected " + this.currentXid + 
", but was " + xid);
+        }
+    }
+
+    @Override
+    public synchronized int prepare(final Xid xid) {
+        try {
+            if (connection.isReadOnly()) {
+                connection.setAutoCommit(originalAutoCommit);
+                return XAResource.XA_RDONLY;
+            }
+        } catch (SQLException ignored) {
+            // no-op
+        }
+
+        return XAResource.XA_OK;
+    }
+
+    @Override
+    public synchronized void commit(final Xid xid, boolean flag) throws 
XAException {
+        if (xid == null) {
+            throw new NullPointerException("xid is null");
+        }
+        if (!this.currentXid.equals(xid)) {
+            throw new XAException("Invalid Xid: expected " + this.currentXid + 
", but was " + xid);
+        }
+
+        try {
+            if (connection.isClosed()) {
+                throw new XAException("Conection is closed");
+            }
+
+            if (!connection.isReadOnly()) {
+                connection.commit();
+            }
+        } catch (SQLException e) {
+            throw (XAException) new XAException().initCause(e);
+        } finally {
+            try {
+                connection.setAutoCommit(originalAutoCommit);
+            } catch (SQLException e) {
+                // no-op
+            }
+            this.currentXid = null;
+        }
+    }
+
+    @Override
+    public synchronized void rollback(final Xid xid) throws XAException {
+        if (xid == null) throw new NullPointerException("xid is null");
+        if (!this.currentXid.equals(xid)) throw new XAException("Invalid Xid: 
expected " + this.currentXid + ", but was " + xid);
+
+        try {
+            connection.rollback();
+        } catch (SQLException e) {
+            throw (XAException) new XAException().initCause(e);
+        } finally {
+            try {
+                connection.setAutoCommit(originalAutoCommit);
+            } catch (SQLException e) {
+                // no-op
+            }
+            this.currentXid = null;
+        }
+    }
+
+    @Override
+    public boolean isSameRM(final XAResource xaResource) {
+        return this == xaResource;
+    }
+
+    @Override
+    public synchronized void forget(final Xid xid) {
+        if (xid != null && this.currentXid.equals(xid)) {
+            this.currentXid = null;
+        }
+    }
+
+    @Override
+    public Xid[] recover(int flag) {
+        return new Xid[0];
+    }
+
+    @Override
+    public int getTransactionTimeout() {
+        return 0;
+    }
+
+    @Override
+    public boolean setTransactionTimeout(int transactionTimeout) {
+        return false;
+    }
+}

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DataSourceCreator.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DataSourceCreator.java?rev=1364440&r1=1364439&r2=1364440&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DataSourceCreator.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DataSourceCreator.java
 Sun Jul 22 21:48:32 2012
@@ -11,7 +11,7 @@ public interface DataSourceCreator {
     DataSource pool(String name, DataSource ds);
     DataSource poolManagedWithRecovery(String name, XAResourceWrapper 
xaResourceWrapper, String driver, Properties properties);
     DataSource poolManaged(String name, String driver, Properties properties);
-    DataSource pool(String name, String driver);
+    DataSource pool(String name, String driver, Properties properties);
 
     boolean hasCreated(Object object);
     void destroy(Object object) throws Throwable;

Added: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DbcpDataSourceCreator.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DbcpDataSourceCreator.java?rev=1364440&view=auto
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DbcpDataSourceCreator.java
 (added)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DbcpDataSourceCreator.java
 Sun Jul 22 21:48:32 2012
@@ -0,0 +1,42 @@
+package org.apache.openejb.resource.jdbc.pool;
+
+import org.apache.openejb.resource.jdbc.dbcp.BasicDataSource;
+import org.apache.openejb.resource.jdbc.dbcp.DbcpDataSource;
+import org.apache.xbean.recipe.ObjectRecipe;
+import org.apache.xbean.recipe.Option;
+
+import javax.sql.DataSource;
+import java.util.Properties;
+
+public class DbcpDataSourceCreator extends PoolDataSourceCreator {
+    @Override
+    public DataSource pool(final String name, final DataSource ds) {
+        return new DbcpDataSource(name, ds);
+    }
+
+    @Override
+    public DataSource pool(final String name, final String driver, final 
Properties properties) {
+        final ObjectRecipe serviceRecipe = new 
ObjectRecipe(BasicDataSource.class.getName());
+        serviceRecipe.allow(Option.CASE_INSENSITIVE_PROPERTIES);
+        serviceRecipe.allow(Option.IGNORE_MISSING_PROPERTIES);
+        serviceRecipe.setProperty("name", name);
+        if (!properties.containsKey("JdbcDriver")) {
+            properties.setProperty("driverClassName", driver);
+        }
+        serviceRecipe.setAllProperties(properties);
+
+        final BasicDataSource ds = (BasicDataSource) serviceRecipe.create(); 
// new BasicDataSource(name);
+        ds.setDriverClassName(driver);
+        return ds;
+    }
+
+    @Override
+    public boolean hasCreated(final Object object) {
+        return object instanceof org.apache.commons.dbcp.BasicDataSource;
+    }
+
+    @Override
+    public void destroy(final Object object) throws Throwable {
+        ((org.apache.commons.dbcp.BasicDataSource) object).close();
+    }
+}

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java?rev=1364440&r1=1364439&r2=1364440&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java
 Sun Jul 22 21:48:32 2012
@@ -41,19 +41,19 @@ public class DefaultDataSourceCreator im
     }
 
     @Override
-    public DataSource pool(String name, String driver) {
+    public DataSource pool(final String name, final String driver, final 
Properties properties) {
         final BasicDataSource ds = new BasicDataSource(name);
         ds.setDriverClassName(driver);
         return ds;
     }
 
     @Override
-    public boolean hasCreated(Object object) {
+    public boolean hasCreated(final Object object) {
         return object instanceof org.apache.commons.dbcp.BasicDataSource;
     }
 
     @Override
-    public void destroy(Object object) throws Throwable {
+    public void destroy(final Object object) throws Throwable {
         ((org.apache.commons.dbcp.BasicDataSource) object).close();
     }
 }

Added: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/PoolDataSourceCreator.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/PoolDataSourceCreator.java?rev=1364440&view=auto
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/PoolDataSourceCreator.java
 (added)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/PoolDataSourceCreator.java
 Sun Jul 22 21:48:32 2012
@@ -0,0 +1,34 @@
+package org.apache.openejb.resource.jdbc.pool;
+
+import org.apache.openejb.resource.XAResourceWrapper;
+import org.apache.openejb.resource.jdbc.managed.ManagedDataSource;
+import org.apache.openejb.resource.jdbc.managed.ManagedXADataSource;
+
+import javax.sql.DataSource;
+import javax.sql.XADataSource;
+import java.util.Properties;
+
+public abstract class PoolDataSourceCreator implements DataSourceCreator {
+    @Override
+    public DataSource managed(final String name, final DataSource ds) {
+        if (ds instanceof XADataSource) {
+            return new ManagedXADataSource(ds);
+        }
+        return new ManagedDataSource(ds);
+    }
+
+    @Override // TODO: manage recovery
+    public DataSource poolManagedWithRecovery(final String name, final 
XAResourceWrapper xaResourceWrapper, final String driver, final Properties 
properties) {
+        throw new UnsupportedOperationException("TODO: implement it");
+    }
+
+    @Override
+    public DataSource poolManaged(final String name, final DataSource ds) {
+        return managed(name, pool(name, ds));
+    }
+
+    @Override
+    public DataSource poolManaged(final String name, final String driver, 
final Properties properties) {
+        return managed(name, pool(name, driver, properties));
+    }
+}

Added: 
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/ManagedDataSourceTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/ManagedDataSourceTest.java?rev=1364440&view=auto
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/ManagedDataSourceTest.java
 (added)
+++ 
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/ManagedDataSourceTest.java
 Sun Jul 22 21:48:32 2012
@@ -0,0 +1,128 @@
+package org.apache.openejb.resource.jdbc;
+
+import org.apache.openejb.jee.Empty;
+import org.apache.openejb.jee.SingletonBean;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.junit.Configuration;
+import org.apache.openejb.junit.Module;
+import org.apache.openejb.resource.jdbc.pool.DbcpDataSourceCreator;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.annotation.Resource;
+import javax.ejb.EJB;
+import javax.ejb.LocalBean;
+import javax.ejb.Singleton;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Properties;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+@Ignore("to implement")
+@RunWith(ApplicationComposer.class)
+public class ManagedDataSourceTest {
+    private static final String URL = "jdbc:hsqldb:mem:managed";
+    private static final String USER = "sa";
+    private static final String PASSWORD = "";
+    private static final String TABLE = "PUBLIC.MANAGED_DATASOURCE_TEST";
+
+    @EJB
+    private PersistManager persistManager;
+
+    @BeforeClass
+    public static void createTable() throws SQLException, 
ClassNotFoundException {
+        Class.forName("org.hsqldb.jdbcDriver");
+
+        final Connection connection = DriverManager.getConnection(URL, USER, 
PASSWORD);
+        final Statement statement = connection.createStatement();
+        statement.execute("CREATE TABLE " + TABLE + "(ID INTEGER)");
+        statement.close();
+        connection.commit();
+        connection.close();
+    }
+
+    @Configuration
+    public Properties config() {
+        final Properties p = new Properties();
+        p.put("openejb.jdbc.datasource-creator", 
DbcpDataSourceCreator.class.getName());
+
+        p.put("managed", "new://Resource?type=DataSource");
+        p.put("managed.JdbcDriver", "org.hsqldb.jdbcDriver");
+        p.put("managed.JdbcUrl", URL);
+        p.put("managed.UserName", USER);
+        p.put("managed.Password", PASSWORD);
+        p.put("managed.JtaManaged", "true");
+        return p;
+    }
+
+    @Module public SingletonBean app() throws Exception {
+        final SingletonBean bean = new SingletonBean(PersistManager.class);
+        bean.setLocalBean(new Empty());
+        return bean;
+    }
+
+    @LocalBean
+    @Singleton
+    public static class PersistManager {
+        @Resource(name = "managed")
+        private DataSource ds;
+
+        public void save() throws SQLException {
+            save(1);
+        }
+
+        public void saveAndRollback() throws SQLException {
+            save(2);
+            throw new RuntimeException();
+        }
+
+        private void save(int id) throws SQLException {
+            execute("INSERT INTO " + TABLE + "(ID) VALUES(" + id + ")");
+        }
+
+        private void execute(final String sql) throws SQLException {
+            final Connection connection = ds.getConnection();
+            final Statement statement = connection.createStatement();
+            statement.executeUpdate(sql);
+            statement.close();
+            connection.close();
+        }
+    }
+
+    @Test
+    public void commit() throws SQLException {
+        persistManager.save();
+        assertTrue(exists(1));
+    }
+
+    @Test
+    public void rollback() throws SQLException {
+        try {
+            persistManager.saveAndRollback();
+        } catch (Exception ignored) {
+            System.out.println(ignored);
+        }
+        assertFalse(exists(2));
+    }
+
+    private static boolean exists(int id) throws SQLException {
+        final Connection connection = DriverManager.getConnection(URL, USER, 
PASSWORD);
+        final Statement statement = connection.createStatement();
+        final ResultSet result = statement.executeQuery("SELECT count(*) AS NB 
FROM " + TABLE + " WHERE ID = " + id);
+        try {
+            assertTrue(result.next());
+            return result.getInt(1) == 1;
+        } finally {
+            statement.close();
+            connection.close();
+        }
+    }
+}


Reply via email to