You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dj...@apache.org on 2011/02/24 03:25:53 UTC
svn commit: r1074024 [1/2] - in /geronimo/sandbox/djencks/txmanager: ./
connector-itests/src/test/java/org/apache/geronimo/components/connector/itests/
geronimo-connector/src/main/java/org/apache/geronimo/connector/assembler/
geronimo-connector/src/mai...
Author: djencks
Date: Thu Feb 24 02:25:51 2011
New Revision: 1074024
URL: http://svn.apache.org/viewvc?rev=1074024&view=rev
Log:
add a lot of service references for wiring. Use a DS component factory to construct the connection manager
Added:
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/BaseConnectionManager.java (contents, props changed)
- copied, changed from r1071447, geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractConnectionManager.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/DSFactoryConnectionManager.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/InterceptorsImpl.java
Removed:
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractConnectionManager.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionInterceptorSource.java
Modified:
geronimo/sandbox/djencks/txmanager/connector-itests/src/test/java/org/apache/geronimo/components/connector/itests/ConnectorTest.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/assembler/AssemblyListener.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/assembler/impl/AssemblerImpl.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/extender/ConnectorExtender.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/extender/Container.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractSinglePoolConnectionInterceptor.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionHandleInterceptor.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionInterceptor.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionTrackingInterceptor.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/GenericConnectionManager.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/LocalXAResourceInsertionInterceptor.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/MCFConnectionInterceptor.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/MultiPoolConnectionInterceptor.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/SubjectInterceptor.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/TCCLInterceptor.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ThreadLocalCachingConnectionInterceptor.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptor.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/TransactionEnlistingInterceptor.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/TxUtil.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/XAResourceInsertionInterceptor.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/connectiontracking/ConnectionTrackingCoordinator.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/transactionlog/LogXAResourceInsertionInterceptor.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/test/java/org/apache/geronimo/connector/AssemblerTest.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/test/java/org/apache/geronimo/connector/outbound/AbstractSinglePoolTest.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/test/java/org/apache/geronimo/connector/outbound/ConnectionInterceptorTestUtils.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/test/java/org/apache/geronimo/connector/outbound/ConnectionManagerTestUtils.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/test/java/org/apache/geronimo/connector/outbound/connectiontracking/ConnectionTrackingCoordinatorProxyTest.java
geronimo/sandbox/djencks/txmanager/geronimo-connector/src/test/java/org/apache/geronimo/connector/outbound/connectiontracking/ConnectionTrackingCoordinatorTest.java
geronimo/sandbox/djencks/txmanager/pom.xml
Modified: geronimo/sandbox/djencks/txmanager/connector-itests/src/test/java/org/apache/geronimo/components/connector/itests/ConnectorTest.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/txmanager/connector-itests/src/test/java/org/apache/geronimo/components/connector/itests/ConnectorTest.java?rev=1074024&r1=1074023&r2=1074024&view=diff
==============================================================================
--- geronimo/sandbox/djencks/txmanager/connector-itests/src/test/java/org/apache/geronimo/components/connector/itests/ConnectorTest.java (original)
+++ geronimo/sandbox/djencks/txmanager/connector-itests/src/test/java/org/apache/geronimo/components/connector/itests/ConnectorTest.java Thu Feb 24 02:25:51 2011
@@ -16,6 +16,7 @@ import org.apache.geronimo.connector.ass
import org.apache.geronimo.connector.extender.ConnectorExtender;
import org.apache.geronimo.connector.mock.MockAdminObject;
import org.apache.geronimo.connector.mock.MockAdminObjectImpl;
+import org.apache.geronimo.connector.mock.MockConnectionFactory;
import org.apache.geronimo.connector.mock.MockManagedConnectionFactory;
import org.apache.geronimo.connector.mock.MockResourceAdapter;
import org.apache.geronimo.connector.model.AdminObjectInfo;
@@ -36,8 +37,11 @@ import org.ops4j.pax.exam.junit.JUnit4Te
import org.ops4j.pax.exam.options.MavenArtifactProvisionOption;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.component.ComponentFactory;
import static org.junit.Assert.assertEquals;
+import static org.ops4j.pax.exam.CoreOptions.bundle;
import static org.ops4j.pax.exam.CoreOptions.equinox;
import static org.ops4j.pax.exam.CoreOptions.options;
import static org.ops4j.pax.exam.CoreOptions.systemProperty;
@@ -107,10 +111,18 @@ public class ConnectorTest {
Assert.assertNotNull(bundleContext.getServiceReference(BootstrapContext.class.getName()));
Assert.assertNotNull(bundleContext.getServiceReference(ConnectionTracker.class.getName()));
+ //connectionmanager factory component
+ Assert.assertNotNull(bundleContext.getServiceReference(ComponentFactory.class.getName()));
+
+
//mock connector services
Assert.assertNotNull(bundleContext.getServiceReference(ResourceAdapter.class.getName()));
Assert.assertNotNull(bundleContext.getServiceReference(MockAdminObject.class.getName()));
Assert.assertNotNull(bundleContext.getServiceReference(ConnectionManagerContainer.class.getName()));
+ ServiceReference sr = bundleContext.getServiceReference(ConnectionManagerContainer.class.getName());
+ ConnectionManagerContainer cm = (ConnectionManagerContainer) bundleContext.getService(sr);
+ MockConnectionFactory cf = (MockConnectionFactory) cm.createConnectionFactory();
+ cf.getConnection();
}
private static InputStream raInputStream() throws ResourceException, IOException {
Modified: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/assembler/AssemblyListener.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/assembler/AssemblyListener.java?rev=1074024&r1=1074023&r2=1074024&view=diff
==============================================================================
--- geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/assembler/AssemblyListener.java (original)
+++ geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/assembler/AssemblyListener.java Thu Feb 24 02:25:51 2011
@@ -22,6 +22,7 @@ package org.apache.geronimo.connector.as
import javax.resource.spi.ManagedConnectionFactory;
import javax.resource.spi.ResourceAdapter;
+import org.apache.geronimo.connector.outbound.BaseConnectionManager;
import org.apache.geronimo.connector.outbound.GenericConnectionManager;
/**
@@ -34,6 +35,6 @@ public interface AssemblyListener {
void newAdminObject(String name, String adminObjectInterface, Object adminObject);
- void newManagedConnectionFactory(String name, ManagedConnectionFactory managedConnectionFactory, GenericConnectionManager connectionManager);
+ void newManagedConnectionFactory(String name, ManagedConnectionFactory managedConnectionFactory, BaseConnectionManager.Interceptors interceptors);
}
Modified: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/assembler/impl/AssemblerImpl.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/assembler/impl/AssemblerImpl.java?rev=1074024&r1=1074023&r2=1074024&view=diff
==============================================================================
--- geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/assembler/impl/AssemblerImpl.java (original)
+++ geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/assembler/impl/AssemblerImpl.java Thu Feb 24 02:25:51 2011
@@ -36,7 +36,9 @@ import org.apache.geronimo.connector.mod
import org.apache.geronimo.connector.model.ManagedConnectionFactoryInfo;
import org.apache.geronimo.connector.model.ResourceAdapterInfo;
import org.apache.geronimo.connector.model.ResourceAdapterModuleInfo;
+import org.apache.geronimo.connector.outbound.BaseConnectionManager;
import org.apache.geronimo.connector.outbound.GenericConnectionManager;
+import org.apache.geronimo.connector.outbound.InterceptorsImpl;
import org.apache.geronimo.connector.outbound.SubjectSource;
import org.apache.geronimo.connector.outbound.connectionmanagerconfig.LocalTransactions;
import org.apache.geronimo.connector.outbound.connectionmanagerconfig.NoPool;
@@ -103,17 +105,17 @@ public class AssemblerImpl implements As
}
TransactionSupport transactionSupport = transactionSupport(managedConnectionFactoryInfo.transactionSupport);
PoolingSupport poolingSupport = poolingSupport(managedConnectionFactoryInfo);
- GenericConnectionManager connectionManager = new GenericConnectionManager(transactionSupport,
+ BaseConnectionManager.Interceptors interceptors = new InterceptorsImpl(transactionSupport,
poolingSupport,
- subjectSource,
- connectionTracker,
- transactionManager,
- managedConnectionFactory,
+ null,
managedConnectionFactoryInfo.name,
+ null,
+ null,
+ managedConnectionFactory,
threadClassLoader);
for (AssemblyListener listener: listeners) {
- listener.newManagedConnectionFactory(managedConnectionFactoryInfo.name, managedConnectionFactory, connectionManager);
+ listener.newManagedConnectionFactory(managedConnectionFactoryInfo.name, managedConnectionFactory, interceptors);
}
}
Modified: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/extender/ConnectorExtender.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/extender/ConnectorExtender.java?rev=1074024&r1=1074023&r2=1074024&view=diff
==============================================================================
--- geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/extender/ConnectorExtender.java (original)
+++ geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/extender/ConnectorExtender.java Thu Feb 24 02:25:51 2011
@@ -27,11 +27,14 @@ import java.net.URL;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.geronimo.connector.model.ResourceAdapterModuleInfo;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleEvent;
import org.osgi.framework.Constants;
+import org.osgi.service.component.ComponentFactory;
import org.osgi.util.tracker.BundleTracker;
import org.osgi.util.tracker.BundleTrackerCustomizer;
@@ -44,6 +47,9 @@ public class ConnectorExtender {
public final static String PLAN_LOCATION = "OSGI-INF/connector/plan.ser";
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY, target = "(component.factory=org.apache.geronimo.connector.outbound.DSFactoryConnectionManager)")
+ private ComponentFactory cmFactory;
+
private BundleTracker bt;
@Activate
@@ -97,7 +103,7 @@ public class ConnectorExtender {
} catch (IOException e) {
}
if (moduleInfo != null) {
- Container container = new Container(bundle, moduleInfo);
+ Container container = new Container(bundle, moduleInfo, cmFactory);
//TODO use an executor
container.run();
return container;
@@ -115,4 +121,11 @@ public class ConnectorExtender {
}
+ public void setCmFactory(ComponentFactory cmFactory) {
+ this.cmFactory = cmFactory;
+ }
+
+ public void unsetCmFactory(ComponentFactory cmFactory) {
+ this.cmFactory = null;
+ }
}
Modified: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/extender/Container.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/extender/Container.java?rev=1074024&r1=1074023&r2=1074024&view=diff
==============================================================================
--- geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/extender/Container.java (original)
+++ geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/extender/Container.java Thu Feb 24 02:25:51 2011
@@ -25,17 +25,21 @@ import java.util.Dictionary;
import java.util.Hashtable;
import java.util.List;
+import javax.naming.spi.DirStateFactory;
import javax.resource.ResourceException;
import javax.resource.spi.ManagedConnectionFactory;
import javax.resource.spi.ResourceAdapter;
import org.apache.geronimo.connector.assembler.AssemblyListener;
import org.apache.geronimo.connector.assembler.impl.AssemblerImpl;
import org.apache.geronimo.connector.model.ResourceAdapterModuleInfo;
+import org.apache.geronimo.connector.outbound.BaseConnectionManager;
import org.apache.geronimo.connector.outbound.ConnectionManagerContainer;
+import org.apache.geronimo.connector.outbound.DSFactoryConnectionManager;
import org.apache.geronimo.connector.outbound.GenericConnectionManager;
import org.osgi.framework.Bundle;
import org.osgi.framework.ServiceFactory;
import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.component.ComponentFactory;
/**
* @version $Rev:$ $Date:$
@@ -44,12 +48,14 @@ public class Container implements Assemb
private final Bundle bundle;
private final ResourceAdapterModuleInfo moduleInfo;
+ private final ComponentFactory cmFactory;
private final List<ServiceRegistration> serviceRegistrations = new ArrayList<ServiceRegistration>();
- public Container(Bundle bundle, ResourceAdapterModuleInfo moduleInfo) {
+ public Container(Bundle bundle, ResourceAdapterModuleInfo moduleInfo, ComponentFactory cmFactory) {
this.bundle = bundle;
this.moduleInfo = moduleInfo;
+ this.cmFactory = cmFactory;
}
@Override
@@ -83,10 +89,12 @@ public class Container implements Assemb
}
@Override
- public void newManagedConnectionFactory(String name, ManagedConnectionFactory managedConnectionFactory, GenericConnectionManager connectionManager) {
- String[] interfaceNames = new String[] {ConnectionManagerContainer.class.getName()};
- Object service = new CMServiceFactory(connectionManager);
- registerService(interfaceNames, service);
+ public void newManagedConnectionFactory(String name, ManagedConnectionFactory managedConnectionFactory, BaseConnectionManager.Interceptors interceptors) {
+ Dictionary properties = new Hashtable();
+ properties.put(DSFactoryConnectionManager.INTERCEPTORS, interceptors);
+ properties.put(DSFactoryConnectionManager.MCF, managedConnectionFactory);
+ properties.put(DSFactoryConnectionManager.NAME, name);
+ cmFactory.newInstance(properties);
}
private void registerService(String[] interfaceNames, Object service) {
@@ -95,27 +103,4 @@ public class Container implements Assemb
serviceRegistrations.add(sr);
}
-
- private static class CMServiceFactory implements ServiceFactory {
-
- private final GenericConnectionManager cm;
-
- private CMServiceFactory(GenericConnectionManager cm) {
- this.cm = cm;
- }
-
- @Override
- public Object getService(Bundle bundle, ServiceRegistration serviceRegistration) {
- return cm;
- }
-
- @Override
- public void ungetService(Bundle bundle, ServiceRegistration serviceRegistration, Object o) {
- try {
- cm.doStop();
- } catch (Exception e) {
- //?
- }
- }
- }
}
Modified: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractSinglePoolConnectionInterceptor.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractSinglePoolConnectionInterceptor.java?rev=1074024&r1=1074023&r2=1074024&view=diff
==============================================================================
--- geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractSinglePoolConnectionInterceptor.java (original)
+++ geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractSinglePoolConnectionInterceptor.java Thu Feb 24 02:25:51 2011
@@ -30,7 +30,9 @@ import javax.resource.spi.ConnectionRequ
import javax.resource.spi.ManagedConnection;
import javax.resource.spi.ManagedConnectionFactory;
import javax.security.auth.Subject;
+import javax.transaction.TransactionManager;
+import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTracker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -65,6 +67,7 @@ public abstract class AbstractSinglePool
permits = new Semaphore(maxSize, true);
}
+ @Override
public void getConnection(ConnectionInfo connectionInfo) throws ResourceException {
if (connectionInfo.getManagedConnectionInfo().getManagedConnection() != null) {
if (log.isTraceEnabled()) {
@@ -100,6 +103,7 @@ public abstract class AbstractSinglePool
protected abstract void internalGetConnection(ConnectionInfo connectionInfo) throws ResourceException;
+ @Override
public void returnConnection(ConnectionInfo connectionInfo,
ConnectionReturnAction connectionReturnAction) {
if (log.isTraceEnabled()) {
@@ -190,6 +194,7 @@ public abstract class AbstractSinglePool
protected abstract void internalDestroy();
// Cancel the IdleReleaser TimerTask (fixes memory leak) and clean up the pool
+ @Override
public void destroy() {
destroyed = true;
if (idleReleaser != null)
@@ -198,6 +203,36 @@ public abstract class AbstractSinglePool
next.destroy();
}
+ @Override
+ public void setConnectionTracker(ConnectionTracker connectionTracker) {
+ next.setConnectionTracker(connectionTracker);
+ }
+
+ @Override
+ public void unsetConnectionTracker() {
+ next.unsetConnectionTracker();
+ }
+
+ @Override
+ public void setTransactionManager(TransactionManager transactionManager) {
+ next.setTransactionManager(transactionManager);
+ }
+
+ @Override
+ public void unsetTransactionManager() {
+ next.unsetTransactionManager();
+ }
+
+ @Override
+ public void setSubjectSource(SubjectSource subjectSource) {
+ next.setSubjectSource(subjectSource);
+ }
+
+ @Override
+ public void unsetSubjectSource() {
+ next.unsetSubjectSource();
+ }
+
public int getPartitionCount() {
return 1;
}
Copied: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/BaseConnectionManager.java (from r1071447, geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractConnectionManager.java)
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/BaseConnectionManager.java?p2=geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/BaseConnectionManager.java&p1=geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractConnectionManager.java&r1=1071447&r2=1074024&rev=1074024&view=diff
==============================================================================
--- geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractConnectionManager.java (original)
+++ geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/BaseConnectionManager.java Thu Feb 24 02:25:51 2011
@@ -23,27 +23,31 @@ import javax.resource.spi.ConnectionRequ
import javax.resource.spi.LazyAssociatableConnectionManager;
import javax.resource.spi.ManagedConnectionFactory;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.ReferencePolicy;
+import org.apache.felix.scr.annotations.Service;
import org.apache.geronimo.connector.outbound.connectionmanagerconfig.PoolingSupport;
import org.apache.geronimo.transaction.manager.RecoverableTransactionManager;
/**
* @version $Rev$ $Date$
*/
-public abstract class AbstractConnectionManager implements ConnectionManagerContainer, ConnectionManager, LazyAssociatableConnectionManager, PoolingAttributes {
- protected transient final Interceptors interceptors;
- private transient final RecoverableTransactionManager transactionManager;
- private transient final ManagedConnectionFactory managedConnectionFactory;
- private final String name;
+
+public class BaseConnectionManager implements ConnectionManagerContainer, ConnectionManager, LazyAssociatableConnectionManager, PoolingAttributes {
+ protected transient Interceptors interceptors;
+ private transient ManagedConnectionFactory managedConnectionFactory;
+
+ @Reference(cardinality = ReferenceCardinality.OPTIONAL_UNARY, policy = ReferencePolicy.DYNAMIC, target = "(service.ranking>=0)")
+ private transient RecoverableTransactionManager transactionManager;
+ private String name;
//default constructor to support externalizable subclasses
- public AbstractConnectionManager() {
- interceptors = null;
- transactionManager = null;
- managedConnectionFactory = null;
- this.name = null;
+ public BaseConnectionManager() {
}
- public AbstractConnectionManager(Interceptors interceptors, RecoverableTransactionManager transactionManager, ManagedConnectionFactory mcf, String name) {
+ public BaseConnectionManager(Interceptors interceptors, RecoverableTransactionManager transactionManager, ManagedConnectionFactory mcf, String name) {
this.interceptors = interceptors;
this.transactionManager = transactionManager;
this.managedConnectionFactory = mcf;
@@ -54,14 +58,6 @@ public abstract class AbstractConnection
return managedConnectionFactory.createConnectionFactory(this);
}
- protected ConnectionManager getConnectionManager() {
- return this;
- }
-
- public ManagedConnectionFactory getManagedConnectionFactory() {
- return managedConnectionFactory;
- }
-
public void doRecovery() {
if (!getIsRecoverable()) {
return;
@@ -114,6 +110,74 @@ public abstract class AbstractConnection
return getStack();
}
+ public Interceptors getInterceptors() {
+ return interceptors;
+ }
+
+ public void setInterceptors(Interceptors interceptors) {
+ this.interceptors = interceptors;
+ checkRecovery();
+ }
+
+ public void unsetInterceptors(Interceptors interceptors) {
+ this.interceptors = null;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ checkRecovery();
+ }
+
+ public RecoverableTransactionManager getTransactionManager() {
+ return transactionManager;
+ }
+
+ public void setTransactionManager(RecoverableTransactionManager transactionManager) {
+ this.transactionManager = transactionManager;
+ checkRecovery();
+ }
+
+ public void unsetTransactionManager(RecoverableTransactionManager transactionManager) {
+ this.transactionManager = null;
+ }
+
+
+ public ManagedConnectionFactory getManagedConnectionFactory() {
+ return managedConnectionFactory;
+ }
+
+ public void setManagedConnectionFactory(ManagedConnectionFactory managedConnectionFactory) {
+ this.managedConnectionFactory = managedConnectionFactory;
+ checkRecovery();
+ }
+
+ public void unsetManagedConnectionFactory(ManagedConnectionFactory managedConnectionFactory) {
+ this.managedConnectionFactory = null;
+ }
+
+ private void checkRecovery() {
+ if (interceptors != null) {
+ interceptors.getStack().setTransactionManager(transactionManager);
+ }
+ if (isComplete()) {
+ transactionManager.registerNamedXAResourceFactory(new OutboundNamedXAResourceFactory(name, getRecoveryStack(), managedConnectionFactory));
+ }
+ }
+
+ private void unregister() {
+ if (isComplete()) {
+ transactionManager.unregisterNamedXAResourceFactory(name);
+ }
+ }
+
+ private boolean isComplete() {
+ return name != null && transactionManager != null && interceptors != null && managedConnectionFactory != null && getIsRecoverable();
+ }
+
//statistics
public int getPartitionCount() {
@@ -185,10 +249,6 @@ public abstract class AbstractConnection
PoolingSupport getPoolingAttributes();
}
- public void doStart() throws Exception {
-
- }
-
public void doStop() throws Exception {
if (transactionManager != null) {
transactionManager.unregisterNamedXAResourceFactory(name);
@@ -196,10 +256,4 @@ public abstract class AbstractConnection
interceptors.getStack().destroy();
}
- public void doFail() {
- if (transactionManager != null) {
- transactionManager.unregisterNamedXAResourceFactory(name);
- }
- interceptors.getStack().destroy();
- }
}
Propchange: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/BaseConnectionManager.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/BaseConnectionManager.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/BaseConnectionManager.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionHandleInterceptor.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionHandleInterceptor.java?rev=1074024&r1=1074023&r2=1074024&view=diff
==============================================================================
--- geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionHandleInterceptor.java (original)
+++ geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionHandleInterceptor.java Thu Feb 24 02:25:51 2011
@@ -18,6 +18,8 @@
package org.apache.geronimo.connector.outbound;
import javax.resource.ResourceException;
+import javax.transaction.TransactionManager;
+import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTracker;
/**
* ConnectionHandleInterceptor.java
@@ -39,6 +41,7 @@ public class ConnectionHandleInterceptor
* @param connectionInfo
* @throws ResourceException
*/
+ @Override
public void getConnection(ConnectionInfo connectionInfo) throws ResourceException {
next.getConnection(connectionInfo);
ManagedConnectionInfo mci = connectionInfo.getManagedConnectionInfo();
@@ -63,6 +66,7 @@ public class ConnectionHandleInterceptor
* @param connectionInfo
* @param connectionReturnAction
*/
+ @Override
public void returnConnection(ConnectionInfo connectionInfo, ConnectionReturnAction connectionReturnAction) {
if (connectionInfo.getConnectionHandle() != null) {
connectionInfo.getManagedConnectionInfo().removeConnectionHandle(
@@ -71,10 +75,12 @@ public class ConnectionHandleInterceptor
next.returnConnection(connectionInfo, connectionReturnAction);
}
+ @Override
public void destroy() {
next.destroy();
}
+ @Override
public void info(StringBuilder s) {
s.append(getClass().getName()).append("\n");
if (next == null) {
@@ -83,4 +89,34 @@ public class ConnectionHandleInterceptor
next.info(s);
}
}
+
+ @Override
+ public void setConnectionTracker(ConnectionTracker connectionTracker) {
+ next.setConnectionTracker(connectionTracker);
+ }
+
+ @Override
+ public void unsetConnectionTracker() {
+ next.unsetConnectionTracker();
+ }
+
+ @Override
+ public void setTransactionManager(TransactionManager transactionManager) {
+ next.setTransactionManager(transactionManager);
+ }
+
+ @Override
+ public void unsetTransactionManager() {
+ next.unsetTransactionManager();
+ }
+
+ @Override
+ public void setSubjectSource(SubjectSource subjectSource) {
+ next.setSubjectSource(subjectSource);
+ }
+
+ @Override
+ public void unsetSubjectSource() {
+ next.unsetSubjectSource();
+ }
}
Modified: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionInterceptor.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionInterceptor.java?rev=1074024&r1=1074023&r2=1074024&view=diff
==============================================================================
--- geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionInterceptor.java (original)
+++ geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionInterceptor.java Thu Feb 24 02:25:51 2011
@@ -18,6 +18,8 @@
package org.apache.geronimo.connector.outbound;
import javax.resource.ResourceException;
+import javax.transaction.TransactionManager;
+import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTracker;
/**
* ConnectionInterceptor is the interface implemented by
@@ -38,4 +40,13 @@ public interface ConnectionInterceptor {
void info(StringBuilder s);
+ void setConnectionTracker(ConnectionTracker connectionTracker);
+ void unsetConnectionTracker();
+
+ void setTransactionManager(TransactionManager transactionManager);
+ void unsetTransactionManager();
+
+ void setSubjectSource(SubjectSource subjectSource);
+ void unsetSubjectSource();
+
} // ConnectionInterceptor
Modified: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionTrackingInterceptor.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionTrackingInterceptor.java?rev=1074024&r1=1074023&r2=1074024&view=diff
==============================================================================
--- geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionTrackingInterceptor.java (original)
+++ geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionTrackingInterceptor.java Thu Feb 24 02:25:51 2011
@@ -19,10 +19,12 @@ package org.apache.geronimo.connector.ou
import java.util.Collection;
import java.util.Iterator;
+import java.util.concurrent.atomic.AtomicReference;
import javax.resource.ResourceException;
import javax.resource.spi.DissociatableManagedConnection;
import javax.resource.spi.ManagedConnection;
+import javax.transaction.TransactionManager;
import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTracker;
@@ -40,7 +42,7 @@ public class ConnectionTrackingIntercept
private final ConnectionInterceptor next;
private final String key;
- private final ConnectionTracker connectionTracker;
+ private final AtomicReference<ConnectionTracker> connectionTracker = new AtomicReference<ConnectionTracker>();
public ConnectionTrackingInterceptor(
final ConnectionInterceptor next,
@@ -49,7 +51,7 @@ public class ConnectionTrackingIntercept
) {
this.next = next;
this.key = key;
- this.connectionTracker = connectionTracker;
+ this.connectionTracker.set(connectionTracker);
}
/**
@@ -62,18 +64,27 @@ public class ConnectionTrackingIntercept
* @throws ResourceException
*/
public void getConnection(ConnectionInfo connectionInfo) throws ResourceException {
- connectionTracker.setEnvironment(connectionInfo, key);
- next.getConnection(connectionInfo);
- connectionTracker.handleObtained(this, connectionInfo, false);
+ boolean reassociate = false;
+ doGetConnection(connectionInfo, reassociate);
}
/**
* Called when a proxied connection which has been released need to be reassociated with a real connection.
*/
public void reassociateConnection(ConnectionInfo connectionInfo) throws ResourceException {
- connectionTracker.setEnvironment(connectionInfo, key);
- next.getConnection(connectionInfo);
- connectionTracker.handleObtained(this, connectionInfo, true);
+ boolean reassociate = true;
+ doGetConnection(connectionInfo, reassociate);
+ }
+
+ private void doGetConnection(ConnectionInfo connectionInfo, boolean reassociate) throws ResourceException {
+ ConnectionTracker connectionTracker = this.connectionTracker.get();
+ if (connectionTracker != null) {
+ connectionTracker.setEnvironment(connectionInfo, key);
+ next.getConnection(connectionInfo);
+ connectionTracker.handleObtained(this, connectionInfo, reassociate);
+ } else {
+ next.getConnection(connectionInfo);
+ }
}
/**
@@ -87,7 +98,10 @@ public class ConnectionTrackingIntercept
public void returnConnection(
ConnectionInfo connectionInfo,
ConnectionReturnAction connectionReturnAction) {
- connectionTracker.handleReleased(this, connectionInfo, connectionReturnAction);
+ ConnectionTracker connectionTracker = this.connectionTracker.get();
+ if (connectionTracker != null) {
+ connectionTracker.handleReleased(this, connectionInfo, connectionReturnAction);
+ }
next.returnConnection(connectionInfo, connectionReturnAction);
}
@@ -133,4 +147,36 @@ public class ConnectionTrackingIntercept
}
}
+ @Override
+ public void setConnectionTracker(ConnectionTracker connectionTracker) {
+ this.connectionTracker.set(connectionTracker);
+ next.setConnectionTracker(connectionTracker);
+ }
+
+ @Override
+ public void unsetConnectionTracker() {
+ this.connectionTracker.set(null);
+ next.unsetConnectionTracker();
+ }
+
+ @Override
+ public void setTransactionManager(TransactionManager transactionManager) {
+ next.setTransactionManager(transactionManager);
+ }
+
+ @Override
+ public void unsetTransactionManager() {
+ next.unsetTransactionManager();
+ }
+
+ @Override
+ public void setSubjectSource(SubjectSource subjectSource) {
+ next.setSubjectSource(subjectSource);
+ }
+
+ @Override
+ public void unsetSubjectSource() {
+ next.unsetSubjectSource();
+ }
+
}
Added: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/DSFactoryConnectionManager.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/DSFactoryConnectionManager.java?rev=1074024&view=auto
==============================================================================
--- geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/DSFactoryConnectionManager.java (added)
+++ geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/DSFactoryConnectionManager.java Thu Feb 24 02:25:51 2011
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+package org.apache.geronimo.connector.outbound;
+
+import javax.resource.spi.ManagedConnectionFactory;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Modified;
+import org.apache.felix.scr.annotations.Properties;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.ReferencePolicy;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTracker;
+import org.osgi.service.component.ComponentContext;
+
+/**
+ * @version $Rev:$ $Date:$
+ */
+@Component(metatype = true, factory = "org.apache.geronimo.connector.outbound.DSFactoryConnectionManager")
+@Service
+@Properties({@Property(name = "transactionManager.target",
+ value = "(service.ranking>=0)"),
+ @Property(name = "connectionTracker.target",
+ value = "(service.ranking>=0)"),
+ @Property(name = "subjectSource.target",
+ value = "(service.ranking>=0)")})
+public class DSFactoryConnectionManager extends BaseConnectionManager {
+
+ @Reference(cardinality = ReferenceCardinality.OPTIONAL_UNARY, policy = ReferencePolicy.DYNAMIC, target = "(service.ranking>=0)")
+ private transient ConnectionTracker connectionTracker;
+
+ @Reference(cardinality = ReferenceCardinality.OPTIONAL_UNARY, policy = ReferencePolicy.DYNAMIC, target = "(service.ranking>=0)")
+ private transient SubjectSource subjectSource;
+
+ public static final String INTERCEPTORS = "interceptors";
+ public static final String MCF = "managedconnectionfactory";
+ public static final String NAME = "name";
+
+ @Activate
+ public void activate(ComponentContext componentContext) {
+ setName((String) componentContext.getProperties().get(NAME));
+ setManagedConnectionFactory((ManagedConnectionFactory) componentContext.getProperties().get(MCF));
+ setInterceptors((Interceptors) componentContext.getProperties().get(INTERCEPTORS));
+ if (connectionTracker != null) {
+ checkConnectionTracker();
+ }
+ if (subjectSource != null) {
+ checkSubjectSource();
+ }
+ }
+
+ @Deactivate
+ public void deactivate(ComponentContext componentContext) {
+
+ }
+
+ @Modified
+ public void modified(ComponentContext componentContext) {
+
+ }
+
+ public void setConnectionTracker(ConnectionTracker connectionTracker) {
+ this.connectionTracker = connectionTracker;
+ checkConnectionTracker();
+ }
+
+ public void unsetConnectionTracker(ConnectionTracker connectionTracker) {
+ if (this.connectionTracker == connectionTracker) {
+ this.connectionTracker = null;
+ checkConnectionTracker();
+ }
+ }
+
+ public void setSubjectSource(SubjectSource subjectSource) {
+ this.subjectSource = subjectSource;
+ checkSubjectSource();
+ }
+
+ public void unsetSubjectSource(SubjectSource subjectSource) {
+ if (this.subjectSource == subjectSource) {
+ this.subjectSource = null;
+ checkSubjectSource();
+ }
+ }
+
+ private void checkConnectionTracker() {
+ if (interceptors != null) {
+ interceptors.getStack().setConnectionTracker(connectionTracker);
+ }
+ }
+
+ private void checkSubjectSource() {
+ if (interceptors != null) {
+ interceptors.getStack().setSubjectSource(subjectSource);
+ }
+ }
+
+}
Modified: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/GenericConnectionManager.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/GenericConnectionManager.java?rev=1074024&r1=1074023&r2=1074024&view=diff
==============================================================================
--- geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/GenericConnectionManager.java (original)
+++ geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/GenericConnectionManager.java Thu Feb 24 02:25:51 2011
@@ -18,14 +18,9 @@
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;
@@ -37,7 +32,7 @@ import org.slf4j.LoggerFactory;
*
* @version $Rev$ $Date$
*/
-public class GenericConnectionManager extends AbstractConnectionManager {
+public class GenericConnectionManager extends BaseConnectionManager {
protected static final Logger log = LoggerFactory.getLogger(GenericConnectionManager.class);
//default constructor to support externalizable subclasses
@@ -67,113 +62,4 @@ public class GenericConnectionManager ex
super(new InterceptorsImpl(transactionSupport, pooling, subjectSource, name, connectionTracker, transactionManager, mcf, classLoader), transactionManager, mcf, name);
}
- private static class InterceptorsImpl implements AbstractConnectionManager.Interceptors {
-
- private final ConnectionInterceptor stack;
- private final ConnectionInterceptor recoveryStack;
- private final PoolingSupport poolingSupport;
-
- /**
- * Order of constructed interceptors:
- * <p/>
- * ConnectionTrackingInterceptor (connectionTracker != null)
- * TCCLInterceptor
- * ConnectionHandleInterceptor
- * TransactionCachingInterceptor (useTransactions & useTransactionCaching)
- * TransactionEnlistingInterceptor (useTransactions)
- * SubjectInterceptor (realmBridge != null)
- * SinglePoolConnectionInterceptor or MultiPoolConnectionInterceptor
- * LocalXAResourceInsertionInterceptor or XAResourceInsertionInterceptor (useTransactions (&localTransactions))
- * MCFConnectionInterceptor
- */
- public InterceptorsImpl(TransactionSupport transactionSupport,
- PoolingSupport pooling,
- SubjectSource subjectSource,
- String name,
- ConnectionTracker connectionTracker,
- TransactionManager transactionManager,
- 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;
-
- stack = transactionSupport.addXAResourceInsertionInterceptor(stack, name);
- stack = pooling.addPoolingInterceptors(stack);
- if (log.isTraceEnabled()) {
- log.trace("Connection Manager " + name + " installed pool " + stack);
- }
-
- this.poolingSupport = pooling;
- stack = transactionSupport.addTransactionInterceptors(stack, transactionManager);
-
- if (subjectSource != null) {
- stack = new SubjectInterceptor(stack, subjectSource);
- }
-
- if (transactionSupport.isRecoverable()) {
- this.recoveryStack = new TCCLInterceptor(stack, classLoader);
- } else {
- this.recoveryStack = null;
- }
-
-
- stack = new ConnectionHandleInterceptor(stack);
- stack = new TCCLInterceptor(stack, classLoader);
- if (connectionTracker != null) {
- stack = new ConnectionTrackingInterceptor(stack,
- name,
- connectionTracker);
- }
- tail.setStack(stack);
- this.stack = stack;
- if (log.isDebugEnabled()) {
- StringBuilder s = new StringBuilder("ConnectionManager Interceptor stack;\n");
- stack.info(s);
- log.debug(s.toString());
- }
- }
-
- public ConnectionInterceptor getStack() {
- return stack;
- }
-
- public ConnectionInterceptor getRecoveryStack() {
- return recoveryStack;
- }
-
- public PoolingSupport getPoolingAttributes() {
- return poolingSupport;
- }
-
- }
-
}
Added: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/InterceptorsImpl.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/InterceptorsImpl.java?rev=1074024&view=auto
==============================================================================
--- geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/InterceptorsImpl.java (added)
+++ geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/InterceptorsImpl.java Thu Feb 24 02:25:51 2011
@@ -0,0 +1,143 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+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;
+
+/**
+* @version $Rev:$ $Date:$
+*/
+public class InterceptorsImpl implements BaseConnectionManager.Interceptors {
+
+ private final ConnectionInterceptor stack;
+ private final ConnectionInterceptor recoveryStack;
+ private final PoolingSupport poolingSupport;
+
+ /**
+ * Order of constructed interceptors:
+ * <p/>
+ * ConnectionTrackingInterceptor (connectionTracker != null)
+ * TCCLInterceptor
+ * ConnectionHandleInterceptor
+ * TransactionCachingInterceptor (useTransactions & useTransactionCaching)
+ * TransactionEnlistingInterceptor (useTransactions)
+ * SubjectInterceptor (realmBridge != null)
+ * SinglePoolConnectionInterceptor or MultiPoolConnectionInterceptor
+ * LocalXAResourceInsertionInterceptor or XAResourceInsertionInterceptor (useTransactions (&localTransactions))
+ * MCFConnectionInterceptor
+ */
+ public InterceptorsImpl(TransactionSupport transactionSupport,
+ PoolingSupport pooling,
+ SubjectSource subjectSource,
+ String name,
+ ConnectionTracker connectionTracker,
+ TransactionManager transactionManager,
+ 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();
+ GenericConnectionManager.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 {
+ GenericConnectionManager.log.info("No runtime TransactionSupport");
+ }
+
+ //Set up the interceptor stack
+ MCFConnectionInterceptor tail = new MCFConnectionInterceptor();
+ ConnectionInterceptor stack = tail;
+
+ stack = transactionSupport.addXAResourceInsertionInterceptor(stack, name);
+ stack = pooling.addPoolingInterceptors(stack);
+ if (GenericConnectionManager.log.isTraceEnabled()) {
+ GenericConnectionManager.log.trace("Connection Manager " + name + " installed pool " + stack);
+ }
+
+ this.poolingSupport = pooling;
+ stack = transactionSupport.addTransactionInterceptors(stack, transactionManager);
+
+ if (subjectSource != null) {
+ stack = new SubjectInterceptor(stack, subjectSource);
+ }
+
+ if (transactionSupport.isRecoverable()) {
+ this.recoveryStack = new TCCLInterceptor(stack, classLoader);
+ } else {
+ this.recoveryStack = null;
+ }
+
+
+ stack = new ConnectionHandleInterceptor(stack);
+ stack = new TCCLInterceptor(stack, classLoader);
+ if (connectionTracker != null) {
+ stack = new ConnectionTrackingInterceptor(stack,
+ name,
+ connectionTracker);
+ }
+ tail.setStack(stack);
+ this.stack = stack;
+ if (GenericConnectionManager.log.isDebugEnabled()) {
+ StringBuilder s = new StringBuilder("ConnectionManager Interceptor stack;\n");
+ stack.info(s);
+ GenericConnectionManager.log.debug(s.toString());
+ }
+ }
+
+ public ConnectionInterceptor getStack() {
+ return stack;
+ }
+
+ public ConnectionInterceptor getRecoveryStack() {
+ return recoveryStack;
+ }
+
+ public PoolingSupport getPoolingAttributes() {
+ return poolingSupport;
+ }
+
+}
Modified: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/LocalXAResourceInsertionInterceptor.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/LocalXAResourceInsertionInterceptor.java?rev=1074024&r1=1074023&r2=1074024&view=diff
==============================================================================
--- geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/LocalXAResourceInsertionInterceptor.java (original)
+++ geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/LocalXAResourceInsertionInterceptor.java Thu Feb 24 02:25:51 2011
@@ -18,6 +18,8 @@
package org.apache.geronimo.connector.outbound;
import javax.resource.ResourceException;
+import javax.transaction.TransactionManager;
+import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTracker;
/**
* LocalXAResourceInsertionInterceptor.java
@@ -37,6 +39,7 @@ public class LocalXAResourceInsertionInt
this.name = name;
}
+ @Override
public void getConnection(ConnectionInfo connectionInfo) throws ResourceException {
next.getConnection(connectionInfo);
ManagedConnectionInfo mci = connectionInfo.getManagedConnectionInfo();
@@ -44,16 +47,19 @@ public class LocalXAResourceInsertionInt
new LocalXAResource(mci.getManagedConnection().getLocalTransaction(), name));
}
+ @Override
public void returnConnection(
ConnectionInfo connectionInfo,
ConnectionReturnAction connectionReturnAction) {
next.returnConnection(connectionInfo, connectionReturnAction);
}
+ @Override
public void destroy() {
next.destroy();
}
+ @Override
public void info(StringBuilder s) {
s.append(getClass().getName()).append("[name=").append(name).append("]\n");
if (next == null) {
@@ -63,4 +69,34 @@ public class LocalXAResourceInsertionInt
}
}
+ @Override
+ public void setConnectionTracker(ConnectionTracker connectionTracker) {
+ next.setConnectionTracker(connectionTracker);
+ }
+
+ @Override
+ public void unsetConnectionTracker() {
+ next.unsetConnectionTracker();
+ }
+
+ @Override
+ public void setTransactionManager(TransactionManager transactionManager) {
+ next.setTransactionManager(transactionManager);
+ }
+
+ @Override
+ public void unsetTransactionManager() {
+ next.unsetTransactionManager();
+ }
+
+ @Override
+ public void setSubjectSource(SubjectSource subjectSource) {
+ next.setSubjectSource(subjectSource);
+ }
+
+ @Override
+ public void unsetSubjectSource() {
+ next.unsetSubjectSource();
+ }
+
}
Modified: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/MCFConnectionInterceptor.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/MCFConnectionInterceptor.java?rev=1074024&r1=1074023&r2=1074024&view=diff
==============================================================================
--- geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/MCFConnectionInterceptor.java (original)
+++ geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/MCFConnectionInterceptor.java Thu Feb 24 02:25:51 2011
@@ -19,7 +19,9 @@ package org.apache.geronimo.connector.ou
import javax.resource.ResourceException;
import javax.resource.spi.ManagedConnection;
+import javax.transaction.TransactionManager;
+import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTracker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -38,6 +40,7 @@ public class MCFConnectionInterceptor im
public MCFConnectionInterceptor() {
}
+ @Override
public void getConnection(ConnectionInfo connectionInfo) throws ResourceException {
ManagedConnectionInfo mci = connectionInfo.getManagedConnectionInfo();
if (mci.getManagedConnection() != null) {
@@ -58,6 +61,7 @@ public class MCFConnectionInterceptor im
}
}
+ @Override
public void returnConnection(
ConnectionInfo connectionInfo,
ConnectionReturnAction connectionReturnAction) {
@@ -74,6 +78,7 @@ public class MCFConnectionInterceptor im
}
}
+ @Override
public void destroy() {
// MCF is the "tail" of the stack. So, we're all done...
}
@@ -82,9 +87,33 @@ public class MCFConnectionInterceptor im
this.stack = stack;
}
+ @Override
public void info(StringBuilder s) {
s.append(getClass().getName()).append("[stack=").append(stack).append("]\n");
s.append("<end>");
}
+ @Override
+ public void setConnectionTracker(ConnectionTracker connectionTracker) {
+ }
+
+ @Override
+ public void unsetConnectionTracker() {
+ }
+
+ @Override
+ public void setTransactionManager(TransactionManager transactionManager) {
+ }
+
+ @Override
+ public void unsetTransactionManager() {
+ }
+
+ @Override
+ public void setSubjectSource(SubjectSource subjectSource) {
+ }
+
+ @Override
+ public void unsetSubjectSource() {
+ }
}
Modified: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/MultiPoolConnectionInterceptor.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/MultiPoolConnectionInterceptor.java?rev=1074024&r1=1074023&r2=1074024&view=diff
==============================================================================
--- geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/MultiPoolConnectionInterceptor.java (original)
+++ geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/MultiPoolConnectionInterceptor.java Thu Feb 24 02:25:51 2011
@@ -23,8 +23,10 @@ import java.util.Map;
import javax.resource.ResourceException;
import javax.resource.spi.ConnectionRequestInfo;
import javax.security.auth.Subject;
+import javax.transaction.TransactionManager;
import org.apache.geronimo.connector.outbound.connectionmanagerconfig.PoolingSupport;
+import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTracker;
/**
* MultiPoolConnectionInterceptor maps the provided subject and connection request info to a
@@ -60,6 +62,7 @@ public class MultiPoolConnectionIntercep
this.useCRI = useCRI;
}
+ @Override
public void getConnection(ConnectionInfo connectionInfo) throws ResourceException {
ManagedConnectionInfo mci = connectionInfo.getManagedConnectionInfo();
SubjectCRIKey key =
@@ -82,6 +85,7 @@ public class MultiPoolConnectionIntercep
}
// let underlying pools handle destroyed processing...
+ @Override
public void returnConnection(
ConnectionInfo connectionInfo,
ConnectionReturnAction connectionReturnAction) {
@@ -102,14 +106,17 @@ public class MultiPoolConnectionIntercep
next.destroy();
}
+ @Override
public int getPartitionCount() {
return pools.size();
}
+ @Override
public int getPartitionMaxSize() {
return singlePoolFactory.getPartitionMaxSize();
}
+ @Override
public void setPartitionMaxSize(int maxSize) throws InterruptedException {
singlePoolFactory.setPartitionMaxSize(maxSize);
for (PoolingAttributes poolingAttributes : pools.values()) {
@@ -117,10 +124,12 @@ public class MultiPoolConnectionIntercep
}
}
+ @Override
public int getPartitionMinSize() {
return singlePoolFactory.getPartitionMinSize();
}
+ @Override
public void setPartitionMinSize(int minSize) {
singlePoolFactory.setPartitionMinSize(minSize);
for (PoolingAttributes poolingAttributes : pools.values()) {
@@ -128,6 +137,7 @@ public class MultiPoolConnectionIntercep
}
}
+ @Override
public int getIdleConnectionCount() {
int count = 0;
for (PoolingAttributes poolingAttributes : pools.values()) {
@@ -136,6 +146,7 @@ public class MultiPoolConnectionIntercep
return count;
}
+ @Override
public int getConnectionCount() {
int count = 0;
for (PoolingAttributes poolingAttributes : pools.values()) {
@@ -144,10 +155,12 @@ public class MultiPoolConnectionIntercep
return count;
}
+ @Override
public int getBlockingTimeoutMilliseconds() {
return singlePoolFactory.getBlockingTimeoutMilliseconds();
}
+ @Override
public void setBlockingTimeoutMilliseconds(int timeoutMilliseconds) {
singlePoolFactory.setBlockingTimeoutMilliseconds(timeoutMilliseconds);
for (PoolingAttributes poolingAttributes : pools.values()) {
@@ -155,10 +168,12 @@ public class MultiPoolConnectionIntercep
}
}
+ @Override
public int getIdleTimeoutMinutes() {
return singlePoolFactory.getIdleTimeoutMinutes();
}
+ @Override
public void setIdleTimeoutMinutes(int idleTimeoutMinutes) {
singlePoolFactory.setIdleTimeoutMinutes(idleTimeoutMinutes);
for (PoolingAttributes poolingAttributes : pools.values()) {
@@ -166,11 +181,41 @@ public class MultiPoolConnectionIntercep
}
}
+ @Override
public void info(StringBuilder s) {
s.append(getClass().getName()).append("[useSubject=").append(useSubject).append(",useCRI=").append(useCRI).append(",pool count=").append(pools.size()).append("]\n");
next.info(s);
}
+ @Override
+ public void setConnectionTracker(ConnectionTracker connectionTracker) {
+ next.setConnectionTracker(connectionTracker);
+ }
+
+ @Override
+ public void unsetConnectionTracker() {
+ next.unsetConnectionTracker();
+ }
+
+ @Override
+ public void setTransactionManager(TransactionManager transactionManager) {
+ next.setTransactionManager(transactionManager);
+ }
+
+ @Override
+ public void unsetTransactionManager() {
+ next.unsetTransactionManager();
+ }
+
+ @Override
+ public void setSubjectSource(SubjectSource subjectSource) {
+ next.setSubjectSource(subjectSource);
+ }
+
+ @Override
+ public void unsetSubjectSource() {
+ next.unsetSubjectSource();
+ }
static class SubjectCRIKey {
private final Subject subject;
Modified: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/SubjectInterceptor.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/SubjectInterceptor.java?rev=1074024&r1=1074023&r2=1074024&view=diff
==============================================================================
--- geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/SubjectInterceptor.java (original)
+++ geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/SubjectInterceptor.java Thu Feb 24 02:25:51 2011
@@ -17,9 +17,13 @@
package org.apache.geronimo.connector.outbound;
+import java.util.concurrent.atomic.AtomicReference;
+
import javax.resource.ResourceException;
import javax.resource.spi.ApplicationServerInternalException;
import javax.security.auth.Subject;
+import javax.transaction.TransactionManager;
+import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTracker;
/**
* SubjectInterceptor.java This is installed only when the plan includes a container-managed-security element.
@@ -32,16 +36,21 @@ import javax.security.auth.Subject;
public class SubjectInterceptor implements ConnectionInterceptor {
private final ConnectionInterceptor next;
- private final SubjectSource subjectSource;
+ private final AtomicReference<SubjectSource> subjectSource = new AtomicReference<SubjectSource>();
public SubjectInterceptor(final ConnectionInterceptor next, final SubjectSource subjectSource) {
this.next = next;
- this.subjectSource = subjectSource;
+ this.subjectSource.set(subjectSource);
}
+ @Override
public void getConnection(ConnectionInfo connectionInfo) throws ResourceException {
Subject currentSubject = null;
if (!connectionInfo.isApplicationManagedSecurity()) {
+ SubjectSource subjectSource = this.subjectSource.get();
+ if (subjectSource == null) {
+ throw new ResourceException("No subject source registered for container managed security");
+ }
try {
currentSubject = subjectSource.getSubject();
} catch (SecurityException e) {
@@ -89,19 +98,53 @@ public class SubjectInterceptor implemen
}
}
+ @Override
public void returnConnection(
ConnectionInfo connectionInfo,
ConnectionReturnAction connectionReturnAction) {
next.returnConnection(connectionInfo, connectionReturnAction);
}
+ @Override
public void destroy() {
next.destroy();
}
+ @Override
public void info(StringBuilder s) {
s.append(getClass().getName()).append("[subjectSource=").append(subjectSource).append("]\n");
next.info(s);
}
+ @Override
+ public void setConnectionTracker(ConnectionTracker connectionTracker) {
+ next.setConnectionTracker(connectionTracker);
+ }
+
+ @Override
+ public void unsetConnectionTracker() {
+ next.unsetConnectionTracker();
+ }
+
+ @Override
+ public void setTransactionManager(TransactionManager transactionManager) {
+ next.setTransactionManager(transactionManager);
+ }
+
+ @Override
+ public void unsetTransactionManager() {
+ next.unsetTransactionManager();
+ }
+
+ @Override
+ public void setSubjectSource(SubjectSource subjectSource) {
+ this.subjectSource.set(subjectSource);
+ next.setSubjectSource(subjectSource);
+ }
+
+ @Override
+ public void unsetSubjectSource() {
+ this.subjectSource.set(null);
+ next.unsetSubjectSource();
+ }
}
Modified: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/TCCLInterceptor.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/TCCLInterceptor.java?rev=1074024&r1=1074023&r2=1074024&view=diff
==============================================================================
--- geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/TCCLInterceptor.java (original)
+++ geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/TCCLInterceptor.java Thu Feb 24 02:25:51 2011
@@ -17,6 +17,8 @@
package org.apache.geronimo.connector.outbound;
import javax.resource.ResourceException;
+import javax.transaction.TransactionManager;
+import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTracker;
/**
* @version $Rev$ $Date$
@@ -31,6 +33,7 @@ public class TCCLInterceptor implements
}
+ @Override
public void getConnection(ConnectionInfo connectionInfo) throws ResourceException {
Thread currentThread = Thread.currentThread();
ClassLoader oldClassLoader = currentThread.getContextClassLoader();
@@ -42,6 +45,7 @@ public class TCCLInterceptor implements
}
}
+ @Override
public void returnConnection(ConnectionInfo connectionInfo, ConnectionReturnAction connectionReturnAction) {
Thread currentThread = Thread.currentThread();
ClassLoader oldClassLoader = currentThread.getContextClassLoader();
@@ -53,13 +57,45 @@ public class TCCLInterceptor implements
}
}
+ @Override
public void destroy() {
this.next.destroy();
}
+ @Override
public void info(StringBuilder s) {
s.append(getClass().getName()).append("[classLoader=").append(classLoader).append("]\n");
next.info(s);
}
-
+
+ @Override
+ public void setConnectionTracker(ConnectionTracker connectionTracker) {
+ next.setConnectionTracker(connectionTracker);
+ }
+
+ @Override
+ public void unsetConnectionTracker() {
+ next.unsetConnectionTracker();
+ }
+
+ @Override
+ public void setTransactionManager(TransactionManager transactionManager) {
+ next.setTransactionManager(transactionManager);
+ }
+
+ @Override
+ public void unsetTransactionManager() {
+ next.unsetTransactionManager();
+ }
+
+ @Override
+ public void setSubjectSource(SubjectSource subjectSource) {
+ next.setSubjectSource(subjectSource);
+ }
+
+ @Override
+ public void unsetSubjectSource() {
+ next.unsetSubjectSource();
+ }
+
}
Modified: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ThreadLocalCachingConnectionInterceptor.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ThreadLocalCachingConnectionInterceptor.java?rev=1074024&r1=1074023&r2=1074024&view=diff
==============================================================================
--- geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ThreadLocalCachingConnectionInterceptor.java (original)
+++ geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ThreadLocalCachingConnectionInterceptor.java Thu Feb 24 02:25:51 2011
@@ -20,6 +20,8 @@ package org.apache.geronimo.connector.ou
import java.util.Collections;
import javax.resource.ResourceException;
+import javax.transaction.TransactionManager;
+import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTracker;
/**
*
@@ -40,6 +42,7 @@ public class ThreadLocalCachingConnectio
}
+ @Override
public void getConnection(ConnectionInfo connectionInfo) throws ResourceException {
if (connectionInfo.isUnshareable()) {
next.getConnection(connectionInfo);
@@ -71,6 +74,7 @@ public class ThreadLocalCachingConnectio
connections.set(connectionInfo.getManagedConnectionInfo());
}
+ @Override
public void returnConnection(ConnectionInfo connectionInfo, ConnectionReturnAction connectionReturnAction) {
if (connectionReturnAction == ConnectionReturnAction.DESTROY
|| connectionInfo.isUnshareable()
@@ -82,13 +86,45 @@ public class ThreadLocalCachingConnectio
}
}
+ @Override
public void destroy() {
next.destroy();
}
+ @Override
public void info(StringBuilder s) {
s.append(getClass().getName()).append("[matchConnections=").append(matchConnections).append("]\n");
next.info(s);
}
-
+
+ @Override
+ public void setConnectionTracker(ConnectionTracker connectionTracker) {
+ next.setConnectionTracker(connectionTracker);
+ }
+
+ @Override
+ public void unsetConnectionTracker() {
+ next.unsetConnectionTracker();
+ }
+
+ @Override
+ public void setTransactionManager(TransactionManager transactionManager) {
+ next.setTransactionManager(transactionManager);
+ }
+
+ @Override
+ public void unsetTransactionManager() {
+ next.unsetTransactionManager();
+ }
+
+ @Override
+ public void setSubjectSource(SubjectSource subjectSource) {
+ next.setSubjectSource(subjectSource);
+ }
+
+ @Override
+ public void unsetSubjectSource() {
+ next.unsetSubjectSource();
+ }
+
}
Modified: geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptor.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptor.java?rev=1074024&r1=1074023&r2=1074024&view=diff
==============================================================================
--- geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptor.java (original)
+++ geronimo/sandbox/djencks/txmanager/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptor.java Thu Feb 24 02:25:51 2011
@@ -19,6 +19,7 @@ package org.apache.geronimo.connector.ou
import java.util.HashSet;
import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
import javax.resource.ResourceException;
import javax.transaction.SystemException;
@@ -27,6 +28,7 @@ import javax.transaction.TransactionMana
import org.apache.geronimo.connector.ConnectionReleaser;
import org.apache.geronimo.connector.ConnectorTransactionContext;
+import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTracker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -54,19 +56,20 @@ public class TransactionCachingIntercept
protected static Logger log = LoggerFactory.getLogger(TransactionCachingInterceptor.class.getName());
private final ConnectionInterceptor next;
- private final TransactionManager transactionManager;
+ private final AtomicReference<TransactionManager> transactionManager = new AtomicReference<TransactionManager>();
public TransactionCachingInterceptor(ConnectionInterceptor next, TransactionManager transactionManager) {
this.next = next;
- this.transactionManager = transactionManager;
+ this.transactionManager.set(transactionManager);
}
+ @Override
public void getConnection(ConnectionInfo connectionInfo) throws ResourceException {
//There can be an inactive transaction context when a connection is requested in
//Synchronization.afterCompletion().
// get the current transaction and status... if there is a problem just assume there is no transaction present
- Transaction transaction = TxUtil.getTransactionIfActive(transactionManager);
+ Transaction transaction = TxUtil.getTransactionIfActive(transactionManager.get());
if (transaction != null) {
ManagedConnectionInfos managedConnectionInfos = ConnectorTransactionContext.get(transaction, this);
if (connectionInfo.isUnshareable()) {
@@ -110,6 +113,7 @@ public class TransactionCachingIntercept
}
}
+ @Override
public void returnConnection(ConnectionInfo connectionInfo, ConnectionReturnAction connectionReturnAction) {
if (connectionReturnAction == ConnectionReturnAction.DESTROY) {
@@ -121,20 +125,23 @@ public class TransactionCachingIntercept
}
Transaction transaction;
try {
- transaction = transactionManager.getTransaction();
- if (transaction != null) {
- if (TxUtil.isActive(transaction)) {
+ TransactionManager transactionManager = this.transactionManager.get();
+ if (transactionManager != null) {
+ transaction = transactionManager.getTransaction();
+ if (transaction != null) {
+ if (TxUtil.isActive(transaction)) {
+ if (log.isTraceEnabled()) {
+ log.trace("tx active, not returning connection " + infoString(connectionInfo));
+ }
+ return;
+ }
+ //We are called from an afterCompletion synchronization. Remove the MCI from the ManagedConnectionInfos
+ //so we don't close it twice
+ ManagedConnectionInfos managedConnectionInfos = ConnectorTransactionContext.get(transaction, this);
+ managedConnectionInfos.remove(connectionInfo.getManagedConnectionInfo());
if (log.isTraceEnabled()) {
- log.trace("tx active, not returning connection " + infoString(connectionInfo));
+ log.trace("tx ended, return during synchronization afterCompletion " + infoString(connectionInfo));
}
- return;
- }
- //We are called from an afterCompletion synchronization. Remove the MCI from the ManagedConnectionInfos
- //so we don't close it twice
- ManagedConnectionInfos managedConnectionInfos = ConnectorTransactionContext.get(transaction, this);
- managedConnectionInfos.remove(connectionInfo.getManagedConnectionInfo());
- if (log.isTraceEnabled()) {
- log.trace("tx ended, return during synchronization afterCompletion " + infoString(connectionInfo));
}
}
} catch (SystemException e) {
@@ -160,10 +167,12 @@ public class TransactionCachingIntercept
}
}
+ @Override
public void destroy() {
next.destroy();
}
+ @Override
public void afterCompletion(Object stuff) {
ManagedConnectionInfos managedConnectionInfos = (ManagedConnectionInfos) stuff;
ManagedConnectionInfo sharedMCI = managedConnectionInfos.getShared();
@@ -191,11 +200,44 @@ public class TransactionCachingIntercept
return "for tx caching interceptor " + this + " " + connectionInfo;
}
+ @Override
public void info(StringBuilder s) {
s.append(getClass().getName()).append("[transactionManager=").append(transactionManager).append("]\n");
next.info(s);
}
-
+
+ @Override
+ public void setConnectionTracker(ConnectionTracker connectionTracker) {
+ next.setConnectionTracker(connectionTracker);
+ }
+
+ @Override
+ public void unsetConnectionTracker() {
+ next.unsetConnectionTracker();
+ }
+
+ @Override
+ public void setTransactionManager(TransactionManager transactionManager) {
+ this.transactionManager.set(transactionManager);
+ next.setTransactionManager(transactionManager);
+ }
+
+ @Override
+ public void unsetTransactionManager() {
+ this.transactionManager.set(null);
+ next.unsetTransactionManager();
+ }
+
+ @Override
+ public void setSubjectSource(SubjectSource subjectSource) {
+ next.setSubjectSource(subjectSource);
+ }
+
+ @Override
+ public void unsetSubjectSource() {
+ next.unsetSubjectSource();
+ }
+
public static class ManagedConnectionInfos {
private ManagedConnectionInfo shared;
private Set<ManagedConnectionInfo> unshared = new HashSet<ManagedConnectionInfo>(1);