GERONIMO-4360 connector 1.6 TransactionSupport runtime support needs us to reverse the connectionmanager-mcf dependency direction.

git-svn-id: https://svn.apache.org/repos/asf/geronimo/components/txmanager/trunk@926676 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractConnectionManager.java b/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractConnectionManager.java
index 8cc0520..5ec67e1 100644
--- a/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractConnectionManager.java
+++ b/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractConnectionManager.java
@@ -22,43 +22,47 @@
 import javax.resource.spi.ConnectionRequestInfo;
 import javax.resource.spi.LazyAssociatableConnectionManager;
 import javax.resource.spi.ManagedConnectionFactory;
-import javax.transaction.SystemException;
 
 import org.apache.geronimo.connector.outbound.connectionmanagerconfig.PoolingSupport;
-import org.apache.geronimo.transaction.manager.NamedXAResource;
-import org.apache.geronimo.transaction.manager.NamedXAResourceFactory;
 import org.apache.geronimo.transaction.manager.RecoverableTransactionManager;
 
 /**
  * @version $Rev$ $Date$
  */
 public abstract class AbstractConnectionManager implements ConnectionManagerContainer, ConnectionManager, LazyAssociatableConnectionManager, PoolingAttributes {
-    protected final Interceptors interceptors;
-    private final RecoverableTransactionManager transactionManager;
+    protected transient final Interceptors interceptors;
+    private transient final RecoverableTransactionManager transactionManager;
+    private transient final ManagedConnectionFactory managedConnectionFactory;
     private final String name;
 
     //default constructor to support externalizable subclasses
     public AbstractConnectionManager() {
         interceptors = null;
         transactionManager = null;
+        managedConnectionFactory = null;
         this.name = null;
     }
 
-    public AbstractConnectionManager(Interceptors interceptors, RecoverableTransactionManager transactionManager, String name) {
+    public AbstractConnectionManager(Interceptors interceptors, RecoverableTransactionManager transactionManager, ManagedConnectionFactory mcf, String name) {
         this.interceptors = interceptors;
         this.transactionManager = transactionManager;
+        this.managedConnectionFactory = mcf;
         this.name = name;
     }
 
-    public Object createConnectionFactory(ManagedConnectionFactory mcf) throws ResourceException {
-        return mcf.createConnectionFactory(this);
+    public Object createConnectionFactory() throws ResourceException {
+        return managedConnectionFactory.createConnectionFactory(this);
     }
 
     protected ConnectionManager getConnectionManager() {
         return this;
     }
 
-    public void doRecovery(ManagedConnectionFactory managedConnectionFactory) {
+    public ManagedConnectionFactory getManagedConnectionFactory() {
+        return managedConnectionFactory;
+    }
+
+    public void doRecovery() {
         if (!getIsRecoverable()) {
             return;
         }
@@ -186,12 +190,16 @@
     }
 
     public void doStop() throws Exception {
-        transactionManager.unregisterNamedXAResourceFactory(name);
+        if (transactionManager != null) {
+            transactionManager.unregisterNamedXAResourceFactory(name);
+        }
         interceptors.getStack().destroy();
     }
 
     public void doFail() {
-        transactionManager.unregisterNamedXAResourceFactory(name);
+        if (transactionManager != null) {
+            transactionManager.unregisterNamedXAResourceFactory(name);
+        }
         interceptors.getStack().destroy();
     }
 }
diff --git a/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionManagerContainer.java b/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionManagerContainer.java
index cedbd16..f7b4f2f 100644
--- a/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionManagerContainer.java
+++ b/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionManagerContainer.java
@@ -27,8 +27,8 @@
  */
 public interface ConnectionManagerContainer {
 
-    Object createConnectionFactory(ManagedConnectionFactory mcf) throws ResourceException;
+    Object createConnectionFactory() throws ResourceException;
 
-    void doRecovery(ManagedConnectionFactory managedConnectionFactory);
+    void doRecovery();
 
 }
diff --git a/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/GenericConnectionManager.java b/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/GenericConnectionManager.java
index 875487e..fddcde0 100644
--- a/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/GenericConnectionManager.java
+++ b/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/GenericConnectionManager.java
@@ -17,11 +17,15 @@
 
 package org.apache.geronimo.connector.outbound;
 
+import javax.resource.spi.ManagedConnectionFactory;
 import javax.transaction.TransactionManager;
 
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.LocalTransactions;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.NoTransactions;
 import org.apache.geronimo.connector.outbound.connectionmanagerconfig.PartitionedPool;
 import org.apache.geronimo.connector.outbound.connectionmanagerconfig.PoolingSupport;
 import org.apache.geronimo.connector.outbound.connectionmanagerconfig.TransactionSupport;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.XATransactions;
 import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTracker;
 import org.apache.geronimo.transaction.manager.RecoverableTransactionManager;
 import org.slf4j.Logger;
@@ -48,6 +52,7 @@
      * @param subjectSource If not null, use container managed security, getting the Subject from the SubjectSource
      * @param connectionTracker tracks connections between calls as needed
      * @param transactionManager transaction manager
+     * @param mcf
      * @param name name
      * @param classLoader classloader this component is running in.
      */
@@ -56,9 +61,10 @@
                                     SubjectSource subjectSource,
                                     ConnectionTracker connectionTracker,
                                     RecoverableTransactionManager transactionManager,
+                                    ManagedConnectionFactory mcf,
                                     String name,
                                     ClassLoader classLoader) {
-        super(new InterceptorsImpl(transactionSupport, pooling, subjectSource, name, connectionTracker, transactionManager, classLoader), transactionManager, name);
+        super(new InterceptorsImpl(transactionSupport, pooling, subjectSource, name, connectionTracker, transactionManager, mcf, classLoader), transactionManager, mcf, name);
     }
 
     private static class InterceptorsImpl implements AbstractConnectionManager.Interceptors {
@@ -86,12 +92,36 @@
                                 String name,
                                 ConnectionTracker connectionTracker,
                                 TransactionManager transactionManager,
-                                ClassLoader classLoader) {
+                                ManagedConnectionFactory mcf, ClassLoader classLoader) {
             //check for consistency between attributes
             if (subjectSource == null && pooling instanceof PartitionedPool && ((PartitionedPool) pooling).isPartitionBySubject()) {
                 throw new IllegalStateException("To use Subject in pooling, you need a SecurityDomain");
             }
 
+            if (mcf == null) {
+                throw new NullPointerException("No ManagedConnectionFactory supplied for " + name);
+            }
+            if (mcf instanceof javax.resource.spi.TransactionSupport) {
+                javax.resource.spi.TransactionSupport txSupport = (javax.resource.spi.TransactionSupport)mcf;
+                javax.resource.spi.TransactionSupport.TransactionSupportLevel txSupportLevel = txSupport.getTransactionSupport();
+                log.info("Runtime TransactionSupport level: " + txSupportLevel);
+                if (txSupportLevel != null) {
+                    if (txSupportLevel == javax.resource.spi.TransactionSupport.TransactionSupportLevel.NoTransaction) {
+                        transactionSupport = NoTransactions.INSTANCE;
+                    } else if (txSupportLevel == javax.resource.spi.TransactionSupport.TransactionSupportLevel.LocalTransaction) {
+                        if (transactionSupport != NoTransactions.INSTANCE) {
+                            transactionSupport = LocalTransactions.INSTANCE;
+                        }
+                    } else {
+                        if (transactionSupport != NoTransactions.INSTANCE && transactionSupport != LocalTransactions.INSTANCE) {
+                            transactionSupport = new XATransactions(true, false);
+                        }
+                    }
+                }
+            } else {
+                log.info("No runtime TransactionSupport");
+            }
+
             //Set up the interceptor stack
             MCFConnectionInterceptor tail = new MCFConnectionInterceptor();
             ConnectionInterceptor stack = tail;
diff --git a/geronimo-connector/src/test/java/org/apache/geronimo/connector/outbound/ConnectionManagerTestUtils.java b/geronimo-connector/src/test/java/org/apache/geronimo/connector/outbound/ConnectionManagerTestUtils.java
index 158803b..cff5c6f 100644
--- a/geronimo-connector/src/test/java/org/apache/geronimo/connector/outbound/ConnectionManagerTestUtils.java
+++ b/geronimo-connector/src/test/java/org/apache/geronimo/connector/outbound/ConnectionManagerTestUtils.java
@@ -113,9 +113,10 @@
                 poolingSupport,
                 subjectSource, connectionTrackingCoordinator,
                 this.transactionManager,
+                mockManagedConnectionFactory,
                 name,
                 classLoader);
-        connectionFactory = (MockConnectionFactory) connectionManagerDeployment.createConnectionFactory(mockManagedConnectionFactory);
+        connectionFactory = (MockConnectionFactory) connectionManagerDeployment.createConnectionFactory();
         connectorInstanceContext = new ConnectorInstanceContextImpl(unshareableResources, applicationManagedSecurityResources);
         defaultComponentInterceptor = new DefaultComponentInterceptor(this, connectionTrackingCoordinator);
     }