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