[jboss-cvs] JBossAS SVN: r107026 - in projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager: ccm and 1 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Jul 22 11:53:23 EDT 2010


Author: jesper.pedersen
Date: 2010-07-22 11:53:22 -0400 (Thu, 22 Jul 2010)
New Revision: 107026

Modified:
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/AbstractConnectionManager.java
   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/KeyConnectionAssociation.java
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListener.java
Log:
[JBJCA-384] Refactor connection manager (Part 6)

Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/AbstractConnectionManager.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/AbstractConnectionManager.java	2010-07-22 15:02:48 UTC (rev 107025)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/AbstractConnectionManager.java	2010-07-22 15:53:22 UTC (rev 107026)
@@ -54,7 +54,7 @@
  * AbstractConnectionManager.
  * 
  * @author <a href="mailto:gurkanerdogdu at yahoo.com">Gurkan Erdogdu</a>
- * @version $Rev$
+ * @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
  */
 public abstract class AbstractConnectionManager implements ConnectionManager 
 {

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	2010-07-22 15:02:48 UTC (rev 107025)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManager.java	2010-07-22 15:53:22 UTC (rev 107026)
@@ -29,15 +29,16 @@
 
 import java.lang.reflect.Method;
 
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -58,28 +59,28 @@
 
 /**
  * CacheConnectionManager.
- * @version $Rev$
- *
+ * 
+ * @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a> 
  */
 public class CachedConnectionManager implements
    UserTransactionStartedListener,
    UserTransactionListener,
    ComponentStack
 {
-   /**Log instance*/
+   /** Log instance */
    private static Logger log = Logger.getLogger(CachedConnectionManager.class);
    
-   /**Log trace*/
-   private boolean trace;
+   /** Log trace */
+   private static boolean trace = log.isTraceEnabled();
    
-   /**Debug flag*/
-   private boolean debug;
+   /** Debugging flag */
+   private static boolean debug = false;
    
-   /**Error flag*/
-   private boolean error;
+   /** Enabled error handling for debugging */
+   private static boolean error = false;
    
-   /**Transaction Manager instance*/
-   private TransactionManager transactionManager;
+   /** Transaction Manager instance */
+   private final TransactionManager transactionManager;
    
    /**
     * ThreadLocal that holds current calling meta-programming aware
@@ -95,9 +96,10 @@
     * map of meta-aware object to set of connections it holds, used by
     * the idiot spec compliant behavior.
     */
-   private final Map<KeyConnectionAssociation, Map<ConnectionCacheListener, Collection<ConnectionRecord>>> 
-   objectToConnectionManagerMap = new HashMap<KeyConnectionAssociation, 
-      Map<ConnectionCacheListener, Collection<ConnectionRecord>>>();
+   private final ConcurrentMap<KeyConnectionAssociation, 
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> 
+   objectToConnectionManagerMap = new ConcurrentHashMap<KeyConnectionAssociation, 
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>>();
 
    /**
     * Connection stacktraces
@@ -111,7 +113,6 @@
    public CachedConnectionManager(final TransactionManager transactionManager)
    {
       this.transactionManager = transactionManager;
-      this.trace = log.isTraceEnabled();
    }
    
    /**
@@ -138,15 +139,19 @@
          return; //not participating properly in this management scheme.  
       }
 
-      Map<ConnectionCacheListener, Collection<ConnectionRecord>> cmToConnectionsMap = key.getCMToConnectionsMap();
-      Iterator<Entry<ConnectionCacheListener, Collection<ConnectionRecord>>> cmToConnectionsMapIterator = 
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap = 
+         key.getCMToConnectionsMap();
+
+      Iterator<Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> cmToConnectionsMapIterator = 
          cmToConnectionsMap.entrySet().iterator();
       
       while (cmToConnectionsMapIterator.hasNext())
       {
-         Entry<ConnectionCacheListener, Collection<ConnectionRecord>> entry = cmToConnectionsMapIterator.next();
+         Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> entry = 
+            cmToConnectionsMapIterator.next();
+
          ConnectionCacheListener cm = entry.getKey();
-         Collection<ConnectionRecord> conns = entry.getValue();
+         CopyOnWriteArrayList<ConnectionRecord> conns = entry.getValue();
          
          cm.transactionStarted(conns);
       }
@@ -202,7 +207,6 @@
                   "see the log for the allocation stacktraces");  
          }
       }
-      
    }
 
    /**
@@ -237,11 +241,13 @@
       }
 
       ConnectionRecord cr = new ConnectionRecord(cl, connection, cri);
-      Map<ConnectionCacheListener, Collection<ConnectionRecord>> cmToConnectionsMap = key.getCMToConnectionsMap();
-      Collection<ConnectionRecord> conns = cmToConnectionsMap.get(cm);
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap = 
+         key.getCMToConnectionsMap();
+
+      CopyOnWriteArrayList<ConnectionRecord> conns = cmToConnectionsMap.get(cm);
       if (conns == null)
       {
-         conns = new ArrayList<ConnectionRecord>();
+         conns = new CopyOnWriteArrayList<ConnectionRecord>();
          cmToConnectionsMap.put(cm, conns);
       }
       
@@ -282,8 +288,10 @@
          return; //not participating properly in this management scheme.  
       }
 
-      Map<ConnectionCacheListener, Collection<ConnectionRecord>> cmToConnectionsMap = key.getCMToConnectionsMap();
-      Collection<ConnectionRecord> conns = cmToConnectionsMap.get(cm);
+      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  
@@ -347,24 +355,23 @@
    @SuppressWarnings("unchecked")
    private void reconnect(KeyConnectionAssociation key, Set unsharableResources) throws ResourceException
    {
-      Map<ConnectionCacheListener, Collection<ConnectionRecord>> cmToConnectionsMap = null;
-      synchronized (objectToConnectionManagerMap)
-      {
-         cmToConnectionsMap = objectToConnectionManagerMap.get(key);
-         if (cmToConnectionsMap == null)
-         {
-            return;  
-         }
-      }
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap = 
+         objectToConnectionManagerMap.get(key);
+         
+      if (cmToConnectionsMap == null)
+         return;  
+
       key.setCMToConnectionsMap(cmToConnectionsMap);
-      Iterator<Entry<ConnectionCacheListener, Collection<ConnectionRecord>>> cmToConnectionsMapIterator = 
+      Iterator<Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> cmToConnectionsMapIterator = 
          cmToConnectionsMap.entrySet().iterator();
       
       while (cmToConnectionsMapIterator.hasNext())
       {
-         Entry<ConnectionCacheListener, Collection<ConnectionRecord>> entry = cmToConnectionsMapIterator.next();
+         Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> entry = 
+            cmToConnectionsMapIterator.next();
+
          ConnectionCacheListener cm = entry.getKey();
-         Collection<ConnectionRecord> conns =  entry.getValue();
+         CopyOnWriteArrayList<ConnectionRecord> conns =  entry.getValue();
          
          cm.reconnect(conns, unsharableResources);
       }
@@ -379,22 +386,23 @@
    @SuppressWarnings("unchecked")
    private void disconnect(KeyConnectionAssociation key, Set unsharableResources) throws ResourceException
    {
-      Map<ConnectionCacheListener, Collection<ConnectionRecord>> cmToConnectionsMap = null;
-      cmToConnectionsMap = key.getCMToConnectionsMap();
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+         key.getCMToConnectionsMap();
+
       if (!cmToConnectionsMap.isEmpty())
       {
-         synchronized (objectToConnectionManagerMap)
-         {
-            objectToConnectionManagerMap.put(key, cmToConnectionsMap);
-         }
-         Iterator<Entry<ConnectionCacheListener, Collection<ConnectionRecord>>> cmToConnectionsMapIterator = 
+         objectToConnectionManagerMap.put(key, cmToConnectionsMap);
+
+         Iterator<Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> cmToConnectionsMapIterator = 
             cmToConnectionsMap.entrySet().iterator();
          
          while (cmToConnectionsMapIterator.hasNext())
          {
-            Entry<ConnectionCacheListener, Collection<ConnectionRecord>> entry = cmToConnectionsMapIterator.next();
+            Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> entry = 
+               cmToConnectionsMapIterator.next();
+
             ConnectionCacheListener cm = entry.getKey();
-            Collection<ConnectionRecord> conns =  entry.getValue();
+            CopyOnWriteArrayList<ConnectionRecord> conns =  entry.getValue();
             
             cm.disconnect(conns, unsharableResources);
          }
@@ -417,19 +425,15 @@
          log.trace("unregisterConnectionCacheListener: " + cm);  
       }
       
-      synchronized (objectToConnectionManagerMap)
+      Iterator<ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> it = 
+         objectToConnectionManagerMap.values().iterator();
+         
+      while (it.hasNext())
       {
-         Iterator<Map<ConnectionCacheListener, Collection<ConnectionRecord>>> it = 
-               objectToConnectionManagerMap.values().iterator();
-         
-         while (it.hasNext())
-         {
-            Map<ConnectionCacheListener, Collection<ConnectionRecord>> cmToConnectionsMap = it.next();
-            if (cmToConnectionsMap != null)
-            {
-               cmToConnectionsMap.remove(cm);  
-            }
-         }
+         ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap = it.next();
+
+         if (cmToConnectionsMap != null)
+            cmToConnectionsMap.remove(cm);  
       }
    }
    
@@ -439,7 +443,8 @@
     * @param cmToConnectionsMap connection manager to connections
     * @return true if close
     */
-   private boolean closeAll(Map<ConnectionCacheListener, Collection<ConnectionRecord>> cmToConnectionsMap)
+   private boolean closeAll(ConcurrentMap<ConnectionCacheListener, 
+                            CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap)
    {
       if (!debug)
       {
@@ -448,12 +453,12 @@
 
       boolean unclosed = false;
 
-      Collection<Collection<ConnectionRecord>> connections = cmToConnectionsMap.values();
+      Collection<CopyOnWriteArrayList<ConnectionRecord>> connections = cmToConnectionsMap.values();
       if (connections.size() != 0)
       {
-         for (Iterator<Collection<ConnectionRecord>> i = connections.iterator(); i.hasNext();)
+         for (Iterator<CopyOnWriteArrayList<ConnectionRecord>> i = connections.iterator(); i.hasNext();)
          {
-            Collection<ConnectionRecord> conns = i.next();
+            CopyOnWriteArrayList<ConnectionRecord> conns = i.next();
             for (Iterator<ConnectionRecord> j = conns.iterator(); j.hasNext();)
             {
                Object c = (j.next()).getConnection();

Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ccm/KeyConnectionAssociation.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ccm/KeyConnectionAssociation.java	2010-07-22 15:02:48 UTC (rev 107025)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ccm/KeyConnectionAssociation.java	2010-07-22 15:53:22 UTC (rev 107026)
@@ -24,9 +24,9 @@
 import org.jboss.jca.core.connectionmanager.ConnectionRecord;
 import org.jboss.jca.core.connectionmanager.listener.ConnectionCacheListener;
 
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.jboss.util.Strings;
 
@@ -44,7 +44,7 @@
    private final Object metaAwareObject;
 
    //map of cm to list of connections for that cm.
-   private Map<ConnectionCacheListener, Collection<ConnectionRecord>> cmToConnectionsMap;
+   private ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap;
 
    /**
     * Creates a new instance.
@@ -84,7 +84,8 @@
     * Set map instance.
     * @param cmToConnectionsMap connection manager to connections
     */
-   public void setCMToConnectionsMap(Map<ConnectionCacheListener, Collection<ConnectionRecord>> cmToConnectionsMap)
+   public void setCMToConnectionsMap(ConcurrentMap<ConnectionCacheListener, 
+                                     CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap)
    {
       this.cmToConnectionsMap = cmToConnectionsMap;
    }
@@ -93,12 +94,10 @@
     * 
     * @return map instance
     */
-   public Map<ConnectionCacheListener, Collection<ConnectionRecord>> getCMToConnectionsMap()
+   public ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> getCMToConnectionsMap()
    {
       if (cmToConnectionsMap == null)
-      {
-         cmToConnectionsMap = new HashMap<ConnectionCacheListener, Collection<ConnectionRecord>>();
-      }
+         cmToConnectionsMap = new ConcurrentHashMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>();
       
       return cmToConnectionsMap;
    }

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	2010-07-22 15:02:48 UTC (rev 107025)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListener.java	2010-07-22 15:53:22 UTC (rev 107026)
@@ -83,7 +83,6 @@
       {
          ((LocalXAResource) xaResource).setConnectionListener(this);  
       }
-
    }   
    
    /**
@@ -236,7 +235,8 @@
       {
          try
          {
-            for (int i = 0; i < unenlisted.size(); ++i)
+            int size = unenlisted.size();
+            for (int i = 0; i < size; ++i)
             {
                TransactionSynchronization sync = (TransactionSynchronization) unenlisted.get(i);
                if (sync.enlist())
@@ -469,13 +469,13 @@
          new Throwable("Unabled to enlist resource, see the previous warnings.");
       
       /** Transaction */
-      private Transaction currentTx;
+      private final Transaction currentTx;
       
       /** This is the status when we were registered */
-      private boolean wasTrackByTx;
+      private final boolean wasTrackByTx;
 
       /** Whether we are enlisted */
-      private boolean enlisted = false;
+      private boolean enlisted;
       
       /** Any error during enlistment */
       private Throwable enlistError;
@@ -485,10 +485,12 @@
        * 
        * @param trackByTx whether this is track by connection
        */
-      public TransactionSynchronization(Transaction tx, boolean trackByTx)
+      public TransactionSynchronization(final Transaction tx, final boolean trackByTx)
       {
          this.currentTx = tx;
          this.wasTrackByTx = trackByTx;
+         this.enlisted = false;
+         this.enlistError = null;
       }
       
       /**



More information about the jboss-cvs-commits mailing list