Return-Path: Delivered-To: apmail-incubator-geronimo-cvs-archive@www.apache.org Received: (qmail 79140 invoked from network); 13 Dec 2003 23:33:57 -0000 Received: from daedalus.apache.org (HELO mail.apache.org) (208.185.179.12) by minotaur-2.apache.org with SMTP; 13 Dec 2003 23:33:57 -0000 Received: (qmail 57139 invoked by uid 500); 13 Dec 2003 23:33:41 -0000 Delivered-To: apmail-incubator-geronimo-cvs-archive@incubator.apache.org Received: (qmail 57114 invoked by uid 500); 13 Dec 2003 23:33:41 -0000 Mailing-List: contact geronimo-cvs-help@incubator.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: list-post: Reply-To: geronimo-dev@incubator.apache.org Delivered-To: mailing list geronimo-cvs@incubator.apache.org Received: (qmail 57101 invoked from network); 13 Dec 2003 23:33:40 -0000 Received: from unknown (HELO minotaur.apache.org) (209.237.227.194) by daedalus.apache.org with SMTP; 13 Dec 2003 23:33:40 -0000 Received: (qmail 79128 invoked by uid 1712); 13 Dec 2003 23:33:54 -0000 Date: 13 Dec 2003 23:33:54 -0000 Message-ID: <20031213233354.79127.qmail@minotaur.apache.org> From: djencks@apache.org To: incubator-geronimo-cvs@apache.org Subject: cvs commit: incubator-geronimo/modules/core/src/test/org/apache/geronimo/connector/outbound ConnectionManagerTestUtils.java ConnectionTrackingInterceptorTest.java TransactionEnlistingInterceptorTest.java X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N djencks 2003/12/13 15:33:54 Modified: modules/core/src/java/org/apache/geronimo/connector/outbound ConnectionHandleInterceptor.java ConnectionManagerDeployment.java ConnectionTrackingInterceptor.java ConnectorTransactionContext.java GeronimoConnectionEventListener.java ManagedConnectionInfo.java ProxyConnectionManager.java TransactionEnlistingInterceptor.java modules/core/src/java/org/apache/geronimo/connector/outbound/connectiontracking/defaultimpl DefaultTransactionContext.java modules/core/src/test/org/apache/geronimo/connector/outbound ConnectionManagerTestUtils.java ConnectionTrackingInterceptorTest.java TransactionEnlistingInterceptorTest.java Removed: modules/core/src/java/org/apache/geronimo/connector/outbound ConnectionManagerDeployment.xml Log: Convert completely to using TransactionContext rather than TransactionManager, and clean up a bit Revision Changes Path 1.4 +17 -7 incubator-geronimo/modules/core/src/java/org/apache/geronimo/connector/outbound/ConnectionHandleInterceptor.java Index: ConnectionHandleInterceptor.java =================================================================== RCS file: /home/cvs/incubator-geronimo/modules/core/src/java/org/apache/geronimo/connector/outbound/ConnectionHandleInterceptor.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- ConnectionHandleInterceptor.java 9 Dec 2003 04:16:25 -0000 1.3 +++ ConnectionHandleInterceptor.java 13 Dec 2003 23:33:53 -0000 1.4 @@ -72,6 +72,12 @@ this.next = next; } + /** + * in: connectionInfo not null, managedConnectionInfo not null. ManagedConnection may or may not be null. ConnectionHandle may or may not be null + * out: managedConnection not null. connection handle not null. managedConnectionInfo has connection handle registered. Connection handle is associated with ManagedConnection. + * @param connectionInfo + * @throws ResourceException + */ public void getConnection(ConnectionInfo connectionInfo) throws ResourceException { next.getConnection(connectionInfo); ManagedConnectionInfo mci = connectionInfo.getManagedConnectionInfo(); @@ -81,19 +87,23 @@ mci.getSubject(), mci.getConnectionRequestInfo())); - } else { + } else if (!mci.hasConnectionInfo(connectionInfo)) { mci.getManagedConnection().associateConnection( connectionInfo.getConnectionHandle()); } - mci.addConnectionHandle(connectionInfo.getConnectionHandle()); + mci.addConnectionHandle(connectionInfo); } - public void returnConnection( - ConnectionInfo connectionInfo, - ConnectionReturnAction connectionReturnAction) { + /** + * in: connectionInfo not null, managedConnectionInfo not null, managedConnection not null. Handle can be null if mc is being destroyed from pool. + * out: managedCOnnectionInfo null, handle not in mci.handles. + * @param connectionInfo + * @param connectionReturnAction + */ + public void returnConnection(ConnectionInfo connectionInfo, ConnectionReturnAction connectionReturnAction) { if (connectionInfo.getConnectionHandle() != null) { connectionInfo.getManagedConnectionInfo().removeConnectionHandle( - connectionInfo.getConnectionHandle()); + connectionInfo); } next.returnConnection(connectionInfo, connectionReturnAction); } 1.5 +68 -123 incubator-geronimo/modules/core/src/java/org/apache/geronimo/connector/outbound/ConnectionManagerDeployment.java Index: ConnectionManagerDeployment.java =================================================================== RCS file: /home/cvs/incubator-geronimo/modules/core/src/java/org/apache/geronimo/connector/outbound/ConnectionManagerDeployment.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- ConnectionManagerDeployment.java 10 Dec 2003 07:48:12 -0000 1.4 +++ ConnectionManagerDeployment.java 13 Dec 2003 23:33:53 -0000 1.5 @@ -57,14 +57,20 @@ package org.apache.geronimo.connector.outbound; import javax.management.ObjectName; +import javax.management.MBeanOperationInfo; import javax.resource.ResourceException; import javax.resource.spi.ManagedConnectionFactory; -import javax.transaction.TransactionManager; import org.apache.geronimo.connector.deployment.ConnectionManagerFactory; import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTracker; import org.apache.geronimo.kernel.jmx.JMXUtil; +import org.apache.geronimo.kernel.service.GeronimoAttributeInfo; +import org.apache.geronimo.kernel.service.GeronimoOperationInfo; +import org.apache.geronimo.kernel.service.GeronimoParameterInfo; + import org.apache.geronimo.kernel.service.GeronimoMBeanContext; +import org.apache.geronimo.kernel.service.GeronimoMBeanEndpoint; +import org.apache.geronimo.kernel.service.GeronimoMBeanInfo; import org.apache.geronimo.kernel.service.GeronimoMBeanTarget; /** @@ -105,11 +111,6 @@ private SecurityDomain securityDomain; /** - * The actual TransactionManager we get - */ - private TransactionManager transactionManager; - - /** * Identifying string used by unshareable resource detection */ private String jndiName; @@ -130,12 +131,20 @@ return true; } - /* (non-Javadoc) - * @see org.apache.geronimo.core.service.AbstractStateManageable#doStart() - */ + /** + * Order of constructed interceptors: + * + * ConnectionTrackingInterceptor (connectionTracker != null) + * ConnectionHandleInterceptor + * TransactionCachingInterceptor (useTransactions & useTransactionCaching) + * TransactionEnlistingInterceptor (useTransactions) + * SubjectInterceptor (securityDomain != null) + * SinglePoolConnectionInterceptor or MultiPoolConnectionInterceptor + * LocalXAResourceInsertionInterceptor or XAResourceInsertionInterceptor (useTransactions (&localTransactions)) + * MCFConnectionInterceptor + */ public void doStart() { //check for consistency between attributes - useTransactions = (transactionManager != null); if (securityDomain == null) { assert useSubject == false: "To use Subject in pooling, you need a SecurityDomain"; } @@ -151,24 +160,24 @@ } if (useSubject || useConnectionRequestInfo) { stack = new MultiPoolConnectionInterceptor( - stack, - maxSize, - blockingTimeout, - useSubject, - useConnectionRequestInfo); + stack, + maxSize, + blockingTimeout, + useSubject, + useConnectionRequestInfo); } else { stack = new SinglePoolConnectionInterceptor( - stack, - null, - null, - maxSize, - blockingTimeout); + stack, + null, + null, + maxSize, + blockingTimeout); } if (securityDomain != null) { stack = new SubjectInterceptor(stack, securityDomain); } if (useTransactions) { - stack = new TransactionEnlistingInterceptor(stack, transactionManager); + stack = new TransactionEnlistingInterceptor(stack); if (useTransactionCaching) { stack = new TransactionCachingInterceptor(stack, connectionTracker); } @@ -176,10 +185,10 @@ stack = new ConnectionHandleInterceptor(stack); if (connectionTracker != null) { stack = new ConnectionTrackingInterceptor( - stack, - jndiName, - connectionTracker, - securityDomain); + stack, + jndiName, + connectionTracker, + securityDomain); } ObjectName name = JMXUtil.getObjectName(MBEAN_SERVER_DELEGATE); @@ -202,7 +211,6 @@ public void doStop() { cm = null; securityDomain = null; - transactionManager = null; connectionTracker = null; } @@ -210,182 +218,119 @@ public void doFail() { } - /** - * @return - * @jmx.managed-attribute - */ public ConnectionInterceptor getStack() { return cm.getStack(); } - /** - * @return - * @jmx.managed-operation - */ public Object createConnectionFactory(ManagedConnectionFactory mcf) throws ResourceException { return mcf.createConnectionFactory(cm); } - /** - * @return - * @jmx.managed-attribute - */ public int getBlockingTimeout() { return blockingTimeout; } - /** - * @param blockingTimeout - * @jmx.managed-attribute - */ public void setBlockingTimeout(int blockingTimeout) { this.blockingTimeout = blockingTimeout; } - /** - * @return - * @jmx.managed-attribute - */ public ConnectionTracker getConnectionTracker() { return connectionTracker; } - /** - * @param connectionTracker - * @jmx.managed-attribute - */ public void setConnectionTracker(ConnectionTracker connectionTracker) { this.connectionTracker = connectionTracker; } - /** - * @return - * @jmx.managed-attribute - */ public String getJndiName() { return jndiName; } - /** - * @param jndiName - * @jmx.managed-attribute - */ public void setJndiName(String jndiName) { this.jndiName = jndiName; } - /** - * @return - * @jmx.managed-attribute - */ public int getMaxSize() { return maxSize; } - /** - * @param maxSize - * @jmx.managed-attribute - */ public void setMaxSize(int maxSize) { this.maxSize = maxSize; } - /** - * @return - * @jmx.managed-attribute - */ public SecurityDomain getSecurityDomain() { return securityDomain; } - /** - * @param securityDomain - * @jmx.managed-attribute - */ public void setSecurityDomain(SecurityDomain securityDomain) { this.securityDomain = securityDomain; } - /** - * @return - * @jmx.managed-attribute - */ - public TransactionManager getTransactionManager() { - return transactionManager; - } - - /** - * @param transactionManager - * @jmx.managed-attribute - */ - public void setTransactionManager(TransactionManager transactionManager) { - this.transactionManager = transactionManager; - } - - /** - * @return - * @jmx.managed-attribute - */ public boolean isUseConnectionRequestInfo() { return useConnectionRequestInfo; } - /** - * @param useConnectionRequestInfo - * @jmx.managed-attribute - */ public void setUseConnectionRequestInfo(boolean useConnectionRequestInfo) { this.useConnectionRequestInfo = useConnectionRequestInfo; } - /** - * @return - * @jmx.managed-attribute - */ + //TODO determine this from [geronimo-]ra.xml transaction attribute. + public boolean isUseTransactions() { + return useTransactions; + } + + public void setUseTransactions(boolean useTransactions) { + this.useTransactions = useTransactions; + } + public boolean isUseLocalTransactions() { return useLocalTransactions; } - /** - * @param useLocalTransactions - * @jmx.managed-attribute - */ public void setUseLocalTransactions(boolean useLocalTransactions) { this.useLocalTransactions = useLocalTransactions; } - /** - * @return - * @jmx.managed-attribute - */ public boolean isUseSubject() { return useSubject; } - /** - * @param useSubject - * @jmx.managed-attribute - */ public void setUseSubject(boolean useSubject) { this.useSubject = useSubject; } - /** - * @return - * @jmx.managed-attribute - */ public boolean isUseTransactionCaching() { return useTransactionCaching; } - /** - * @param useTransactionCaching - * @jmx.managed-attribute - */ public void setUseTransactionCaching(boolean useTransactionCaching) { this.useTransactionCaching = useTransactionCaching; } + public static GeronimoMBeanInfo getGeronimoMBeanInfo() throws Exception { + GeronimoMBeanInfo mBeanInfo = new GeronimoMBeanInfo(); + + mBeanInfo.setTargetClass(ConnectionManagerDeployment.class); + mBeanInfo.addEndpoint(new GeronimoMBeanEndpoint("ConnectionTracker", ConnectionTracker.class, ObjectName.getInstance("geronimo.connector:role=ConnectionTrackingCoordinator"), true)); + mBeanInfo.addEndpoint(new GeronimoMBeanEndpoint("SecurityDomain", SecurityDomain.class, ObjectName.getInstance("geronimo.connector:role=SecurityDomain"), false)); + + mBeanInfo.addAttributeInfo(new GeronimoAttributeInfo("BlockingTimeout", true, true, "Milliseconds to wait for a connection to be returned")); + mBeanInfo.addAttributeInfo(new GeronimoAttributeInfo("JndiName", true, true, "Name to use to identify this guy (needs refactoring of naming conventions)")); + mBeanInfo.addAttributeInfo(new GeronimoAttributeInfo("MaxSize", true, true, "Maximum number of ManagedConnections to create in each pool")); + mBeanInfo.addAttributeInfo(new GeronimoAttributeInfo("UseConnectionRequestInfo", true, true, "Select pool using app-supplied ConnectionRequestInfo")); + mBeanInfo.addAttributeInfo(new GeronimoAttributeInfo("UseTransactions", true, true, "Use local or xa transactions vs. no transactions")); + mBeanInfo.addAttributeInfo(new GeronimoAttributeInfo("UseLocalTransactions", true, true, "Use local rather than xa transactions")); + mBeanInfo.addAttributeInfo(new GeronimoAttributeInfo("UseTransactionCaching", true, true, "Always use the same connection in a transaction")); + mBeanInfo.addAttributeInfo(new GeronimoAttributeInfo("UseSubject", true, true, "Select pool using SecurityDomain supplied subject")); + + mBeanInfo.addOperationInfo(new GeronimoOperationInfo("getStack")); + + mBeanInfo.addOperationInfo(new GeronimoOperationInfo("createConnectionFactory", + new GeronimoParameterInfo[] {new GeronimoParameterInfo("ManagedConnectionFactory", ManagedConnectionFactory.class, "ManagedConnectionFactory that will create the ConnectionFactory")}, + MBeanOperationInfo.ACTION, + "PRIVATE OPERATION. Have the supplied ManagedConnectionFactory create a connection factory")); + return mBeanInfo; + } } 1.3 +23 -27 incubator-geronimo/modules/core/src/java/org/apache/geronimo/connector/outbound/ConnectionTrackingInterceptor.java Index: ConnectionTrackingInterceptor.java =================================================================== RCS file: /home/cvs/incubator-geronimo/modules/core/src/java/org/apache/geronimo/connector/outbound/ConnectionTrackingInterceptor.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- ConnectionTrackingInterceptor.java 10 Dec 2003 07:48:12 -0000 1.2 +++ ConnectionTrackingInterceptor.java 13 Dec 2003 23:33:53 -0000 1.3 @@ -68,7 +68,7 @@ import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTracker; /** - * MetaCallConnectionInterceptor.java handles communication with the + * ConnectionTrackingInterceptor.java handles communication with the * CachedConnectionManager. On method call entry, cached handles are * checked for the correct Subject. On method call exit, cached * handles are disassociated if possible. On getting or releasing @@ -95,11 +95,30 @@ this.securityDomain = securityDomain; } + /** + * called by: ProxyConnectionManager.allocateConnection, ProxyConnectionManager.associateConnection, and enter. + * in: connectionInfo is non-null, and has non-null ManagedConnectionInfo with non-null managedConnectionfactory. + * connection handle may or may not be null. + * out: connectionInfo has non-null connection handle, non null ManagedConnectionInfo with non-null ManagedConnection and GeronimoConnectionEventListener. + * connection tracker has been notified of handle-managed connection association. + * @param connectionInfo + * @throws ResourceException + */ public void getConnection(ConnectionInfo connectionInfo) throws ResourceException { + ManagedConnectionInfo managedConnectionInfo = connectionInfo.getManagedConnectionInfo(); + managedConnectionInfo.setTransactionContext(connectionTracker.getConnectorTransactionContext()); next.getConnection(connectionInfo); connectionTracker.handleObtained(this, connectionInfo); } + /** + * called by: GeronimoConnectionEventListener.connectionClosed, GeronimoConnectionEventListener.connectionErrorOccurred, exit + * in: handle has already been dissociated from ManagedConnection. connectionInfo not null, has non-null ManagedConnectionInfo, ManagedConnectionInfo has non-null ManagedConnection + * handle can be null if called from error in ManagedConnection in pool. + * out: connectionTracker has been notified, ManagedConnectionInfo null. + * @param connectionInfo + * @param connectionReturnAction + */ public void returnConnection( ConnectionInfo connectionInfo, ConnectionReturnAction connectionReturnAction) { @@ -132,30 +151,6 @@ for (Iterator i = connectionInfos.iterator(); i.hasNext();) { ConnectionInfo connectionInfo = (ConnectionInfo) i.next(); getConnection(connectionInfo); - /* - ManagedConnectionInfo originalManagedConnectionInfo = connectionInfo.getManagedConnectionInfo(); - //Is this check correct? perhaps more credentials got - //added without changing the relevant credential we use. - if (!currentSubject.equals(originalManagedConnectionInfo.getSubject())) { - //make a ConnectionInfo to process removing the handle from the old mc - ConnectionInfo returningConnectionInfo = new ConnectionInfo(); - returningConnectionInfo.setManagedConnectionInfo(originalManagedConnectionInfo); - //This should decrement handle count, but not close the handle, when returnConnection is called - //I'm not sure how to test/assure this. - returningConnectionInfo.setConnectionHandle(connectionInfo.getConnectionHandle()); - - //make a new originalManagedConnectionInfo for the mc we will ask for - ManagedConnectionInfo newManagedConnectionInfo = - new ManagedConnectionInfo( - originalManagedConnectionInfo.getManagedConnectionFactory(), - originalManagedConnectionInfo.getConnectionRequestInfo()); - newManagedConnectionInfo.setSubject(currentSubject); - connectionInfo.setManagedConnectionInfo(newManagedConnectionInfo); - next.getConnection(connectionInfo); - //process the removal of the handle from the previous mc - returnConnection(returningConnectionInfo, ConnectionReturnAction.RETURN_HANDLE); - } - */ } } @@ -169,7 +164,8 @@ ConnectionInfo connectionInfo = (ConnectionInfo) i.next(); ManagedConnectionInfo managedConnectionInfo = connectionInfo.getManagedConnectionInfo(); ManagedConnection managedConnection = managedConnectionInfo.getManagedConnection(); - if (managedConnection instanceof DissociatableManagedConnection) { + if (managedConnection instanceof DissociatableManagedConnection + && managedConnectionInfo.isFirstConnectionInfo(connectionInfo)) { i.remove(); ((DissociatableManagedConnection) managedConnection).dissociateConnections(); managedConnectionInfo.clearConnectionHandles(); 1.2 +4 -1 incubator-geronimo/modules/core/src/java/org/apache/geronimo/connector/outbound/ConnectorTransactionContext.java Index: ConnectorTransactionContext.java =================================================================== RCS file: /home/cvs/incubator-geronimo/modules/core/src/java/org/apache/geronimo/connector/outbound/ConnectorTransactionContext.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- ConnectorTransactionContext.java 9 Dec 2003 04:15:20 -0000 1.1 +++ ConnectorTransactionContext.java 13 Dec 2003 23:33:53 -0000 1.2 @@ -1,5 +1,6 @@ package org.apache.geronimo.connector.outbound; +import javax.transaction.Transaction; /** @@ -22,5 +23,7 @@ ManagedConnectionInfo getManagedConnectionInfo(ConnectionReleaser key); boolean isActive(); + + Transaction getTransaction(); } 1.5 +30 -21 incubator-geronimo/modules/core/src/java/org/apache/geronimo/connector/outbound/GeronimoConnectionEventListener.java Index: GeronimoConnectionEventListener.java =================================================================== RCS file: /home/cvs/incubator-geronimo/modules/core/src/java/org/apache/geronimo/connector/outbound/GeronimoConnectionEventListener.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- GeronimoConnectionEventListener.java 9 Dec 2003 04:16:25 -0000 1.4 +++ GeronimoConnectionEventListener.java 13 Dec 2003 23:33:53 -0000 1.5 @@ -56,12 +56,11 @@ package org.apache.geronimo.connector.outbound; -import java.util.HashSet; -import java.util.Set; +import java.util.ArrayList; +import java.util.List; import javax.resource.spi.ConnectionEvent; import javax.resource.spi.ConnectionEventListener; -import javax.transaction.Synchronization; import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.Log; @@ -79,43 +78,43 @@ private static Log log = LogFactory.getLog(GeronimoConnectionEventListener.class.getName()); - private final ManagedConnectionInfo mci; + private final ManagedConnectionInfo managedConnectionInfo; private final ConnectionInterceptor stack; - private final Set connectionHandles = new HashSet(); + private final List connectionInfos = new ArrayList(); public GeronimoConnectionEventListener( final ConnectionInterceptor stack, - final ManagedConnectionInfo mci) { + final ManagedConnectionInfo managedConnectionInfo) { this.stack = stack; - this.mci = mci; + this.managedConnectionInfo = managedConnectionInfo; } public void connectionClosed(ConnectionEvent connectionEvent) { - if (connectionEvent.getSource() != mci.getManagedConnection()) { + if (connectionEvent.getSource() != managedConnectionInfo.getManagedConnection()) { throw new IllegalArgumentException( "ConnectionClosed event received from wrong ManagedConnection. Expected " - + mci.getManagedConnection() + + managedConnectionInfo.getManagedConnection() + ", actual " + connectionEvent.getSource()); } if (log.isTraceEnabled()) { log.trace("connectionClosed called with " + connectionEvent.getConnectionHandle()); } - ConnectionInfo ci = new ConnectionInfo(mci); + ConnectionInfo ci = new ConnectionInfo(managedConnectionInfo); ci.setConnectionHandle(connectionEvent.getConnectionHandle()); stack.returnConnection(ci, ConnectionReturnAction.RETURN_HANDLE); } public void connectionErrorOccurred(ConnectionEvent connectionEvent) { - if (connectionEvent.getSource() != mci.getManagedConnection()) { + if (connectionEvent.getSource() != managedConnectionInfo.getManagedConnection()) { throw new IllegalArgumentException( "ConnectionError event received from wrong ManagedConnection. Expected " - + mci.getManagedConnection() + + managedConnectionInfo.getManagedConnection() + ", actual " + connectionEvent.getSource()); } log.info("connectionErrorOccurred called with " + connectionEvent.getConnectionHandle(),connectionEvent.getException()); - ConnectionInfo ci = new ConnectionInfo(mci); + ConnectionInfo ci = new ConnectionInfo(managedConnectionInfo); ci.setConnectionHandle(connectionEvent.getConnectionHandle()); stack.returnConnection(ci, ConnectionReturnAction.DESTROY); } @@ -142,20 +141,30 @@ public void localTransactionRolledback(ConnectionEvent event) { } - public void addConnectionHandle(Object handle) { - connectionHandles.add(handle); + public void addConnectionInfo(ConnectionInfo connectionInfo) { + assert connectionInfo.getConnectionHandle() != null; + connectionInfos.add(connectionInfo); } - public void removeConnectionHandle(Object handle) { - connectionHandles.remove(handle); + public void removeConnectionInfo(ConnectionInfo connectionInfo) { + assert connectionInfo.getConnectionHandle() != null; + connectionInfos.remove(connectionInfo); } - public boolean hasConnectionHandles() { - return !connectionHandles.isEmpty(); + public boolean hasConnectionInfos() { + return !connectionInfos.isEmpty(); } - public void clearConnectionHandles() { - connectionHandles.clear(); + public void clearConnectionInfos() { + connectionInfos.clear(); + } + + public boolean hasConnectionInfo(ConnectionInfo connectionInfo) { + return connectionInfos.contains(connectionInfo); + } + + public boolean isFirstConnectionInfo(ConnectionInfo connectionInfo) { + return !connectionInfos.isEmpty() && connectionInfos.get(0) == connectionInfo; } } 1.4 +42 -83 incubator-geronimo/modules/core/src/java/org/apache/geronimo/connector/outbound/ManagedConnectionInfo.java Index: ManagedConnectionInfo.java =================================================================== RCS file: /home/cvs/incubator-geronimo/modules/core/src/java/org/apache/geronimo/connector/outbound/ManagedConnectionInfo.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- ManagedConnectionInfo.java 9 Dec 2003 04:16:25 -0000 1.3 +++ ManagedConnectionInfo.java 13 Dec 2003 23:33:53 -0000 1.4 @@ -60,7 +60,6 @@ import javax.resource.spi.ManagedConnection; import javax.resource.spi.ManagedConnectionFactory; import javax.security.auth.Subject; -import javax.transaction.Transaction; import javax.transaction.xa.XAResource; /** @@ -73,11 +72,11 @@ */ public class ManagedConnectionInfo { - private ManagedConnectionFactory mcf; - private ConnectionRequestInfo cri; + private ManagedConnectionFactory managedConnectionFactory; + private ConnectionRequestInfo connectionRequestInfo; private Subject subject; - private Transaction tx; - private ManagedConnection mc; + private ConnectorTransactionContext transactionContext; + private ManagedConnection managedConnection; private XAResource xares; private long lastUsed; private ConnectionInterceptor poolInterceptor; @@ -85,104 +84,56 @@ private GeronimoConnectionEventListener listener; public ManagedConnectionInfo( - ManagedConnectionFactory mcf, - ConnectionRequestInfo cri) { - this.mcf = mcf; - this.cri = cri; - } // ManagedConnectionInfo constructor - - /** - * Get the Mcf value. - * @return the Mcf value. - */ + ManagedConnectionFactory managedConnectionFactory, + ConnectionRequestInfo connectionRequestInfo) { + this.managedConnectionFactory = managedConnectionFactory; + this.connectionRequestInfo = connectionRequestInfo; + } + public ManagedConnectionFactory getManagedConnectionFactory() { - return mcf; + return managedConnectionFactory; } - /** - * Set the Mcf value. - * @param newMcf The new Mcf value. - */ - public void setManagedConnectionFactory(ManagedConnectionFactory mcf) { - this.mcf = mcf; + public void setManagedConnectionFactory(ManagedConnectionFactory managedConnectionFactory) { + this.managedConnectionFactory = managedConnectionFactory; } - /** - * Get the Cri value. - * @return the Cri value. - */ public ConnectionRequestInfo getConnectionRequestInfo() { - return cri; + return connectionRequestInfo; } - /** - * Set the Cri value. - * @param newCri The new Cri value. - */ public void setConnectionRequestInfo(ConnectionRequestInfo cri) { - this.cri = cri; + this.connectionRequestInfo = cri; } - /** - * Get the Subject value. - * @return the Subject value. - */ public Subject getSubject() { return subject; } - /** - * Set the Subject value. - * @param newSubject The new Subject value. - */ public void setSubject(Subject subject) { this.subject = subject; } - /** - * Get the Tx value. - * @return the Tx value. - */ - public Transaction getTransaction() { - return tx; - } - - /** - * Set the Tx value. - * @param newTx The new Tx value. - */ - public void setTransaction(Transaction tx) { - this.tx = tx; - } - - /** - * Get the Mc value. - * @return the Mc value. - */ + public ConnectorTransactionContext getTransactionContext() { + return transactionContext; + } + + public void setTransactionContext(ConnectorTransactionContext transactionContext) { + this.transactionContext = transactionContext; + } + public ManagedConnection getManagedConnection() { - return mc; + return managedConnection; } - /** - * Set the Mc value. - * @param newMc The new Mc value. - */ - public void setManagedConnection(ManagedConnection mc) { - this.mc = mc; + public void setManagedConnection(ManagedConnection managedConnection) { + this.managedConnection = managedConnection; } - /** - * Get the Xares value. - * @return the Xares value. - */ public XAResource getXAResource() { return xares; } - /** - * Set the Xares value. - * @param newXares The new Xares value. - */ public void setXAResource(XAResource xares) { this.xares = xares; } @@ -207,20 +158,20 @@ this.listener = listener; } - public void addConnectionHandle(Object handle) { - listener.addConnectionHandle(handle); + public void addConnectionHandle(ConnectionInfo connectionInfo) { + listener.addConnectionInfo(connectionInfo); } - public void removeConnectionHandle(Object handle) { - listener.removeConnectionHandle(handle); + public void removeConnectionHandle(ConnectionInfo connectionInfo) { + listener.removeConnectionInfo(connectionInfo); } public boolean hasConnectionHandles() { - return listener.hasConnectionHandles(); + return listener.hasConnectionInfos(); } public void clearConnectionHandles() { - listener.clearConnectionHandles(); + listener.clearConnectionInfos(); } public boolean securityMatches(ManagedConnectionInfo other) { @@ -228,9 +179,17 @@ subject == null ? other.getSubject() == null : subject.equals(other.getSubject())) - && (cri == null + && (connectionRequestInfo == null ? other.getConnectionRequestInfo() == null - : cri.equals(other.getConnectionRequestInfo())); + : connectionRequestInfo.equals(other.getConnectionRequestInfo())); + } + + public boolean hasConnectionInfo(ConnectionInfo connectionInfo) { + return listener.hasConnectionInfo(connectionInfo); + } + + public boolean isFirstConnectionInfo(ConnectionInfo connectionInfo) { + return listener.isFirstConnectionInfo(connectionInfo); } } 1.3 +30 -21 incubator-geronimo/modules/core/src/java/org/apache/geronimo/connector/outbound/ProxyConnectionManager.java Index: ProxyConnectionManager.java =================================================================== RCS file: /home/cvs/incubator-geronimo/modules/core/src/java/org/apache/geronimo/connector/outbound/ProxyConnectionManager.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- ProxyConnectionManager.java 14 Nov 2003 16:00:23 -0000 1.2 +++ ProxyConnectionManager.java 13 Dec 2003 23:33:53 -0000 1.3 @@ -58,7 +58,6 @@ import java.io.Serializable; -import javax.management.AttributeNotFoundException; import javax.management.InstanceNotFoundException; import javax.management.MBeanException; import javax.management.MBeanServer; @@ -90,7 +89,7 @@ private final String agentID; /** - * The field CMName holds the object name of + * The field ConnectionManagerName holds the object name of * the ConnectionManagerDeployment that sets us up. * */ @@ -100,31 +99,48 @@ public ProxyConnectionManager( String agentID, - ObjectName CMName, + ObjectName ConnectionManagerName, ConnectionInterceptor stack) { this.agentID = agentID; - this.CMName = CMName; + this.CMName = ConnectionManagerName; this.stack = stack; - } // ProxyConnectionManager constructor + } + /** + * in: mcf != null, is a deployed mcf + * out: useable connection object. + * @param managedConnectionFactory + * @param connectionRequestInfo + * @return + * @throws ResourceException + */ public Object allocateConnection( - ManagedConnectionFactory mcf, - ConnectionRequestInfo cri) + ManagedConnectionFactory managedConnectionFactory, + ConnectionRequestInfo connectionRequestInfo) throws ResourceException { internalGetStack(); - ManagedConnectionInfo mci = new ManagedConnectionInfo(mcf, cri); + ManagedConnectionInfo mci = new ManagedConnectionInfo(managedConnectionFactory, connectionRequestInfo); ConnectionInfo ci = new ConnectionInfo(mci); stack.getConnection(ci); return ci.getConnectionHandle(); } + /** + * in: non-null connection object, from non-null mcf. + * connection object is not associated with a managed connection + * out: supplied connection object is assiciated with a non-null ManagedConnection from mcf. + * @param connection + * @param managedConnectionFactory + * @param connectionRequestInfo + * @throws ResourceException + */ public void associateConnection( Object connection, - ManagedConnectionFactory mcf, - ConnectionRequestInfo cri) + ManagedConnectionFactory managedConnectionFactory, + ConnectionRequestInfo connectionRequestInfo) throws ResourceException { internalGetStack(); - ManagedConnectionInfo mci = new ManagedConnectionInfo(mcf, cri); + ManagedConnectionInfo mci = new ManagedConnectionInfo(managedConnectionFactory, connectionRequestInfo); ConnectionInfo ci = new ConnectionInfo(mci); ci.setConnectionHandle(connection); stack.getConnection(ci); @@ -137,20 +153,15 @@ 0); try { this.stack = - (ConnectionInterceptor) server.getAttribute( - this.CMName, - "Stack"); + (ConnectionInterceptor) server.invoke(CMName, "getStack", null, null); } catch (InstanceNotFoundException e) { throw new ResourceException("Could not get stack from jmx", e); } catch (MBeanException e) { throw new ResourceException("Could not get stack from jmx", e); } catch (ReflectionException e) { throw new ResourceException("Could not get stack from jmx", e); - } catch (AttributeNotFoundException e) { - throw new ResourceException("Could not get stack from jmx", e); } - - } // end of if () + } } /** @@ -159,11 +170,9 @@ * of this object. * * @return a ConnectionInterceptor value - * - * @jmx.managed-operation */ public ConnectionInterceptor getStack() { return stack; } -} // ProxyConnectionManager +} 1.4 +11 -18 incubator-geronimo/modules/core/src/java/org/apache/geronimo/connector/outbound/TransactionEnlistingInterceptor.java Index: TransactionEnlistingInterceptor.java =================================================================== RCS file: /home/cvs/incubator-geronimo/modules/core/src/java/org/apache/geronimo/connector/outbound/TransactionEnlistingInterceptor.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- TransactionEnlistingInterceptor.java 9 Dec 2003 04:16:25 -0000 1.3 +++ TransactionEnlistingInterceptor.java 13 Dec 2003 23:33:53 -0000 1.4 @@ -59,12 +59,8 @@ import javax.resource.ResourceException; import javax.transaction.RollbackException; import javax.transaction.SystemException; -import javax.transaction.Transaction; -import javax.transaction.TransactionManager; import javax.transaction.xa.XAResource; -import org.apache.geronimo.connector.TxUtils; - /** * TransactionEnlistingInterceptor.java * @@ -76,24 +72,21 @@ public class TransactionEnlistingInterceptor implements ConnectionInterceptor { private final ConnectionInterceptor next; - private final TransactionManager transactionManager; public TransactionEnlistingInterceptor( - ConnectionInterceptor next, - TransactionManager transactionManager) { + ConnectionInterceptor next + ) { this.next = next; - this.transactionManager = transactionManager; } public void getConnection(ConnectionInfo connectionInfo) throws ResourceException { next.getConnection(connectionInfo); try { - Transaction tx = transactionManager.getTransaction(); - if (TxUtils.isActive(tx)) { - ManagedConnectionInfo mci = connectionInfo.getManagedConnectionInfo(); + ManagedConnectionInfo mci = connectionInfo.getManagedConnectionInfo(); + ConnectorTransactionContext transactionContext = mci.getTransactionContext(); + if (transactionContext.isActive()) { XAResource xares = mci.getXAResource(); - tx.enlistResource(xares); - mci.setTransaction(tx); + transactionContext.getTransaction().enlistResource(xares); } } catch (SystemException e) { @@ -119,12 +112,12 @@ ConnectionInfo connectionInfo, ConnectionReturnAction connectionReturnAction) { try { - Transaction tx = transactionManager.getTransaction(); - if (TxUtils.isActive(tx)) { - ManagedConnectionInfo mci = connectionInfo.getManagedConnectionInfo(); + ManagedConnectionInfo mci = connectionInfo.getManagedConnectionInfo(); + ConnectorTransactionContext transactionContext = mci.getTransactionContext(); + if (transactionContext.isActive()) { XAResource xares = mci.getXAResource(); - tx.delistResource(xares, XAResource.TMSUSPEND); - mci.setTransaction(null); + transactionContext.getTransaction().delistResource(xares, XAResource.TMSUSPEND); + mci.setTransactionContext(null); } } catch (SystemException e) { 1.2 +5 -1 incubator-geronimo/modules/core/src/java/org/apache/geronimo/connector/outbound/connectiontracking/defaultimpl/DefaultTransactionContext.java Index: DefaultTransactionContext.java =================================================================== RCS file: /home/cvs/incubator-geronimo/modules/core/src/java/org/apache/geronimo/connector/outbound/connectiontracking/defaultimpl/DefaultTransactionContext.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- DefaultTransactionContext.java 9 Dec 2003 04:13:20 -0000 1.1 +++ DefaultTransactionContext.java 13 Dec 2003 23:33:54 -0000 1.2 @@ -124,6 +124,10 @@ } } + public Transaction getTransaction() { + return transaction; + } + public void beforeCompletion() { } 1.2 +11 -1 incubator-geronimo/modules/core/src/test/org/apache/geronimo/connector/outbound/ConnectionManagerTestUtils.java Index: ConnectionManagerTestUtils.java =================================================================== RCS file: /home/cvs/incubator-geronimo/modules/core/src/test/org/apache/geronimo/connector/outbound/ConnectionManagerTestUtils.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- ConnectionManagerTestUtils.java 10 Dec 2003 07:48:12 -0000 1.1 +++ ConnectionManagerTestUtils.java 13 Dec 2003 23:33:54 -0000 1.2 @@ -68,10 +68,13 @@ import javax.resource.spi.LocalTransaction; import javax.resource.spi.ManagedConnectionMetaData; import javax.resource.spi.DissociatableManagedConnection; +import javax.transaction.Transaction; import javax.transaction.xa.XAResource; import junit.framework.TestCase; +import org.apache.geronimo.connector.outbound.connectiontracking.defaultimpl.DefaultTransactionContext; + /** * * @@ -121,6 +124,13 @@ protected ConnectionInfo makeConnectionInfo() { ManagedConnectionInfo managedConnectionInfo = new ManagedConnectionInfo(null, null); + return new ConnectionInfo(managedConnectionInfo); + } + + protected ConnectionInfo makeConnectionInfo(Transaction transaction) throws Exception { + DefaultTransactionContext transactionContext = new DefaultTransactionContext(transaction); + ManagedConnectionInfo managedConnectionInfo = new ManagedConnectionInfo(null, null); + managedConnectionInfo.setTransactionContext(transactionContext); return new ConnectionInfo(managedConnectionInfo); } 1.3 +2 -1 incubator-geronimo/modules/core/src/test/org/apache/geronimo/connector/outbound/ConnectionTrackingInterceptorTest.java Index: ConnectionTrackingInterceptorTest.java =================================================================== RCS file: /home/cvs/incubator-geronimo/modules/core/src/test/org/apache/geronimo/connector/outbound/ConnectionTrackingInterceptorTest.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- ConnectionTrackingInterceptorTest.java 10 Dec 2003 07:48:12 -0000 1.2 +++ ConnectionTrackingInterceptorTest.java 13 Dec 2003 23:33:54 -0000 1.3 @@ -198,6 +198,7 @@ managedConnectionInfo.setConnectionEventListener(new GeronimoConnectionEventListener(null, managedConnectionInfo)); managedConnectionInfo.setSubject(subject); managedConnectionInfo.setManagedConnection(managedConnection); + managedConnectionInfo.addConnectionHandle(connectionInfo); } } 1.3 +7 -7 incubator-geronimo/modules/core/src/test/org/apache/geronimo/connector/outbound/TransactionEnlistingInterceptorTest.java Index: TransactionEnlistingInterceptorTest.java =================================================================== RCS file: /home/cvs/incubator-geronimo/modules/core/src/test/org/apache/geronimo/connector/outbound/TransactionEnlistingInterceptorTest.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- TransactionEnlistingInterceptorTest.java 10 Dec 2003 07:48:12 -0000 1.2 +++ TransactionEnlistingInterceptorTest.java 13 Dec 2003 23:33:54 -0000 1.3 @@ -57,6 +57,7 @@ package org.apache.geronimo.connector.outbound; import javax.resource.ResourceException; +import javax.transaction.Transaction; import javax.transaction.TransactionManager; import javax.transaction.xa.XAResource; import javax.transaction.xa.Xid; @@ -74,7 +75,6 @@ implements XAResource { private TransactionEnlistingInterceptor transactionEnlistingInterceptor; - private TransactionManager transactionManager; private boolean started; private boolean ended; private boolean returned; @@ -82,13 +82,11 @@ protected void setUp() throws Exception { super.setUp(); - transactionManager = new TransactionManagerImpl(); - transactionEnlistingInterceptor = new TransactionEnlistingInterceptor(this, transactionManager); + transactionEnlistingInterceptor = new TransactionEnlistingInterceptor(this); } protected void tearDown() throws Exception { super.tearDown(); - transactionManager = null; transactionEnlistingInterceptor = null; started = false; ended = false; @@ -97,7 +95,7 @@ } public void testNoTransaction() throws Exception { - ConnectionInfo connectionInfo = makeConnectionInfo(); + ConnectionInfo connectionInfo = makeConnectionInfo(null); transactionEnlistingInterceptor.getConnection(connectionInfo); assertTrue("Expected not started", !started); assertTrue("Expected not ended", !ended); @@ -107,8 +105,10 @@ } public void testTransaction() throws Exception { - ConnectionInfo connectionInfo = makeConnectionInfo(); + TransactionManager transactionManager = new TransactionManagerImpl(); transactionManager.begin(); + Transaction transaction = transactionManager.getTransaction(); + ConnectionInfo connectionInfo = makeConnectionInfo(transaction); transactionEnlistingInterceptor.getConnection(connectionInfo); assertTrue("Expected started", started); assertTrue("Expected not ended", !ended);