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 2005/02/01 01:42:01 UTC
svn commit: r149334 -
geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptor.java
Author: djencks
Date: Mon Jan 31 16:41:59 2005
New Revision: 149334
URL: http://svn.apache.org/viewcvs?view=rev&rev=149334
Log:
GERONIMO-561 Don't add a connection to an inactive transaction context
Modified:
geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptor.java
Modified: geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptor.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptor.java?view=diff&r1=149333&r2=149334
==============================================================================
--- geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptor.java (original)
+++ geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptor.java Mon Jan 31 16:41:59 2005
@@ -32,18 +32,18 @@
* TransactionCachingInterceptor.java
* TODO: This implementation does not take account of unshareable resources
* TODO: This implementation does not take account of application security
- * where several connections with different security info are obtained.
+ * where several connections with different security info are obtained.
* TODO: This implementation does not take account of container managed security where,
- * within one transaction, a security domain boundary is crossed
+ * within one transaction, a security domain boundary is crossed
* and connections are obtained with two (or more) different subjects.
- *
+ * <p/>
* I suggest a state pattern, with the state set in a threadlocal upon entering a component,
* will be a usable implementation.
- *
+ * <p/>
* The afterCompletion method will need to move to an interface, and that interface include the
* security info to distinguish connections.
- *
- *
+ * <p/>
+ * <p/>
* Created: Mon Sep 29 15:07:07 2003
*
* @version 1.0
@@ -60,30 +60,32 @@
public void getConnection(ConnectionInfo connectionInfo) throws ResourceException {
TransactionContext transactionContext = transactionContextManager.getContext();
- if (transactionContext == null) {
+ //There can be an inactive transaction context when a connection is requested in
+ //Synchronization.afterCompletion().
+ if (transactionContext == null || !transactionContext.isActive()) {
next.getConnection(connectionInfo);
} else {
- ManagedConnectionInfos managedConnectionInfos = (ManagedConnectionInfos) transactionContext.getManagedConnectionInfo(this);
- if (managedConnectionInfos == null) {
- managedConnectionInfos = new ManagedConnectionInfos();
- transactionContext.setManagedConnectionInfo(this, managedConnectionInfos);
- }
- if (connectionInfo.isUnshareable()) {
- if (!managedConnectionInfos.containsUnshared(connectionInfo.getManagedConnectionInfo())) {
- next.getConnection(connectionInfo);
- managedConnectionInfos.addUnshared(connectionInfo.getManagedConnectionInfo());
+ ManagedConnectionInfos managedConnectionInfos = (ManagedConnectionInfos) transactionContext.getManagedConnectionInfo(this);
+ if (managedConnectionInfos == null) {
+ managedConnectionInfos = new ManagedConnectionInfos();
+ transactionContext.setManagedConnectionInfo(this, managedConnectionInfos);
}
- } else {
- ManagedConnectionInfo managedConnectionInfo = managedConnectionInfos.getShared();
- if (managedConnectionInfo != null) {
- connectionInfo.setManagedConnectionInfo(managedConnectionInfo);
- return;
+ if (connectionInfo.isUnshareable()) {
+ if (!managedConnectionInfos.containsUnshared(connectionInfo.getManagedConnectionInfo())) {
+ next.getConnection(connectionInfo);
+ managedConnectionInfos.addUnshared(connectionInfo.getManagedConnectionInfo());
+ }
} else {
- next.getConnection(connectionInfo);
- managedConnectionInfos.setShared(connectionInfo.getManagedConnectionInfo());
+ ManagedConnectionInfo managedConnectionInfo = managedConnectionInfos.getShared();
+ if (managedConnectionInfo != null) {
+ connectionInfo.setManagedConnectionInfo(managedConnectionInfo);
+ return;
+ } else {
+ next.getConnection(connectionInfo);
+ managedConnectionInfos.setShared(connectionInfo.getManagedConnectionInfo());
+ }
}
}
- }
}
public void returnConnection(ConnectionInfo connectionInfo, ConnectionReturnAction connectionReturnAction) {
@@ -97,6 +99,10 @@
if (transactionContext != null && transactionContext.isActive()) {
return;
}
+ internalReturn(connectionInfo, connectionReturnAction);
+ }
+
+ private void internalReturn(ConnectionInfo connectionInfo, ConnectionReturnAction connectionReturnAction) {
if (connectionInfo.getManagedConnectionInfo().hasConnectionHandles()) {
return;
}
@@ -105,7 +111,7 @@
}
public void afterCompletion(Object stuff) {
- ManagedConnectionInfos managedConnectionInfos = (ManagedConnectionInfos)stuff;
+ ManagedConnectionInfos managedConnectionInfos = (ManagedConnectionInfos) stuff;
ManagedConnectionInfo sharedMCI = managedConnectionInfos.getShared();
if (sharedMCI != null) {
returnHandle(sharedMCI);
@@ -119,7 +125,7 @@
private void returnHandle(ManagedConnectionInfo managedConnectionInfo) {
ConnectionInfo connectionInfo = new ConnectionInfo();
connectionInfo.setManagedConnectionInfo(managedConnectionInfo);
- returnConnection(connectionInfo, ConnectionReturnAction.RETURN_HANDLE);
+ internalReturn(connectionInfo, ConnectionReturnAction.RETURN_HANDLE);
}
static class ManagedConnectionInfos {