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 2008/10/16 02:14:11 UTC

svn commit: r705104 - in /geronimo/components/txmanager/trunk: ./ geronimo-connector/ geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ geronimo-connector/src/main/java/org/apache/geronimo/connector/work/ geronimo-connector/src/t...

Author: djencks
Date: Wed Oct 15 17:14:10 2008
New Revision: 705104

URL: http://svn.apache.org/viewvc?rev=705104&view=rev
Log:
update to connector 1.6 api jar.  Implement InflowContext handling.  Implementation of new LazyAssociatableConnectionManager.inactiveConnectionClosed method not done.... I don't see why its necessary yet

Added:
    geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/InflowContextHandler.java   (with props)
    geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/TransactionInflowContextHandler.java   (with props)
Modified:
    geronimo/components/txmanager/trunk/geronimo-connector/pom.xml
    geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractConnectionManager.java
    geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/GeronimoWorkManager.java
    geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/WorkerContext.java
    geronimo/components/txmanager/trunk/geronimo-connector/src/test/java/org/apache/geronimo/connector/BootstrapContextTest.java
    geronimo/components/txmanager/trunk/geronimo-connector/src/test/java/org/apache/geronimo/connector/work/PooledWorkManagerTest.java
    geronimo/components/txmanager/trunk/geronimo-transaction/pom.xml
    geronimo/components/txmanager/trunk/pom.xml

Modified: geronimo/components/txmanager/trunk/geronimo-connector/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/components/txmanager/trunk/geronimo-connector/pom.xml?rev=705104&r1=705103&r2=705104&view=diff
==============================================================================
--- geronimo/components/txmanager/trunk/geronimo-connector/pom.xml (original)
+++ geronimo/components/txmanager/trunk/geronimo-connector/pom.xml Wed Oct 15 17:14:10 2008
@@ -51,9 +51,9 @@
 
         <dependency>
             <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-j2ee-connector_1.5_spec</artifactId>
+            <artifactId>geronimo-j2ee-connector_1.6_spec</artifactId>
         </dependency>
-        
+
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>

Modified: geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractConnectionManager.java
URL: http://svn.apache.org/viewvc/geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractConnectionManager.java?rev=705104&r1=705103&r2=705104&view=diff
==============================================================================
--- geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractConnectionManager.java (original)
+++ geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractConnectionManager.java Wed Oct 15 17:14:10 2008
@@ -111,6 +111,11 @@
         getStack().getConnection(ci);
     }
 
+    public void inactiveConnectionClosed(Object connection, ManagedConnectionFactory managedConnectionFactory) {
+        //TODO If we are tracking connections, we need to stop tracking this one.
+        //I don't see why we don't get a connectionClosed event for it.
+    }
+
     ConnectionInterceptor getConnectionInterceptor() {
         return getStack();
     }

Modified: geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/GeronimoWorkManager.java
URL: http://svn.apache.org/viewvc/geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/GeronimoWorkManager.java?rev=705104&r1=705103&r2=705104&view=diff
==============================================================================
--- geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/GeronimoWorkManager.java (original)
+++ geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/GeronimoWorkManager.java Wed Oct 15 17:14:10 2008
@@ -18,6 +18,8 @@
 package org.apache.geronimo.connector.work;
 
 import java.util.concurrent.Executor;
+import java.util.List;
+import java.util.Collections;
 
 import javax.resource.spi.work.ExecutionContext;
 import javax.resource.spi.work.Work;
@@ -30,7 +32,6 @@
 import org.apache.geronimo.connector.work.pool.StartWorkExecutor;
 import org.apache.geronimo.connector.work.pool.SyncWorkExecutor;
 import org.apache.geronimo.connector.work.pool.WorkExecutor;
-import org.apache.geronimo.transaction.manager.XAWork;
 
 /**
  * WorkManager implementation which uses under the cover three WorkExecutorPool
@@ -64,7 +65,8 @@
      */
     private Executor scheduledWorkExecutorPool;
 
-    private final XAWork transactionManager;
+    private final List<InflowContextHandler> inflowContextHandlers;
+
 
     private final WorkExecutor scheduleWorkExecutor = new ScheduleWorkExecutor();
     private final WorkExecutor startWorkExecutor = new StartWorkExecutor();
@@ -77,11 +79,11 @@
         this(null, null, null, null);
     }
 
-    public GeronimoWorkManager(Executor sync, Executor start, Executor sched, XAWork xaWork) {
+    public GeronimoWorkManager(Executor sync, Executor start, Executor sched, List<InflowContextHandler> inflowContextHandlers) {
         syncWorkExecutorPool = sync;
         startWorkExecutorPool = start;
         scheduledWorkExecutorPool = sched;
-        this.transactionManager = xaWork;
+        this.inflowContextHandlers = inflowContextHandlers == null? Collections.<InflowContextHandler>emptyList(): inflowContextHandlers;
     }
 
     public void doStart() throws Exception {
@@ -114,7 +116,7 @@
     * @see javax.resource.spi.work.WorkManager#doWork(javax.resource.spi.work.Work)
     */
     public void doWork(Work work) throws WorkException {
-        executeWork(new WorkerContext(work, transactionManager), syncWorkExecutor, syncWorkExecutorPool);
+        executeWork(new WorkerContext(work, inflowContextHandlers), syncWorkExecutor, syncWorkExecutorPool);
     }
 
     /* (non-Javadoc)
@@ -127,7 +129,7 @@
             WorkListener workListener)
             throws WorkException {
         WorkerContext workWrapper =
-                new WorkerContext(work, startTimeout, execContext, transactionManager, workListener);
+                new WorkerContext(work, startTimeout, execContext, workListener, inflowContextHandlers);
         workWrapper.setThreadPriority(Thread.currentThread().getPriority());
         executeWork(workWrapper, syncWorkExecutor, syncWorkExecutorPool);
     }
@@ -136,7 +138,7 @@
      * @see javax.resource.spi.work.WorkManager#startWork(javax.resource.spi.work.Work)
      */
     public long startWork(Work work) throws WorkException {
-        WorkerContext workWrapper = new WorkerContext(work, transactionManager);
+        WorkerContext workWrapper = new WorkerContext(work, inflowContextHandlers);
         workWrapper.setThreadPriority(Thread.currentThread().getPriority());
         executeWork(workWrapper, startWorkExecutor, startWorkExecutorPool);
         return System.currentTimeMillis() - workWrapper.getAcceptedTime();
@@ -152,7 +154,7 @@
             WorkListener workListener)
             throws WorkException {
         WorkerContext workWrapper =
-                new WorkerContext(work, startTimeout, execContext, transactionManager, workListener);
+                new WorkerContext(work, startTimeout, execContext, workListener, inflowContextHandlers);
         workWrapper.setThreadPriority(Thread.currentThread().getPriority());
         executeWork(workWrapper, startWorkExecutor, startWorkExecutorPool);
         return System.currentTimeMillis() - workWrapper.getAcceptedTime();
@@ -162,7 +164,7 @@
      * @see javax.resource.spi.work.WorkManager#scheduleWork(javax.resource.spi.work.Work)
      */
     public void scheduleWork(Work work) throws WorkException {
-        WorkerContext workWrapper = new WorkerContext(work, transactionManager);
+        WorkerContext workWrapper = new WorkerContext(work, inflowContextHandlers);
         workWrapper.setThreadPriority(Thread.currentThread().getPriority());
         executeWork(workWrapper, scheduleWorkExecutor, scheduledWorkExecutorPool);
     }
@@ -177,7 +179,7 @@
             WorkListener workListener)
             throws WorkException {
         WorkerContext workWrapper =
-                new WorkerContext(work, startTimeout, execContext, transactionManager, workListener);
+                new WorkerContext(work, startTimeout, execContext, workListener, inflowContextHandlers);
         workWrapper.setThreadPriority(Thread.currentThread().getPriority());
         executeWork(workWrapper, scheduleWorkExecutor, scheduledWorkExecutorPool);
     }

Added: geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/InflowContextHandler.java
URL: http://svn.apache.org/viewvc/geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/InflowContextHandler.java?rev=705104&view=auto
==============================================================================
--- geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/InflowContextHandler.java (added)
+++ geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/InflowContextHandler.java Wed Oct 15 17:14:10 2008
@@ -0,0 +1,37 @@
+/*
+ * 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.work;
+
+import javax.resource.spi.work.InflowContext;
+import javax.resource.spi.work.WorkCompletedException;
+
+/**
+ * @version $Rev:$ $Date:$
+ */
+public interface InflowContextHandler<E extends InflowContext> {
+
+    void before(E inflowContext) throws WorkCompletedException;
+
+    void after(E inflowContext) throws WorkCompletedException;
+
+    Class<E> getHandledClass(); 
+
+}

Propchange: geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/InflowContextHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/InflowContextHandler.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/InflowContextHandler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/TransactionInflowContextHandler.java
URL: http://svn.apache.org/viewvc/geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/TransactionInflowContextHandler.java?rev=705104&view=auto
==============================================================================
--- geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/TransactionInflowContextHandler.java (added)
+++ geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/TransactionInflowContextHandler.java Wed Oct 15 17:14:10 2008
@@ -0,0 +1,76 @@
+/*
+ * 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.work;
+
+import javax.resource.spi.work.TransactionInflowContext;
+import javax.resource.spi.work.WorkCompletedException;
+import javax.transaction.xa.XAException;
+import javax.transaction.InvalidTransactionException;
+import javax.transaction.SystemException;
+
+import org.apache.geronimo.transaction.manager.XAWork;
+import org.apache.geronimo.transaction.manager.ImportedTransactionActiveException;
+
+/**
+ * @version $Rev:$ $Date:$
+ */
+public class TransactionInflowContextHandler implements InflowContextHandler<TransactionInflowContext>{
+
+    private final XAWork xaWork;
+
+    public TransactionInflowContextHandler(XAWork xaWork) {
+        this.xaWork = xaWork;
+    }
+
+    public void before(TransactionInflowContext inflowContext) throws WorkCompletedException {
+        if (inflowContext.getXid() != null) {
+            try {
+                long transactionTimeout = inflowContext.getTransactionTimeout();
+                //translate -1 value to 0 to indicate default transaction timeout.
+                xaWork.begin(inflowContext.getXid(), transactionTimeout < 0 ? 0 : transactionTimeout);
+            } catch (XAException e) {
+                throw (WorkCompletedException)new WorkCompletedException("Transaction import failed for xid " + inflowContext.getXid(), WorkCompletedException.TX_RECREATE_FAILED).initCause(e);
+            } catch (InvalidTransactionException e) {
+                throw (WorkCompletedException)new WorkCompletedException("Transaction import failed for xid " + inflowContext.getXid(), WorkCompletedException.TX_RECREATE_FAILED).initCause(e);
+            } catch (SystemException e) {
+                throw (WorkCompletedException)new WorkCompletedException("Transaction import failed for xid " + inflowContext.getXid(), WorkCompletedException.TX_RECREATE_FAILED).initCause(e);
+            } catch (ImportedTransactionActiveException e) {
+                throw (WorkCompletedException)new WorkCompletedException("Transaction already active for xid " + inflowContext.getXid(), WorkCompletedException.TX_CONCURRENT_WORK_DISALLOWED).initCause(e);
+            }
+        }
+    }
+
+    public void after(TransactionInflowContext inflowContext) throws WorkCompletedException {
+        if (inflowContext.getXid() != null) {
+            try {
+                xaWork.end(inflowContext.getXid());
+            } catch (XAException e) {
+                throw (WorkCompletedException)new WorkCompletedException("Transaction end failed for xid " + inflowContext.getXid(), WorkCompletedException.TX_RECREATE_FAILED).initCause(e);
+            } catch (SystemException e) {
+                throw (WorkCompletedException)new WorkCompletedException("Transaction end failed for xid " + inflowContext.getXid(), WorkCompletedException.TX_RECREATE_FAILED).initCause(e);
+            }
+        }
+    }
+
+    public Class<TransactionInflowContext> getHandledClass() {
+        return TransactionInflowContext.class;
+    }
+}

Propchange: geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/TransactionInflowContextHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/TransactionInflowContextHandler.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/TransactionInflowContextHandler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/WorkerContext.java
URL: http://svn.apache.org/viewvc/geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/WorkerContext.java?rev=705104&r1=705103&r2=705104&view=diff
==============================================================================
--- geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/WorkerContext.java (original)
+++ geronimo/components/txmanager/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/WorkerContext.java Wed Oct 15 17:14:10 2008
@@ -17,9 +17,17 @@
 
 package org.apache.geronimo.connector.work;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
 import java.util.concurrent.CountDownLatch;
 
+import javax.resource.NotSupportedException;
 import javax.resource.spi.work.ExecutionContext;
+import javax.resource.spi.work.InflowContext;
+import javax.resource.spi.work.InflowContextProvider;
+import javax.resource.spi.work.TransactionInflowContext;
 import javax.resource.spi.work.Work;
 import javax.resource.spi.work.WorkAdapter;
 import javax.resource.spi.work.WorkCompletedException;
@@ -28,12 +36,7 @@
 import javax.resource.spi.work.WorkListener;
 import javax.resource.spi.work.WorkManager;
 import javax.resource.spi.work.WorkRejectedException;
-import javax.transaction.InvalidTransactionException;
-import javax.transaction.SystemException;
-import javax.transaction.xa.XAException;
 
-import org.apache.geronimo.transaction.manager.ImportedTransactionActiveException;
-import org.apache.geronimo.transaction.manager.XAWork;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -46,6 +49,8 @@
 
     private static final Logger log = LoggerFactory.getLogger(WorkerContext.class);
 
+    private static final List<InflowContext> NO_INFLOW_CONTEXT = Collections.emptyList();
+
     /**
      * Null WorkListener used as the default WorkListener.
      */
@@ -93,16 +98,9 @@
     private long startTimeOut;
 
     /**
-     * Execution context of the actual work to be executed.
-     */
-    private final ExecutionContext executionContext;
-
-    private final XAWork xaWork;
-
-    /**
      * Listener to be notified during the life-cycle of the work treatment.
      */
-    private WorkListener workListener = NULL_WORK_LISTENER;
+    private final WorkListener workListener;
 
     /**
      * Work exception, if any.
@@ -120,40 +118,59 @@
     private CountDownLatch endLatch = new CountDownLatch(1);
 
     /**
+     * Execution context of the actual work to be executed.
+     */
+    private final ExecutionContext executionContext;
+
+    private final List<InflowContextHandler> inflowContextHandlers;
+
+
+    /**
      * Create a WorkWrapper.
-     *
-     * @param work                      Work to be wrapped.
-     * @param xaWork
+     * TODO include a InflowContextLifecycleListener
+     * @param work   Work to be wrapped.
+     * @param inflowContextHandlers InflowContextHandlers supported by this work manager
      */
-    public WorkerContext(Work work, XAWork xaWork) {
+    public WorkerContext(Work work, List<InflowContextHandler> inflowContextHandlers) {
         adaptee = work;
+        this.inflowContextHandlers = inflowContextHandlers;
         executionContext = null;
-        this.xaWork = xaWork;
+        workListener = NULL_WORK_LISTENER;
     }
 
     /**
      * Create a WorkWrapper with the specified execution context.
      *
+     * TODO include a InflowContextLifecycleListener
      * @param aWork         Work to be wrapped.
      * @param aStartTimeout a time duration (in milliseconds) within which the
-     *                      execution of the Work instance must start.
+ *                      execution of the Work instance must start.
      * @param execContext   an object containing the execution context with which
-     *                      the submitted Work instance must be executed.
+*                      the submitted Work instance must be executed.
      * @param workListener  an object which would be notified when the various
-     *                      Work processing events (work accepted, work rejected, work started,
+     * @param inflowContextHandlers InflowContextHandlers supported by this work manager
+     * @throws javax.resource.spi.work.WorkRejectedException if executionContext supplied yet Work implements InflowContextProvider
      */
     public WorkerContext(Work aWork,
                          long aStartTimeout,
                          ExecutionContext execContext,
-                         XAWork xaWork,
-                         WorkListener workListener) {
+                         WorkListener workListener, List<InflowContextHandler> inflowContextHandlers) throws WorkRejectedException {
         adaptee = aWork;
         startTimeOut = aStartTimeout;
-        executionContext = execContext;
-        this.xaWork = xaWork;
-        if (null != workListener) {
+        if (null == workListener) {
+            this.workListener = NULL_WORK_LISTENER;
+        } else {
             this.workListener = workListener;
         }
+        if (aWork instanceof InflowContextProvider) {
+            if (execContext != null) {
+                throw new WorkRejectedException("Execution context provided but Work implements InflowContextProvider");
+            }
+            executionContext = null;
+        } else {
+            executionContext = execContext;
+        }
+        this.inflowContextHandlers = inflowContextHandlers;
     }
 
     /* (non-Javadoc)
@@ -229,7 +246,7 @@
      * @return true if the Work has timed out and false otherwise.
      */
     public synchronized boolean isTimedOut() {
-        assert isAccepted: "The work is not accepted.";
+        assert isAccepted : "The work is not accepted.";
         // A value of 0 means that the work never times out.
         //??? really?
         if (0 == startTimeOut || startTimeOut == WorkManager.INDEFINITE) {
@@ -278,6 +295,7 @@
             endLatch.countDown();
             return;
         }
+
         // Implementation note: the work listener is notified prior to release
         // the start lock. This behavior is intentional and seems to be the
         // more conservative.
@@ -286,29 +304,50 @@
         //Implementation note: we assume this is being called without an interesting TransactionContext,
         //and ignore/replace whatever is associated with the current thread.
         try {
-            if (executionContext == null || executionContext.getXid() == null) {
-                adaptee.run();
-            } else {
+            List<InflowContext> inflowContexts = NO_INFLOW_CONTEXT;
+            if (executionContext != null) {
+                TransactionInflowContext txInflowContext = new TransactionInflowContext();
                 try {
-                    long transactionTimeout = executionContext.getTransactionTimeout();
-                    //translate -1 value to 0 to indicate default transaction timeout.
-                    xaWork.begin(executionContext.getXid(), transactionTimeout < 0 ? 0 : transactionTimeout);
-                } catch (XAException e) {
-                    throw new WorkCompletedException("Transaction import failed for xid " + executionContext.getXid(), WorkCompletedException.TX_RECREATE_FAILED).initCause(e);
-                } catch (InvalidTransactionException e) {
-                    throw new WorkCompletedException("Transaction import failed for xid " + executionContext.getXid(), WorkCompletedException.TX_RECREATE_FAILED).initCause(e);
-                } catch (SystemException e) {
-                    throw new WorkCompletedException("Transaction import failed for xid " + executionContext.getXid(), WorkCompletedException.TX_RECREATE_FAILED).initCause(e);
-                } catch (ImportedTransactionActiveException e) {
-                    throw new WorkCompletedException("Transaction already active for xid " + executionContext.getXid(), WorkCompletedException.TX_CONCURRENT_WORK_DISALLOWED).initCause(e);
+                    txInflowContext.setTransactionTimeout(executionContext.getTransactionTimeout());
+                } catch (NotSupportedException e) {
+                    throw new WorkRejectedException("Could not read tx timeout");
                 }
-                try {
-                    adaptee.run();
-                } finally {
-                    xaWork.end(executionContext.getXid());
+                inflowContexts = Collections.<InflowContext>singletonList(txInflowContext);
+            } else if (adaptee instanceof InflowContextProvider) {
+                inflowContexts = ((InflowContextProvider) adaptee).getInflowContexts();
+            }
+            List<InflowContextHandler> sortedHandlers = new ArrayList<InflowContextHandler>(inflowContexts.size());
+            for (InflowContext inflowContext : inflowContexts) {
+                boolean found = false;
+                for (Iterator<InflowContextHandler> it = inflowContextHandlers.iterator(); it.hasNext();) {
+                    InflowContextHandler inflowContextHandler = it.next();
+                    //TODO is this the right way around?
+                    if (inflowContext.getClass().isAssignableFrom(inflowContextHandler.getHandledClass())) {
+                        it.remove();
+                        sortedHandlers.add(inflowContextHandler);
+                        found = true;
+                        break;
+                    }
                 }
+                if (!found) {
+                    throw new WorkCompletedException("Duplicate or unhandled InflowContext: " + inflowContext);
+                }
+            }
+            // TODO use a InflowContextLifecycleListener
 
+            int i = 0;
+            for (InflowContext inflowContext : inflowContexts) {
+                inflowContextHandlers.get(i).before(inflowContext);
+            }
+            try {
+                adaptee.run();
+            } finally {
+                int j = 0;
+                for (InflowContext inflowContext : inflowContexts) {
+                    inflowContextHandlers.get(j).after(inflowContext);
+                }
             }
+
             workListener.workCompleted(new WorkEvent(this, WorkEvent.WORK_COMPLETED, adaptee, null));
         } catch (Throwable e) {
             workException = (WorkException) (e instanceof WorkCompletedException ? e : new WorkCompletedException("Unknown error", WorkCompletedException.UNDEFINED).initCause(e));

Modified: geronimo/components/txmanager/trunk/geronimo-connector/src/test/java/org/apache/geronimo/connector/BootstrapContextTest.java
URL: http://svn.apache.org/viewvc/geronimo/components/txmanager/trunk/geronimo-connector/src/test/java/org/apache/geronimo/connector/BootstrapContextTest.java?rev=705104&r1=705103&r2=705104&view=diff
==============================================================================
--- geronimo/components/txmanager/trunk/geronimo-connector/src/test/java/org/apache/geronimo/connector/BootstrapContextTest.java (original)
+++ geronimo/components/txmanager/trunk/geronimo-connector/src/test/java/org/apache/geronimo/connector/BootstrapContextTest.java Wed Oct 15 17:14:10 2008
@@ -18,6 +18,7 @@
 package org.apache.geronimo.connector;
 
 import java.util.Timer;
+import java.util.Collections;
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.RejectedExecutionHandler;
 import java.util.concurrent.SynchronousQueue;
@@ -30,6 +31,8 @@
 
 import junit.framework.TestCase;
 import org.apache.geronimo.connector.work.GeronimoWorkManager;
+import org.apache.geronimo.connector.work.TransactionInflowContextHandler;
+import org.apache.geronimo.connector.work.InflowContextHandler;
 import org.apache.geronimo.transaction.manager.GeronimoTransactionManager;
 import org.apache.geronimo.transaction.manager.XAWork;
 
@@ -94,7 +97,8 @@
      */
     public void testGetSetWorkManager() throws Exception {
         GeronimoTransactionManager transactionManager = new GeronimoTransactionManager();
-        GeronimoWorkManager manager = new GeronimoWorkManager(pool, pool, pool, transactionManager);
+        TransactionInflowContextHandler txInflowContextHandler = new TransactionInflowContextHandler(transactionManager);
+        GeronimoWorkManager manager = new GeronimoWorkManager(pool, pool, pool, Collections.<InflowContextHandler>singletonList(txInflowContextHandler));
         GeronimoBootstrapContext context = new GeronimoBootstrapContext(manager, transactionManager);
         WorkManager wm = context.getWorkManager();
 
@@ -106,7 +110,8 @@
      */
     public void testGetSetXATerminator() throws Exception {
         GeronimoTransactionManager transactionManager = new GeronimoTransactionManager();
-        GeronimoWorkManager manager = new GeronimoWorkManager(pool, pool, pool, transactionManager);
+        TransactionInflowContextHandler txInflowContextHandler = new TransactionInflowContextHandler(transactionManager);
+        GeronimoWorkManager manager = new GeronimoWorkManager(pool, pool, pool, Collections.<InflowContextHandler>singletonList(txInflowContextHandler));
         GeronimoBootstrapContext context = new GeronimoBootstrapContext(manager, transactionManager);
         XATerminator xat = context.getXATerminator();
 

Modified: geronimo/components/txmanager/trunk/geronimo-connector/src/test/java/org/apache/geronimo/connector/work/PooledWorkManagerTest.java
URL: http://svn.apache.org/viewvc/geronimo/components/txmanager/trunk/geronimo-connector/src/test/java/org/apache/geronimo/connector/work/PooledWorkManagerTest.java?rev=705104&r1=705103&r2=705104&view=diff
==============================================================================
--- geronimo/components/txmanager/trunk/geronimo-connector/src/test/java/org/apache/geronimo/connector/work/PooledWorkManagerTest.java (original)
+++ geronimo/components/txmanager/trunk/geronimo-connector/src/test/java/org/apache/geronimo/connector/work/PooledWorkManagerTest.java Wed Oct 15 17:14:10 2008
@@ -24,6 +24,7 @@
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
+import java.util.Collections;
 
 import javax.resource.spi.work.ExecutionContext;
 import javax.resource.spi.work.Work;
@@ -51,6 +52,7 @@
         super.setUp();
         
         XAWork xaWork = new GeronimoTransactionManager();
+        TransactionInflowContextHandler txInflowContextHandler = new TransactionInflowContextHandler(xaWork);
         int poolSize = 1;
         int keepAliveTime = 30000;
         ThreadPoolExecutor pool = new ThreadPoolExecutor(
@@ -63,7 +65,7 @@
         pool.setThreadFactory(new ThreadPoolThreadFactory("Connector Test", getClass().getClassLoader()));
 
 
-        workManager = new GeronimoWorkManager(pool, pool, pool, xaWork);
+        workManager = new GeronimoWorkManager(pool, pool, pool, Collections.<InflowContextHandler>singletonList(txInflowContextHandler));
         workManager.doStart();
     }
 

Modified: geronimo/components/txmanager/trunk/geronimo-transaction/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/components/txmanager/trunk/geronimo-transaction/pom.xml?rev=705104&r1=705103&r2=705104&view=diff
==============================================================================
--- geronimo/components/txmanager/trunk/geronimo-transaction/pom.xml (original)
+++ geronimo/components/txmanager/trunk/geronimo-transaction/pom.xml Wed Oct 15 17:14:10 2008
@@ -54,10 +54,10 @@
             <artifactId>geronimo-jta_1.1_spec</artifactId>
         </dependency>
 
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-j2ee-connector_1.5_spec</artifactId>
-        </dependency>
+            <dependency>
+                <groupId>org.apache.geronimo.specs</groupId>
+                <artifactId>geronimo-j2ee-connector_1.6_spec</artifactId>
+            </dependency>
 
         <dependency>
             <groupId>org.objectweb.howl</groupId>

Modified: geronimo/components/txmanager/trunk/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/components/txmanager/trunk/pom.xml?rev=705104&r1=705103&r2=705104&view=diff
==============================================================================
--- geronimo/components/txmanager/trunk/pom.xml (original)
+++ geronimo/components/txmanager/trunk/pom.xml Wed Oct 15 17:14:10 2008
@@ -85,8 +85,8 @@
 
             <dependency>
                 <groupId>org.apache.geronimo.specs</groupId>
-                <artifactId>geronimo-j2ee-connector_1.5_spec</artifactId>
-                <version>2.0.0</version>
+                <artifactId>geronimo-j2ee-connector_1.6_spec</artifactId>
+                <version>1.0-EA-SNAPSHOT</version>
             </dependency>
 
             <dependency>