GERONIMO-3250 Adding counters to keep track of transaction activity, Patch by Viet H. Nguyen

git-svn-id: https://svn.apache.org/repos/asf/geronimo/components/txmanager/trunk@584554 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/TransactionManagerImpl.java b/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/TransactionManagerImpl.java
index f8b739e..91cd872 100644
--- a/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/TransactionManagerImpl.java
+++ b/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/TransactionManagerImpl.java
@@ -29,6 +29,7 @@
 
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicLong;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.geronimo.transaction.log.UnrecoverableLog;
@@ -53,6 +54,10 @@
     final Recovery recovery;
     private final CopyOnWriteArrayList transactionAssociationListeners = new CopyOnWriteArrayList();
     private List recoveryErrors = new ArrayList();
+    // statistics
+    private AtomicLong totalCommits = new AtomicLong(0);
+    private AtomicLong totalRollBacks = new AtomicLong(0);
+    private AtomicLong activeCount = new AtomicLong(0);
 
     public TransactionManagerImpl() throws XAException {
         this(DEFAULT_TIMEOUT,
@@ -79,7 +84,6 @@
         if (defaultTransactionTimeoutSeconds <= 0) {
             throw new IllegalArgumentException("defaultTransactionTimeoutSeconds must be positive: attempted value: " + defaultTransactionTimeoutSeconds);
         }
-
         this.defaultTransactionTimeoutMilliseconds = defaultTransactionTimeoutSeconds * 1000;
 
         if (transactionLog == null) {
@@ -111,6 +115,7 @@
         }
         threadTx.set(tx);
         fireThreadAssociated(tx);
+        activeCount.getAndIncrement();
     }
 
     private void unassociate() {
@@ -119,6 +124,7 @@
             associatedTransactions.remove(tx);
             threadTx.set(null);
             fireThreadUnassociated(tx);
+            activeCount.getAndDecrement();
         }
     }
 
@@ -240,6 +246,7 @@
         } finally {
             unassociate();
         }
+        totalCommits.getAndIncrement();
     }
 
     public void rollback() throws IllegalStateException, SecurityException, SystemException {
@@ -252,6 +259,7 @@
         } finally {
             unassociate();
         }
+        totalRollBacks.getAndIncrement();
     }
 
     //XidImporter implementation
@@ -285,6 +293,7 @@
                 throw (XAException) new XAException().initCause(e);
             }
         }
+        totalCommits.getAndIncrement();
     }
 
     public void forget(Transaction tx) throws XAException {
@@ -309,6 +318,7 @@
         } catch (SystemException e) {
             throw (XAException) new XAException().initCause(e);
         }
+        totalRollBacks.getAndIncrement();
     }
 
     long getTransactionTimeoutMilliseconds(long transactionTimeoutMilliseconds) {
@@ -369,4 +379,33 @@
             }
         }
     }
+
+    /**
+     * Returns the number of active transactions.
+     */
+    public long getActiveCount() {
+        return activeCount.longValue();
+    }
+
+    /**
+     * Return the number of total commits
+     */
+    public long getTotalCommits() {
+        return totalCommits.longValue();
+    }
+
+    /**
+     * Returns the number of total rollbacks
+     */
+    public long getTotalRollbacks() {
+        return totalRollBacks.longValue();
+    }
+
+    /**
+     * Reset statistics
+     */
+    public void resetStatistics() {
+        totalCommits.getAndSet(0);
+        totalRollBacks.getAndSet(0);
+    }
 }