[jboss-cvs] JBossAS SVN: r93532 - in projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager: listener and 3 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Sep 15 09:41:07 EDT 2009


Author: gurkanerdogdu
Date: 2009-09-15 09:41:06 -0400 (Tue, 15 Sep 2009)
New Revision: 93532

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/CachedConnectionManager.java
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ConnectionValidator.java
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/IdleRemover.java
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/ConnectionListenerFactory.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/pool/AbstractPool.java
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/SubPoolContext.java
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/transaction/TransactionSynchronizer.java
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/tx/TxConnectionManager.java
Log:
[JBJCA-167] Generic Connection Manager Implementation.

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	2009-09-15 13:24:01 UTC (rev 93531)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/AbstractConnectionManager.java	2009-09-15 13:41:06 UTC (rev 93532)
@@ -486,7 +486,7 @@
    /**
     * {@inheritDoc}
     */
-   public TransactionManager getTransactionManagerInstance()
+   public TransactionManager getTransactionManager()
    {
       return null;
    }

Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/CachedConnectionManager.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/CachedConnectionManager.java	2009-09-15 13:24:01 UTC (rev 93531)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/CachedConnectionManager.java	2009-09-15 13:41:06 UTC (rev 93532)
@@ -127,13 +127,6 @@
    public void setTransactionManager(TransactionManager transactionManager)
    {
       this.transactionManager = transactionManager;
-      
-      // FIXME we should be injecting onto the synchronizer directly
-      if (this.transactionManager != null)
-      {
-         TransactionSynchronizer.setTransactionManager(transactionManager);
-      }
-         
    }
    
    

Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ConnectionValidator.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ConnectionValidator.java	2009-09-15 13:24:01 UTC (rev 93531)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ConnectionValidator.java	2009-09-15 13:41:06 UTC (rev 93532)
@@ -22,6 +22,21 @@
 
 package org.jboss.jca.core.connectionmanager;
 
+import org.jboss.jca.core.connectionmanager.pool.InternalManagedConnectionPool;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.jboss.logging.Logger;
+
 /**
  * Connection validator class.
  * 
@@ -31,22 +46,241 @@
  */
 public class ConnectionValidator
 {
+   /**Logger instance*/
+   private static Logger logger = Logger.getLogger(ConnectionValidator.class);
+   
+   /**Validator thread name*/
+   private static final String VALIDATOR_THREAD_NAME = "JBossConnectionValidator";
+   
+   /**Registered internal pool instances*/
+   private CopyOnWriteArrayList<InternalManagedConnectionPool> registeredPools = 
+      new CopyOnWriteArrayList<InternalManagedConnectionPool>();
+   
+   /**Validator executor service*/
+   private ExecutorService executorService = null;
+   
+   /**Singleton instance*/
+   private static ConnectionValidator instance = new ConnectionValidator();
+   
+   /** The interval */
+   private long interval = Long.MAX_VALUE;
+
+   /** The next */
+ //important initialization!
+   private long next = Long.MAX_VALUE;
+   
+   /**Lock for condition*/
+   private Lock lock = new ReentrantLock();
+   
+   /**Condition*/
+   private Condition condition = lock.newCondition();
+   
+   
    /**
+    * Private constructor.
+    */
+   private ConnectionValidator()
+   {
+      this.executorService = Executors.newSingleThreadExecutor(new ValidatorThreadFactory());
+      this.executorService.execute(new JBossConnectionValidator());
+   }
+   
+   /**
     * Register pool for connection validation.
     * @param mcp managed connection pool
     * @param interval validation interval
     */
-   public static void registerPool(IdleConnectionRemovalSupport mcp, long interval)
+   public static void registerPool(InternalManagedConnectionPool mcp, long interval)
    {
-      
+      instance.internalRegisterPool(mcp, interval);
    }
    
    /**
     * Unregister pool instance for connection validation.
     * @param mcp pool instance
     */
-   public static void unregisterPool(IdleConnectionRemovalSupport mcp)
+   public static void unregisterPool(InternalManagedConnectionPool mcp)
    {
+      instance.internalUnregisterPool(mcp);
+   }
+   
+   private void internalRegisterPool(InternalManagedConnectionPool mcp, long interval)
+   {
+      try
+      {
+         this.lock.lock();
+         
+         this.registeredPools.addIfAbsent(mcp);
+         
+         if (interval > 1 && interval / 2 < this.interval) 
+         {
+            this.interval = interval / 2;
+            long maybeNext = System.currentTimeMillis() + this.interval;
+            if (next > maybeNext && maybeNext > 0) 
+            {
+               next = maybeNext;
+               if (logger.isDebugEnabled())
+               {
+                  logger.debug("internalRegisterPool: about to notify thread: old next: " +
+                        next + ", new next: " + maybeNext);  
+               }               
+               
+               this.condition.signal();
+               
+            }
+         }
+         
+      } 
+      finally
+      {
+         this.lock.unlock();
+      }
+   }
+   
+   private void internalUnregisterPool(InternalManagedConnectionPool mcp)
+   {
+      this.registeredPools.remove(mcp);
       
+      if (this.registeredPools.size() == 0) 
+      {
+         if (logger.isDebugEnabled())
+         {
+            logger.debug("internalUnregisterPool: setting interval to Long.MAX_VALUE");  
+         }
+         
+         interval = Long.MAX_VALUE;
+      }
    }
+   
+   /**
+    * Setup context class loader.
+    */
+   private void setupContextClassLoader()
+   {
+      // Could be null if loaded from system classloader
+      final ClassLoader cl = ConnectionValidator.class.getClassLoader();
+      if (cl == null)
+      {
+         return;  
+      }
+      
+      SecurityManager sm = System.getSecurityManager();
+      
+      if (sm == null)
+      {
+         Thread.currentThread().setContextClassLoader(cl);
+         
+         return;
+      }
+      
+      AccessController.doPrivileged(new PrivilegedAction<Object>()
+      {
+         public Object run()
+         {
+            Thread.currentThread().setContextClassLoader(cl);
+            
+            return null;
+         }
+      });
+   }
+   
+   /**
+    * Wait for background thread.
+    */
+   public static void waitForBackgroundThread()
+   {
+      try
+      {
+         instance.lock.lock();
+         
+      }
+      finally
+      {
+         instance.lock.unlock();  
+      }
+   }
+   
+   
+   /**
+    * Thread factory.
+    */
+   private static class ValidatorThreadFactory implements ThreadFactory
+   {
+      /**
+       * {@inheritDoc}
+       */
+      public Thread newThread(Runnable r)
+      {
+         Thread thread = new Thread(r, ConnectionValidator.VALIDATOR_THREAD_NAME);
+         thread.setDaemon(true);
+         
+         return thread;
+      }      
+   }
+   
+   /**
+    * JBossConnectionValidator.
+    *
+    */
+   private class JBossConnectionValidator implements Runnable
+   {
+      
+      /**
+       * {@inheritDoc}
+       */
+      public void run()
+      {
+         setupContextClassLoader();
+         
+         try
+         {
+            lock.lock();
+            
+            while (true)
+            {
+               boolean result = instance.condition.await(instance.interval, TimeUnit.MILLISECONDS);
+               
+               if (logger.isTraceEnabled())
+               {
+                  logger.trace("Result of await ConnectionValidator: " + result);
+               }
+               
+               if (logger.isDebugEnabled())
+               {
+                  logger.debug("run: ConnectionValidator notifying pools, interval: " + interval);  
+               }
+     
+               for (InternalManagedConnectionPool mcp : registeredPools)
+               {
+                  mcp.validateConnections();
+               }
+
+               next = System.currentTimeMillis() + interval;
+               
+               if (next < 0)
+               {
+                  next = Long.MAX_VALUE;  
+               }              
+            }            
+         }
+         catch (InterruptedException e)
+         {
+            logger.info("run: ConnectionValidator has been interrupted, returning");
+            
+            return;  
+         }
+         catch (RuntimeException e)
+         {
+            logger.warn("run: ConnectionValidator ignored unexpected runtime exception", e);
+         }
+         catch (Exception e)
+         {
+            logger.warn("run: ConnectionValidator ignored unexpected error", e);
+         }         
+         finally
+         {
+            lock.unlock();  
+         }         
+      }      
+   }
 }

Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/IdleRemover.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/IdleRemover.java	2009-09-15 13:24:01 UTC (rev 93531)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/IdleRemover.java	2009-09-15 13:41:06 UTC (rev 93532)
@@ -22,32 +22,263 @@
 
 package org.jboss.jca.core.connectionmanager;
 
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
 
+import org.jboss.logging.Logger;
+
 /**
- * Idle remover.
+ * Connection validator class.
+ * 
  * @author <a href="mailto:gurkanerdogdu at yahoo.com">Gurkan Erdogdu</a>
  * @version $Rev$ $Date$
  *
  */
 public class IdleRemover
 {
+   /**Logger instance*/
+   private static Logger logger = Logger.getLogger(IdleRemover.class);
+   
+   /**Validator thread name*/
+   private static final String VALIDATOR_THREAD_NAME = "JBossConnectionValidator";
+   
+   /**Registered internal pool instances*/
+   private CopyOnWriteArrayList<IdleConnectionRemovalSupport> registeredPools = 
+      new CopyOnWriteArrayList<IdleConnectionRemovalSupport>();
+   
+   /**Validator executor service*/
+   private ExecutorService executorService = null;
+   
+   /**Singleton instance*/
+   private static IdleRemover instance = new IdleRemover();
+   
+   /** The interval */
+   private long interval = Long.MAX_VALUE;
 
+   /** The next */
+ //important initialization!
+   private long next = Long.MAX_VALUE;
+   
+   /**Lock for condition*/
+   private Lock lock = new ReentrantLock();
+   
+   /**Condition*/
+   private Condition condition = lock.newCondition();
+   
+   
    /**
-    * Register pool for idle removal.
-    * @param mcp pool instance
-    * @param interval interval for removal
+    * Private constructor.
     */
+   private IdleRemover()
+   {
+      this.executorService = Executors.newSingleThreadExecutor(new ValidatorThreadFactory());
+      this.executorService.execute(new JBossConnectionValidator());
+   }
+   
+   /**
+    * Register pool for connection validation.
+    * @param mcp managed connection pool
+    * @param interval validation interval
+    */
    public static void registerPool(IdleConnectionRemovalSupport mcp, long interval)
    {
-      
+      instance.internalRegisterPool(mcp, interval);
    }
    
    /**
-    * Unregister pool for idle removal.
+    * Unregister pool instance for connection validation.
     * @param mcp pool instance
     */
    public static void unregisterPool(IdleConnectionRemovalSupport mcp)
    {
+      instance.internalUnregisterPool(mcp);
+   }
+   
+   private void internalRegisterPool(IdleConnectionRemovalSupport mcp, long interval)
+   {
+      try
+      {
+         this.lock.lock();
+         
+         this.registeredPools.addIfAbsent(mcp);
+         
+         if (interval > 1 && interval / 2 < this.interval) 
+         {
+            this.interval = interval / 2;
+            long maybeNext = System.currentTimeMillis() + this.interval;
+            if (next > maybeNext && maybeNext > 0) 
+            {
+               next = maybeNext;
+               if (logger.isDebugEnabled())
+               {
+                  logger.debug("internalRegisterPool: about to notify thread: old next: " +
+                        next + ", new next: " + maybeNext);  
+               }               
+               
+               this.condition.signal();
+               
+            }
+         }
+         
+      } 
+      finally
+      {
+         this.lock.unlock();
+      }
+   }
+   
+   private void internalUnregisterPool(IdleConnectionRemovalSupport mcp)
+   {
+      this.registeredPools.remove(mcp);
       
+      if (this.registeredPools.size() == 0) 
+      {
+         if (logger.isDebugEnabled())
+         {
+            logger.debug("internalUnregisterPool: setting interval to Long.MAX_VALUE");  
+         }
+         
+         interval = Long.MAX_VALUE;
+      }
    }
+   
+   /**
+    * Setup context class loader.
+    */
+   private void setupContextClassLoader()
+   {
+      // Could be null if loaded from system classloader
+      final ClassLoader cl = IdleRemover.class.getClassLoader();
+      if (cl == null)
+      {
+         return;  
+      }
+      
+      SecurityManager sm = System.getSecurityManager();
+      
+      if (sm == null)
+      {
+         Thread.currentThread().setContextClassLoader(cl);
+         
+         return;
+      }
+      
+      AccessController.doPrivileged(new PrivilegedAction<Object>()
+      {
+         public Object run()
+         {
+            Thread.currentThread().setContextClassLoader(cl);
+            
+            return null;
+         }
+      });
+   }
+   
+   /**
+    * Wait for background thread.
+    */
+   public static void waitForBackgroundThread()
+   {
+      try
+      {
+         instance.lock.lock();
+         
+      }
+      finally
+      {
+         instance.lock.unlock();  
+      }
+   }
+   
+   
+   /**
+    * Thread factory.
+    */
+   private static class ValidatorThreadFactory implements ThreadFactory
+   {
+      /**
+       * {@inheritDoc}
+       */
+      public Thread newThread(Runnable r)
+      {
+         Thread thread = new Thread(r, IdleRemover.VALIDATOR_THREAD_NAME);
+         thread.setDaemon(true);
+         
+         return thread;
+      }      
+   }
+   
+   /**
+    * JBossConnectionValidator.
+    *
+    */
+   private class JBossConnectionValidator implements Runnable
+   {
+      
+      /**
+       * {@inheritDoc}
+       */
+      public void run()
+      {
+         setupContextClassLoader();
+         
+         try
+         {
+            lock.lock();
+            
+            while (true)
+            {
+               boolean result = instance.condition.await(instance.interval, TimeUnit.MILLISECONDS);
+
+               if (logger.isTraceEnabled())
+               {
+                  logger.trace("Result of await ConnectionValidator: " + result);
+               }
+
+               if (logger.isDebugEnabled())
+               {
+                  logger.debug("run: ConnectionValidator notifying pools, interval: " + interval);  
+               }
+     
+               for (IdleConnectionRemovalSupport mcp : registeredPools)
+               {
+                  mcp.removeIdleConnections();
+               }
+
+               next = System.currentTimeMillis() + interval;
+               
+               if (next < 0)
+               {
+                  next = Long.MAX_VALUE;  
+               }              
+            }            
+         }
+         catch (InterruptedException e)
+         {
+            logger.info("run: ConnectionValidator has been interrupted, returning");
+            
+            return;  
+         }
+         catch (RuntimeException e)
+         {
+            logger.warn("run: ConnectionValidator ignored unexpected runtime exception", e);
+         }
+         catch (Exception e)
+         {
+            logger.warn("run: ConnectionValidator ignored unexpected error", e);
+         }         
+         finally
+         {
+            lock.unlock();  
+         }         
+      }      
+   }
 }

Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/ConnectionListenerFactory.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/ConnectionListenerFactory.java	2009-09-15 13:24:01 UTC (rev 93531)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/ConnectionListenerFactory.java	2009-09-15 13:41:06 UTC (rev 93532)
@@ -57,5 +57,5 @@
     * 
     * @return the transaction manager
     */
-   TransactionManager getTransactionManagerInstance();
+   TransactionManager getTransactionManager();
 }

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	2009-09-15 13:24:01 UTC (rev 93531)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListener.java	2009-09-15 13:41:06 UTC (rev 93532)
@@ -127,7 +127,7 @@
       // not a real issue.
       
       // No transaction associated with the thread
-      TransactionManager tm = getConnectionManager().getTransactionManagerInstance();
+      TransactionManager tm = getConnectionManager().getTransactionManager();
       int status = tm.getStatus();
       if (status == Status.STATUS_NO_TRANSACTION)
       {

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	2009-09-15 13:24:01 UTC (rev 93531)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/AbstractPool.java	2009-09-15 13:41:06 UTC (rev 93532)
@@ -161,7 +161,7 @@
       if (subPoolContext == null)
       {
          SubPoolContext newSubPoolContext = new SubPoolContext(getTransactionManager(), mcf, clf, subject, 
-                                                         cri, poolParams, log);
+                                                         cri, poolParams);
          subPoolContext = subPools.putIfAbsent(key, newSubPoolContext);
          if (subPoolContext == null)
          {
@@ -182,7 +182,7 @@
    {
       if (clf != null)
       {
-         return clf.getTransactionManagerInstance();  
+         return clf.getTransactionManager();  
       }
       else
       {

Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/SubPoolContext.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/SubPoolContext.java	2009-09-15 13:24:01 UTC (rev 93531)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/SubPoolContext.java	2009-09-15 13:41:06 UTC (rev 93532)
@@ -29,7 +29,6 @@
 import javax.security.auth.Subject;
 import javax.transaction.TransactionManager;
 
-import org.jboss.logging.Logger;
 import org.jboss.tm.TransactionLocal;
 
 /**
@@ -56,10 +55,9 @@
     * @param subject the subject
     * @param cri the connection request info
     * @param poolParams the pool parameters
-    * @param log the log
     */
    public SubPoolContext(TransactionManager tm, ManagedConnectionFactory mcf, ConnectionListenerFactory clf, 
-         Subject subject, ConnectionRequestInfo cri, PoolParams poolParams, Logger log)
+         Subject subject, ConnectionRequestInfo cri, PoolParams poolParams)
    {
       subPool = new InternalManagedConnectionPool(mcf, clf, subject, cri, poolParams);
       if (tm != null)

Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/transaction/TransactionSynchronizer.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/transaction/TransactionSynchronizer.java	2009-09-15 13:24:01 UTC (rev 93531)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/transaction/TransactionSynchronizer.java	2009-09-15 13:41:06 UTC (rev 93532)
@@ -22,6 +22,8 @@
 package org.jboss.jca.core.connectionmanager.transaction;
 
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.ReentrantLock;
 
 import javax.transaction.RollbackException;
 import javax.transaction.Synchronization;
@@ -60,13 +62,19 @@
    private Thread enlistingThread;
    
    /** Unenlisted */
-   private CopyOnWriteArrayList<Synchronization> unenlisted;
+   private CopyOnWriteArrayList<Synchronization> unenlisted = new CopyOnWriteArrayList<Synchronization>();
    
    /** Enlisted */
-   private CopyOnWriteArrayList<Synchronization> enlisted;
+   private CopyOnWriteArrayList<Synchronization> enlisted = new CopyOnWriteArrayList<Synchronization>();
    
    /** The cached connection manager synchronization */
    private Synchronization ccmSynch;
+   
+   /**Lock*/
+   private ReentrantLock lockObject = new ReentrantLock();
+   
+   /**Condition*/
+   private Condition condition = this.lockObject.newCondition();
 
    /** 
     * Initialization. 
@@ -106,16 +114,23 @@
    public CopyOnWriteArrayList<Synchronization> getUnenlisted()
    {
       Thread currentThread = Thread.currentThread();
+      
       while (enlistingThread != null && enlistingThread != currentThread)
       {
          boolean interrupted = false;
          try
          {
-            wait();
+            this.lockObject.lock();
+            
+            this.condition.await();
          }
          catch (InterruptedException e)
          {
             interrupted = true;
+         }         
+         finally
+         {
+            this.lockObject.unlock();
          }
          
          if (interrupted)
@@ -123,6 +138,7 @@
             currentThread.interrupt();  
          }
       }
+
       CopyOnWriteArrayList<Synchronization> result = unenlisted;
       
       unenlisted = null;
@@ -160,17 +176,28 @@
     */
    public void enlisted()
    {
-      Thread currentThread = Thread.currentThread();
-      if (enlistingThread == null || enlistingThread != currentThread)
+      try
       {
-         log.warn("Thread " + currentThread + " not the enlisting thread " + 
-               enlistingThread, new Exception("STACKTRACE"));
+         this.lockObject.lock();
          
-         return;
+         Thread currentThread = Thread.currentThread();
+         
+         if (enlistingThread == null || enlistingThread != currentThread)
+         {
+            log.warn("Thread " + currentThread + " not the enlisting thread " + 
+                  enlistingThread, new Exception("STACKTRACE"));
+            
+            return;
+         }
+         
+         enlistingThread = null;
+         
+         this.condition.signalAll();
       }
-      
-      enlistingThread = null;
-      notifyAll();
+      finally
+      {
+         this.lockObject.unlock();
+      }      
    }
    
    /**
@@ -331,5 +358,6 @@
       {
          log.warn("Transaction " + tx + " error in after completion " + synch, t);
       }
-   }
+   }   
+   
 }

Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/tx/TxConnectionManager.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/tx/TxConnectionManager.java	2009-09-15 13:24:01 UTC (rev 93531)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/tx/TxConnectionManager.java	2009-09-15 13:41:06 UTC (rev 93532)
@@ -125,7 +125,7 @@
 public class TxConnectionManager extends AbstractConnectionManager
 {
    /**Transaction manager instance*/
-   private TransactionManager tm;
+   private TransactionManager transactionManager;
 
    /**Interleaving or not*/
    private boolean interleaving;
@@ -159,18 +159,18 @@
     * Gets transaction manager instance.
     * @return transaction manager
     */
-   public TransactionManager getTransactionManagerInstance()
+   public TransactionManager getTransactionManager()
    {
-      return tm;
+      return this.transactionManager;
    }
 
    /**
     * Sets transaction manager.
     * @param tm transaction manager
     */
-   public void setTransactionManagerInstance(TransactionManager tm)
+   public void setTransactionManager(TransactionManager tm)
    {
-      this.tm = tm;
+      this.transactionManager = tm;
    }
 
    /**
@@ -316,10 +316,17 @@
     */
    public long getTimeLeftBeforeTransactionTimeout(boolean errorRollback) throws RollbackException
    {
-      if (tm == null)
-         throw new IllegalStateException("No transaction manager: " + getCachedConnectionManager());
-      if (tm instanceof TransactionTimeoutConfiguration)
-         return ((TransactionTimeoutConfiguration) tm).getTimeLeftBeforeTransactionTimeout(errorRollback);
+      if (this.transactionManager == null)
+      {
+         throw new IllegalStateException("No transaction manager: " + getCachedConnectionManager());  
+      }
+
+      if (this.transactionManager instanceof TransactionTimeoutConfiguration)
+      {
+         return ((TransactionTimeoutConfiguration) this.transactionManager).
+            getTimeLeftBeforeTransactionTimeout(errorRollback);  
+      }
+      
       return -1;
    }
 
@@ -329,16 +336,21 @@
    @Override
    public void checkTransactionActive() throws RollbackException, SystemException
    {
-      if (tm == null)
-         throw new IllegalStateException("No transaction manager: " + getCachedConnectionManager());
-      Transaction tx = tm.getTransaction();
+      if (this.transactionManager == null)
+      {
+         throw new IllegalStateException("No transaction manager: " + getCachedConnectionManager());  
+      }
+      
+      Transaction tx = this.transactionManager.getTransaction();
       if (tx != null)
       {
          int status = tx.getStatus();
          // Only allow states that will actually succeed
          if (status != Status.STATUS_ACTIVE && status != Status.STATUS_PREPARING && 
                status != Status.STATUS_PREPARED && status != Status.STATUS_COMMITTING)
-            throw new RollbackException("Transaction " + tx + " cannot proceed " + TxUtils.getStatusAsString(status));
+         {
+            throw new RollbackException("Transaction " + tx + " cannot proceed " + TxUtils.getStatusAsString(status));  
+         }
       }
    }
 
@@ -351,11 +363,16 @@
       Transaction trackByTransaction = null;
       try
       {
-         Transaction tx = tm.getTransaction();
+         Transaction tx = this.transactionManager.getTransaction();
          if (tx != null && !TxUtils.isActive(tx))
-            throw new ResourceException("Transaction is not active: tx=" + tx);
+         {
+            throw new ResourceException("Transaction is not active: tx=" + tx);  
+         }
+         
          if (!interleaving)
-            trackByTransaction = tx;
+         {
+            trackByTransaction = tx;  
+         }
       }
       catch (Throwable t)
       {
@@ -363,7 +380,10 @@
       }
 
       if (this.trace)
-         getLog().trace("getManagedConnection interleaving=" + interleaving + " tx=" + trackByTransaction);
+      {
+         getLog().trace("getManagedConnection interleaving=" + interleaving + " tx=" + trackByTransaction);  
+      }
+      
       return super.getManagedConnection(trackByTransaction, subject, cri);
    }
 
@@ -447,12 +467,14 @@
    {
       XAResource xaResource = null;
       
-      if (localTransactions)
+      if (this.localTransactions)
       {
          xaResource = new LocalXAResource(this);
     
          if (xaResourceTimeout != 0)
-            getLog().debug("XAResource transaction timeout cannot be set for local transactions: " + getJndiName());
+         {
+            getLog().debug("XAResource transaction timeout cannot be set for local transactions: " + getJndiName());  
+         }
       }
       
       else
@@ -508,7 +530,7 @@
     */
    public boolean isTransactional()
    {
-      return !TxUtils.isCompleted(tm);
+      return !TxUtils.isCompleted(this.transactionManager);
    }
    
    /**




More information about the jboss-cvs-commits mailing list