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