Author: rmannibucau
Date: Mon Jul 23 21:54:06 2012
New Revision: 1364813

URL: http://svn.apache.org/viewvc?rev=1364813&view=rev
Log:
managed and recovery and some comments

Added:
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/TransactionManagerWrapper.java
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java
      - copied, changed from r1364794, 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedConnection.java
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedDataSource.java
      - copied, changed from r1364676, 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedDataSource.java
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXAConnection.java
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXADataSource.java
Removed:
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedConnection.java
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedDataSource.java
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedXAConnection.java
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedXADataSource.java
Modified:
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicDataSource.java
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicManagedDataSource.java
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/ManagedDataSourceWithRecovery.java
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/LocalXAResource.java
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DataSourceCreator.java
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DbcpDataSourceCreator.java
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java
    
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/PoolDataSourceCreator.java
    
openejb/branches/openejb-pool/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/ManagedDataSourceTest.java

Added: 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/TransactionManagerWrapper.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/TransactionManagerWrapper.java?rev=1364813&view=auto
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/TransactionManagerWrapper.java
 (added)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/TransactionManagerWrapper.java
 Mon Jul 23 21:54:06 2012
@@ -0,0 +1,138 @@
+package org.apache.openejb.resource;
+
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.InvalidTransactionException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.RollbackException;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+import javax.transaction.xa.XAResource;
+
+public class TransactionManagerWrapper implements TransactionManager {
+    private final String name;
+    private final TransactionManager delegate;
+    private final XAResourceWrapper xaResourceWrapper;
+
+    public TransactionManagerWrapper(final TransactionManager delegate, final 
String name, final XAResourceWrapper xaResourceWrapper) {
+        this.delegate = delegate;
+        this.name = name;
+        this.xaResourceWrapper = xaResourceWrapper;
+    }
+
+    @Override
+    public void begin() throws NotSupportedException, SystemException {
+        delegate.begin();
+    }
+
+    @Override
+    public void commit() throws HeuristicMixedException, 
HeuristicRollbackException, IllegalStateException, RollbackException, 
SecurityException, SystemException {
+        delegate.commit();
+    }
+
+    @Override
+    public int getStatus() throws SystemException {
+        return delegate.getStatus();
+    }
+
+    @Override
+    public Transaction getTransaction() throws SystemException {
+        final Transaction tx = delegate.getTransaction();
+        return tx == null ? null : new 
TransactionWrapper(delegate.getTransaction(), name, xaResourceWrapper);
+    }
+
+    @Override
+    public void resume(Transaction transaction) throws IllegalStateException, 
InvalidTransactionException, SystemException {
+        delegate.resume(((TransactionWrapper) transaction).transaction);
+    }
+
+    @Override
+    public void rollback() throws IllegalStateException, SecurityException, 
SystemException {
+        delegate.rollback();
+    }
+
+    @Override
+    public void setRollbackOnly() throws IllegalStateException, 
SystemException {
+        delegate.setRollbackOnly();
+    }
+
+    @Override
+    public void setTransactionTimeout(int i) throws SystemException {
+        delegate.setTransactionTimeout(i);
+    }
+
+    @Override
+    public Transaction suspend() throws SystemException {
+        return new TransactionWrapper(delegate.suspend(), name, 
xaResourceWrapper);
+    }
+
+    private static class TransactionWrapper implements Transaction {
+        private final Transaction transaction;
+        private final String name;
+        private final XAResourceWrapper xaResourceWrapper;
+
+        private TransactionWrapper(final Transaction transaction, final String 
name, final XAResourceWrapper xaResourceWrapper) {
+            this.transaction = transaction;
+            this.name = name;
+            this.xaResourceWrapper = xaResourceWrapper;
+        }
+
+        @Override
+        public void commit() throws HeuristicMixedException, 
HeuristicRollbackException, RollbackException, SecurityException, 
SystemException {
+            transaction.commit();
+        }
+
+        @Override
+        public boolean delistResource(final XAResource xaResource, int i) 
throws IllegalStateException, SystemException {
+            final XAResource wrapper = xaResourceWrapper.wrap(xaResource, 
name);
+            return transaction.delistResource(wrapper, i);
+        }
+
+        @Override
+        public boolean enlistResource(final XAResource xaResource) throws 
IllegalStateException, RollbackException, SystemException {
+            final XAResource wrapper = xaResourceWrapper.wrap(xaResource, 
name);
+            return transaction.enlistResource(wrapper);
+        }
+
+        @Override
+        public int getStatus() throws SystemException {
+            return transaction.getStatus();
+        }
+
+        @Override
+        public void registerSynchronization(final Synchronization 
synchronization) throws IllegalStateException, RollbackException, 
SystemException {
+            transaction.registerSynchronization(synchronization);
+        }
+
+        @Override
+        public void rollback() throws IllegalStateException, SystemException {
+            transaction.rollback();
+        }
+
+        @Override
+        public void setRollbackOnly() throws IllegalStateException, 
SystemException {
+            transaction.setRollbackOnly();
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) {
+                return true;
+            }
+            if (o == null || getClass() != o.getClass()) {
+                return false;
+            }
+
+            final TransactionWrapper that = (TransactionWrapper) o;
+            return transaction.equals(that.transaction);
+        }
+
+        @Override
+        public int hashCode() {
+            return transaction.hashCode();
+        }
+    }
+}
+

Modified: 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java?rev=1364813&r1=1364812&r2=1364813&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java
 (original)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java
 Mon Jul 23 21:54:06 2012
@@ -34,9 +34,6 @@ public class DataSourceFactory {
     public static final String POOL_PROPERTY = "openejb.datasource.pool";
 
     public static DataSource create(final String name, final boolean managed, 
final Class impl, final String definition) throws IllegalAccessException, 
InstantiationException, IOException {
-
-        final DataSource ds;
-
         final Properties properties = asProperties(definition);
         final DataSourceCreator creator = 
SystemInstance.get().getComponent(DataSourceCreator.class);
 
@@ -49,35 +46,33 @@ public class DataSourceFactory {
             recipe.allow(Option.NAMED_PARAMETERS);
             recipe.setAllProperties(properties);
 
-            DataSource dataSource = (DataSource) recipe.create();
+            final DataSource dataSource = (DataSource) recipe.create();
 
             if (managed) {
                 if (useDbcp(properties)) {
-                    ds = creator.poolManaged(name, dataSource);
+                    return creator.poolManaged(name, dataSource);
                 } else {
-                    ds = creator.managed(name, dataSource);
+                    return creator.managed(name, dataSource);
                 }
             } else {
                 if (useDbcp(properties)) {
-                    ds = creator.pool(name, dataSource);
+                    return creator.pool(name, dataSource);
                 } else {
-                    ds = dataSource;
+                    return dataSource;
                 }
             }
-        } else {
+        } else { // by driver
             if (managed) {
-                XAResourceWrapper xaResourceWrapper = 
SystemInstance.get().getComponent(XAResourceWrapper.class);
+                final XAResourceWrapper xaResourceWrapper = 
SystemInstance.get().getComponent(XAResourceWrapper.class);
                 if (xaResourceWrapper != null) {
-                    ds = creator.poolManagedWithRecovery(name, 
xaResourceWrapper, impl.getName(), properties);
+                    return creator.poolManagedWithRecovery(name, 
xaResourceWrapper, impl.getName(), properties);
                 } else {
-                    ds = creator.poolManaged(name, impl.getName(), properties);
+                    return creator.poolManaged(name, impl.getName(), 
properties);
                 }
             } else {
-                ds = creator.pool(name, impl.getName(), properties);
+                return creator.pool(name, impl.getName(), properties);
             }
         }
-
-        return ds;
     }
 
     private static boolean createDataSourceFromClass(final Class<?> impl) {

Modified: 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicDataSource.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicDataSource.java?rev=1364813&r1=1364812&r2=1364813&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicDataSource.java
 (original)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicDataSource.java
 Mon Jul 23 21:54:06 2012
@@ -16,7 +16,12 @@
  */
 package org.apache.openejb.resource.jdbc.dbcp;
 
+import org.apache.openejb.assembler.monitoring.JMXBasicDataSource;
 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.sql.DataSource;
 import java.io.File;
@@ -25,11 +30,6 @@ import java.sql.SQLFeatureNotSupportedEx
 import java.util.Properties;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.logging.Logger;
-import org.apache.openejb.assembler.monitoring.JMXBasicDataSource;
-import org.apache.openejb.resource.jdbc.BasicDataSourceUtil;
-import org.apache.openejb.resource.jdbc.plugin.DataSourcePlugin;
-import org.apache.openejb.resource.jdbc.IsolationLevels;
-import org.apache.openejb.resource.jdbc.cipher.PasswordCipher;
 
 @SuppressWarnings({"UnusedDeclaration"})
 public class BasicDataSource extends org.apache.commons.dbcp.BasicDataSource {

Modified: 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicManagedDataSource.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicManagedDataSource.java?rev=1364813&r1=1364812&r2=1364813&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicManagedDataSource.java
 (original)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicManagedDataSource.java
 Mon Jul 23 21:54:06 2012
@@ -16,19 +16,20 @@
  */
 package org.apache.openejb.resource.jdbc.dbcp;
 
+import org.apache.openejb.assembler.monitoring.JMXBasicDataSource;
+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.sql.DataSource;
 import java.io.File;
 import java.sql.SQLException;
 import java.sql.SQLFeatureNotSupportedException;
 import java.util.Properties;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.logging.Logger;
-import javax.sql.DataSource;
-import org.apache.openejb.loader.SystemInstance;
-import org.apache.openejb.assembler.monitoring.JMXBasicDataSource;
-import org.apache.openejb.resource.jdbc.BasicDataSourceUtil;
-import org.apache.openejb.resource.jdbc.plugin.DataSourcePlugin;
-import org.apache.openejb.resource.jdbc.IsolationLevels;
-import org.apache.openejb.resource.jdbc.cipher.PasswordCipher;
 
 @SuppressWarnings({"UnusedDeclaration"})
 public class BasicManagedDataSource extends 
org.apache.commons.dbcp.managed.BasicManagedDataSource {

Modified: 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/ManagedDataSourceWithRecovery.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/ManagedDataSourceWithRecovery.java?rev=1364813&r1=1364812&r2=1364813&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/ManagedDataSourceWithRecovery.java
 (original)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/ManagedDataSourceWithRecovery.java
 Mon Jul 23 21:54:06 2012
@@ -16,18 +16,10 @@
  */
 package org.apache.openejb.resource.jdbc.dbcp;
 
+import org.apache.openejb.resource.TransactionManagerWrapper;
 import org.apache.openejb.resource.XAResourceWrapper;
 
-import javax.transaction.HeuristicMixedException;
-import javax.transaction.HeuristicRollbackException;
-import javax.transaction.InvalidTransactionException;
-import javax.transaction.NotSupportedException;
-import javax.transaction.RollbackException;
-import javax.transaction.Synchronization;
-import javax.transaction.SystemException;
-import javax.transaction.Transaction;
 import javax.transaction.TransactionManager;
-import javax.transaction.xa.XAResource;
 
 public class ManagedDataSourceWithRecovery extends BasicManagedDataSource {
     private TransactionManager suppliedTransactionManager;
@@ -48,110 +40,4 @@ public class ManagedDataSourceWithRecove
             super.setTransactionManager(new 
TransactionManagerWrapper(suppliedTransactionManager, getUrl(), 
xaResourceWrapper));
         }
     }
-
-    private static class TransactionManagerWrapper implements 
TransactionManager {
-
-        private final TransactionManager transactionManager;
-        private final String name;
-        private final XAResourceWrapper xaResourceWrapper;
-
-        private TransactionManagerWrapper(TransactionManager 
transactionManager, String name, XAResourceWrapper xaResourceWrapper) {
-            this.transactionManager = transactionManager;
-            this.name = name;
-            this.xaResourceWrapper = xaResourceWrapper;
-        }
-
-        public void begin() throws NotSupportedException, SystemException {
-            transactionManager.begin();
-        }
-
-        public void commit() throws HeuristicMixedException, 
HeuristicRollbackException, IllegalStateException, RollbackException, 
SecurityException, SystemException {
-            transactionManager.commit();
-        }
-
-        public int getStatus() throws SystemException {
-            return transactionManager.getStatus();
-        }
-
-        public Transaction getTransaction() throws SystemException {
-            Transaction tx = transactionManager.getTransaction();
-            return tx == null? null: new 
TransactionWrapper(transactionManager.getTransaction(), name, 
xaResourceWrapper);
-        }
-
-        public void resume(Transaction transaction) throws 
IllegalStateException, InvalidTransactionException, SystemException {
-            
transactionManager.resume(((TransactionWrapper)transaction).transaction);
-        }
-
-        public void rollback() throws IllegalStateException, 
SecurityException, SystemException {
-            transactionManager.rollback();
-        }
-
-        public void setRollbackOnly() throws IllegalStateException, 
SystemException {
-            transactionManager.setRollbackOnly();
-        }
-
-        public void setTransactionTimeout(int i) throws SystemException {
-            transactionManager.setTransactionTimeout(i);
-        }
-
-        public Transaction suspend() throws SystemException {
-            return new TransactionWrapper(transactionManager.suspend(), name, 
xaResourceWrapper);
-        }
-    }
-
-    private static class TransactionWrapper implements Transaction {
-
-        private final Transaction transaction;
-        private final String name;
-        private final XAResourceWrapper xaResourceWrapper;
-
-        private TransactionWrapper(Transaction transaction, String name, 
XAResourceWrapper xaResourceWrapper) {
-            this.transaction = transaction;
-            this.name = name;
-            this.xaResourceWrapper = xaResourceWrapper;
-        }
-
-        public void commit() throws HeuristicMixedException, 
HeuristicRollbackException, RollbackException, SecurityException, 
SystemException {
-            transaction.commit();
-        }
-
-        public boolean delistResource(XAResource xaResource, int i) throws 
IllegalStateException, SystemException {
-            XAResource wrapper = xaResourceWrapper.wrap(xaResource, name);
-            return transaction.delistResource(wrapper, i);
-        }
-
-        public boolean enlistResource(XAResource xaResource) throws 
IllegalStateException, RollbackException, SystemException {
-            XAResource wrapper = xaResourceWrapper.wrap(xaResource, name);
-            return transaction.enlistResource(wrapper);
-        }
-
-        public int getStatus() throws SystemException {
-            return transaction.getStatus();
-        }
-
-        public void registerSynchronization(Synchronization synchronization) 
throws IllegalStateException, RollbackException, SystemException {
-            transaction.registerSynchronization(synchronization);
-        }
-
-        public void rollback() throws IllegalStateException, SystemException {
-            transaction.rollback();
-        }
-
-        public void setRollbackOnly() throws IllegalStateException, 
SystemException {
-            transaction.setRollbackOnly();
-        }
-
-        public boolean equals(Object o) {
-            if (this == o) return true;
-            if (o == null || getClass() != o.getClass()) return false;
-
-            TransactionWrapper that = (TransactionWrapper) o;
-
-            return transaction.equals(that.transaction);
-        }
-
-        public int hashCode() {
-            return transaction.hashCode();
-        }
-    }
 }
\ No newline at end of file

Modified: 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/LocalXAResource.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/LocalXAResource.java?rev=1364813&r1=1364812&r2=1364813&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/LocalXAResource.java
 (original)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/LocalXAResource.java
 Mon Jul 23 21:54:06 2012
@@ -6,13 +6,16 @@ import javax.transaction.xa.Xid;
 import java.sql.Connection;
 import java.sql.SQLException;
 
+// seems synchronized is faster than java.util.concurrent for 1 or 2 threads
+// so should be fine here
+// moreover all operations are very short so synchronized is faster
 public class LocalXAResource implements XAResource {
     private final Connection connection;
     private Xid currentXid;
     private boolean originalAutoCommit;
 
     public LocalXAResource(final Connection localTransaction) {
-        this.connection = localTransaction;
+        connection = localTransaction;
     }
 
     public synchronized Xid getXid() {
@@ -22,7 +25,7 @@ public class LocalXAResource implements 
     @Override
     public synchronized void start(final Xid xid, int flag) throws XAException 
{
         if (flag == XAResource.TMNOFLAGS) {
-            if (this.currentXid != null) {
+            if (currentXid != null) {
                 throw new XAException("Already enlisted in another transaction 
with xid " + xid);
             }
 
@@ -41,8 +44,8 @@ public class LocalXAResource implements 
 
             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);
+            if (xid != currentXid) {
+                throw new XAException("Attempting to resume in different 
transaction: expected " + currentXid + ", but was " + xid);
             }
         } else {
             throw new XAException("Unknown start flag " + flag);
@@ -78,8 +81,8 @@ public class LocalXAResource implements 
         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);
+        if (!currentXid.equals(xid)) {
+            throw new XAException("Invalid Xid: expected " + currentXid + ", 
but was " + xid);
         }
 
         try {
@@ -98,7 +101,7 @@ public class LocalXAResource implements 
             } catch (SQLException e) {
                 // no-op
             }
-            this.currentXid = null;
+            currentXid = null;
         }
     }
 
@@ -107,8 +110,8 @@ public class LocalXAResource implements 
         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);
+        if (!currentXid.equals(xid)) {
+            throw new XAException("Invalid Xid: expected " + currentXid + ", 
but was " + xid);
         }
 
         try {
@@ -132,8 +135,8 @@ public class LocalXAResource implements 
 
     @Override
     public synchronized void forget(final Xid xid) {
-        if (xid != null && this.currentXid.equals(xid)) {
-            this.currentXid = null;
+        if (xid != null && currentXid.equals(xid)) {
+            currentXid = null;
         }
     }
 

Copied: 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java
 (from r1364794, 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedConnection.java)
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java?p2=openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java&p1=openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedConnection.java&r1=1364794&r2=1364813&rev=1364813&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedConnection.java
 (original)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java
 Mon Jul 23 21:54:06 2012
@@ -1,7 +1,6 @@
-package org.apache.openejb.resource.jdbc.managed;
+package org.apache.openejb.resource.jdbc.managed.local;
 
 import org.apache.openejb.OpenEJB;
-import org.apache.openejb.resource.jdbc.managed.local.LocalXAResource;
 
 import javax.transaction.RollbackException;
 import javax.transaction.Status;
@@ -22,17 +21,16 @@ public class ManagedConnection implement
     private static final Map<Transaction, Connection> CONNECTION_BY_TX = new 
ConcurrentHashMap<Transaction, Connection>();
 
     protected Connection delegate;
-    protected XAResource xaResource;
-
+    private final TransactionManager transactionManager;
     private Transaction currentTransaction;
 
-    protected ManagedConnection(final Connection connection, final XAResource 
resource) {
+    public ManagedConnection(final Connection connection, final 
TransactionManager txMgr) {
         delegate = connection;
-        xaResource = resource;
+        transactionManager = txMgr;
     }
 
-    public ManagedConnection(final Connection connection) {
-        this(connection, new LocalXAResource(connection));
+    public XAResource getXAResource() throws SQLException {
+        return new LocalXAResource(delegate);
     }
 
     @Override
@@ -40,7 +38,7 @@ public class ManagedConnection implement
         // first some Object method management
         final String mtdName = method.getName();
         if ("toString".equals(mtdName)) {
-            return "ManagedConnection{" + delegate.toString() + "}";
+            return "ManagedConnection{" + delegate + "}";
         }
         if ("hashCode".equals(mtdName)) {
             return delegate.hashCode();
@@ -51,7 +49,6 @@ public class ManagedConnection implement
 
         // here the real logic starts
         try {
-            final TransactionManager transactionManager = 
OpenEJB.getTransactionManager();
             final Transaction transaction = 
transactionManager.getTransaction();
 
             if (transaction == null) { // shouldn't be possible
@@ -83,7 +80,7 @@ public class ManagedConnection implement
                         CONNECTION_BY_TX.put(transaction, delegate);
                         currentTransaction = transaction;
                         try {
-                            transaction.enlistResource(xaResource);
+                            transaction.enlistResource(getXAResource());
                         } catch (RollbackException ignored) {
                             // no-op
                         } catch (SystemException e) {

Copied: 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedDataSource.java
 (from r1364676, 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedDataSource.java)
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedDataSource.java?p2=openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedDataSource.java&p1=openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedDataSource.java&r1=1364676&r2=1364813&rev=1364813&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/ManagedDataSource.java
 (original)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedDataSource.java
 Mon Jul 23 21:54:06 2012
@@ -1,15 +1,9 @@
-package org.apache.openejb.resource.jdbc.managed;
+package org.apache.openejb.resource.jdbc.managed.local;
 
-import org.apache.openejb.OpenEJB;
-import org.apache.openejb.resource.jdbc.managed.local.LocalXAResource;
 import org.apache.openejb.util.reflection.Reflections;
 
 import javax.sql.DataSource;
-import javax.transaction.RollbackException;
-import javax.transaction.SystemException;
-import javax.transaction.Transaction;
 import javax.transaction.TransactionManager;
-import javax.transaction.xa.XAResource;
 import java.io.PrintWriter;
 import java.lang.reflect.Proxy;
 import java.sql.Connection;
@@ -21,9 +15,11 @@ public class ManagedDataSource implement
     private static final Class<?>[] CONNECTION_CLASS = new Class<?>[] { 
Connection.class };
 
     protected final DataSource delegate;
+    protected final TransactionManager transactionManager;
 
-    public ManagedDataSource(final DataSource ds) {
+    public ManagedDataSource(final DataSource ds, final TransactionManager 
txMgr) {
         delegate = ds;
+        transactionManager = txMgr;
     }
 
     @Override
@@ -36,10 +32,6 @@ public class ManagedDataSource implement
         return managed(delegate.getConnection(username, password));
     }
 
-    private Connection managed(final Connection connection) {
-        return (Connection) 
Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), 
CONNECTION_CLASS, new ManagedConnection(connection));
-    }
-
     @Override
     public PrintWriter getLogWriter() throws SQLException {
         return delegate.getLogWriter();
@@ -60,11 +52,6 @@ public class ManagedDataSource implement
         return delegate.getLoginTimeout();
     }
 
-    // @Override
-    public Logger getParentLogger() throws SQLFeatureNotSupportedException {
-        return (Logger) Reflections.invokeByReflection(delegate, 
"getParentLogger", new Class<?>[0], null);
-    }
-
     @Override
     public <T> T unwrap(final Class<T> iface) throws SQLException {
         return delegate.unwrap(iface);
@@ -74,4 +61,13 @@ public class ManagedDataSource implement
     public boolean isWrapperFor(final Class<?> iface) throws SQLException {
         return delegate.isWrapperFor(iface);
     }
+
+    // @Override JDK7
+    public Logger getParentLogger() throws SQLFeatureNotSupportedException {
+        return (Logger) Reflections.invokeByReflection(delegate, 
"getParentLogger", new Class<?>[0], null);
+    }
+
+    private Connection managed(final Connection connection) {
+        return (Connection) 
Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), 
CONNECTION_CLASS, new ManagedConnection(connection, transactionManager));
+    }
 }

Added: 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXAConnection.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXAConnection.java?rev=1364813&view=auto
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXAConnection.java
 (added)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXAConnection.java
 Mon Jul 23 21:54:06 2012
@@ -0,0 +1,20 @@
+package org.apache.openejb.resource.jdbc.managed.xa;
+
+import org.apache.openejb.resource.jdbc.managed.local.ManagedConnection;
+
+import javax.sql.XAConnection;
+import javax.transaction.TransactionManager;
+import javax.transaction.xa.XAResource;
+import java.sql.Connection;
+import java.sql.SQLException;
+
+public class ManagedXAConnection extends ManagedConnection {
+    public ManagedXAConnection(final Connection connection, final 
TransactionManager txMgr) throws SQLException {
+        super(connection, txMgr);
+    }
+
+    @Override
+    public XAResource getXAResource() throws SQLException {
+        return ((XAConnection) delegate).getXAResource();
+    }
+}

Added: 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXADataSource.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXADataSource.java?rev=1364813&view=auto
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXADataSource.java
 (added)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/xa/ManagedXADataSource.java
 Mon Jul 23 21:54:06 2012
@@ -0,0 +1,36 @@
+package org.apache.openejb.resource.jdbc.managed.xa;
+
+import org.apache.openejb.resource.jdbc.managed.local.ManagedDataSource;
+
+import javax.sql.DataSource;
+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 };
+
+    private final XADataSource xaDataSource;
+
+    public ManagedXADataSource(final DataSource ds, final TransactionManager 
txMgr) {
+        super(ds, txMgr);
+        xaDataSource = (XADataSource) ds;
+    }
+
+    @Override
+    public Connection getConnection() throws SQLException {
+        return managedXA(xaDataSource.getXAConnection().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(connection, transactionManager));
+    }
+}

Modified: 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DataSourceCreator.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DataSourceCreator.java?rev=1364813&r1=1364812&r2=1364813&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DataSourceCreator.java
 (original)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DataSourceCreator.java
 Mon Jul 23 21:54:06 2012
@@ -5,6 +5,11 @@ import org.apache.openejb.resource.XARes
 import javax.sql.DataSource;
 import java.util.Properties;
 
+// Look org.apache.openejb.resource.jdbc.pool.PoolDataSourceCreator
+// it is the class to extend
+// this interface is mainly so complicated
+// 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 poolManaged(String name, DataSource ds);

Modified: 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DbcpDataSourceCreator.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DbcpDataSourceCreator.java?rev=1364813&r1=1364812&r2=1364813&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DbcpDataSourceCreator.java
 (original)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DbcpDataSourceCreator.java
 Mon Jul 23 21:54:06 2012
@@ -8,6 +8,8 @@ import org.apache.xbean.recipe.Option;
 import javax.sql.DataSource;
 import java.util.Properties;
 
+// just a sample showing how to implement a datasourcecreator
+// this one will probably not be used since dbcp has already the integration 
we need
 public class DbcpDataSourceCreator extends PoolDataSourceCreator {
     @Override
     public DataSource pool(final String name, final DataSource ds) {

Modified: 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java?rev=1364813&r1=1364812&r2=1364813&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java
 (original)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java
 Mon Jul 23 21:54:06 2012
@@ -3,9 +3,9 @@ package org.apache.openejb.resource.jdbc
 import org.apache.openejb.resource.XAResourceWrapper;
 import org.apache.openejb.resource.jdbc.dbcp.BasicDataSource;
 import org.apache.openejb.resource.jdbc.dbcp.BasicManagedDataSource;
-import org.apache.openejb.resource.jdbc.dbcp.ManagedDataSourceWithRecovery;
 import org.apache.openejb.resource.jdbc.dbcp.DbcpDataSource;
 import org.apache.openejb.resource.jdbc.dbcp.DbcpManagedDataSource;
+import org.apache.openejb.resource.jdbc.dbcp.ManagedDataSourceWithRecovery;
 
 import javax.sql.DataSource;
 import java.util.Properties;

Modified: 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/PoolDataSourceCreator.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/PoolDataSourceCreator.java?rev=1364813&r1=1364812&r2=1364813&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/PoolDataSourceCreator.java
 (original)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/PoolDataSourceCreator.java
 Mon Jul 23 21:54:06 2012
@@ -1,25 +1,34 @@
 package org.apache.openejb.resource.jdbc.pool;
 
+import org.apache.openejb.OpenEJB;
+import org.apache.openejb.resource.TransactionManagerWrapper;
 import org.apache.openejb.resource.XAResourceWrapper;
-import org.apache.openejb.resource.jdbc.managed.ManagedDataSource;
-import org.apache.openejb.resource.jdbc.managed.ManagedXADataSource;
+import org.apache.openejb.resource.jdbc.managed.local.ManagedDataSource;
+import org.apache.openejb.resource.jdbc.managed.xa.ManagedXADataSource;
 
 import javax.sql.DataSource;
 import javax.sql.XADataSource;
+import javax.transaction.TransactionManager;
 import java.util.Properties;
 
 public abstract class PoolDataSourceCreator implements DataSourceCreator {
     @Override
     public DataSource managed(final String name, final DataSource ds) {
+        final TransactionManager transactionManager = 
OpenEJB.getTransactionManager();
         if (ds instanceof XADataSource) {
-            return new ManagedXADataSource(ds);
+            return new ManagedXADataSource(ds, transactionManager);
         }
-        return new ManagedDataSource(ds);
+        return new ManagedDataSource(ds, transactionManager);
     }
 
-    @Override // TODO: manage recovery
+    @Override
     public DataSource poolManagedWithRecovery(final String name, final 
XAResourceWrapper xaResourceWrapper, final String driver, final Properties 
properties) {
-        throw new UnsupportedOperationException("TODO: implement it");
+        final TransactionManager transactionManager = new 
TransactionManagerWrapper(OpenEJB.getTransactionManager(), name, 
xaResourceWrapper);
+        final DataSource ds = pool(name, driver, properties);
+        if (ds instanceof XADataSource) {
+            return new ManagedXADataSource(ds, transactionManager);
+        }
+        return new ManagedDataSource(ds, transactionManager);
     }
 
     @Override

Modified: 
openejb/branches/openejb-pool/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/ManagedDataSourceTest.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/ManagedDataSourceTest.java?rev=1364813&r1=1364812&r2=1364813&view=diff
==============================================================================
--- 
openejb/branches/openejb-pool/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/ManagedDataSourceTest.java
 (original)
+++ 
openejb/branches/openejb-pool/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/ManagedDataSourceTest.java
 Mon Jul 23 21:54:06 2012
@@ -5,7 +5,7 @@ import org.apache.openejb.jee.SingletonB
 import org.apache.openejb.junit.ApplicationComposer;
 import org.apache.openejb.junit.Configuration;
 import org.apache.openejb.junit.Module;
-import org.apache.openejb.resource.jdbc.managed.ManagedConnection;
+import org.apache.openejb.resource.jdbc.managed.local.ManagedConnection;
 import org.apache.openejb.resource.jdbc.pool.DbcpDataSourceCreator;
 import org.junit.After;
 import org.junit.BeforeClass;


Reply via email to