[jboss-cvs] JBossAS SVN: r110437 - in projects/jboss-jca/trunk: core and 15 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Jan 24 10:11:33 EST 2011


Author: maeste
Date: 2011-01-24 10:11:31 -0500 (Mon, 24 Jan 2011)
New Revision: 110437

Added:
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManagerTestCase.java
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/package.html
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListenerTestCase.java
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/package.html
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/OnePoolTestCase.java
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/package.html
   projects/jboss-jca/trunk/deployers/src/test/java/org/jboss/jca/test/deployers/spec/rars/testcases/package.html
Modified:
   projects/jboss-jca/trunk/common/src/main/resources/schema/ironjacamar_1_0.xsd
   projects/jboss-jca/trunk/core/.classpath
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManager.java
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListener.java
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/notx/NoTxConnectionManagerImpl.java
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/AbstractPool.java
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/NoTxConnectionListenerTestCase.java
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter10/api/WorkManagerRejectingScheduleWorkTestCase.java
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter10/api/WorkManagerRejectingStartWorkTestCase.java
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter11/section7/WorkContextSetupListenerTestCase.java
   projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/common/AbstractResourceAdapterDeployer.java
   projects/jboss-jca/trunk/doc/userguide/en-US/modules/schemas.xml
   projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/Embedded.java
   projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/EmbeddedJCA.java
   projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/arquillian/EmbeddedJCAContainer.java
Log:
JBJCA-495 provide full coverage for core module

Modified: projects/jboss-jca/trunk/common/src/main/resources/schema/ironjacamar_1_0.xsd
===================================================================
--- projects/jboss-jca/trunk/common/src/main/resources/schema/ironjacamar_1_0.xsd	2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/common/src/main/resources/schema/ironjacamar_1_0.xsd	2011-01-24 15:11:31 UTC (rev 110437)
@@ -2,7 +2,8 @@
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
            elementFormDefault="qualified"
            targetNamespace="http://www.jboss.org/ironjacamar/schema"
-           xmlns="http://www.jboss.org/ironjacamar/schema">
+           xmlns="http://www.jboss.org/ironjacamar/schema"
+           version="1.0">
 
   <xs:complexType name="boolean-presenceType"></xs:complexType>
 

Modified: projects/jboss-jca/trunk/core/.classpath
===================================================================
--- projects/jboss-jca/trunk/core/.classpath	2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/core/.classpath	2011-01-24 15:11:31 UTC (rev 110437)
@@ -23,5 +23,7 @@
 	<classpathentry kind="lib" path="/ironjacamar-parent/lib/test/mockito-all.jar"/>
 	<classpathentry kind="lib" path="/ironjacamar-parent/lib/test/h2.jar"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/ironjacamar-embedded"/>
+	<classpathentry kind="lib" path="/ironjacamar-parent/lib/common/jbossjts-integration.jar"/>
+	<classpathentry kind="lib" path="/ironjacamar-parent/lib/common/jbossjts.jar"/>
 	<classpathentry kind="output" path="eclipse-target/classes"/>
 </classpath>

Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManager.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManager.java	2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManager.java	2011-01-24 15:11:31 UTC (rev 110437)
@@ -28,7 +28,6 @@
 import org.jboss.jca.spi.ComponentStack;
 
 import java.lang.reflect.Method;
-
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -42,7 +41,6 @@
 import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-
 import javax.resource.ResourceException;
 import javax.resource.spi.ConnectionRequestInfo;
 import javax.transaction.Synchronization;
@@ -51,7 +49,6 @@
 import javax.transaction.TransactionManager;
 
 import org.jboss.logging.Logger;
-
 import org.jboss.tm.TxUtils;
 import org.jboss.tm.usertx.UserTransactionListener;
 import org.jboss.tm.usertx.client.ServerVMClientUserTransaction.UserTransactionStartedListener;
@@ -59,8 +56,8 @@
 
 /**
  * CacheConnectionManager.
- * 
- * @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a> 
+ *
+ * @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
  */
 public class CachedConnectionManager implements
    UserTransactionStartedListener,
@@ -69,19 +66,19 @@
 {
    /** Log instance */
    private static Logger log = Logger.getLogger(CachedConnectionManager.class);
-   
+
    /** Log trace */
    private static boolean trace = log.isTraceEnabled();
-   
+
    /** Debugging flag */
    private static boolean debug = false;
-   
+
    /** Enabled error handling for debugging */
    private static boolean error = false;
-   
+
    /** Transaction Manager instance */
    private final TransactionManager transactionManager;
-   
+
    /**
     * ThreadLocal that holds current calling meta-programming aware
     * object, used in case someone is idiotic enough to cache a
@@ -96,15 +93,15 @@
     * map of meta-aware object to set of connections it holds, used by
     * the idiot spec compliant behavior.
     */
-   private final ConcurrentMap<KeyConnectionAssociation, 
-      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> 
-   objectToConnectionManagerMap = new ConcurrentHashMap<KeyConnectionAssociation, 
+   private final ConcurrentMap<KeyConnectionAssociation,
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>>
+   objectToConnectionManagerMap = new ConcurrentHashMap<KeyConnectionAssociation,
       ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>>();
 
    /**
     * Connection stacktraces
     */
-   private Map<Object, Throwable> connectionStackTraces = new WeakHashMap<Object, Throwable>();
+   private final Map<Object, Throwable> connectionStackTraces = new WeakHashMap<Object, Throwable>();
 
    /**
     * Creates a new instance.
@@ -114,7 +111,7 @@
    {
       this.transactionManager = transactionManager;
    }
-   
+
    /**
     * Gets transaction manager.
     * @return transaction manager
@@ -123,7 +120,7 @@
    {
       return transactionManager;
    }
-   
+
    /**
     * {@inheritDoc}
     */
@@ -132,55 +129,55 @@
       KeyConnectionAssociation key = peekMetaAwareObject();
       if (trace)
       {
-         log.trace("user tx started, key: " + key);  
+         log.trace("user tx started, key: " + key);
       }
       if (key == null)
       {
-         return; //not participating properly in this management scheme.  
+         return; //not participating properly in this management scheme.
       }
 
-      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap = 
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
          key.getCMToConnectionsMap();
 
-      Iterator<Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> cmToConnectionsMapIterator = 
+      Iterator<Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> cmToConnectionsMapIterator =
          cmToConnectionsMap.entrySet().iterator();
-      
+
       while (cmToConnectionsMapIterator.hasNext())
       {
-         Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> entry = 
+         Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> entry =
             cmToConnectionsMapIterator.next();
 
          ConnectionCacheListener cm = entry.getKey();
          CopyOnWriteArrayList<ConnectionRecord> conns = entry.getValue();
-         
+
          cm.transactionStarted(conns);
       }
    }
-   
+
    /**
-    * 
+    *
     * @return stack last meta-aware object
     */
-   KeyConnectionAssociation peekMetaAwareObject()
+   private KeyConnectionAssociation peekMetaAwareObject()
    {
       LinkedList<Object> stack = currentObjects.get();
       if (stack == null)
       {
-         return null;  
+         return null;
       }
-      
+
       if (!stack.isEmpty())
       {
-         return (KeyConnectionAssociation) stack.getLast();  
+         return (KeyConnectionAssociation) stack.getLast();
       }
-      
+
       else
       {
-         return null;  
+         return null;
       }
    }
-   
-   
+
+
    /**
     * {@inheritDoc}
     */
@@ -191,20 +188,20 @@
       KeyConnectionAssociation oldKey = (KeyConnectionAssociation) stack.removeLast();
       if (trace)
       {
-         log.trace("popped object: " + Strings.defaultToString(oldKey));  
+         log.trace("popped object: " + Strings.defaultToString(oldKey));
       }
 
       if (!stack.contains(oldKey))
       {
          disconnect(oldKey, unsharableResources);
       } // end of if ()
-       
+
       if (debug)
       {
          if (closeAll(oldKey.getCMToConnectionsMap()) && error)
          {
             throw new ResourceException("Some connections were not closed, " +
-                  "see the log for the allocation stacktraces");  
+                  "see the log for the allocation stacktraces");
          }
       }
    }
@@ -216,7 +213,7 @@
     * @param connection connection handle
     * @param cri connection request info.
     */
-   public void registerConnection(ConnectionCacheListener cm, ConnectionListener cl, 
+   public void registerConnection(ConnectionCacheListener cm, ConnectionListener cl,
          Object connection, ConnectionRequestInfo cri)
    {
       if (debug)
@@ -228,20 +225,20 @@
       }
 
       KeyConnectionAssociation key = peekMetaAwareObject();
-      
+
       if (trace)
       {
          log.trace("registering connection from connection manager " + cm +
-               ", connection : " + connection + ", key: " + key);  
+               ", connection : " + connection + ", key: " + key);
       }
-      
+
       if (key == null)
       {
-         return; //not participating properly in this management scheme.  
+         return; //not participating properly in this management scheme.
       }
 
       ConnectionRecord cr = new ConnectionRecord(cl, connection, cri);
-      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap = 
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
          key.getCMToConnectionsMap();
 
       CopyOnWriteArrayList<ConnectionRecord> conns = cmToConnectionsMap.get(cm);
@@ -250,7 +247,7 @@
          conns = new CopyOnWriteArrayList<ConnectionRecord>();
          cmToConnectionsMap.put(cm, conns);
       }
-      
+
       conns.add(cr);
    }
 
@@ -266,9 +263,9 @@
          CloseConnectionSynchronization cas = getCloseConnectionSynchronization(false);
          if (cas != null)
          {
-            cas.remove(connection);  
+            cas.remove(connection);
          }
-         
+
          synchronized (connectionStackTraces)
          {
             connectionStackTraces.remove(connection);
@@ -276,39 +273,41 @@
       }
 
       KeyConnectionAssociation key = peekMetaAwareObject();
-      
+
       if (trace)
       {
          log.trace("unregistering connection from connection manager " + cm +
-               ", object: " + connection + ", key: " + key);  
+               ", object: " + connection + ", key: " + key);
       }
-      
+
       if (key == null)
       {
-         return; //not participating properly in this management scheme.  
+         return; //not participating properly in this management scheme.
       }
 
-      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap = 
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
          key.getCMToConnectionsMap();
 
       CopyOnWriteArrayList<ConnectionRecord> conns = cmToConnectionsMap.get(cm);
       if (conns == null)
       {
-         return; // Can happen if connections are "passed" between contexts  
+         return; // Can happen if connections are "passed" between contexts
       }
-      
-      for (Iterator<ConnectionRecord> i = conns.iterator(); i.hasNext();)
+
+      //note iterator of CopyOnWriteArrayList does not support remove method
+      //we use here remove on CopyOnWriteArrayList directly
+      for (ConnectionRecord connectionRecord : conns)
       {
-         if ((i.next()).getConnection() == connection)
+         if (connectionRecord.getConnection() == connection)
          {
-            i.remove();
+            conns.remove(connectionRecord);
             return;
          }
       }
-      
+
       throw new IllegalStateException("Trying to return an unknown connection2! " + connection);
    }
-   
+
    /**
     * {@inheritDoc}
     */
@@ -320,29 +319,29 @@
       {
          if (trace)
          {
-            log.trace("new stack for key: " + Strings.defaultToString(rawKey));  
+            log.trace("new stack for key: " + Strings.defaultToString(rawKey));
          }
-         
-         stack = new LinkedList<Object>();         
-         currentObjects.set(stack);         
+
+         stack = new LinkedList<Object>();
+         currentObjects.set(stack);
       }
       else
       {
          if (trace)
          {
-            log.trace("old stack for key: " + Strings.defaultToString(rawKey));  
+            log.trace("old stack for key: " + Strings.defaultToString(rawKey));
          }
       }
-      
+
       KeyConnectionAssociation key = new KeyConnectionAssociation(rawKey);
       if (!stack.contains(key))
       {
          reconnect(key, unsharableResources);
       }
-      
-      stack.addLast(key);      
+
+      stack.addLast(key);
    }
-   
+
    /**
     * The <code>reconnect</code> method gets the cmToConnectionsMap
     * from objectToConnectionManagerMap, copies it to the key, and
@@ -355,28 +354,28 @@
    @SuppressWarnings("unchecked")
    private void reconnect(KeyConnectionAssociation key, Set unsharableResources) throws ResourceException
    {
-      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap = 
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
          objectToConnectionManagerMap.get(key);
-         
+
       if (cmToConnectionsMap == null)
-         return;  
+         return;
 
       key.setCMToConnectionsMap(cmToConnectionsMap);
-      Iterator<Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> cmToConnectionsMapIterator = 
+      Iterator<Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> cmToConnectionsMapIterator =
          cmToConnectionsMap.entrySet().iterator();
-      
+
       while (cmToConnectionsMapIterator.hasNext())
       {
-         Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> entry = 
+         Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> entry =
             cmToConnectionsMapIterator.next();
 
          ConnectionCacheListener cm = entry.getKey();
          CopyOnWriteArrayList<ConnectionRecord> conns =  entry.getValue();
-         
+
          cm.reconnect(conns, unsharableResources);
       }
    }
-   
+
    /**
     * Disconnect connections.
     * @param key key
@@ -393,62 +392,62 @@
       {
          objectToConnectionManagerMap.put(key, cmToConnectionsMap);
 
-         Iterator<Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> cmToConnectionsMapIterator = 
+         Iterator<Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> cmToConnectionsMapIterator =
             cmToConnectionsMap.entrySet().iterator();
-         
+
          while (cmToConnectionsMapIterator.hasNext())
          {
-            Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> entry = 
+            Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> entry =
                cmToConnectionsMapIterator.next();
 
             ConnectionCacheListener cm = entry.getKey();
             CopyOnWriteArrayList<ConnectionRecord> conns =  entry.getValue();
-            
+
             cm.disconnect(conns, unsharableResources);
          }
       }
    }
-   
+
    /**
     * Describe <code>unregisterConnectionCacheListener</code> method here.
     * This is a shutdown method called by a connection manager.  It will remove all reference
     * to that connection manager from the cache, so cached connections from that manager
     * will never be recoverable.
     * Possibly this method should not exist.
-    * 
+    *
     * @param cm a <code>ConnectionCacheListener</code> value
-    */   
+    */
    public void unregisterConnectionCacheListener(ConnectionCacheListener cm)
    {
       if (trace)
       {
-         log.trace("unregisterConnectionCacheListener: " + cm);  
+         log.trace("unregisterConnectionCacheListener: " + cm);
       }
-      
-      Iterator<ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> it = 
+
+      Iterator<ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> it =
          objectToConnectionManagerMap.values().iterator();
-         
+
       while (it.hasNext())
       {
          ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap = it.next();
 
          if (cmToConnectionsMap != null)
-            cmToConnectionsMap.remove(cm);  
+            cmToConnectionsMap.remove(cm);
       }
    }
-   
-   
+
+
    /**
     * Close all connections.
     * @param cmToConnectionsMap connection manager to connections
     * @return true if close
     */
-   private boolean closeAll(ConcurrentMap<ConnectionCacheListener, 
+   private boolean closeAll(ConcurrentMap<ConnectionCacheListener,
                             CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap)
    {
       if (!debug)
       {
-         return false;  
+         return false;
       }
 
       boolean unclosed = false;
@@ -470,15 +469,15 @@
                }
                else
                {
-                  cas.add(c);  
+                  cas.add(c);
                }
             }
          }
       }
-      
+
       return unclosed;
    }
-   
+
    /**
     * Gets close sync. instance.
     * @param createIfNotFound create if not found
@@ -491,23 +490,23 @@
          Transaction tx = null;
          if (transactionManager != null)
          {
-            tx = transactionManager.getTransaction();  
+            tx = transactionManager.getTransaction();
          }
-        
+
          if (tx != null)
          {
             TransactionSynchronizer.lock(tx);
             try
             {
-               CloseConnectionSynchronization cas = (CloseConnectionSynchronization) 
+               CloseConnectionSynchronization cas = (CloseConnectionSynchronization)
                                                    TransactionSynchronizer.getCCMSynchronization(tx);
-               
+
                if (cas == null && createIfNotFound && TxUtils.isActive(tx))
                {
                   cas = new CloseConnectionSynchronization();
                   TransactionSynchronizer.registerCCMSynchronization(tx, cas);
                }
-               
+
                return cas;
             }
             finally
@@ -520,11 +519,11 @@
       {
          log.debug("Unable to synchronize with transaction", t);
       }
-      
+
       return null;
    }
-   
-   
+
+
    /**
     * Close connection handle.
     * @param connectionHandle connection handle
@@ -534,25 +533,25 @@
       try
       {
          Throwable exception;
-         
+
          synchronized (connectionStackTraces)
          {
             exception = connectionStackTraces.remove(connectionHandle);
          }
-         
+
          Method m = connectionHandle.getClass().getMethod("close", new Class[]{});
-         
+
          try
          {
             if (exception != null)
             {
-               log.info("Closing a connection for you.  Please close them yourself: " + connectionHandle, exception);  
+               log.info("Closing a connection for you.  Please close them yourself: " + connectionHandle, exception);
             }
             else
             {
-               log.info("Closing a connection for you.  Please close them yourself: " + connectionHandle);  
+               log.info("Closing a connection for you.  Please close them yourself: " + connectionHandle);
             }
-            
+
             m.invoke(connectionHandle, new Object[]{});
          }
          catch (Throwable t)
@@ -565,16 +564,16 @@
          log.info("Could not find a close method on alleged connection objects.  Please close your own connections.");
       }
    }
-   
-   
+
+
    /**
-    * Close synch. class. 
+    * Close synch. class.
     */
    private class CloseConnectionSynchronization implements Synchronization
    {
       /**Connection handles*/
       CopyOnWriteArraySet<Object> connections = new CopyOnWriteArraySet<Object>();
-      
+
       /**Closing flag*/
       AtomicBoolean closing = new AtomicBoolean(false);
 
@@ -583,7 +582,7 @@
        */
       public CloseConnectionSynchronization()
       {
-         
+
       }
 
       /**
@@ -594,7 +593,7 @@
       {
          if (closing.get())
          {
-            return;  
+            return;
          }
          connections.add(c);
       }
@@ -607,9 +606,9 @@
       {
          if (closing.get())
          {
-            return;  
+            return;
          }
-         
+
          connections.remove(c);
       }
 
@@ -627,14 +626,26 @@
       public void afterCompletion(int status)
       {
          closing.set(true);
-         
+
          for (Iterator<Object> i = connections.iterator(); i.hasNext();)
          {
-            closeConnection(i.next());  
+            closeConnection(i.next());
          }
-        
+
          connections.clear();
       }
    }
-   
+
+   /**
+    * Get the currentObjects.
+    * This method is package protected beacause it is intended only for test case use.
+    * Please don't use it in your production code.
+    *
+    * @return the currentObjects.
+    */
+   final ThreadLocal<LinkedList<Object>> getCurrentObjects()
+   {
+      return currentObjects;
+   }
+
 }

Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListener.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListener.java	2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListener.java	2011-01-24 15:11:31 UTC (rev 110437)
@@ -47,20 +47,20 @@
 
 /**
  * Tx connection listener.
- * @author <a href="mailto:gurkanerdogdu at yahoo.com">Gurkan Erdogdu</a> 
+ * @author <a href="mailto:gurkanerdogdu at yahoo.com">Gurkan Erdogdu</a>
  * @version $Rev$
  */
 public class TxConnectionListener extends AbstractConnectionListener
 {
-   
+
    /**Transaction synch. instance*/
    private TransactionSynchronization transactionSynchronization;
-   
+
    /**XAResource instance*/
    private final XAResource xaResource;
 
    /** Whether there is a local transaction */
-   private AtomicBoolean localTransaction = new AtomicBoolean(false);
+   private final AtomicBoolean localTransaction = new AtomicBoolean(false);
 
    /**
     * Creates a new tx listener.
@@ -71,33 +71,34 @@
     * @param xaResource xaresource instance
     * @throws ResourceException if aexception while creating
     */
-   public TxConnectionListener(final ConnectionManager cm, final ManagedConnection mc, 
+   public TxConnectionListener(final ConnectionManager cm, final ManagedConnection mc,
                                final Pool pool, final Object context, final XAResource xaResource)
       throws ResourceException
    {
       super(cm, mc, pool, context);
 
       this.xaResource = xaResource;
-      
+
       if (xaResource instanceof LocalXAResource)
       {
-         ((LocalXAResource) xaResource).setConnectionListener(this);  
+         ((LocalXAResource) xaResource).setConnectionListener(this);
       }
-   }   
-   
+   }
+
    /**
     * {@inheritDoc}
     */
+   @Override
    public void enlist() throws SystemException
    {
       // This method is a bit convulted, but it has to be such because
       // there is a race condition in the transaction manager where it
-      // unlocks during the enlist of the XAResource. It does this 
+      // unlocks during the enlist of the XAResource. It does this
       // to avoid distributed deadlocks and to ensure the transaction
       // timeout can fail a badly behaving resource during the enlist.
       //
-      // When two threads in the same transaction are trying to enlist 
-      // connections they could be from the same resource manager 
+      // When two threads in the same transaction are trying to enlist
+      // connections they could be from the same resource manager
       // or even the same connection when tracking the connection by transaction.
       //
       // For the same connection, we only want to do the real enlist once.
@@ -123,7 +124,7 @@
       // an earlier thread while it enlists some later thread's resource.
       // Since they are all a part of the same transaction, this is probably
       // not a real issue.
-      
+
       // No transaction associated with the thread
       TransactionManager tm = getConnectionManager().getTransactionManager();
       int status = tm.getStatus();
@@ -134,19 +135,19 @@
             String error = "Attempt to use connection outside a transaction when already a tx!";
             if (trace)
             {
-               getLog().trace(error + " " + this);  
+               getLog().trace(error + " " + this);
             }
-            
+
             throw new IllegalStateException(error);
          }
          if (trace)
          {
-            getLog().trace("No transaction, no need to enlist: " + this);  
+            getLog().trace("No transaction, no need to enlist: " + this);
          }
-         
+
          return;
       }
-      
+
       // Inactive transaction
       Transaction threadTx = tm.getTransaction();
       if (threadTx == null || status != Status.STATUS_ACTIVE)
@@ -154,21 +155,21 @@
          String error = "Transaction " + threadTx + " is not active " + TxUtils.getStatusAsString(status);
          if (trace)
          {
-            getLog().trace(error + " cl=" + this);  
+            getLog().trace(error + " cl=" + this);
          }
-         
+
          throw new IllegalStateException(error);
       }
 
       if (trace)
       {
-         getLog().trace("Pre-enlist: " + this + " threadTx=" + threadTx);  
+         getLog().trace("Pre-enlist: " + this + " threadTx=" + threadTx);
       }
-      
-      // Our synchronization 
+
+      // Our synchronization
       TransactionSynchronization ourSynchronization = null;
 
-      // Serializes enlistment when two different threads are enlisting 
+      // Serializes enlistment when two different threads are enlisting
       // different connections in the same transaction concurrently
       TransactionSynchronizer synchronizer = null;
 
@@ -182,18 +183,18 @@
             String error = "Can't enlist - already a tx!";
             if (trace)
             {
-               getLog().trace(error + " " + this);  
+               getLog().trace(error + " " + this);
             }
             throw new IllegalStateException(error);
          }
-         
+
          // Check for different transaction
          if (transactionSynchronization != null && !transactionSynchronization.currentTx.equals(threadTx))
          {
             String error = "Trying to change transaction " + threadTx + " in enlist!";
             if (trace)
             {
-               getLog().trace(error + " " + this);  
+               getLog().trace(error + " " + this);
             }
             throw new IllegalStateException(error);
          }
@@ -203,9 +204,9 @@
          {
             if (this.trace)
             {
-               getLog().trace("Get synchronizer " + this + " threadTx=" + threadTx);  
+               getLog().trace("Get synchronizer " + this + " threadTx=" + threadTx);
             }
-            
+
             synchronizer = TransactionSynchronizer.getRegisteredSynchronizer(threadTx);
          }
          catch (Throwable t)
@@ -221,7 +222,7 @@
             synchronizer.addUnenlisted(synchronization);
             transactionSynchronization = synchronization;
          }
-         
+
          ourSynchronization = transactionSynchronization;
       }
       finally
@@ -241,7 +242,7 @@
                TransactionSynchronization sync = (TransactionSynchronization) unenlisted.get(i);
                if (sync.enlist())
                {
-                  synchronizer.addEnlisted(sync);  
+                  synchronizer.addEnlisted(sync);
                }
             }
          }
@@ -250,19 +251,20 @@
             synchronizer.enlisted();
          }
       }
-      
+
       // What was the result of our enlistment?
       if (this.trace)
       {
-         getLog().trace("Check enlisted " + this + " threadTx=" + threadTx);  
+         getLog().trace("Check enlisted " + this + " threadTx=" + threadTx);
       }
-      
+
       ourSynchronization.checkEnlisted();
    }
 
    /**
     * {@inheritDoc}
     */
+   @Override
    public void delist() throws ResourceException
    {
       if (trace)
@@ -282,7 +284,7 @@
                   synchronizer.removeEnlisted(synchronization);
                if (!tx.delistResource(getXAResource(), XAResource.TMSUSPEND))
                {
-                  throw new ResourceException("Failure to delist resource: " + this);  
+                  throw new ResourceException("Failure to delist resource: " + this);
                }
             }
          }
@@ -306,6 +308,7 @@
    /**
     * {@inheritDoc}
     */
+   @Override
    public void connectionClosed(ConnectionEvent ce)
    {
       if (trace)
@@ -318,7 +321,7 @@
       {
          try
          {
-            this.getCachedConnectionManager().unregisterConnection(this.getConnectionManager(), 
+            this.getCachedConnectionManager().unregisterConnection(this.getConnectionManager(),
                                                                    ce.getConnectionHandle());
          }
          catch (Throwable t)
@@ -352,6 +355,7 @@
    /**
     * {@inheritDoc}
     */
+   @Override
    public void localTransactionStarted(ConnectionEvent ce)
    {
       localTransaction.set(true);
@@ -360,6 +364,7 @@
    /**
     * {@inheritDoc}
     */
+   @Override
    public void localTransactionCommitted(ConnectionEvent ce)
    {
       localTransaction.set(false);
@@ -368,6 +373,7 @@
    /**
     * {@inheritDoc}
     */
+   @Override
    public void localTransactionRolledback(ConnectionEvent ce)
    {
       localTransaction.set(false);
@@ -376,6 +382,7 @@
    /**
     * {@inheritDoc}
     */
+   @Override
    public void tidyup() throws ResourceException
    {
       // We have a hanging transaction
@@ -406,6 +413,7 @@
    /**
     * {@inheritDoc}
     */
+   @Override
    public void connectionErrorOccurred(ConnectionEvent ce)
    {
       transactionSynchronization = null;
@@ -416,6 +424,7 @@
     * {@inheritDoc}
     */
    //Important method!!
+   @Override
    public boolean isManagedConnectionFree()
    {
       if (isTrackByTx() && transactionSynchronization != null)
@@ -424,7 +433,7 @@
    }
 
    /**
-    * This method changes the number of handles or 
+    * This method changes the number of handles or
     * the track-by-tx value depending on the parameter passed in
     * @param handle The handle; if <code>null</code> track-by-tx is changed
     * @return True if the managed connection was freed
@@ -453,36 +462,39 @@
          // Set track-by-tx to false
          setTrackByTx(false);
       }
-      
+
       // Return if the managed connection was just freed
       return isManagedConnectionFree();
    }
-         
-   
+
    /**
-    * Transaction sync. class. 
+    * Transaction sync. class.
+    * Please note this class has public access is for test purposes only.
+    * Except for test purposes it should be considered private!
+    * Don't use it outside enclosing class or testcase!
     */
-   private class TransactionSynchronization implements Synchronization
+   public class TransactionSynchronization implements Synchronization
    {
       /**Error message*/
-      private final Throwable failedToEnlist = 
+      private final Throwable failedToEnlist =
          new Throwable("Unabled to enlist resource, see the previous warnings.");
-      
+
       /** Transaction */
-      private final Transaction currentTx;
-      
+      protected final Transaction currentTx;
+
       /** This is the status when we were registered */
       private final boolean wasTrackByTx;
 
       /** Whether we are enlisted */
       private boolean enlisted;
-      
+
       /** Any error during enlistment */
       private Throwable enlistError;
-      
+
       /**
-       * Create a new TransactionSynchronization.
-       * 
+       * Create a new TransactionSynchronization.transaction
+       * @param tx transaction
+       *
        * @param trackByTx whether this is track by connection
        */
       public TransactionSynchronization(final Transaction tx, final boolean trackByTx)
@@ -492,10 +504,10 @@
          this.enlisted = false;
          this.enlistError = null;
       }
-      
+
       /**
        * Get the result of the enlistment.
-       * 
+       *
        * @throws SystemExeption for any error
        */
       public void checkEnlisted() throws SystemException
@@ -505,14 +517,14 @@
             String error = "Error enlisting resource in transaction=" + this.currentTx;
             if (TxConnectionListener.this.trace)
             {
-               TxConnectionListener.this.getLog().trace(error + " " + TxConnectionListener.this);  
+               TxConnectionListener.this.getLog().trace(error + " " + TxConnectionListener.this);
             }
 
             // Wrap the error to give a reasonable stacktrace since the resource
             // could have been enlisted by a different thread
             if (enlistError == failedToEnlist)
             {
-               throw new SystemException(failedToEnlist + " tx=" + this.currentTx);  
+               throw new SystemException(failedToEnlist + " tx=" + this.currentTx);
             }
             else
             {
@@ -526,29 +538,29 @@
             String error = "Resource is not enlisted in transaction=" + currentTx;
             if (trace)
             {
-               getLog().trace(error + " " + TxConnectionListener.this);  
+               getLog().trace(error + " " + TxConnectionListener.this);
             }
             throw new IllegalStateException("Resource was not enlisted.");
          }
       }
-      
+
       /**
        * Enlist the resource
-       * 
+       *
        * @return true when enlisted, false otherwise
        */
       public boolean enlist()
       {
          if (TxConnectionListener.this.trace)
          {
-            TxConnectionListener.this.getLog().trace("Enlisting resource " + TxConnectionListener.this);  
+            TxConnectionListener.this.getLog().trace("Enlisting resource " + TxConnectionListener.this);
          }
          try
          {
             XAResource resource = getXAResource();
             if (!currentTx.enlistResource(resource))
             {
-               enlistError = failedToEnlist;  
+               enlistError = failedToEnlist;
             }
          }
          catch (Throwable t)
@@ -562,25 +574,25 @@
             {
                if (trace)
                {
-                  getLog().trace("Failed to enlist resource " + TxConnectionListener.this, enlistError);  
+                  getLog().trace("Failed to enlist resource " + TxConnectionListener.this, enlistError);
                }
-               
+
                setTrackByTx(false);
                transactionSynchronization = null;
-               
+
                return false;
             }
-            
+
             if (trace)
             {
-               getLog().trace("Enlisted resource " + TxConnectionListener.this);  
+               getLog().trace("Enlisted resource " + TxConnectionListener.this);
             }
-            
+
             enlisted = true;
             return true;
          }
       }
-      
+
       /**
        * {@inheritDoc}
        */
@@ -597,16 +609,16 @@
          // The connection got destroyed during the transaction
          if (getState().equals(ConnectionState.DESTROYED))
          {
-            return;  
+            return;
          }
-         
+
          // Are we still in the original transaction?
          if (!this.equals(transactionSynchronization))
          {
             // If we are interleaving transactions we have nothing to do
             if (!wasTrackByTx)
             {
-               return;  
+               return;
             }
             else
             {
@@ -630,14 +642,15 @@
 
             if (wasFreed(null))
             {
-               getConnectionManager().returnManagedConnection(TxConnectionListener.this, false);  
+               getConnectionManager().returnManagedConnection(TxConnectionListener.this, false);
             }
          }
       }
-      
+
       /**
        * {@inheritDoc}
        */
+      @Override
       public String toString()
       {
          StringBuffer buffer = new StringBuffer();
@@ -649,14 +662,37 @@
          return buffer.toString();
       }
    }
-   
+
    /**
     * {@inheritDoc}
     */
    // For debugging
+   @Override
    protected void toString(StringBuffer buffer)
    {
       buffer.append(" xaResource=").append(xaResource);
       buffer.append(" txSync=").append(transactionSynchronization);
    }
+
+   /**
+    * Get the transactionSynchronization.
+    * Please note this package protected method is for test purposes only. Don't use it!
+    *
+    * @return the transactionSynchronization.
+    */
+   final TransactionSynchronization getTransactionSynchronization()
+   {
+      return transactionSynchronization;
+   }
+
+   /**
+    * Set the transactionSynchronization.
+    * Please note this package protected method is for test purposes only. Don't use it!
+    *
+    * @param transactionSynchronization The transactionSynchronization to set.
+    */
+   final void setTransactionSynchronization(TransactionSynchronization transactionSynchronization)
+   {
+      this.transactionSynchronization = transactionSynchronization;
+   }
 }

Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/notx/NoTxConnectionManagerImpl.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/notx/NoTxConnectionManagerImpl.java	2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/notx/NoTxConnectionManagerImpl.java	2011-01-24 15:11:31 UTC (rev 110437)
@@ -29,6 +29,7 @@
 import org.jboss.jca.core.connectionmanager.listener.NoTxConnectionListener;
 
 import java.util.Collection;
+
 import javax.resource.ResourceException;
 import javax.resource.spi.ManagedConnection;
 import javax.transaction.SystemException;

Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/AbstractPool.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/AbstractPool.java	2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/AbstractPool.java	2011-01-24 15:11:31 UTC (rev 110437)
@@ -63,13 +63,13 @@
 
    /** Is trace enabled */
    private boolean trace = false;
-   
+
    /** The subpools, maps key --> pool */
    private final ConcurrentMap<Object, SubPoolContext> subPools = new ConcurrentHashMap<Object, SubPoolContext>();
 
    /** The managed connection factory for this pool */
    private final ManagedConnectionFactory mcf;
-   
+
    /** The connection listener factory for this pool*/
    private ConnectionListenerFactory clf;
 
@@ -77,14 +77,14 @@
    private final PoolConfiguration poolConfiguration;
 
    /** Whether to use separate pools for transactional and non-transaction use */
-   private boolean noTxSeparatePools;
+   private final boolean noTxSeparatePools;
 
    /** The poolName */
    private String poolName;
 
    /**
     * Create a new base pool.
-    * 
+    *
     * @param mcf the managed connection factory
     * @param pc the pool configuration
     * @param noTxSeparatePools noTxSeparatePool
@@ -112,7 +112,7 @@
    {
       this.poolName = poolName;
    }
-   
+
    /**
     * Gets pool name.
     * @return pool name
@@ -121,23 +121,23 @@
    {
       return poolName;
    }
-   
+
    /**
     * Retrieve the key for this request.
-    * 
-    * @param subject the subject 
+    *
+    * @param subject the subject
     * @param cri the connection request information
     * @param separateNoTx separateNoTx
     * @return the key
     * @throws ResourceException for any error
     */
-   protected abstract Object getKey(Subject subject, ConnectionRequestInfo cri, 
+   protected abstract Object getKey(Subject subject, ConnectionRequestInfo cri,
          boolean separateNoTx) throws ResourceException;
 
    /**
     * Determine the correct pool for this request,
     * creates a new one when necessary.
-    * 
+    *
     * @param key the key to the pool
     * @param subject the subject of the pool
     * @param cri the connection request info
@@ -149,7 +149,7 @@
       SubPoolContext subPoolContext = subPools.get(key);
       if (subPoolContext == null)
       {
-         SubPoolContext newSubPoolContext = new SubPoolContext(getTransactionManager(), mcf, clf, subject, 
+         SubPoolContext newSubPoolContext = new SubPoolContext(getTransactionManager(), mcf, clf, subject,
                                                                cri, poolConfiguration, this, log);
          subPoolContext = subPools.putIfAbsent(key, newSubPoolContext);
          if (subPoolContext == null)
@@ -163,22 +163,22 @@
 
    /**
     * Get any transaction manager associated with the pool.
-    * 
+    *
     * @return the transaction manager
     */
    protected TransactionManager getTransactionManager()
    {
       if (clf != null)
       {
-         return clf.getTransactionManager();  
+         return clf.getTransactionManager();
       }
       else
       {
-         return null;  
+         return null;
       }
    }
-   
-   
+
+
    /**
     * {@inheritDoc}
     */
@@ -219,74 +219,74 @@
 
    /**
     * {@inheritDoc}
-    */   
-   public ConnectionListener getConnection(Transaction trackByTransaction, Subject subject, ConnectionRequestInfo cri) 
+    */
+   public ConnectionListener getConnection(Transaction trackByTransaction, Subject subject, ConnectionRequestInfo cri)
       throws ResourceException
    {
       ConnectionListener cl = null;
-      
+
       boolean separateNoTx = false;
-      
+
       if (noTxSeparatePools)
       {
          separateNoTx = clf.isTransactional();
       }
-      
+
       //Get specific sub-pool key
       Object key = getKey(subject, cri, separateNoTx);
-      
+
       //Find sub-pool related with key
       SubPoolContext subPoolContext = getSubPool(key, subject, cri);
-      
+
       //Sub-pool internal managed connection pool
       ManagedConnectionPool imcp = subPoolContext.getSubPool();
 
       // Are we doing track by transaction?
       TransactionLocal trackByTx = subPoolContext.getTrackByTx();
-      
+
       if (trackByTransaction == null || trackByTx == null)
       {
          cl = getSimpleConnection(subject, cri, subPoolContext);
-      } //end of if trackByTransaction   
-      
+      } //end of if trackByTransaction
+
       //Transaction old connections
       if (cl == null)
       {
          cl = getTransactionOldConnection(trackByTx, trackByTransaction);
       }
-      
+
       if (cl == null)
       {
          //Creats a new connection with given transaction
          cl = getTransactionNewConnection(trackByTx, trackByTransaction, imcp, subject, cri);
       }
-      
+
       return cl;
    }
-   
+
    /**
     * Gets simple connection listener that wraps connection.
     * @param subject subject instance
     * @param cri connection request info
     * @param separateNoTx seperate pool for tx
     * @return connection listener
-    * @throws ResourceException
+    * @throws ResourceException ResourceException
     */
-   private ConnectionListener getSimpleConnection(final Subject subject, final ConnectionRequestInfo cri, 
+   private ConnectionListener getSimpleConnection(final Subject subject, final ConnectionRequestInfo cri,
          final SubPoolContext subPoolContext)
       throws ResourceException
    {
       ConnectionListener cl = null;
       ManagedConnectionPool imcp = null;
-      
+
       try
-      {  
+      {
          //Find internal managed pool
          imcp = subPoolContext.getSubPool();
-         
+
          //Get connection from imcp
          cl = imcp.getConnection(subject, cri);
-         
+
          if (trace)
          {
             dump("Got connection from pool : " + cl);
@@ -300,19 +300,19 @@
          if (re instanceof RetryableException)
          {
             if (log.isDebugEnabled())
-               log.debug("Got a RetryableException - trying to reinitialize the pool");  
+               log.debug("Got a RetryableException - trying to reinitialize the pool");
 
             // The IMCP is down - retry
             imcp = subPoolContext.getSubPool();
 
             // Make sure that IMCP is running
             if (!imcp.isRunning())
-               imcp.reenable();  
-         
+               imcp.reenable();
+
             //Getting connection from pool
             cl = imcp.getConnection(subject, cri);
             if (trace)
-               dump("Got connection from pool (retried) " + cl);  
+               dump("Got connection from pool (retried) " + cl);
 
             return cl;
          }
@@ -321,21 +321,23 @@
             throw re;
          }
       }
-      
+
    }
-   
+
    /**
     * Gets connection listener instance associated with transaction.
+    * This method is package protected beacause it is intended only for test case use.
+    * Please don't use it in your production code.
     * @param trackByTx trnasaction local
     * @param trackByTransaction transaction instance
     * @return connection listener instance
     * @throws ResourceException
     */
-   private ConnectionListener getTransactionOldConnection(TransactionLocal trackByTx, Transaction trackByTransaction)
+   ConnectionListener getTransactionOldConnection(TransactionLocal trackByTx, Transaction trackByTransaction)
       throws ResourceException
    {
       ConnectionListener cl = null;
-      
+
       // Track by transaction
       try
       {
@@ -343,7 +345,7 @@
       }
       catch (Throwable t)
       {
-         JBossResourceException.rethrowAsResourceException("Unable to get connection from the pool for tx=" 
+         JBossResourceException.rethrowAsResourceException("Unable to get connection from the pool for tx="
                + trackByTransaction, t);
       }
       try
@@ -354,9 +356,9 @@
          {
             if (trace)
             {
-               dump("Previous connection tracked by transaction " + cl + " tx=" + trackByTransaction);  
+               dump("Previous connection tracked by transaction " + cl + " tx=" + trackByTransaction);
             }
-            
+
             return cl;
          }
       }
@@ -364,26 +366,28 @@
       {
          trackByTx.unlock(trackByTransaction);
       }
-      
+
       return cl;
    }
 
    /**
     * Gets new connection listener if necessary instance with transaction.
+    * This method is package protected beacause it is intended only for test case use.
+    * Please don't use it in your production code.
     * @param trackByTx trnasaction local
     * @param trackByTransaction transaction instance
     * @param mcp pool instance
     * @param subject subject instance
     * @param cri connection request info
     * @return connection listener instance
-    * @throws ResourceException
+    * @throws ResourceException ResourceException
     */
-   private ConnectionListener getTransactionNewConnection(TransactionLocal trackByTx, Transaction trackByTransaction, 
+   ConnectionListener getTransactionNewConnection(TransactionLocal trackByTx, Transaction trackByTransaction,
          ManagedConnectionPool mcp, Subject subject, ConnectionRequestInfo cri)
       throws ResourceException
    {
       ConnectionListener cl = null;
-      
+
       // Need a new one for this transaction
       // This must be done outside the tx local lock, otherwise
       // the tx timeout won't work and get connection can do a lot of other work
@@ -393,9 +397,9 @@
       cl = mcp.getConnection(subject, cri);
       if (trace)
       {
-         dump("Got connection from pool tracked by transaction " + cl + " tx=" + trackByTransaction);  
+         dump("Got connection from pool tracked by transaction " + cl + " tx=" + trackByTransaction);
       }
-      
+
       // Relock and check/set status
       try
       {
@@ -406,11 +410,11 @@
          mcp.returnConnection(cl, false);
          if (trace)
          {
-            dump("Had to return connection tracked by transaction " + cl + " tx=" + 
-                  trackByTransaction + " error=" + t.getMessage());  
+            dump("Had to return connection tracked by transaction " + cl + " tx=" +
+                  trackByTransaction + " error=" + t.getMessage());
          }
-         
-         JBossResourceException.rethrowAsResourceException("Unable to get connection from the pool for tx=" 
+
+         JBossResourceException.rethrowAsResourceException("Unable to get connection from the pool for tx="
                + trackByTransaction, t);
       }
       try
@@ -422,28 +426,28 @@
             mcp.returnConnection(cl, false);
             if (trace)
             {
-               dump("Another thread already got a connection tracked by transaction " + 
-                     other + " tx=" + trackByTransaction);  
+               dump("Another thread already got a connection tracked by transaction " +
+                     other + " tx=" + trackByTransaction);
             }
-            
+
             cl = other;
          }
-         
+
          // This is the connection for this transaction
          cl.setTrackByTx(true);
          trackByTx.set(cl);
-         
+
          if (trace)
          {
-            dump("Using connection from pool tracked by transaction " + cl + " tx=" + trackByTransaction);  
+            dump("Using connection from pool tracked by transaction " + cl + " tx=" + trackByTransaction);
          }
-         
+
       }
       finally
       {
          trackByTx.unlock(trackByTransaction);
       }
-      
+
       return cl;
    }
 
@@ -457,27 +461,27 @@
 
    /**
     * {@inheritDoc}
-    */   
+    */
    public void returnConnection(ConnectionListener cl, boolean kill) throws ResourceException
    {
       cl.setTrackByTx(false);
       //Get connection listener pool
       ManagedConnectionPool mcp = (ManagedConnectionPool) cl.getContext();
-      
+
       //Return connection to the pool
       mcp.returnConnection(cl, kill);
-      
+
       if (trace)
       {
          dump("Returning connection to pool " + cl);
-      }            
+      }
    }
 
    /**
     * {@inheritDoc}
-    */   
+    */
    public void setConnectionListenerFactory(ConnectionListenerFactory clf)
-   {      
+   {
       this.clf = clf;
    }
 
@@ -486,17 +490,9 @@
     */
    public void shutdown()
    {
-      Iterator<SubPoolContext> itSubPoolContexts = subPools.values().iterator();
-      SubPoolContext subPoolContext = null;
-      while (itSubPoolContexts.hasNext())
-      {
-         subPoolContext = itSubPoolContexts.next();
-         subPoolContext.getSubPool().shutdown();
-      }
+      flush();
+   }
 
-      subPools.clear();
-   }
-   
    /**
     * Dump the stats to the trace log
     * @param info some context
@@ -517,4 +513,15 @@
          log.trace(toLog);
       }
    }
+
+   /**
+    * Get the subPools. This method is package protected beacause it is intended only for test case use.
+    * Please don't use it in your production code.
+    *
+    * @return the subPools.
+    */
+   final ConcurrentMap<Object, SubPoolContext> getSubPools()
+   {
+      return subPools;
+   }
 }

Added: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManagerTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManagerTestCase.java	                        (rev 0)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManagerTestCase.java	2011-01-24 15:11:31 UTC (rev 110437)
@@ -0,0 +1,511 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.jca.core.connectionmanager.ccm;
+
+import org.jboss.jca.core.connectionmanager.ConnectionRecord;
+import org.jboss.jca.core.connectionmanager.listener.ConnectionCacheListener;
+import org.jboss.jca.core.connectionmanager.listener.ConnectionListener;
+
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import javax.resource.spi.ConnectionRequestInfo;
+import javax.transaction.TransactionManager;
+
+import org.junit.Test;
+
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+/**
+ *
+ * A CachedConnectionManagerTestCase.
+ *
+ * @author <a href="stefano.maestri at jboss.com">Stefano Maestri</a>
+ *
+ */
+public class CachedConnectionManagerTestCase
+{
+
+   /**
+    *
+    * userTransactionStartedShoudStartTransactionOnEveryConnectionCacheListener
+    *
+    * @throws Exception in case of error
+    */
+   @Test
+   public void userTransactionStartedShoudStartTransactionOnEveryConnectionCacheListener() throws Exception
+   {
+      //given
+      TransactionManager tm = mock(TransactionManager.class);
+      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+      ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
+      ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
+      ConnectionRecord cr0 = mock(ConnectionRecord.class);
+      ConnectionRecord cr1 = mock(ConnectionRecord.class);
+      ConnectionRecord cr2 = mock(ConnectionRecord.class);
+      ConnectionRecord cr3 = mock(ConnectionRecord.class);
+      CopyOnWriteArrayList<ConnectionRecord> crList0 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr0,
+         cr1));
+      CopyOnWriteArrayList<ConnectionRecord> crList1 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr2,
+         cr3));
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+         new ConcurrentHashMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>(2);
+      cmToConnectionsMap.put(cm0, crList0);
+      cmToConnectionsMap.put(cm1, crList1);
+
+      LinkedList<Object> keys = new LinkedList<Object>();
+      KeyConnectionAssociation key0 = new KeyConnectionAssociation("stringKey0");
+      key0.setCMToConnectionsMap(cmToConnectionsMap);
+      keys.add(key0);
+
+      //when
+      ccm.getCurrentObjects().set(keys);
+      //then
+      ccm.userTransactionStarted();
+
+      verify(cm0, times(1)).transactionStarted(eq(crList0));
+      verify(cm1, times(1)).transactionStarted(eq(crList1));
+
+   }
+
+   /**
+   *
+   * userTransactionStartedShoudDoNothingForCurrentObjectsNull
+   *
+   * @throws Exception in case of error
+   */
+   @Test
+   public void userTransactionStartedShoudDoNothingForCurrentObjectsNull() throws Exception
+   {
+      //given
+      TransactionManager tm = mock(TransactionManager.class);
+      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+
+      ccm.getCurrentObjects().set(null);
+      //then
+      ccm.userTransactionStarted();
+   }
+
+   /**
+   *
+   * popMetaAwareObjectShoudRemoveAssociationAndDisconnectFromListener
+   *
+   * @throws Exception in case of error
+   */
+   @Test
+   public void popMetaAwareObjectShoudRemoveAssociationAndDisconnectFromListener() throws Exception
+   {
+      //given
+      TransactionManager tm = mock(TransactionManager.class);
+      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+      ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
+      ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
+      ConnectionRecord cr0 = mock(ConnectionRecord.class);
+      ConnectionRecord cr1 = mock(ConnectionRecord.class);
+      ConnectionRecord cr2 = mock(ConnectionRecord.class);
+      ConnectionRecord cr3 = mock(ConnectionRecord.class);
+      CopyOnWriteArrayList<ConnectionRecord> crList0 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr0,
+         cr1));
+      CopyOnWriteArrayList<ConnectionRecord> crList1 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr2,
+         cr3));
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+         new ConcurrentHashMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>(2);
+      cmToConnectionsMap.put(cm0, crList0);
+      cmToConnectionsMap.put(cm1, crList1);
+
+      LinkedList<Object> keys = new LinkedList<Object>();
+      KeyConnectionAssociation key0 = new KeyConnectionAssociation("stringKey0");
+      key0.setCMToConnectionsMap(cmToConnectionsMap);
+      keys.add(key0);
+
+      ccm.getCurrentObjects().set(keys);
+      //when
+      Set unsharableResources = mock(Set.class);
+      //then
+      ccm.popMetaAwareObject(unsharableResources);
+
+      verify(cm0, times(1)).disconnect(eq(crList0), eq(unsharableResources));
+      verify(cm1, times(1)).disconnect(eq(crList1), eq(unsharableResources));
+      assertThat(ccm.getCurrentObjects().get().size(), is(0));
+
+   }
+
+   /**
+   *
+   * registerConnectionShoudDoNothingForCurrentObjectsNull
+   *
+   * @throws Exception in case of error
+   */
+   @Test
+   public void registerConnectionShoudDoNothingForCurrentObjectsNull() throws Exception
+   {
+      //given
+      TransactionManager tm = mock(TransactionManager.class);
+      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+
+      ccm.getCurrentObjects().set(null);
+      //then (parameters are not important the key of this test is that given ccm have no associations
+      ccm.registerConnection(null, null, null, null);
+   }
+
+   /**
+   *
+   * registerConnectionShoudAddConnectionRecordToExistingKey
+   *
+   * @throws Exception in case of error
+   */
+   @Test
+   public void registerConnectionShoudAddConnectionRecordToExistingKey() throws Exception
+   {
+      //given
+      TransactionManager tm = mock(TransactionManager.class);
+      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+      ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
+      ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
+      ConnectionRecord cr0 = mock(ConnectionRecord.class);
+      ConnectionRecord cr1 = mock(ConnectionRecord.class);
+      ConnectionRecord cr2 = mock(ConnectionRecord.class);
+      ConnectionRecord cr3 = mock(ConnectionRecord.class);
+      CopyOnWriteArrayList<ConnectionRecord> crList0 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr0,
+         cr1));
+      CopyOnWriteArrayList<ConnectionRecord> crList1 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr2,
+         cr3));
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+         new ConcurrentHashMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>(2);
+      cmToConnectionsMap.put(cm0, crList0);
+      cmToConnectionsMap.put(cm1, crList1);
+
+      LinkedList<Object> keys = new LinkedList<Object>();
+      KeyConnectionAssociation key0 = new KeyConnectionAssociation("stringKey0");
+      key0.setCMToConnectionsMap(cmToConnectionsMap);
+      keys.add(key0);
+
+      ccm.getCurrentObjects().set(keys);
+      //when
+      ccm.registerConnection(cm0, mock(ConnectionListener.class), mock(Object.class),
+         mock(ConnectionRequestInfo.class));
+
+      //then
+
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> actualCmMap =
+         ((KeyConnectionAssociation) keys.getLast()).getCMToConnectionsMap();
+      assertThat(actualCmMap.get(cm0).size(), is(3));
+      assertThat(actualCmMap.get(cm1).size(), is(2));
+
+   }
+
+   /**
+   *
+   * registerConnectionShoudAddConnectionRecordToExistingKey
+   *
+   * @throws Exception in case of error
+   */
+   @Test
+   public void registerConnectionShoudAddKey() throws Exception
+   {
+      //given
+      TransactionManager tm = mock(TransactionManager.class);
+      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+      ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
+      ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
+      ConnectionCacheListener cm2 = mock(ConnectionCacheListener.class);
+
+      ConnectionRecord cr0 = mock(ConnectionRecord.class);
+      ConnectionRecord cr1 = mock(ConnectionRecord.class);
+      ConnectionRecord cr2 = mock(ConnectionRecord.class);
+      ConnectionRecord cr3 = mock(ConnectionRecord.class);
+      CopyOnWriteArrayList<ConnectionRecord> crList0 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr0,
+         cr1));
+      CopyOnWriteArrayList<ConnectionRecord> crList1 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr2,
+         cr3));
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+         new ConcurrentHashMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>(2);
+      cmToConnectionsMap.put(cm0, crList0);
+      cmToConnectionsMap.put(cm1, crList1);
+
+      LinkedList<Object> keys = new LinkedList<Object>();
+      KeyConnectionAssociation key0 = new KeyConnectionAssociation("stringKey0");
+      key0.setCMToConnectionsMap(cmToConnectionsMap);
+      keys.add(key0);
+
+      ccm.getCurrentObjects().set(keys);
+      //when
+      ccm.registerConnection(cm2, mock(ConnectionListener.class), mock(Object.class),
+         mock(ConnectionRequestInfo.class));
+
+      //then
+
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> actualCmMap =
+         ((KeyConnectionAssociation) keys.getLast()).getCMToConnectionsMap();
+      assertThat(actualCmMap.size(), is(3));
+      assertThat(actualCmMap.get(cm0).size(), is(2));
+      assertThat(actualCmMap.get(cm1).size(), is(2));
+      assertThat(actualCmMap.get(cm2).size(), is(1));
+
+   }
+
+   /**
+   *
+   * unregisterConnectionShoudDoNothingForCurrentObjectsNull
+   *
+   * @throws Exception in case of error
+   */
+   @Test
+   public void unregisterConnectionShoudDoNothingForCurrentObjectsNull() throws Exception
+   {
+      //given
+      TransactionManager tm = mock(TransactionManager.class);
+      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+
+      ccm.getCurrentObjects().set(null);
+      //then (parameters are not important the key of this test is that given ccm have no associations
+      ccm.unregisterConnection(null, null);
+   }
+
+   /**
+   *
+   * unregisterConnectionShoudDoNothingForNullConnectionsInMatchedKey
+   *
+   * @throws Exception in case of error
+   */
+   @Test
+   public void unregisterConnectionShoudDoNothingForNullConnectionsInMatchedKey() throws Exception
+   {
+      //given
+      TransactionManager tm = mock(TransactionManager.class);
+      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+      ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
+      ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
+      ConnectionRecord cr0 = mock(ConnectionRecord.class);
+      Object connection = mock(Object.class);
+      when(cr0.getConnection()).thenReturn(connection);
+      ConnectionRecord cr1 = mock(ConnectionRecord.class);
+      ConnectionRecord cr2 = mock(ConnectionRecord.class);
+      ConnectionRecord cr3 = mock(ConnectionRecord.class);
+
+      CopyOnWriteArrayList<ConnectionRecord> crList1 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr2,
+         cr3));
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+         new ConcurrentHashMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>(2);
+      cmToConnectionsMap.put(cm1, crList1);
+
+      LinkedList<Object> keys = new LinkedList<Object>();
+      KeyConnectionAssociation key0 = new KeyConnectionAssociation("stringKey0");
+      key0.setCMToConnectionsMap(cmToConnectionsMap);
+      keys.add(key0);
+
+      ccm.getCurrentObjects().set(keys);
+      //when
+      ccm.unregisterConnection(cm0, connection);
+
+      //then
+
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> actualCmMap =
+         ((KeyConnectionAssociation) keys.getLast()).getCMToConnectionsMap();
+      assertThat(actualCmMap.size(), is(1));
+      assertThat(actualCmMap.get(cm1).size(), is(2));
+
+   }
+
+   /**
+   *
+   * unregisterConnectionShoudRemovedMatchedConnection
+   *
+   * @throws Exception in case of error
+   */
+   @Test
+   public void unregisterConnectionShoudRemovedMatchedConnection() throws Exception
+   {
+      //given
+      TransactionManager tm = mock(TransactionManager.class);
+      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+      ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
+      ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
+      ConnectionRecord cr0 = mock(ConnectionRecord.class);
+      Object connection = mock(Object.class);
+      when(cr0.getConnection()).thenReturn(connection);
+      ConnectionRecord cr1 = mock(ConnectionRecord.class);
+      ConnectionRecord cr2 = mock(ConnectionRecord.class);
+      ConnectionRecord cr3 = mock(ConnectionRecord.class);
+      CopyOnWriteArrayList<ConnectionRecord> crList0 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr0,
+         cr1));
+      CopyOnWriteArrayList<ConnectionRecord> crList1 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr2,
+         cr3));
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+         new ConcurrentHashMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>(2);
+      cmToConnectionsMap.put(cm0, crList0);
+      cmToConnectionsMap.put(cm1, crList1);
+
+      LinkedList<Object> keys = new LinkedList<Object>();
+      KeyConnectionAssociation key0 = new KeyConnectionAssociation("stringKey0");
+      key0.setCMToConnectionsMap(cmToConnectionsMap);
+      keys.add(key0);
+
+      ccm.getCurrentObjects().set(keys);
+      //when
+      ccm.unregisterConnection(cm0, connection);
+
+      //then
+
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> actualCmMap =
+         ((KeyConnectionAssociation) keys.getLast()).getCMToConnectionsMap();
+      assertThat(actualCmMap.get(cm0).size(), is(1));
+      assertThat(actualCmMap.get(cm1).size(), is(2));
+
+   }
+
+   /**
+   *
+   * pushMetaAwareObjectShoudCreateStack
+   *
+   * @throws Exception in case of error
+   */
+   @Test
+   public void pushMetaAwareObjectShoudPushANewKey() throws Exception
+   {
+      //given
+      TransactionManager tm = mock(TransactionManager.class);
+      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+
+      //when
+      ccm.pushMetaAwareObject(mock(Object.class), null);
+
+      //then
+      assertThat(ccm.getCurrentObjects().get() == null, is(false));
+
+   }
+
+   /**
+   *
+   * pushMetaAwareObjectShoudCreateStack
+   *
+   * @throws Exception in case of error
+   */
+   @Test
+   public void pushMetaAwareObjectShoudCreateStack() throws Exception
+   {
+      //given
+      TransactionManager tm = mock(TransactionManager.class);
+      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+
+      ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
+      ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
+      ConnectionRecord cr0 = mock(ConnectionRecord.class);
+      Object connection = mock(Object.class);
+      when(cr0.getConnection()).thenReturn(connection);
+      ConnectionRecord cr1 = mock(ConnectionRecord.class);
+      ConnectionRecord cr2 = mock(ConnectionRecord.class);
+      ConnectionRecord cr3 = mock(ConnectionRecord.class);
+      CopyOnWriteArrayList<ConnectionRecord> crList0 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr0,
+         cr1));
+      CopyOnWriteArrayList<ConnectionRecord> crList1 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr2,
+         cr3));
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+         new ConcurrentHashMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>(2);
+      cmToConnectionsMap.put(cm0, crList0);
+      cmToConnectionsMap.put(cm1, crList1);
+
+      LinkedList<Object> keys = new LinkedList<Object>();
+      KeyConnectionAssociation key0 = new KeyConnectionAssociation("stringKey0");
+      key0.setCMToConnectionsMap(cmToConnectionsMap);
+      keys.add(key0);
+
+      ccm.getCurrentObjects().set(keys);
+
+      Object rawKey = mock(Object.class);
+
+      //when
+      ccm.pushMetaAwareObject(rawKey, null);
+
+      //then
+      assertThat(ccm.getCurrentObjects().get() == null, is(false));
+      assertThat((KeyConnectionAssociation) ccm.getCurrentObjects().get().getLast(),
+         is(new KeyConnectionAssociation(rawKey)));
+
+   }
+
+   /**
+   *
+   * pushMetaAwareObjectShoudReconnectAPreviouslyDisconnectedConnection
+   *
+   * @throws Exception in case of error
+   */
+   @Test
+   public void pushMetaAwareObjectShoudReconnectAPreviouslyDisconnectedConnection() throws Exception
+   {
+      //given
+      TransactionManager tm = mock(TransactionManager.class);
+      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+
+      ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
+      ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
+      ConnectionRecord cr0 = mock(ConnectionRecord.class);
+      Object connection = mock(Object.class);
+      when(cr0.getConnection()).thenReturn(connection);
+      ConnectionRecord cr1 = mock(ConnectionRecord.class);
+      ConnectionRecord cr2 = mock(ConnectionRecord.class);
+      ConnectionRecord cr3 = mock(ConnectionRecord.class);
+      CopyOnWriteArrayList<ConnectionRecord> crList0 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr0,
+         cr1));
+      CopyOnWriteArrayList<ConnectionRecord> crList1 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr2,
+         cr3));
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+         new ConcurrentHashMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>(2);
+      cmToConnectionsMap.put(cm0, crList0);
+      cmToConnectionsMap.put(cm1, crList1);
+
+      LinkedList<Object> keys = new LinkedList<Object>();
+      KeyConnectionAssociation key0 = new KeyConnectionAssociation("stringKey0");
+      key0.setCMToConnectionsMap(cmToConnectionsMap);
+      keys.add(key0);
+
+      ccm.getCurrentObjects().set(keys);
+
+      Set unsharableResources = mock(Set.class);
+      ccm.popMetaAwareObject(unsharableResources);
+
+      //when
+      ccm.pushMetaAwareObject("stringKey0", unsharableResources);
+
+      //then
+
+      verify(cm0, times(1)).disconnect(eq(crList0), eq(unsharableResources));
+      verify(cm1, times(1)).disconnect(eq(crList1), eq(unsharableResources));
+      verify(cm0, times(1)).reconnect(eq(crList0), eq(unsharableResources));
+      verify(cm1, times(1)).reconnect(eq(crList1), eq(unsharableResources));
+
+      assertThat(ccm.getCurrentObjects().get() == null, is(false));
+      assertThat(ccm.getCurrentObjects().get().size(), is(1));
+
+   }
+
+}

Added: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/package.html
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/package.html	                        (rev 0)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/package.html	2011-01-24 15:11:31 UTC (rev 110437)
@@ -0,0 +1,3 @@
+<body>
+Test cases for cached connection manager.
+</body>

Modified: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/NoTxConnectionListenerTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/NoTxConnectionListenerTestCase.java	2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/NoTxConnectionListenerTestCase.java	2011-01-24 15:11:31 UTC (rev 110437)
@@ -52,6 +52,13 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
 
+/**
+ *
+ * A NoTxConnectionListenerTestCase.
+ *
+ * @author <a href="stefano.maestri at jboss.com">Stefano Maestri</a>
+ *
+ */
 public class NoTxConnectionListenerTestCase
 {
 
@@ -64,6 +71,12 @@
 
    private static Pool pool = null;
 
+   /**
+    *
+    * testConnectionClosed
+    *
+    * @throws Exception in case of unexpected errors
+    */
    @Test
    public void testConnectionClosed() throws Exception
    {
@@ -85,11 +98,17 @@
 
       ConnectionEvent event = new ConnectionEvent(listener.getManagedConnection(), ConnectionEvent.CONNECTION_CLOSED);
 
-       ((NoTxConnectionListener) listener).connectionClosed(event);
+      ((NoTxConnectionListener) listener).connectionClosed(event);
 
       assertThat(((MockManagedConnection) listener.getManagedConnection()).cleanUpCalled(), is(1));
    }
 
+   /**
+    *
+    * connectionErrorOccuredShouldFreeManagedCOnnection
+    *
+    * @throws Exception in case of unexpected errors
+    */
    @Test
    public void connectionErrorOccuredShouldFreeManagedCOnnection() throws Exception
    {
@@ -116,6 +135,12 @@
       assertThat(listener.isManagedConnectionFree(), is(true));
    }
 
+   /**
+    *
+    * unregisterAssociationShouldFreeManagedCOnnection
+    *
+    * @throws Exception in case of unexpected errors
+    */
    @Test
    public void unregisterAssociationShouldFreeManagedCOnnection() throws Exception
    {
@@ -141,6 +166,12 @@
       assertThat(listener.isManagedConnectionFree(), is(true));
    }
 
+   /**
+    *
+    * unregisterNotYetCreatedAssociationShouldNotThrowException
+    *
+    * @throws Exception in case of unexpected errors
+    */
    @Test
    public void unregisterNotYetCreatedAssociationShouldNotThrowException() throws Exception
    {
@@ -196,7 +227,7 @@
       ConnectionManager connectionManager = cmf.createNonTransactional(TransactionSupportLevel.NoTransaction, pool,
          null, null);
 
-       noTxCm = ((NoTxConnectionManagerImpl) connectionManager);
+      noTxCm = ((NoTxConnectionManagerImpl) connectionManager);
 
    }
 
@@ -222,4 +253,3 @@
    }
 
 }
-

Added: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListenerTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListenerTestCase.java	                        (rev 0)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListenerTestCase.java	2011-01-24 15:11:31 UTC (rev 110437)
@@ -0,0 +1,706 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.jca.core.connectionmanager.listener;
+
+import org.jboss.jca.core.api.connectionmanager.pool.PoolConfiguration;
+import org.jboss.jca.core.connectionmanager.ConnectionManagerFactory;
+import org.jboss.jca.core.connectionmanager.TxConnectionManager;
+import org.jboss.jca.core.connectionmanager.ccm.CachedConnectionManager;
+import org.jboss.jca.core.connectionmanager.common.MockManagedConnectionFactory;
+import org.jboss.jca.core.connectionmanager.listener.TxConnectionListener.TransactionSynchronization;
+import org.jboss.jca.core.connectionmanager.pool.api.Pool;
+import org.jboss.jca.core.connectionmanager.pool.api.PoolFactory;
+import org.jboss.jca.core.connectionmanager.pool.api.PoolStrategy;
+import org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerTestCase;
+import org.jboss.jca.embedded.Embedded;
+import org.jboss.jca.embedded.EmbeddedFactory;
+
+import java.net.URL;
+
+import javax.resource.ResourceException;
+import javax.resource.spi.ConnectionEvent;
+import javax.resource.spi.ConnectionManager;
+import javax.resource.spi.LocalTransaction;
+import javax.resource.spi.ManagedConnection;
+import javax.resource.spi.ManagedConnectionFactory;
+import javax.resource.spi.TransactionSupport.TransactionSupportLevel;
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+import javax.transaction.xa.XAResource;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsNot.not;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+/**
+ *
+ * A TxConnectionListenerTestCase.
+ *
+ * @author <a href="stefano.maestri at jboss.com">Stefano Maestri</a>
+ *
+ */
+public class TxConnectionListenerTestCase
+{
+   /**Embedded JCA*/
+   private static Embedded embedded = null;
+
+   private static TxConnectionManager txConnectionManager = null;
+
+   private static ManagedConnectionFactory mcf = null;
+
+   /**
+    *
+    * delistShouldSetTransactionSynchronizationToNullIfEverythingCommitted
+    *
+    * @throws Exception in case of error
+    */
+   @Test
+   public void delistShouldSetTransactionSynchronizationToNullIfEverythingCommitted() throws Exception
+   {
+      //given
+      TxConnectionListener listener = new TxConnectionListener(txConnectionManager, null, null, null, null);
+      listener.setTrackByTx(false);
+      Transaction tx = mock(Transaction.class);
+      when(tx.getStatus()).thenReturn(Status.STATUS_COMMITTED);
+      TransactionSynchronization transactionSynchronization = listener.new TransactionSynchronization(tx, false);
+      listener.setTransactionSynchronization(transactionSynchronization);
+      //when
+      listener.delist();
+      //then
+      assertThat(listener.getTransactionSynchronization(), is((TransactionSynchronization) null));
+   }
+
+   /**
+    *
+    * delistShouldNotSetTransactionSynchronizationToNullIfTrackByTx
+    *
+    * @throws Exception in case of error
+    */
+   @Test
+   public void delistShouldNotSetTransactionSynchronizationToNullIfTrackByTx() throws Exception
+   {
+      //given
+      TxConnectionListener listener = new TxConnectionListener(txConnectionManager, null, null, null, null);
+      listener.setTrackByTx(true);
+      Transaction tx = mock(Transaction.class);
+      when(tx.getStatus()).thenReturn(Status.STATUS_COMMITTED);
+      TransactionSynchronization transactionSynchronization = listener.new TransactionSynchronization(tx, false);
+      listener.setTransactionSynchronization(transactionSynchronization);
+      //when
+      listener.delist();
+      //then
+      assertThat(listener.getTransactionSynchronization(), not(is((TransactionSynchronization) null)));
+   }
+
+   /**
+   *
+   * enlistShouldThrowSystemExceptionIfEnlistResourceFail
+   *
+   * @throws Exception in case of error
+   */
+   @Test
+   public void deListShouldCompleteCorrectlyAfterARightEnlist() throws Exception
+   {
+      //given
+      TxConnectionManager cm = mock(TxConnectionManager.class);
+      TransactionManager tm = mock(TransactionManager.class);
+      com.arjuna.ats.jta.transaction.Transaction threadTx = mock(com.arjuna.ats.jta.transaction.Transaction.class);
+      when(threadTx.isAlive()).thenReturn(true);
+      when(threadTx.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+      when(threadTx.enlistResource((XAResource) anyObject())).thenReturn(true);
+      when(threadTx.delistResource((XAResource) anyObject(), anyInt())).thenReturn(true);
+
+      when(tm.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+      when(tm.getTransaction()).thenReturn(threadTx);
+      when(cm.getTransactionManager()).thenReturn(tm);
+
+      TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+      listener.setTrackByTx(false);
+      TransactionSynchronization transactionSynchronization = null;
+      listener.setTransactionSynchronization(transactionSynchronization);
+      listener.enlist();
+      //when
+      listener.delist();
+
+      //then complete without exception
+
+   }
+
+   /**
+   *
+   * enlistShouldThrowSystemExceptionIfEnlistResourceFail
+   *
+   * @throws Exception in case of error
+   */
+   @Test(expected = ResourceException.class)
+   public void deListShouldThrowResourceExceptionIfDelistResourceFailOnTx() throws Exception
+   {
+      //given
+      TxConnectionManager cm = mock(TxConnectionManager.class);
+      TransactionManager tm = mock(TransactionManager.class);
+      com.arjuna.ats.jta.transaction.Transaction threadTx = mock(com.arjuna.ats.jta.transaction.Transaction.class);
+      when(threadTx.isAlive()).thenReturn(true);
+      when(threadTx.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+      when(threadTx.enlistResource((XAResource) anyObject())).thenReturn(true);
+      /*******this is the important GIVEN *******/
+      when(threadTx.delistResource((XAResource) anyObject(), anyInt())).thenReturn(false);
+
+      when(tm.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+      when(tm.getTransaction()).thenReturn(threadTx);
+      when(cm.getTransactionManager()).thenReturn(tm);
+
+      TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+      listener.setTrackByTx(false);
+      TransactionSynchronization transactionSynchronization = null;
+      listener.setTransactionSynchronization(transactionSynchronization);
+      listener.enlist();
+      //when
+      listener.delist();
+
+      //then complete without exception
+
+   }
+
+
+   /**
+   *
+   * enlistShouldThrowIllegalStateExceptionWithCurrentTxAndStatusNoTransaction
+   *
+   * @throws Exception in case of error
+   */
+   @Test(expected = IllegalStateException.class)
+   public void enlistShouldThrowIllegalStateExceptionWithCurrentTxAndStatusNoTransaction() throws Exception
+   {
+      //given
+      TxConnectionManager cm = mock(TxConnectionManager.class);
+      TransactionManager tm = mock(TransactionManager.class);
+      when(tm.getStatus()).thenReturn(Status.STATUS_NO_TRANSACTION);
+      when(cm.getTransactionManager()).thenReturn(tm);
+      TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+      listener.setTrackByTx(true);
+      Transaction tx = mock(Transaction.class);
+      TransactionSynchronization transactionSynchronization = listener.new TransactionSynchronization(tx, false);
+      listener.setTransactionSynchronization(transactionSynchronization);
+      //when
+      listener.enlist();
+      //then iLLEGALsTATEeXCEPTION
+
+   }
+
+   /**
+   *
+   * enlistShouldDoNothingForNoStransaction
+   *
+   * @throws Exception in case of error
+   */
+   @Test
+   public void enlistShouldDoNothingForNoStransaction() throws Exception
+   {
+      //given
+      TxConnectionManager cm = mock(TxConnectionManager.class);
+      TransactionManager tm = mock(TransactionManager.class);
+      when(tm.getStatus()).thenReturn(Status.STATUS_NO_TRANSACTION);
+      when(cm.getTransactionManager()).thenReturn(tm);
+      TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+      listener.setTrackByTx(true);
+      Transaction tx = mock(Transaction.class);
+      TransactionSynchronization transactionSynch = mock(TxConnectionListener.TransactionSynchronization.class);
+      listener.setTransactionSynchronization(transactionSynch);
+      //when
+      listener.enlist();
+      //then
+      verifyZeroInteractions(transactionSynch);
+   }
+
+   /**
+   *
+   * enlistShouldThrowIllegalStateExceptionWithCurrentTxAndStatusNoTransaction
+   *
+   * @throws Exception in case of error
+   */
+   @Test(expected = IllegalStateException.class)
+   public void enlistShouldThrowIllegalStateExceptionWithNoActiveTransaction() throws Exception
+   {
+      //given
+      TxConnectionManager cm = mock(TxConnectionManager.class);
+      TransactionManager tm = mock(TransactionManager.class);
+      when(tm.getStatus()).thenReturn(Status.STATUS_COMMITTING);
+      when(cm.getTransactionManager()).thenReturn(tm);
+
+      TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+      listener.setTrackByTx(true);
+      Transaction tx = mock(Transaction.class);
+      TransactionSynchronization transactionSynchronization = listener.new TransactionSynchronization(tx, false);
+      listener.setTransactionSynchronization(transactionSynchronization);
+      //when
+      listener.enlist();
+      //then iLLEGALsTATEeXCEPTION
+
+   }
+
+   /**
+   *
+   * enlistShouldThrowIllegalStateExceptionWithCurrentTxAndStatusNoTransaction
+   *
+   * @throws Exception in case of error
+   */
+   @Test(expected = IllegalStateException.class)
+   public void enlistShouldThrowIllegalStateExceptionTryingToChangeTransaction() throws Exception
+   {
+      //given
+      TxConnectionManager cm = mock(TxConnectionManager.class);
+      TransactionManager tm = mock(TransactionManager.class);
+      com.arjuna.ats.jta.transaction.Transaction threadTx = mock(com.arjuna.ats.jta.transaction.Transaction.class);
+      when(threadTx.isAlive()).thenReturn(true);
+      when(threadTx.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+      when(tm.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+      when(tm.getTransaction()).thenReturn(threadTx);
+      when(cm.getTransactionManager()).thenReturn(tm);
+
+      TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+      listener.setTrackByTx(true);
+      Transaction tx = mock(Transaction.class);
+      TransactionSynchronization transactionSynchronization = listener.new TransactionSynchronization(tx, false);
+      listener.setTransactionSynchronization(transactionSynchronization);
+      //when
+      listener.enlist();
+      //then iLLEGALsTATEeXCEPTION
+
+   }
+
+   /**
+   *
+   * enlistShouldThrowIllegalStateExceptionForCantEnlistAlreadyTx
+   *
+   * @throws Exception in case of error
+   */
+   @Test(expected = IllegalStateException.class)
+   public void enlistShouldThrowIllegalStateExceptionForCantEnlistAlreadyTx() throws Exception
+   {
+      //given
+      TxConnectionManager cm = mock(TxConnectionManager.class);
+      TransactionManager tm = mock(TransactionManager.class);
+      com.arjuna.ats.jta.transaction.Transaction threadTx = mock(com.arjuna.ats.jta.transaction.Transaction.class);
+      when(threadTx.isAlive()).thenReturn(true);
+      when(threadTx.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+      when(tm.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+      when(tm.getTransaction()).thenReturn(threadTx);
+      when(cm.getTransactionManager()).thenReturn(tm);
+
+      TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+      listener.setTrackByTx(false);
+      TransactionSynchronization transactionSynchronization = listener.new TransactionSynchronization(threadTx, false);
+      listener.setTransactionSynchronization(transactionSynchronization);
+      //when
+      listener.enlist();
+      //then iLLEGALsTATEeXCEPTION
+
+   }
+
+   /**
+   *
+   * enlistShouldThrowIllegalStateExceptionForCantEnlistAlreadyTx
+   *
+   * @throws Exception in case of error
+   */
+   @Test(expected = SystemException.class)
+   public void enlistShouldThrowIllegalStateExceptionForCantEnlistAlreadyTx2() throws Exception
+   {
+      //given
+      TxConnectionManager cm = mock(TxConnectionManager.class);
+      TransactionManager tm = mock(TransactionManager.class);
+      com.arjuna.ats.jta.transaction.Transaction threadTx = mock(com.arjuna.ats.jta.transaction.Transaction.class);
+      when(threadTx.isAlive()).thenReturn(true);
+      when(threadTx.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+      doThrow(new SystemException("ThreadTx Exception")).when(threadTx).registerSynchronization(
+         (Synchronization) anyObject());
+      when(tm.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+      when(tm.getTransaction()).thenReturn(threadTx);
+      when(cm.getTransactionManager()).thenReturn(tm);
+
+      TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+      listener.setTrackByTx(true);
+      TransactionSynchronization transactionSynchronization = listener.new TransactionSynchronization(threadTx, false);
+      listener.setTransactionSynchronization(transactionSynchronization);
+      //when
+      listener.enlist();
+      //then iLLEGALsTATEeXCEPTION
+
+   }
+
+   /**
+   *
+   * enlistShouldThrowIllegalStateExceptionWithCurrentTxAndStatusNoTransaction
+   *
+   * @throws Exception in case of error
+   */
+   @Test(expected = IllegalStateException.class)
+   public void enlistShouldThrowIllegalStateExceptionForNotEnlistedResources() throws Exception
+   {
+      //given
+      TxConnectionManager cm = mock(TxConnectionManager.class);
+      TransactionManager tm = mock(TransactionManager.class);
+      com.arjuna.ats.jta.transaction.Transaction threadTx = mock(com.arjuna.ats.jta.transaction.Transaction.class);
+      when(threadTx.isAlive()).thenReturn(true);
+      when(threadTx.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+      when(tm.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+      when(tm.getTransaction()).thenReturn(threadTx);
+      when(cm.getTransactionManager()).thenReturn(tm);
+
+      TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+      listener.setTrackByTx(true);
+      TransactionSynchronization transactionSynchronization = listener.new TransactionSynchronization(threadTx, false);
+      listener.setTransactionSynchronization(transactionSynchronization);
+      //when
+      listener.enlist();
+      //then iLLEGALsTATEeXCEPTION
+
+   }
+
+   /**
+   *
+   * enlistShouldThrowSystemExceptionIfEnlistResourceFail
+   *
+   * @throws Exception in case of error
+   */
+   @Test(expected = SystemException.class)
+   public void enlistShouldThrowSystemExceptionIfEnlistResourceFail() throws Exception
+   {
+      //given
+      TxConnectionManager cm = mock(TxConnectionManager.class);
+      TransactionManager tm = mock(TransactionManager.class);
+      com.arjuna.ats.jta.transaction.Transaction threadTx = mock(com.arjuna.ats.jta.transaction.Transaction.class);
+      when(threadTx.isAlive()).thenReturn(true);
+      when(threadTx.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+      /******* THIS IS THE IMPORTANT GIVEN ****/
+      when(threadTx.enlistResource((XAResource) anyObject())).thenReturn(false);
+
+      when(tm.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+      when(tm.getTransaction()).thenReturn(threadTx);
+      when(cm.getTransactionManager()).thenReturn(tm);
+
+      TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+      listener.setTrackByTx(true);
+      TransactionSynchronization transactionSynchronization = null;
+      listener.setTransactionSynchronization(transactionSynchronization);
+      //when
+      listener.enlist();
+      //then SystemException
+
+   }
+
+   /**
+   *
+   * enlistShouldThrowSystemExceptionIfEnlistResourceFail
+   *
+   * @throws Exception in case of error
+   */
+   @Test
+   public void enlistShouldCompleteWithoutExceptions() throws Exception
+   {
+      //given
+      TxConnectionManager cm = mock(TxConnectionManager.class);
+      TransactionManager tm = mock(TransactionManager.class);
+      com.arjuna.ats.jta.transaction.Transaction threadTx = mock(com.arjuna.ats.jta.transaction.Transaction.class);
+      when(threadTx.isAlive()).thenReturn(true);
+      when(threadTx.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+      when(threadTx.enlistResource((XAResource) anyObject())).thenReturn(true);
+
+      when(tm.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+      when(tm.getTransaction()).thenReturn(threadTx);
+      when(cm.getTransactionManager()).thenReturn(tm);
+
+      TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+      listener.setTrackByTx(true);
+      TransactionSynchronization transactionSynchronization = null;
+      listener.setTransactionSynchronization(transactionSynchronization);
+      //when
+      listener.enlist();
+      //then complete without exception
+
+   }
+
+   /**
+   *
+   * connectionClosedShouldThrowIllegalStateExceptionForDifferentManagedConnection
+   *
+   * @throws Exception in case of error
+   */
+   @Test(expected = IllegalArgumentException.class)
+   public void connectionClosedShouldThrowIllegalStateExceptionForDifferentManagedConnection() throws Exception
+   {
+      //given
+      TxConnectionManager cm = mock(TxConnectionManager.class);
+      ManagedConnection mc = mock(ManagedConnection.class);
+      ManagedConnection mc2 = mock(ManagedConnection.class);
+
+      TxConnectionListener listener = new TxConnectionListener(cm, mc, null, null, null);
+      ConnectionEvent ce = new ConnectionEvent(mc2, ConnectionEvent.CONNECTION_CLOSED);
+      //when
+      listener.connectionClosed(ce);
+      //then complete without exception
+
+   }
+
+   /**
+   *
+   * connectionClosedShouldThrowIllegalStateExceptionForDifferentManagedConnection
+   *
+   * @throws Exception in case of error
+   */
+   @Test
+   public void connectionClosedShouldInvokeRightMethodsForNonFreedConnection() throws Exception
+   {
+      //given
+      TxConnectionManager cm = mock(TxConnectionManager.class);
+      ManagedConnection mc = mock(ManagedConnection.class);
+      CachedConnectionManager ccm = mock(CachedConnectionManager.class);
+      when(cm.getCachedConnectionManager()).thenReturn(ccm);
+      TxConnectionListener listener = new TxConnectionListener(cm, mc, null, null, null);
+      listener.setTrackByTx(false);
+      ConnectionEvent ce = new ConnectionEvent(mc, ConnectionEvent.CONNECTION_CLOSED);
+      //when
+      listener.connectionClosed(ce);
+      //then
+      verify(ccm, times(1)).unregisterConnection((ConnectionCacheListener) anyObject(), anyObject());
+      verify(cm, never()).returnManagedConnection(eq(listener), anyBoolean());
+   }
+
+   /**
+   *
+   * connectionClosedShouldInvokeRiightMethodsFreedConnection
+   *
+   * @throws Exception in case of error
+   */
+   @Test
+   public void connectionClosedShouldInvokeRightMethodsForFreedConnection() throws Exception
+   {
+      //given
+      TxConnectionManager cm = mock(TxConnectionManager.class);
+      ManagedConnection mc = mock(ManagedConnection.class);
+      CachedConnectionManager ccm = mock(CachedConnectionManager.class);
+      when(cm.getCachedConnectionManager()).thenReturn(ccm);
+      TxConnectionListener listener = new TxConnectionListener(cm, mc, null, null, null);
+      listener.setTrackByTx(true);
+      ConnectionEvent ce = new ConnectionEvent(mc, ConnectionEvent.CONNECTION_CLOSED);
+      //when
+      listener.connectionClosed(ce);
+      //then
+      verify(ccm, times(1)).unregisterConnection((ConnectionCacheListener) anyObject(), anyObject());
+      verify(cm, times(1)).returnManagedConnection(eq(listener), eq(false));
+   }
+
+   /**
+   *
+   * connectionClosedShouldInvokeRightMethodsInCaseOfExceptions
+   *
+   * @throws Exception in case of error
+   */
+   @Test
+   public void connectionClosedShouldInvokeRightMethodsInCaseOfExceptions() throws Exception
+   {
+      //given
+      TxConnectionManager cm = mock(TxConnectionManager.class);
+      ManagedConnection mc = mock(ManagedConnection.class);
+      CachedConnectionManager ccm = mock(CachedConnectionManager.class);
+      when(cm.getCachedConnectionManager()).thenReturn(ccm);
+      TxConnectionListener listener = new TxConnectionListener(cm, mc, null, null, null);
+      listener.setTrackByTx(true);
+      ConnectionEvent ce = mock(ConnectionEvent.class);
+      when(ce.getSource()).thenReturn(mc);
+      /****** this is the important given *****/
+      when(ce.getConnectionHandle()).thenThrow(new RuntimeException());
+      //when
+      listener.connectionClosed(ce);
+      //then
+      verify(ccm, never()).unregisterConnection((ConnectionCacheListener) anyObject(), anyObject());
+      verify(cm, times(1)).returnManagedConnection(eq(listener), eq(true));
+   }
+
+   /**
+   *
+   * tidyUpShouldDoNothingWithoutLocalTransaction
+   *
+   * @throws Exception in case of error
+   */
+   @Test
+   public void tidyUpShouldDoNothingWithoutLocalTransaction() throws Exception
+   {
+      //given
+      TxConnectionManager cm = mock(TxConnectionManager.class);
+      ManagedConnection mc = mock(ManagedConnection.class);
+      TxConnectionListener listener = new TxConnectionListener(cm, mc, null, null, null);
+      ConnectionEvent ce = mock(ConnectionEvent.class);
+      /****** this is the important given *****/
+      listener.localTransactionCommitted(ce);
+      //when
+      listener.tidyup();
+      //then
+      verify(cm, times(0)).returnManagedConnection(eq(listener), eq(true));
+   }
+
+   /**
+   *
+   * tidyUpShouldDoNothingWithoutLocalTransaction
+   *
+   * @throws Exception in case of error
+   */
+   @Test(expected = ResourceException.class)
+   public void tidyUpShouldRethrowExceptionOfGetLocalTransactionAsResourceException() throws Exception
+   {
+      //given
+      TxConnectionManager cm = mock(TxConnectionManager.class);
+      ManagedConnection mc = mock(ManagedConnection.class);
+      TxConnectionListener listener = new TxConnectionListener(cm, mc, null, null, null);
+      ConnectionEvent ce = mock(ConnectionEvent.class);
+      /****** this is the important given *****/
+      listener.localTransactionStarted(ce);
+      when(mc.getLocalTransaction()).thenThrow(new ResourceException());
+      //when
+      listener.tidyup();
+      //then
+
+   }
+
+   /**
+   *
+   * tidyUpShouldDoNothingWithoutLocalTransaction
+   *
+   * @throws Exception in case of error
+   */
+   @Test(expected = ResourceException.class)
+   public void tidyUpShouldThrowResourceExceptionIfLocalTransactionIsNull() throws Exception
+   {
+      //given
+      TxConnectionManager cm = mock(TxConnectionManager.class);
+      ManagedConnection mc = mock(ManagedConnection.class);
+      TxConnectionListener listener = new TxConnectionListener(cm, mc, null, null, null);
+      ConnectionEvent ce = mock(ConnectionEvent.class);
+      /****** this is the important given *****/
+      listener.localTransactionStarted(ce);
+      when(mc.getLocalTransaction()).thenReturn(null);
+      //when
+      listener.tidyup();
+      //then
+
+   }
+
+   /**
+   *
+   * tidyUpShouldDoNothingWithoutLocalTransaction
+   *
+   * @throws Exception in case of error
+   */
+   @Test
+   public void tidyUpShouldInvokeRollebackOnLocalTransaction() throws Exception
+   {
+      //given
+      TxConnectionManager cm = mock(TxConnectionManager.class);
+      ManagedConnection mc = mock(ManagedConnection.class);
+      TxConnectionListener listener = new TxConnectionListener(cm, mc, null, null, null);
+      ConnectionEvent ce = mock(ConnectionEvent.class);
+      /****** this is the important given *****/
+      listener.localTransactionStarted(ce);
+      LocalTransaction local = mock(LocalTransaction.class);
+      when(mc.getLocalTransaction()).thenReturn(local);
+      //when
+      listener.tidyup();
+      //then
+      verify(local, times(1)).rollback();
+   }
+
+   /**
+    * Lifecycle start, before the suite is executed
+    * @throws Throwable throwable exception
+    */
+   @BeforeClass
+   public static void beforeClass() throws Throwable
+   {
+      // Create and set an embedded JCA instance
+      embedded = EmbeddedFactory.create(false);
+
+      // Startup
+      embedded.startup();
+
+      // Deploy Naming and Transaction
+      URL naming = TxConnectionManagerTestCase.class.getClassLoader().getResource("naming.xml");
+      URL transaction = TxConnectionManagerTestCase.class.getClassLoader().getResource("transaction.xml");
+
+      embedded.deploy(naming);
+      embedded.deploy(transaction);
+
+      TransactionManager tm = embedded.lookup("RealTransactionManager", TransactionManager.class);
+
+      mcf = new MockManagedConnectionFactory();
+      PoolConfiguration pc = new PoolConfiguration();
+      PoolFactory pf = new PoolFactory();
+
+      Pool pool = pf.create(PoolStrategy.ONE_POOL, mcf, pc, true);
+
+      ConnectionManagerFactory cmf = new ConnectionManagerFactory();
+      ConnectionManager connectionManager = cmf.createTransactional(TransactionSupportLevel.LocalTransaction, pool,
+         null, null, tm, null, null, null, null, null);
+
+      txConnectionManager = (TxConnectionManager) connectionManager;
+   }
+
+   /**
+    * Lifecycle stop, after the suite is executed
+    * @throws Throwable throwable exception
+    */
+   @AfterClass
+   public static void afterClass() throws Throwable
+   {
+      // Undeploy Transaction and Naming
+      URL naming = TxConnectionManagerTestCase.class.getClassLoader().getResource("naming.xml");
+      URL transaction = TxConnectionManagerTestCase.class.getClassLoader().getResource("transaction.xml");
+
+      embedded.undeploy(transaction);
+      embedded.undeploy(naming);
+
+      // Shutdown embedded
+      embedded.shutdown();
+
+      // Set embedded to null
+      embedded = null;
+   }
+
+}
+

Added: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/package.html
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/package.html	                        (rev 0)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/package.html	2011-01-24 15:11:31 UTC (rev 110437)
@@ -0,0 +1,3 @@
+<body>
+Test cases for the non connection listeners
+</body>

Added: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/OnePoolTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/OnePoolTestCase.java	                        (rev 0)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/OnePoolTestCase.java	2011-01-24 15:11:31 UTC (rev 110437)
@@ -0,0 +1,415 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.jca.core.connectionmanager.pool;
+
+import org.jboss.jca.core.api.connectionmanager.pool.PoolConfiguration;
+import org.jboss.jca.core.connectionmanager.listener.ConnectionListener;
+import org.jboss.jca.core.connectionmanager.pool.mcp.ManagedConnectionPool;
+import org.jboss.jca.core.connectionmanager.pool.strategy.OnePool;
+
+import javax.resource.ResourceException;
+import javax.resource.spi.ConnectionRequestInfo;
+import javax.resource.spi.ManagedConnectionFactory;
+import javax.security.auth.Subject;
+import javax.transaction.Transaction;
+
+import org.jboss.tm.TransactionLocal;
+
+import org.junit.Test;
+import org.mockito.InOrder;
+import org.mockito.Mockito;
+
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+/**
+ *
+ * A OnePoolTestCase.
+ *
+ * NOTE that this class is in org.jboss.jca.core.connectionmanager.pool and not in
+ * org.jboss.jca.core.connectionmanager.pool.strategy because it needs to access to AbstractPool's
+ * package protected methods. Please don't move it, and keep this class packaging consistent with AbstractPool's
+ *
+ * @author <a href="stefano.maestri at jboss.com">Stefano Maestri</a>
+ *
+ */
+public class OnePoolTestCase
+{
+
+   /**
+    *
+    * getKeyShouldReturnSameBooleanValuePassedAsSeparateNoTx
+    * @throws Exception in case of unexpected errors
+    *
+    */
+   @Test
+   public void getKeyShouldReturnSameBooleanValuePassedAsSeparateNoTx() throws Exception
+   {
+      AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+      assertThat((Boolean) pool.getKey(null, null, true), is(true));
+      assertThat((Boolean) pool.getKey(null, null, false), is(false));
+   }
+
+   /**
+   *
+   * getKeyShouldReturnSameBooleanValuePassedAsSeparateNoTx
+   *  @throws Exception in case of unexpected errors
+   */
+   @Test(expected = IllegalArgumentException.class)
+   public void constructorShouldThrowIllegalArgumentExceptionForNullManagedConnectionFactory() throws Exception
+   {
+      OnePool pool = new OnePool(null, mock(PoolConfiguration.class), false);
+   }
+
+   /**
+   *
+   * constructorShouldThrowIllegalArgumentExceptionForNullPoolConfiguration
+   *  @throws Exception in case of unexpected errors
+   */
+   @Test(expected = IllegalArgumentException.class)
+   public void constructorShouldThrowIllegalArgumentExceptionForNullPoolConfiguration() throws Exception
+   {
+      OnePool pool = new OnePool(mock(ManagedConnectionFactory.class), null, false);
+   }
+
+   /**
+   *
+   * prefillWithSubjectArgumentShouldPopulateSubPool
+   *  @throws Exception in case of unexpected errors
+   */
+   @Test
+   public void prefillWithSubjectArgumentShouldPopulateSubPool() throws Exception
+   {
+      //given
+      AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+      //when (note: argument is not important, set to null just for convenience)
+      ((OnePool) pool).prefill(null);
+      //then
+      assertThat(pool.getSubPools().get(pool.getKey(null, null, false)) == null, is(false));
+   }
+
+   /**
+   *
+   * prefillWithAllArgumentsShouldPopulateSubPoolIfPoolConfigHasPrefillSetToTrue
+   *  @throws Exception in case of unexpected errors
+   */
+   @Test
+   public void prefillWithAllArgumentsShouldPopulateSubPoolIfPoolConfigHasPrefillSetToTrue() throws Exception
+   {
+      //given
+      PoolConfiguration config = new PoolConfiguration();
+      //prefill=true is the default
+      ManagedConnectionFactory mcf = mock(ManagedConnectionFactory.class);
+      AbstractPrefillPool pool = new OnePool(mcf, config, false);
+      Subject subject = new Subject();
+      ConnectionRequestInfo cri = mock(ConnectionRequestInfo.class);
+      boolean noTxnSeperatePool = true;
+      //when
+      pool.prefill(subject, cri, noTxnSeperatePool);
+      //then
+      assertThat(pool.getSubPools().get(pool.getKey(subject, cri, noTxnSeperatePool)) == null, is(false));
+   }
+
+   /**
+   *
+   * prefillWithAllArgumentsShouldPopulateSubPool
+   *  @throws Exception in case of unexpected errors
+   */
+   @Test
+   public void prefillWithAllArgumentsShouldDoNothingIfPoolConfigHasPrefillSetToFalse() throws Exception
+   {
+      //given
+      PoolConfiguration config = new PoolConfiguration();
+      config.setPrefill(false);
+      AbstractPrefillPool pool = new OnePool(mock(ManagedConnectionFactory.class), config, false);
+      Subject subject = new Subject();
+      ConnectionRequestInfo cri = mock(ConnectionRequestInfo.class);
+      boolean noTxnSeperatePool = true;
+      //when
+      pool.prefill(subject, cri, noTxnSeperatePool);
+      //then
+      assertThat(pool.getSubPools().get(pool.getKey(subject, cri, noTxnSeperatePool)), is((SubPoolContext) null));
+   }
+
+   /**
+   *
+   * emptySubPoolShouldDoNothing
+   *  @throws Exception in case of unexpected errors
+   */
+   @Test
+   public void emptySubPoolShouldDoNothing() throws Exception
+   {
+      //given
+      AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+      //when (note: argument is not important, set to null just for convenience)
+      ((OnePool) pool).prefill(null);
+      ((OnePool) pool).emptySubPool(null);
+      //then
+      assertThat(pool.getSubPools().get(pool.getKey(null, null, false)) == null, is(false));
+
+   }
+
+   /**
+   *
+   * flushPoolShouldLeaveSubPoolEmpty
+   *  @throws Exception in case of unexpected errors
+   */
+   @Test
+   public void flushPoolShouldLeaveSubPoolEmpty() throws Exception
+   {
+      //given
+      AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+      //when (note: argument is not important, set to null just for convenience)
+      ((OnePool) pool).prefill(null);
+      ((OnePool) pool).flush();
+      //then
+      assertThat(pool.getSubPools().size(), is(0));
+
+   }
+
+   /**
+   *
+   * shutdownShouldLeaveSubPoolEmpty
+   *  @throws Exception in case of unexpected errors
+   */
+   @Test
+   public void shutdownShouldLeaveSubPoolEmpty() throws Exception
+   {
+      //given
+      AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+      //when (note: argument is not important, set to null just for convenience)
+      ((OnePool) pool).prefill(null);
+      ((OnePool) pool).shutdown();
+      //then
+      assertThat(pool.getSubPools().size(), is(0));
+
+   }
+
+   /**
+   *
+   * getTransactionOldConnectionShouldThrowResourceExceptionIfLockFail
+   *  @throws Exception in case of unexpected errors
+   */
+   @Test(expected = ResourceException.class)
+   public void getTransactionOldConnectionShouldThrowResourceExceptionIfLockFail() throws Exception
+   {
+      //given
+      AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+      TransactionLocal trackByTx = mock(TransactionLocal.class);
+      Transaction trackByTransaction = mock(Transaction.class);
+      doThrow(new InterruptedException()).when(trackByTx).lock(trackByTransaction);
+      //when
+      pool.getTransactionOldConnection(trackByTx, trackByTransaction);
+      //then exception
+
+   }
+
+   /**
+   *
+   * getTransactionOldConnectionShouldReturnNullIfClIsNullButCOrrectlyLockAndUnlock
+   *  @throws Exception in case of unexpected errors
+   */
+   @Test
+   public void getTransactionOldConnectionShouldReturnNullIfClIsNullButCorrectlyLockAndUnlock() throws Exception
+   {
+      //given
+      AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+      TransactionLocal trackByTx = mock(TransactionLocal.class);
+      Transaction trackByTransaction = mock(Transaction.class);
+      when(trackByTx.get(eq(trackByTransaction))).thenReturn(null);
+      //when
+      Object returnValue = pool.getTransactionOldConnection(trackByTx, trackByTransaction);
+      //then
+      assertThat(returnValue == null, is(true));
+      verify(trackByTx, times(1)).lock(eq(trackByTransaction));
+      verify(trackByTx, times(1)).unlock(eq(trackByTransaction));
+   }
+
+   /**
+   *
+   * getTransactionOldConnectionShouldReturnNullIfClIsNullButCOrrectlyLockAndUnlock
+   *  @throws Exception in case of unexpected errors
+   */
+   @Test
+   public void getTransactionOldConnectionShouldReturnValueIfClHasValueAndCorrectlyLockAndUnlock() throws Exception
+   {
+      //given
+      AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+      TransactionLocal trackByTx = mock(TransactionLocal.class);
+      Transaction trackByTransaction = mock(Transaction.class);
+      ConnectionListener listener = mock(ConnectionListener.class);
+      when(trackByTx.get(eq(trackByTransaction))).thenReturn(listener);
+      //when
+      ConnectionListener returnValue = pool.getTransactionOldConnection(trackByTx, trackByTransaction);
+      //then
+      assertThat(returnValue, is(listener));
+      verify(trackByTx, times(1)).lock(eq(trackByTransaction));
+      verify(trackByTx, times(1)).unlock(eq(trackByTransaction));
+   }
+
+   /**
+   *
+   * getTransactionNewConnectionShouldGetConnectionBeforeLocking
+   *  @throws Exception in case of unexpected errors
+   */
+   @Test
+   public void getTransactionNewConnectionShouldGetConnectionBeforeLocking() throws Exception
+   {
+      //given
+      AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+      TransactionLocal trackByTx = mock(TransactionLocal.class);
+      Transaction trackByTransaction = mock(Transaction.class);
+      ConnectionListener listener = mock(ConnectionListener.class);
+      ManagedConnectionPool mcp = mock(ManagedConnectionPool.class);
+      Subject subject = new Subject();
+      ConnectionRequestInfo cri = mock(ConnectionRequestInfo.class);
+      when(trackByTx.get(eq(trackByTransaction))).thenReturn(listener);
+      //when
+      ConnectionListener returnValue = pool.getTransactionNewConnection(trackByTx, trackByTransaction, mcp, subject,
+         cri);
+      //then
+
+      //note: it'simportant the order of inorder.verrify invocations, not inOrder() constructor
+      InOrder inOrder = Mockito.inOrder(mcp, trackByTx);
+      inOrder.verify(mcp, times(1)).getConnection(subject, cri);
+      inOrder.verify(trackByTx, times(1)).lock(eq(trackByTransaction));
+      //always unlock because it's on finally block
+      inOrder.verify(trackByTx, times(1)).unlock(eq(trackByTransaction));
+   }
+
+   /**
+   *
+   * getTransactionNewConnectionShouldThrowResourceExceptionAndReturnCOnnectionInCaseOfLockFails
+   *  @throws Exception in case of unexpected errors
+   */
+   @Test(expected = ResourceException.class)
+   public void getTransactionNewConnectionShouldThrowResourceExceptionAndReturnCOnnectionInCaseOfLockFails()
+      throws Exception
+   {
+      //given
+      AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+      TransactionLocal trackByTx = mock(TransactionLocal.class);
+      Transaction trackByTransaction = mock(Transaction.class);
+      ManagedConnectionPool mcp = mock(ManagedConnectionPool.class);
+      ConnectionListener cl = mock(ConnectionListener.class);
+      Subject subject = new Subject();
+      ConnectionRequestInfo cri = mock(ConnectionRequestInfo.class);
+      when(mcp.getConnection(subject, cri)).thenReturn(cl);
+
+      doThrow(new InterruptedException()).when(trackByTx).lock(trackByTransaction);
+      ConnectionListener returnValue = pool.getTransactionNewConnection(trackByTx, trackByTransaction, mcp, subject,
+         cri);
+      //then
+
+      //note: it'simportant the order of inorder.verrify invocations, not inOrder() constructor
+      InOrder inOrder = Mockito.inOrder(mcp, trackByTx);
+      inOrder.verify(mcp, times(1)).getConnection(subject, cri);
+      inOrder.verify(trackByTx, times(1)).lock(eq(trackByTransaction));
+      inOrder.verify(mcp, times(1)).returnConnection(eq(cl), eq(false));
+      //always unlock because it's on finally block
+      inOrder.verify(trackByTx, times(1)).unlock(eq(trackByTransaction));
+   }
+
+   /**
+   *
+   * getTransactionNewConnectionShouldThrowResourceExceptionAndReturnCOnnectionInCaseOfLockFails
+   *  @throws Exception in case of unexpected errors
+   */
+   @Test
+   public void getTransactionNewConnectionShouldUseTheOtherFromDifferentThreadIfAlreadyTracked() throws Exception
+   {
+      //given
+      AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+      TransactionLocal trackByTx = mock(TransactionLocal.class);
+      Transaction trackByTransaction = mock(Transaction.class);
+      ManagedConnectionPool mcp = mock(ManagedConnectionPool.class);
+      ConnectionListener cl = mock(ConnectionListener.class);
+      ConnectionListener other = mock(ConnectionListener.class);
+
+      Subject subject = new Subject();
+      ConnectionRequestInfo cri = mock(ConnectionRequestInfo.class);
+      when(mcp.getConnection(subject, cri)).thenReturn(cl);
+
+      when(trackByTx.get(eq(trackByTransaction))).thenReturn(other);
+      //when
+      ConnectionListener returnValue = pool.getTransactionNewConnection(trackByTx, trackByTransaction, mcp, subject,
+         cri);
+      //then
+
+      //note: it'simportant the order of inorder.verrify invocations, not inOrder() constructor
+      InOrder inOrder = Mockito.inOrder(mcp, trackByTx, other);
+      inOrder.verify(mcp, times(1)).getConnection(subject, cri);
+      inOrder.verify(trackByTx, times(1)).lock(eq(trackByTransaction));
+      inOrder.verify(mcp, times(1)).returnConnection(eq(cl), eq(false));
+      inOrder.verify(other, times(1)).setTrackByTx(eq(true));
+      inOrder.verify(trackByTx, times(1)).set(eq(other));
+      //always unlock because it's on finally block
+      inOrder.verify(trackByTx, times(1)).unlock(eq(trackByTransaction));
+
+      assertThat(returnValue, is(other));
+   }
+
+   /**
+   *
+   * getTransactionNewConnectionShouldThrowResourceExceptionAndReturnCOnnectionInCaseOfLockFails
+   *  @throws Exception in case of unexpected errors
+   */
+   @Test
+   public void getTransactionNewConnectionShouldUseMcpReturnedCl() throws Exception
+   {
+      //given
+      AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+      TransactionLocal trackByTx = mock(TransactionLocal.class);
+      Transaction trackByTransaction = mock(Transaction.class);
+      ManagedConnectionPool mcp = mock(ManagedConnectionPool.class);
+      ConnectionListener cl = mock(ConnectionListener.class);
+      ConnectionListener other = null;
+
+      Subject subject = new Subject();
+      ConnectionRequestInfo cri = mock(ConnectionRequestInfo.class);
+      when(mcp.getConnection(subject, cri)).thenReturn(cl);
+
+      when(trackByTx.get(eq(trackByTransaction))).thenReturn(other);
+      //when
+      ConnectionListener returnValue = pool.getTransactionNewConnection(trackByTx, trackByTransaction, mcp, subject,
+         cri);
+      //then
+
+      //note: it'simportant the order of inorder.verrify invocations, not inOrder() constructor
+      InOrder inOrder = Mockito.inOrder(mcp, trackByTx, cl);
+      inOrder.verify(mcp, times(1)).getConnection(subject, cri);
+      inOrder.verify(trackByTx, times(1)).lock(eq(trackByTransaction));
+      inOrder.verify(cl, times(1)).setTrackByTx(eq(true));
+      inOrder.verify(trackByTx, times(1)).set(eq(cl));
+      //always unlock because it's on finally block
+      inOrder.verify(trackByTx, times(1)).unlock(eq(trackByTransaction));
+
+      assertThat(returnValue, is(cl));
+   }
+
+}

Added: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/package.html
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/package.html	                        (rev 0)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/package.html	2011-01-24 15:11:31 UTC (rev 110437)
@@ -0,0 +1,3 @@
+<body>
+Test cases for pools.
+</body>

Modified: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter10/api/WorkManagerRejectingScheduleWorkTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter10/api/WorkManagerRejectingScheduleWorkTestCase.java	2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter10/api/WorkManagerRejectingScheduleWorkTestCase.java	2011-01-24 15:11:31 UTC (rev 110437)
@@ -34,13 +34,12 @@
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import static org.junit.Assert.*;
 
 /**
  * WorkManagerRejectingScheduleWorkTestCase.
- * 
+ *
  * Tests for rejecting work instance to the WorkManager scheduleWork() methods
- * 
+ *
  * @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
  * @version $Revision: $
  */
@@ -50,10 +49,10 @@
     * Embedded
     */
    private static Embedded embedded;
-   
+
    /**
     * scheduleWork method
-    * @throws Throwable throwable exception 
+    * @throws Throwable throwable exception
     */
    @Test(expected = WorkRejectedException.class)
    public void testScheduleWork() throws Throwable
@@ -64,10 +63,10 @@
 
       workManager.scheduleWork(work);
    }
-   
+
    /**
     * scheduleWork method (full signature)
-    * @throws Throwable throwable exception 
+    * @throws Throwable throwable exception
     */
    @Test(expected = WorkRejectedException.class)
    public void testScheduleWorkFullSignature() throws Throwable
@@ -76,16 +75,16 @@
 
       ShortRunningWork work = new ShortRunningWork();
       MyWorkAdapter wa = new MyWorkAdapter();
-      
+
       workManager.scheduleWork(work, WorkManager.INDEFINITE, null, wa);
    }
-   
+
    // --------------------------------------------------------------------------------||
    // Lifecycle Methods --------------------------------------------------------------||
    // --------------------------------------------------------------------------------||
    /**
     * Lifecycle start, before the suite is executed
-    * @throws Throwable throwable exception 
+    * @throws Throwable throwable exception
     */
    @BeforeClass
    public static void beforeClass() throws Throwable
@@ -97,13 +96,11 @@
       embedded.startup();
 
       // Deploy Naming, Transaction and WorkManager
-      URL naming =
-         WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader().getResource("naming.xml");
-      URL transaction =
-         WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader().getResource("transaction.xml");
-      URL wm =
-         WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader().
-         getResource("rejecting-workmanager.xml");
+      URL naming = WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader().getResource("naming.xml");
+      URL transaction = WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader()
+         .getResource("transaction.xml");
+      URL wm = WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader().getResource(
+         "rejecting-workmanager.xml");
 
       embedded.deploy(naming);
       embedded.deploy(transaction);
@@ -112,19 +109,17 @@
 
    /**
     * Lifecycle stop, after the suite is executed
-    * @throws Throwable throwable exception 
+    * @throws Throwable throwable exception
     */
    @AfterClass
    public static void afterClass() throws Throwable
    {
       // Undeploy WorkManager, Transaction and Naming
-      URL naming =
-         WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader().getResource("naming.xml");
-      URL transaction =
-         WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader().getResource("transaction.xml");
-      URL wm =
-         WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader().
-         getResource("rejecting-workmanager.xml");
+      URL naming = WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader().getResource("naming.xml");
+      URL transaction = WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader()
+         .getResource("transaction.xml");
+      URL wm = WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader().getResource(
+         "rejecting-workmanager.xml");
 
       embedded.undeploy(wm);
       embedded.undeploy(transaction);

Modified: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter10/api/WorkManagerRejectingStartWorkTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter10/api/WorkManagerRejectingStartWorkTestCase.java	2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter10/api/WorkManagerRejectingStartWorkTestCase.java	2011-01-24 15:11:31 UTC (rev 110437)
@@ -34,13 +34,12 @@
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import static org.junit.Assert.*;
 
 /**
  * WorkManagerRejectingStartWorkTestCase.
- * 
+ *
  * Tests for rejecting work instance to the WorkManager startWork() methods
- * 
+ *
  * @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
  * @version $Revision: $
  */
@@ -50,10 +49,10 @@
     * Embedded
     */
    private static Embedded embedded;
-   
+
    /**
     * startWork method
-    * @throws Throwable throwable exception 
+    * @throws Throwable throwable exception
     */
    @Test(expected = WorkRejectedException.class)
    public void testStartWork() throws Throwable
@@ -64,10 +63,10 @@
 
       workManager.startWork(work);
    }
-   
+
    /**
     * startWork method (full signature)
-    * @throws Throwable throwable exception 
+    * @throws Throwable throwable exception
     */
    @Test(expected = WorkRejectedException.class)
    public void testStartWorkFullSignature() throws Throwable
@@ -76,16 +75,16 @@
 
       ShortRunningWork work = new ShortRunningWork();
       MyWorkAdapter wa = new MyWorkAdapter();
-      
+
       workManager.startWork(work, WorkManager.INDEFINITE, null, wa);
    }
-   
+
    // --------------------------------------------------------------------------------||
    // Lifecycle Methods --------------------------------------------------------------||
    // --------------------------------------------------------------------------------||
    /**
     * Lifecycle start, before the suite is executed
-    * @throws Throwable throwable exception 
+    * @throws Throwable throwable exception
     */
    @BeforeClass
    public static void beforeClass() throws Throwable
@@ -97,13 +96,9 @@
       embedded.startup();
 
       // Deploy Naming, Transaction and WorkManager
-      URL naming =
-         WorkManagerRejectingStartWorkTestCase.class.getClassLoader().getResource("naming.xml");
-      URL transaction =
-         WorkManagerRejectingStartWorkTestCase.class.getClassLoader().getResource("transaction.xml");
-      URL wm =
-         WorkManagerRejectingStartWorkTestCase.class.getClassLoader().
-         getResource("rejecting-workmanager.xml");
+      URL naming = WorkManagerRejectingStartWorkTestCase.class.getClassLoader().getResource("naming.xml");
+      URL transaction = WorkManagerRejectingStartWorkTestCase.class.getClassLoader().getResource("transaction.xml");
+      URL wm = WorkManagerRejectingStartWorkTestCase.class.getClassLoader().getResource("rejecting-workmanager.xml");
 
       embedded.deploy(naming);
       embedded.deploy(transaction);
@@ -112,19 +107,15 @@
 
    /**
     * Lifecycle stop, after the suite is executed
-    * @throws Throwable throwable exception 
+    * @throws Throwable throwable exception
     */
    @AfterClass
    public static void afterClass() throws Throwable
    {
       // Undeploy WorkManager, Transaction and Naming
-      URL naming =
-         WorkManagerRejectingStartWorkTestCase.class.getClassLoader().getResource("naming.xml");
-      URL transaction =
-         WorkManagerRejectingStartWorkTestCase.class.getClassLoader().getResource("transaction.xml");
-      URL wm =
-         WorkManagerRejectingStartWorkTestCase.class.getClassLoader().
-         getResource("rejecting-workmanager.xml");
+      URL naming = WorkManagerRejectingStartWorkTestCase.class.getClassLoader().getResource("naming.xml");
+      URL transaction = WorkManagerRejectingStartWorkTestCase.class.getClassLoader().getResource("transaction.xml");
+      URL wm = WorkManagerRejectingStartWorkTestCase.class.getClassLoader().getResource("rejecting-workmanager.xml");
 
       embedded.undeploy(wm);
       embedded.undeploy(transaction);

Modified: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter11/section7/WorkContextSetupListenerTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter11/section7/WorkContextSetupListenerTestCase.java	2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter11/section7/WorkContextSetupListenerTestCase.java	2011-01-24 15:11:31 UTC (rev 110437)
@@ -27,7 +27,6 @@
 import org.jboss.jca.test.core.spec.chapter11.common.DuplicateTransactionContextWork;
 import org.jboss.jca.test.core.spec.chapter11.common.TransactionContextCustom;
 import org.jboss.jca.test.core.spec.chapter11.common.TransactionContextWork;
-import org.jboss.jca.test.core.spec.chapter11.section4.subsection3.WorkContextHandlingAssignmentTestCase;
 
 import java.net.URL;
 
@@ -42,7 +41,7 @@
 
 /**
  * WorkContextSetupListenerTest
- * 
+ *
  * @version $Rev$ $Date$
  * @author gurkanerdogdu
  */
@@ -54,8 +53,8 @@
    private static Embedded embedded;
 
    /**
-    * Test {@link WorkContextLifecycleListener} for transaction context.
-    * 
+    * Test WorkContextLifecycleListener for transaction context.
+    *
     * @throws Throwable throws any error
     */
    @Test
@@ -63,17 +62,17 @@
    {
       WorkManager manager = embedded.lookup("WorkManager", WorkManager.class);
       manager.doWork(new TransactionContextWork(), WorkManager.INDEFINITE, null, null);
-      
+
       String errorCode = TransactionContextCustom.getContextSetupFailedErrorCode();
       boolean complete = TransactionContextCustom.isContextSetupComplete();
-      
+
       Assert.assertEquals("", errorCode);
-      Assert.assertTrue(complete);      
+      Assert.assertTrue(complete);
    }
-   
+
    /**
-    * Test {@link WorkContextLifecycleListener} for transaction context.
-    * 
+    * Test WorkContextLifecycleListener for transaction context.
+    *
     * @throws Throwable throws any error
     */
    @Test
@@ -82,24 +81,24 @@
       WorkManager manager = embedded.lookup("WorkManager", WorkManager.class);
       try
       {
-         manager.doWork(new DuplicateTransactionContextWork(), WorkManager.INDEFINITE, null, null);  
+         manager.doWork(new DuplicateTransactionContextWork(), WorkManager.INDEFINITE, null, null);
       }
       catch (Throwable e)
       {
          //Swallow
       }
-      
+
       String errorCode = TransactionContextCustom.getContextSetupFailedErrorCode();
       boolean complete = TransactionContextCustom.isContextSetupComplete();
-      
+
       Assert.assertEquals(WorkContextErrorCodes.DUPLICATE_CONTEXTS, errorCode);
-      Assert.assertFalse(complete);      
+      Assert.assertFalse(complete);
    }
-   
 
+
    /**
     * Before class.
-    * @throws Throwable throwable exception 
+    * @throws Throwable throwable exception
     */
    @BeforeClass
    public static void beforeClass() throws Throwable
@@ -112,7 +111,7 @@
 
       // Deploy Naming, Transaction and WorkManager
       URL naming = WorkContextSetupListenerTestCase.class.getClassLoader().getResource("naming.xml");
-      URL transaction = 
+      URL transaction =
          WorkContextSetupListenerTestCase.class.getClassLoader().getResource("transaction.xml");
       URL wm = WorkContextSetupListenerTestCase.class.getClassLoader().getResource("workmanager.xml");
 
@@ -124,13 +123,13 @@
 
    /**
     * After class.
-    * @throws Throwable throwable exception 
+    * @throws Throwable throwable exception
     */
    @AfterClass
    public static void afterClass() throws Throwable
    {
       URL naming = WorkContextSetupListenerTestCase.class.getClassLoader().getResource("naming.xml");
-      URL transaction = 
+      URL transaction =
          WorkContextSetupListenerTestCase.class.getClassLoader().getResource("transaction.xml");
       URL wm = WorkContextSetupListenerTestCase.class.getClassLoader().getResource("workmanager.xml");
 

Modified: projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/common/AbstractResourceAdapterDeployer.java
===================================================================
--- projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/common/AbstractResourceAdapterDeployer.java	2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/common/AbstractResourceAdapterDeployer.java	2011-01-24 15:11:31 UTC (rev 110437)
@@ -583,7 +583,7 @@
     * @throws DeployException DeployException in case of errors
     */
    protected Set<Failure> initAdminObject(Connector cmd, ClassLoader cl, List<Validate> archiveValidationObjects,
-         List<Object> beanValidationObjects, Set<Failure> failures, 
+      List<Object> beanValidationObjects, Set<Failure> failures,
          URL url, String deploymentName, boolean activateDeployment,
          List<org.jboss.jca.common.api.metadata.common.CommonAdminObject> aosRaXml,
          List<org.jboss.jca.common.api.metadata.common.CommonAdminObject> aosIronJacamar,
@@ -644,7 +644,7 @@
                                     {
                                        jndiName = aoRaXml.getJndiName();
 
-                                       if (aoRaXml.isUseJavaContext() != null && 
+                                       if (aoRaXml.isUseJavaContext() != null &&
                                            aoRaXml.isUseJavaContext().booleanValue() &&
                                            !jndiName.startsWith("java:/"))
                                        {
@@ -655,14 +655,14 @@
                                     {
                                        jndiName = ijAO.getJndiName();
 
-                                       if (ijAO.isUseJavaContext() != null && 
+                                       if (ijAO.isUseJavaContext() != null &&
                                            ijAO.isUseJavaContext().booleanValue() &&
                                            !jndiName.startsWith("java:/"))
                                        {
                                           jndiName = "java:/" + jndiName;
                                        }
                                     }
-                                 
+
                                     bindAdminObject(url, deploymentName, ao, jndiName);
                                  }
                                  else
@@ -670,7 +670,7 @@
                                     String[] names = bindAdminObject(url, deploymentName, ao);
                                     jndiName = names[0];
                                  }
-                           
+
                                  aos[i] = ao;
                                  aoJndiNames[i] = jndiName;
 
@@ -759,7 +759,7 @@
          if (mgtUniqueId.indexOf("/") != -1)
             mgtUniqueId = mgtUniqueId.substring(mgtUniqueId.lastIndexOf("/") + 1);
 
-         org.jboss.jca.core.api.management.Connector mgtConnector = 
+         org.jboss.jca.core.api.management.Connector mgtConnector =
             new org.jboss.jca.core.api.management.Connector(mgtUniqueId);
 
          ResourceAdapter resourceAdapter = null;
@@ -1018,7 +1018,7 @@
                            {
                               jndiName = cdRaXml.getJndiName();
 
-                              if (cdRaXml.isUseJavaContext() != null && 
+                              if (cdRaXml.isUseJavaContext() != null &&
                                   cdRaXml.isUseJavaContext().booleanValue() &&
                                   !jndiName.startsWith("java:/"))
                               {
@@ -1029,7 +1029,7 @@
                            {
                               jndiName = ijCD.getJndiName();
 
-                              if (ijCD.isUseJavaContext() != null && 
+                              if (ijCD.isUseJavaContext() != null &&
                                   ijCD.isUseJavaContext().booleanValue() &&
                                   !jndiName.startsWith("java:/"))
                               {
@@ -1052,7 +1052,7 @@
                            {
                               poolName = ijCD.getPoolName();
                            }
- 
+
                            if (poolName == null)
                               poolName = jndiName;
 
@@ -1074,7 +1074,7 @@
                            {
                               poolName = ijCD.getPoolName();
                            }
- 
+
                            if (poolName == null)
                               poolName = cfJndiNames[0];
 
@@ -1322,7 +1322,7 @@
                                        {
                                           jndiName = cdRaXml.getJndiName();
 
-                                          if (cdRaXml.isUseJavaContext() != null && 
+                                          if (cdRaXml.isUseJavaContext() != null &&
                                               cdRaXml.isUseJavaContext().booleanValue() &&
                                               !jndiName.startsWith("java:/"))
                                           {
@@ -1333,7 +1333,7 @@
                                        {
                                           jndiName = ijCD.getJndiName();
 
-                                          if (ijCD.isUseJavaContext() != null && 
+                                          if (ijCD.isUseJavaContext() != null &&
                                               ijCD.isUseJavaContext().booleanValue() &&
                                               !jndiName.startsWith("java:/"))
                                           {
@@ -1356,7 +1356,7 @@
                                        {
                                           poolName = ijCD.getPoolName();
                                        }
-                                       
+
                                        if (poolName == null)
                                           poolName = jndiName;
 
@@ -1378,7 +1378,7 @@
                                        {
                                           poolName = ijCD.getPoolName();
                                        }
-                                       
+
                                        if (poolName == null)
                                           poolName = cfJndiNames[0];
 
@@ -1407,10 +1407,8 @@
                                           failures, url, activateDeployment);
 
             failures = initAdminObject(cmd, cl, archiveValidationObjects, beanValidationObjects, failures, url,
-                                       deploymentName, activateDeployment, 
-                                       raxml != null ? raxml.getAdminObjects() : null,
-                                       ijmd != null ? ijmd.getAdminObjects() : null, 
-                                       aos, aoJndiNames, mgtConnector);
+               deploymentName, activateDeployment, raxml != null ? raxml.getAdminObjects() : null, ijmd != null
+                  ? ijmd.getAdminObjects() : null, aos, aoJndiNames, mgtConnector);
          }
 
          // Archive validation
@@ -1526,8 +1524,8 @@
     * @param cps The config property's
     * @return The management view of these
     */
-   private List<org.jboss.jca.core.api.management.ConfigProperty> 
-      createManagementView(List<? extends ConfigProperty> cps)
+   private List<org.jboss.jca.core.api.management.ConfigProperty> createManagementView(
+      List<? extends ConfigProperty> cps)
    {
       List<org.jboss.jca.core.api.management.ConfigProperty> result =
          new ArrayList<org.jboss.jca.core.api.management.ConfigProperty>();
@@ -1551,14 +1549,14 @@
                if (confidential == null)
                   confidential = Boolean.FALSE;
 
-               mgtCp = 
+               mgtCp =
                   new org.jboss.jca.core.api.management.ConfigProperty(
                      cp.getConfigPropertyName().getValue(),
                      dynamic.booleanValue(), confidential.booleanValue());
             }
             else
             {
-               mgtCp = 
+               mgtCp =
                   new org.jboss.jca.core.api.management.ConfigProperty(
                      cp.getConfigPropertyName().getValue());
             }

Added: projects/jboss-jca/trunk/deployers/src/test/java/org/jboss/jca/test/deployers/spec/rars/testcases/package.html
===================================================================
--- projects/jboss-jca/trunk/deployers/src/test/java/org/jboss/jca/test/deployers/spec/rars/testcases/package.html	                        (rev 0)
+++ projects/jboss-jca/trunk/deployers/src/test/java/org/jboss/jca/test/deployers/spec/rars/testcases/package.html	2011-01-24 15:11:31 UTC (rev 110437)
@@ -0,0 +1,3 @@
+<body>
+Test cases for the deployers.
+</body>

Modified: projects/jboss-jca/trunk/doc/userguide/en-US/modules/schemas.xml
===================================================================
--- projects/jboss-jca/trunk/doc/userguide/en-US/modules/schemas.xml	2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/doc/userguide/en-US/modules/schemas.xml	2011-01-24 15:11:31 UTC (rev 110437)
@@ -2720,7 +2720,7 @@
     <programlisting language="xml">
 <![CDATA[
 <?xml version="1.0" encoding="UTF-8"?>
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="1.0">
 
   <xs:complexType name="boolean-presenceType"></xs:complexType>
 

Modified: projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/Embedded.java
===================================================================
--- projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/Embedded.java	2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/Embedded.java	2011-01-24 15:11:31 UTC (rev 110437)
@@ -74,6 +74,7 @@
 
    /**
     * Lookup a bean
+    * @param <T> the generics type
     * @param name The bean name
     * @param expectedType The expected type for the bean
     * @return The bean instance

Modified: projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/EmbeddedJCA.java
===================================================================
--- projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/EmbeddedJCA.java	2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/EmbeddedJCA.java	2011-01-24 15:11:31 UTC (rev 110437)
@@ -51,7 +51,7 @@
    private static final int BUFFER_SIZE = 4096;
 
    /** Enable full profile */
-   private boolean fullProfile;
+   private final boolean fullProfile;
 
    /** Kernel */
    private Kernel kernel;
@@ -150,6 +150,7 @@
 
    /**
     * Lookup a bean
+    * @param <T> the generic type
     * @param name The bean name
     * @param expectedType The expected type for the bean
     * @return The bean instance
@@ -177,7 +178,7 @@
    public void deploy(URL url) throws Throwable
    {
       if (url == null)
-         throw new IllegalArgumentException("Url is null");      
+         throw new IllegalArgumentException("Url is null");
 
       if (!started)
          throw new IllegalStateException("Container not started");
@@ -193,17 +194,17 @@
    public void deploy(ResourceAdapterArchive raa) throws Throwable
    {
       if (raa == null)
-         throw new IllegalArgumentException("Url is null");      
+         throw new IllegalArgumentException("Url is null");
 
       if (!raa.getName().endsWith(".rar"))
-         throw new IllegalArgumentException(raa.getName() + " doesn't end with .rar");      
+         throw new IllegalArgumentException(raa.getName() + " doesn't end with .rar");
 
       if (!started)
          throw new IllegalStateException("Container not started");
 
       InputStream is = raa.as(ZipExporter.class).exportZip();
       BufferedInputStream bis = new BufferedInputStream(is, BUFFER_SIZE);
-      
+
       File parentDirectory = new File(SecurityActions.getSystemProperty("java.io.tmpdir"));
       File raaFile = new File(parentDirectory, raa.getName());
 
@@ -258,7 +259,7 @@
          shrinkwrapDeployments = new ArrayList<File>(1);
 
       shrinkwrapDeployments.add(raaFile);
-     
+
       kernel.getMainDeployer().deploy(raaFile.toURI().toURL());
    }
 
@@ -292,7 +293,7 @@
    public void undeploy(URL url) throws Throwable
    {
       if (url == null)
-         throw new IllegalArgumentException("Url is null");      
+         throw new IllegalArgumentException("Url is null");
 
       if (!started)
          throw new IllegalStateException("Container not started");
@@ -308,7 +309,7 @@
    public void undeploy(ResourceAdapterArchive raa) throws Throwable
    {
       if (raa == null)
-         throw new IllegalArgumentException("Url is null");      
+         throw new IllegalArgumentException("Url is null");
 
       if (!started)
          throw new IllegalStateException("Container not started");
@@ -350,7 +351,7 @@
    private void removeDeployment(File deployment) throws IOException
    {
       if (deployment == null)
-         throw new IllegalArgumentException("Deployment is null");      
+         throw new IllegalArgumentException("Deployment is null");
 
       if (deployment.exists())
       {
@@ -380,7 +381,7 @@
                if (files[i].isDirectory())
                {
                   recursiveDelete(files[i]);
-               } 
+               }
                else
                {
                   if (!files[i].delete())

Modified: projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/arquillian/EmbeddedJCAContainer.java
===================================================================
--- projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/arquillian/EmbeddedJCAContainer.java	2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/arquillian/EmbeddedJCAContainer.java	2011-01-24 15:11:31 UTC (rev 110437)
@@ -132,8 +132,9 @@
     *
     * @param asset asset
     * @param name asset
-    * @throws FileNotFoundException IOException
+    *
     * @throws IOException IOException
+    * @throws FileNotFoundException FileNotFoundException
     * @throws MalformedURLException MalformedURLException
     * @throws Throwable Throwable
     *



More information about the jboss-cvs-commits mailing list