Author: rmannibucau
Date: Thu Jul  5 10:21:14 2012
New Revision: 1357537

URL: http://svn.apache.org/viewvc?rev=1357537&view=rev
Log:
OPENEJB-1858 mocking G tx manager interface to be able to use another tx 
manager with mcf

Modified:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java?rev=1357537&r1=1357536&r2=1357537&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java
 Thu Jul  5 10:21:14 2012
@@ -25,10 +25,35 @@ import org.apache.geronimo.connector.out
 import 
org.apache.geronimo.connector.outbound.connectionmanagerconfig.SinglePool;
 import 
org.apache.geronimo.connector.outbound.connectionmanagerconfig.TransactionSupport;
 import 
org.apache.geronimo.connector.outbound.connectionmanagerconfig.XATransactions;
+import 
org.apache.geronimo.transaction.manager.ExponentialtIntervalRetryScheduler;
+import org.apache.geronimo.transaction.manager.NamedXAResource;
+import org.apache.geronimo.transaction.manager.NamedXAResourceFactory;
+import org.apache.geronimo.transaction.manager.RecoverTask;
 import org.apache.geronimo.transaction.manager.RecoverableTransactionManager;
+import org.apache.geronimo.transaction.manager.Recovery;
+import org.apache.geronimo.transaction.manager.RecoveryImpl;
+import org.apache.geronimo.transaction.manager.RetryScheduler;
+import org.apache.geronimo.transaction.manager.TransactionImpl;
+import org.apache.geronimo.transaction.manager.XidImpl;
 
 import javax.resource.spi.ManagedConnectionFactory;
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.InvalidTransactionException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.RollbackException;
+import javax.transaction.SystemException;
+import javax.transaction.Transaction;
 import javax.transaction.TransactionManager;
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.Xid;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 
 public class GeronimoConnectionManagerFactory   {
     private String name;
@@ -155,16 +180,21 @@ public class GeronimoConnectionManagerFa
         if (classLoader == null) 
Thread.currentThread().getContextClassLoader();
         if (classLoader == null) classLoader = getClass().getClassLoader();
         if (classLoader == null) classLoader = 
ClassLoader.getSystemClassLoader();
-        GenericConnectionManager connectionManager = new 
GenericConnectionManager(
+        RecoverableTransactionManager tm;
+        if (transactionManager instanceof RecoverableTransactionManager) {
+            tm = (RecoverableTransactionManager) transactionManager;
+        } else {
+            tm = new SimpleRecoverableTransactionManager(transactionManager);
+        }
+        return new GenericConnectionManager(
                 createTransactionSupport(),
                 poolingSupport,
                 null,
                 new AutoConnectionTracker(),
-                (RecoverableTransactionManager)transactionManager,
+                tm,
                 mcf,
                 name,
                 classLoader);
-        return connectionManager;
     }
 
     private TransactionSupport createTransactionSupport() {
@@ -225,4 +255,111 @@ public class GeronimoConnectionManagerFa
             throw new IllegalArgumentException("Unknown partition strategy " + 
partitionStrategy);
         }
     }
+
+    private class SimpleRecoverableTransactionManager implements 
RecoverableTransactionManager {
+        private final TransactionManager delegate;
+        private final Recovery recovery;
+        private final List<Exception> recoveryErrors = new 
ArrayList<Exception>();
+        private final RetryScheduler retryScheduler = new 
ExponentialtIntervalRetryScheduler();
+        private final Map<String, NamedXAResourceFactory> 
namedXAResourceFactories = new ConcurrentHashMap<String, 
NamedXAResourceFactory>();
+
+        public SimpleRecoverableTransactionManager(final TransactionManager 
transactionManager) {
+            delegate = transactionManager;
+            recovery = new Recovery() { // TODO
+                @Override
+                public void recoverLog() throws XAException {
+                    // no-op
+                }
+
+                @Override
+                public void recoverResourceManager(final NamedXAResource 
namedXAResource) throws XAException {
+                    // no-op
+                }
+
+                @Override
+                public boolean hasRecoveryErrors() {
+                    return !recoveryErrors.isEmpty();
+                }
+
+                @Override
+                public List getRecoveryErrors() {
+                    return recoveryErrors;
+                }
+
+                @Override
+                public boolean localRecoveryComplete() {
+                    return true;
+                }
+
+                @Override
+                public int localUnrecoveredCount() {
+                    return 0;
+                }
+
+                @Override
+                public Map<Xid, TransactionImpl> getExternalXids() {
+                    return Collections.emptyMap();
+                }
+            };
+        }
+
+        @Override
+        public void recoveryError(final Exception e) {
+            recoveryErrors.add(e);
+        }
+
+        public void registerNamedXAResourceFactory(final 
NamedXAResourceFactory namedXAResourceFactory) {
+            namedXAResourceFactories.put(namedXAResourceFactory.getName(), 
namedXAResourceFactory);
+            new RecoverTask(retryScheduler, namedXAResourceFactory, recovery, 
this).run();
+        }
+
+        public void unregisterNamedXAResourceFactory(final String 
namedXAResourceFactoryName) {
+            namedXAResourceFactories.remove(namedXAResourceFactoryName);
+        }
+
+        @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 {
+            return delegate.getTransaction();
+        }
+
+        @Override
+        public void resume(final Transaction transaction) throws 
IllegalStateException, InvalidTransactionException, SystemException {
+            delegate.resume(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 delegate.suspend();
+        }
+    }
 }


Reply via email to