Refactor common code

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/jcs/trunk@1775170 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/AbstractDoubleLinkedListMemoryCache.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/AbstractDoubleLinkedListMemoryCache.java
index 2a70420..b1faf25 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/AbstractDoubleLinkedListMemoryCache.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/AbstractDoubleLinkedListMemoryCache.java
@@ -20,14 +20,13 @@
  */
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.commons.jcs.engine.CacheConstants;
 import org.apache.commons.jcs.engine.behavior.ICacheElement;
@@ -36,7 +35,6 @@
 import org.apache.commons.jcs.engine.memory.util.DefaultMemoryElementDescriptor;
 import org.apache.commons.jcs.engine.memory.util.MemoryElementDescriptor;
 import org.apache.commons.jcs.engine.stats.StatElement;
-import org.apache.commons.jcs.engine.stats.Stats;
 import org.apache.commons.jcs.engine.stats.behavior.IStatElement;
 import org.apache.commons.jcs.engine.stats.behavior.IStats;
 import org.apache.commons.jcs.utils.struct.DoubleLinkedList;
@@ -59,15 +57,6 @@
     /** thread-safe double linked list for lru */
     protected DoubleLinkedList<MemoryElementDescriptor<K, V>> list; // TODO privatise
 
-    /** number of hits */
-    private AtomicLong hitCnt;
-
-    /** number of misses */
-    private AtomicLong missCnt;
-
-    /** number of puts */
-    private AtomicLong putCnt;
-
     /**
      * For post reflection creation initialization.
      * <p>
@@ -77,35 +66,9 @@
     @Override
     public void initialize(CompositeCache<K, V> hub)
     {
-        lock.lock();
-        try
-        {
-            super.initialize(hub);
-            hitCnt = new AtomicLong(0);
-            missCnt = new AtomicLong(0);
-            putCnt = new AtomicLong(0);
-            list = new DoubleLinkedList<MemoryElementDescriptor<K, V>>();
-            log.info("initialized MemoryCache for " + getCacheName());
-        }
-        finally
-        {
-            lock.unlock();
-        }
-    }
-
-    /**
-     * Reset statistics
-     *
-     * @see org.apache.commons.jcs.engine.memory.AbstractMemoryCache#dispose()
-     */
-    @Override
-    public void dispose() throws IOException
-    {
-        super.dispose();
-        removeAll();
-        hitCnt.set(0);
-        missCnt.set(0);
-        putCnt.set(0);
+        super.initialize(hub);
+        list = new DoubleLinkedList<MemoryElementDescriptor<K, V>>();
+        log.info("initialized MemoryCache for " + getCacheName());
     }
 
     /**
@@ -689,26 +652,12 @@
     @Override
     public IStats getStatistics()
     {
-        IStats stats = new Stats();
+        IStats stats = super.getStatistics();
         stats.setTypeName( /* add algorithm name */"Memory Cache");
 
-        ArrayList<IStatElement<?>> elems = new ArrayList<IStatElement<?>>();
+        List<IStatElement<?>> elems = stats.getStatElements();
 
-        lock.lock(); // not sure that's really relevant here but not that important
-        try
-        {
-            elems.add(new StatElement<Integer>("List Size", Integer.valueOf(list.size())));
-            elems.add(new StatElement<Integer>("Map Size", Integer.valueOf(map.size())));
-            elems.add(new StatElement<AtomicLong>("Put Count", putCnt));
-            elems.add(new StatElement<AtomicLong>("Hit Count", hitCnt));
-            elems.add(new StatElement<AtomicLong>("Miss Count", missCnt));
-        }
-        finally
-        {
-            lock.unlock();
-        }
-
-        stats.setStatElements(elems);
+        elems.add(new StatElement<Integer>("List Size", Integer.valueOf(list.size())));
 
         return stats;
     }
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/AbstractMemoryCache.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/AbstractMemoryCache.java
index c969b43..87929fa 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/AbstractMemoryCache.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/AbstractMemoryCache.java
@@ -20,9 +20,11 @@
  */
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
@@ -32,7 +34,9 @@
 import org.apache.commons.jcs.engine.control.CompositeCache;
 import org.apache.commons.jcs.engine.memory.behavior.IMemoryCache;
 import org.apache.commons.jcs.engine.memory.util.MemoryElementDescriptor;
+import org.apache.commons.jcs.engine.stats.StatElement;
 import org.apache.commons.jcs.engine.stats.Stats;
+import org.apache.commons.jcs.engine.stats.behavior.IStatElement;
 import org.apache.commons.jcs.engine.stats.behavior.IStats;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -66,6 +70,15 @@
     /** Map where items are stored by key.  This is created by the concrete child class. */
     protected Map<K, MemoryElementDescriptor<K, V>> map;// TODO privatise
 
+    /** number of hits */
+    protected AtomicLong hitCnt;
+
+    /** number of misses */
+    protected AtomicLong missCnt;
+
+    /** number of puts */
+    protected AtomicLong putCnt;
+
     /**
      * For post reflection creation initialization
      * <p>
@@ -74,20 +87,17 @@
     @Override
     public void initialize( CompositeCache<K, V> hub )
     {
-        lock.lock();
-        try
-        {
-            this.cacheAttributes = hub.getCacheAttributes();
-            this.cache = hub;
-            map = createMap();
+        hitCnt = new AtomicLong(0);
+        missCnt = new AtomicLong(0);
+        putCnt = new AtomicLong(0);
 
-            chunkSize = cacheAttributes.getSpoolChunkSize();
-            status = CacheStatus.ALIVE;
-        }
-        finally
-        {
-            lock.unlock();
-        }
+        this.cacheAttributes = hub.getCacheAttributes();
+        this.chunkSize = cacheAttributes.getSpoolChunkSize();
+        this.cache = hub;
+
+        this.map = createMap();
+
+        this.status = CacheStatus.ALIVE;
     }
 
     /**
@@ -213,7 +223,7 @@
     }
 
     /**
-     * Prepares for shutdown.
+     * Prepares for shutdown. Reset statistics
      * <p>
      * @throws IOException
      */
@@ -221,6 +231,10 @@
     public void dispose()
         throws IOException
     {
+        removeAll();
+        hitCnt.set(0);
+        missCnt.set(0);
+        putCnt.set(0);
         log.info( "Memory Cache dispose called." );
     }
 
@@ -232,6 +246,15 @@
     {
         IStats stats = new Stats();
         stats.setTypeName( "Abstract Memory Cache" );
+
+        ArrayList<IStatElement<?>> elems = new ArrayList<IStatElement<?>>();
+        stats.setStatElements(elems);
+
+        elems.add(new StatElement<AtomicLong>("Put Count", putCnt));
+        elems.add(new StatElement<AtomicLong>("Hit Count", hitCnt));
+        elems.add(new StatElement<AtomicLong>("Miss Count", missCnt));
+        elems.add(new StatElement<Integer>( "Map Size", Integer.valueOf(getSize()) ) );
+
         return stats;
     }
 
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/lru/LHMLRUMemoryCache.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/lru/LHMLRUMemoryCache.java
index 91a28f2..acb3cee 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/lru/LHMLRUMemoryCache.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/lru/LHMLRUMemoryCache.java
@@ -20,13 +20,11 @@
  */
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.commons.jcs.engine.CacheConstants;
 import org.apache.commons.jcs.engine.behavior.ICacheElement;
@@ -35,9 +33,6 @@
 import org.apache.commons.jcs.engine.memory.AbstractMemoryCache;
 import org.apache.commons.jcs.engine.memory.util.DefaultMemoryElementDescriptor;
 import org.apache.commons.jcs.engine.memory.util.MemoryElementDescriptor;
-import org.apache.commons.jcs.engine.stats.StatElement;
-import org.apache.commons.jcs.engine.stats.Stats;
-import org.apache.commons.jcs.engine.stats.behavior.IStatElement;
 import org.apache.commons.jcs.engine.stats.behavior.IStats;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -51,15 +46,6 @@
     /** The Logger. */
     private static final Log log = LogFactory.getLog( LRUMemoryCache.class );
 
-    /** number of hits */
-    private AtomicLong hitCnt;
-
-    /** number of misses */
-    private AtomicLong missCnt;
-
-    /** number of puts */
-    private AtomicLong putCnt;
-
     /**
      * For post reflection creation initialization
      * <p>
@@ -69,9 +55,6 @@
     public void initialize( CompositeCache<K, V> hub )
     {
         super.initialize( hub );
-        hitCnt = new AtomicLong(0);
-        missCnt = new AtomicLong(0);
-        putCnt = new AtomicLong(0);
         log.info( "initialized LHMLRUMemoryCache for " + getCacheName() );
     }
 
@@ -230,18 +213,9 @@
     @Override
     public IStats getStatistics()
     {
-        IStats stats = new Stats();
+        IStats stats = super.getStatistics();
         stats.setTypeName( "LHMLRU Memory Cache" );
 
-        ArrayList<IStatElement<?>> elems = new ArrayList<IStatElement<?>>();
-
-        elems.add(new StatElement<Integer>( "Map Size", Integer.valueOf(map.size()) ) );
-        elems.add(new StatElement<AtomicLong>("Put Count", putCnt));
-        elems.add(new StatElement<AtomicLong>("Hit Count", hitCnt));
-        elems.add(new StatElement<AtomicLong>("Miss Count", missCnt));
-
-        stats.setStatElements( elems );
-
         return stats;
     }
 
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/soft/SoftReferenceMemoryCache.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/soft/SoftReferenceMemoryCache.java
index c2e44d7..5108c66 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/soft/SoftReferenceMemoryCache.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/soft/SoftReferenceMemoryCache.java
@@ -21,15 +21,14 @@
 
 import java.io.IOException;
 import java.lang.ref.SoftReference;
-import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.commons.jcs.engine.CacheConstants;
 import org.apache.commons.jcs.engine.behavior.ICacheElement;
@@ -40,7 +39,6 @@
 import org.apache.commons.jcs.engine.memory.util.MemoryElementDescriptor;
 import org.apache.commons.jcs.engine.memory.util.SoftReferenceElementDescriptor;
 import org.apache.commons.jcs.engine.stats.StatElement;
-import org.apache.commons.jcs.engine.stats.Stats;
 import org.apache.commons.jcs.engine.stats.behavior.IStatElement;
 import org.apache.commons.jcs.engine.stats.behavior.IStats;
 import org.apache.commons.logging.Log;
@@ -70,15 +68,6 @@
      */
     private LinkedBlockingQueue<ICacheElement<K, V>> strongReferences;
 
-    /** number of hits */
-    private AtomicLong hitCnt;
-
-    /** number of misses */
-    private AtomicLong missCnt;
-
-    /** number of puts */
-    private AtomicLong putCnt;
-
     /**
      * For post reflection creation initialization
      * <p>
@@ -89,9 +78,6 @@
     {
         super.initialize( hub );
         strongReferences = new LinkedBlockingQueue<ICacheElement<K, V>>();
-        hitCnt = new AtomicLong(0);
-        missCnt = new AtomicLong(0);
-        putCnt = new AtomicLong(0);
         log.info( "initialized Soft Reference Memory Cache for " + getCacheName() );
     }
 
@@ -149,21 +135,13 @@
     @Override
     public IStats getStatistics()
     {
-        ArrayList<IStatElement<?>> elems = new ArrayList<IStatElement<?>>();
+        IStats stats = super.getStatistics();
+        stats.setTypeName("Soft Reference Memory Cache");
 
-        int size = getSize();
-        int emptyrefs = map.size() - size;
-
-        elems.add(new StatElement<Integer>("Size", Integer.valueOf(size)));
+        List<IStatElement<?>> elems = stats.getStatElements();
+        int emptyrefs = map.size() - getSize();
         elems.add(new StatElement<Integer>("Empty References", Integer.valueOf(emptyrefs)));
         elems.add(new StatElement<Integer>("Strong References", Integer.valueOf(strongReferences.size())));
-        elems.add(new StatElement<AtomicLong>("Put Count", putCnt));
-        elems.add(new StatElement<AtomicLong>("Hit Count", hitCnt));
-        elems.add(new StatElement<AtomicLong>("Miss Count", missCnt));
-
-        IStats stats = new Stats();
-        stats.setTypeName("Soft Reference Memory Cache");
-        stats.setStatElements(elems);
 
         return stats;
     }
@@ -358,21 +336,6 @@
     }
 
     /**
-     * Prepares for shutdown.
-     * <p>
-     * @throws IOException
-     */
-    @Override
-    public void dispose() throws IOException
-    {
-        super.dispose();
-        removeAll();
-        hitCnt.set(0);
-        missCnt.set(0);
-        putCnt.set(0);
-    }
-
-    /**
      * This can't be implemented.
      * <p>
      * @param numberToFree