Clover coverage report -
Coverage timestamp: Thu Jul 5 2007 20:02:32 EDT
file stats: LOC: 85   Methods: 4
NCLOC: 39   Classes: 1
 
 Source file Conditionals Statements Methods TOTAL
LFUAlgorithm.java 83.3% 92.3% 100% 91.3%
coverage coverage
 1    /*
 2    * JBoss, the OpenSource J2EE webOS
 3    *
 4    * Distributable under LGPL license.
 5    * See terms of license at gnu.org.
 6    */
 7    package org.jboss.cache.eviction;
 8   
 9    import org.apache.commons.logging.Log;
 10    import org.apache.commons.logging.LogFactory;
 11    import org.jboss.cache.Region;
 12   
 13    /**
 14    * Least Frequently Used algorithm for cache eviction.
 15    * Note that this algorithm is not thread-safe.
 16    * <p/>
 17    * This algorithm relies on maxNodes and minNodes to operate correctly.
 18    * Eviction takes place using Least Frequently Used algorithm. A node A
 19    * that is used less than a node B is evicted sooner.
 20    * <p/>
 21    * The minNodes property defines a threshold for eviction. If minNodes = 100,
 22    * the LFUAlgorithm will not evict the cache to anything less than 100 elements
 23    * still left in cache. The maxNodes property defines the maximum number of nodes
 24    * the cache will accept before eviction. maxNodes = 0 means that this region is
 25    * unbounded. minNodes = 0 means that the eviction queue will attempt to bring
 26    * the cache of this region to 0 elements (evict all elements) whenever it is run.
 27    * <p/>
 28    * This algorithm uses a sorted eviction queue. The eviction queue is sorted in
 29    * ascending order based on the number of times a node is visited. The more frequently
 30    * a node is visited, the less likely it will be evicted.
 31    *
 32    * @author Daniel Huang - dhuang@jboss.org 10/2005
 33    * @version $Revision: 1.7 $
 34    */
 35    public class LFUAlgorithm extends BaseSortedEvictionAlgorithm implements EvictionAlgorithm
 36    {
 37    private static final Log log = LogFactory.getLog(LFUAlgorithm.class);
 38   
 39   
 40  41 public LFUAlgorithm()
 41    {
 42  41 super();
 43    }
 44   
 45  15528 protected boolean shouldEvictNode(NodeEntry ne)
 46    {
 47  15528 if (log.isTraceEnabled())
 48    {
 49  0 log.trace("Deciding whether node in queue " + ne.getFqn() + " requires eviction.");
 50    }
 51   
 52  15528 LFUConfiguration config = (LFUConfiguration) region.getEvictionPolicyConfig();
 53  15528 int size = this.getEvictionQueue().getNumberOfNodes();
 54  15528 if (config.getMaxNodes() != 0 && size > config.getMaxNodes())
 55    {
 56  3002 return true;
 57    }
 58  12526 else if (size > config.getMinNodes())
 59    {
 60  12505 return true;
 61    }
 62   
 63  21 return false;
 64    }
 65   
 66    /**
 67    * Will create a LFUQueue to be used as the underlying eviction queue.
 68    *
 69    * @param region MarshRegion to create the eviction queue for.
 70    * @return The created LFUQueue.
 71    * @throws EvictionException
 72    */
 73  18 protected EvictionQueue setupEvictionQueue(Region region) throws EvictionException
 74    {
 75  18 return new LFUQueue();
 76    }
 77   
 78  42 protected void prune() throws EvictionException
 79    {
 80  42 super.prune();
 81   
 82    // clean up the Queue's eviction removals
 83  42 ((LFUQueue) this.evictionQueue).prune();
 84    }
 85    }