User: user57  
  Date: 02/02/16 03:41:17

  Modified:    src/main/org/jboss/util LRUCachePolicy.java
  Log:
   o reformat
  
  Revision  Changes    Path
  1.14      +423 -422  jboss/src/main/org/jboss/util/LRUCachePolicy.java
  
  Index: LRUCachePolicy.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/util/LRUCachePolicy.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- LRUCachePolicy.java       31 Jan 2002 00:05:02 -0000      1.13
  +++ LRUCachePolicy.java       16 Feb 2002 11:41:17 -0000      1.14
  @@ -4,6 +4,7 @@
    * Distributable under LGPL license.
    * See terms of license at gnu.org.
    */
  +
   package org.jboss.util;
   
   import java.util.HashMap;
  @@ -12,430 +13,430 @@
    * Implementation of a Least Recently Used cache policy.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Simone Bordet</a>
  - * @version $Revision: 1.13 $
  + * @version $Revision: 1.14 $
    */
   public class LRUCachePolicy
  -     implements CachePolicy
  +   implements CachePolicy
   {
  -     // Constants -----------------------------------------------------
  +   // Constants -----------------------------------------------------
   
  -     // Attributes ----------------------------------------------------
  -     /**
  -      * The map holding the cached objects
  -      */
  -     protected HashMap m_map;
  -     /**
  -      * The linked list used to implement the LRU algorithm
  -      */
  -     protected LRUList m_list;
  -     /**
  -      * The maximum capacity of this cache
  -      */
  -     protected int m_maxCapacity;
  -     /**
  -      * The minimum capacity of this cache
  -      */
  -     protected int m_minCapacity;
  -
  -     // Static --------------------------------------------------------
  -
  -     // Constructors --------------------------------------------------
  -     /**
  -      * Creates a LRU cache policy object with zero cache capacity.
  -      * @see #init
  -      */
  -     public LRUCachePolicy()
  -     {
  -     }
  -     /**
  -      * Creates a LRU cache policy object with the specified minimum
  -      * and maximum capacity.
  -      * @see #init
  -      */
  -     public LRUCachePolicy(int min, int max)
  -     {
  -             if (min < 2 || min > max) {throw new IllegalArgumentException("Illegal 
cache capacities");}
  -             m_minCapacity = min;
  -             m_maxCapacity = max;
  -     }
  -
  -     // Public --------------------------------------------------------
  -
  -     // Service implementation ----------------------------------------------
  -     /**
  -      * Initializes the cache, creating all required objects and initializing their
  -      * values.
  -      * @see #start
  -      * @see #destroy
  -      */
  -     public void create()
  -     {
  -             m_map = new HashMap();
  -             m_list = createList();
  -             m_list.m_maxCapacity = m_maxCapacity;
  -             m_list.m_minCapacity = m_minCapacity;
  -             m_list.m_capacity = m_maxCapacity;
  -     }
  -     /**
  -      * Starts this cache that is now ready to be used.
  -      * @see #init
  -      * @see #stop
  -      */
  -     public void start()
  -     {
  -     }
  -     /**
  -      * Stops this cache thus {@link #flush}ing all cached objects. <br>
  -      * After this method is called, a call to {@link #start} will restart the 
cache.
  -      * @see #start
  -      * @see #destroy
  -      */
  -     public void stop()
  -     {
  -             if (m_list != null)
  -             {
  -                     flush();
  -             }
  -     }
  -     /**
  -      * Destroys the cache that is now unusable. <br>
  -      * To have it working again it must be re-{@link #init}ialized and
  -      * re-{@link #start}ed.
  -      * @see #init
  -      */
  -     public void destroy()
  -     {
  -     }
  -
  -     public Object get(Object key)
  -     {
  -             if (key == null)
  -             {
  -                     throw new IllegalArgumentException("Requesting an object using 
a null key");
  -             }
  -
  -             LRUCacheEntry value = (LRUCacheEntry)m_map.get(key);
  -             if (value != null)
  -             {
  -                     m_list.promote(value);
  -                     return value.m_object;
  -             }
  -             else
  -             {
  -                     cacheMiss();
  -                     return null;
  -             }
  -     }
  -     public Object peek(Object key)
  -     {
  -             if (key == null)
  -             {
  -                     throw new IllegalArgumentException("Requesting an object using 
a null key");
  -             }
  -
  -             LRUCacheEntry value = (LRUCacheEntry)m_map.get(key);
  -             if (value == null)
  -             {
  -                     return null;
  -             }
  -             else
  -             {
  -                     return value.m_object;
  -             }
  -     }
  -     public void insert(Object key, Object o)
  -     {
  -             if (o == null) {throw new IllegalArgumentException("Cannot insert a 
null object in the cache");}
  -             if (key == null) {throw new IllegalArgumentException("Cannot insert an 
object in the cache with null key");}
  -             Object obj = m_map.get(key);
  -             if (obj == null)
  -             {
  -                     m_list.demote();
  -                     LRUCacheEntry entry = createCacheEntry(key, o);
  -                     m_list.promote(entry);
  -                     m_map.put(key, entry);
  -             }
  -             else
  -             {
  -                     throw new IllegalStateException("Attempt to put in the cache 
an object that is already there");
  -             }
  -     }
  -     public void remove(Object key)
  -     {
  -             if (key == null) {throw new IllegalArgumentException("Removing an 
object using a null key");}
  -
  -             Object value = m_map.get(key);
  -             if (value != null)
  -             {
  -                     m_list.remove((LRUCacheEntry)value);
  -             }
  -             else {} // Do nothing, the object isn't in the cache list
  -             m_map.remove(key);
  -     }
  -     public void flush()
  -     {
  -             LRUCacheEntry entry = null;
  -             while ((entry = m_list.m_tail) != null)
  -             {
  -                     ageOut(entry);
  -             }
  -     }
  -
  -    public int size() {
  -     return m_list.m_count;
  -    }
  -
  -     // Y overrides ---------------------------------------------------
  -
  -     // Package protected ---------------------------------------------
  -
  -     // Protected -----------------------------------------------------
  -     /**
  -      * Factory method for the linked list used by this cache implementation.
  -      */
  -     protected LRUList createList() {return new LRUList();}
  -     /**
  -      * Callback method called when the cache algorithm ages out of the cache
  -      * the given entry. <br>
  -      * The implementation here is removing the given entry from the cache.
  -      */
  -     protected void ageOut(LRUCacheEntry entry)
  -     {
  -             remove(entry.m_key);
  -     }
  -     /**
  -      * Callback method called when a cache miss happens.
  -      */
  -     protected void cacheMiss()
  -     {
  -     }
  -     /**
  -      * Factory method for cache entries
  -      */
  -     protected LRUCacheEntry createCacheEntry(Object key, Object value)
  -     {
  -             return new LRUCacheEntry(key, value);
  -     }
  -
  -     // Private -------------------------------------------------------
  -
  -     // Inner classes -------------------------------------------------
  -     /**
  -      * Double queued list used to store cache entries.
  -      */
  -     public class LRUList
  -     {
  -             /** The maximum capacity of the cache list */
  -             public int m_maxCapacity;
  -             /** The minimum capacity of the cache list */
  -             public int m_minCapacity;
  -             /** The current capacity of the cache list */
  -             public int m_capacity;
  -             /** The number of cached objects */
  -             public int m_count;
  -             /** The head of the double linked list */
  -             public LRUCacheEntry m_head;
  -             /** The tail of the double linked list */
  -             public LRUCacheEntry m_tail;
  -             /** The cache misses happened */
  -             public int m_cacheMiss;
  -             /**
  -              * Creates a new double queued list.
  -              */
  -             protected LRUList()
  -             {
  -                     m_head = null;
  -                     m_tail = null;
  -                     m_count = 0;
  -             }
  -             /**
  -              * Promotes the cache entry <code>entry</code> to the last used 
position
  -              * of the list. <br>
  -              * If the object is already there, does nothing.
  -              * @param entry the object to be promoted, cannot be null
  -              * @see #demote
  -              * @throws IllegalStateException if this method is called with a full 
cache
  -              */
  -             protected void promote(LRUCacheEntry entry)
  -             {
  -                     if (entry == null) {throw new IllegalArgumentException("Trying 
to promote a null object");}
  -                     if (m_capacity < 1) {throw new IllegalStateException("Can't 
work with capacity < 1");}
  -
  -                     entry.m_time = System.currentTimeMillis();
  -                     if (entry.m_prev == null)
  -                     {
  -                             if (entry.m_next == null)
  -                             {
  -                                     // entry is new or there is only the head
  -                                     if (m_count == 0) // cache is empty
  -                                     {
  -                                             m_head = entry;
  -                                             m_tail = entry;
  -                                             ++m_count;
  -                                             entryAdded(entry);
  -                                     }
  -                                     else if (m_count == 1 && m_head == entry) {} 
// there is only the head and I want to promote it, do nothing
  -                                     else if (m_count < m_capacity)
  -                                     {
  -                                             entry.m_prev = null;
  -                                             entry.m_next = m_head;
  -                                             m_head.m_prev = entry;
  -                                             m_head = entry;
  -                                             ++m_count;
  -                                             entryAdded(entry);
  -                                     }
  -                                     else if (m_count < m_maxCapacity)
  -                                     {
  -                                             entry.m_prev = null;
  -                                             entry.m_next = m_head;
  -                                             m_head.m_prev = entry;
  -                                             m_head = entry;
  -                                             ++m_count;
  -                                             int oldCapacity = m_capacity;
  -                                             ++m_capacity;
  -                                             entryAdded(entry);
  -                                             capacityChanged(oldCapacity);
  -                                     }
  -                                     else {throw new IllegalStateException("Attempt 
to put a new cache entry on a full cache");}
  -                             }
  -                             else {} // entry is the head, do nothing
  -                     }
  -                     else
  -                     {
  -                             if (entry.m_next == null) // entry is the tail
  -                             {
  -                                     LRUCacheEntry beforeLast = entry.m_prev;
  -                                     beforeLast.m_next = null;
  -                                     entry.m_prev = null;
  -                                     entry.m_next = m_head;
  -                                     m_head.m_prev = entry;
  -                                     m_head = entry;
  -                                     m_tail = beforeLast;
  -                             }
  -                             else // entry is in the middle of the list
  -                             {
  -                                     LRUCacheEntry previous = entry.m_prev;
  -                                     previous.m_next = entry.m_next;
  -                                     entry.m_next.m_prev = previous;
  -                                     entry.m_prev = null;
  -                                     entry.m_next = m_head;
  -                                     m_head.m_prev = entry;
  -                                     m_head = entry;
  -                             }
  -                     }
  -             }
  -             /**
  -              * Demotes from the cache the least used entry. <br>
  -              * If the cache is not full, does nothing.
  -              * @see #promote
  -              */
  -             protected void demote()
  -             {
  -                     if (m_capacity < 1) {throw new IllegalStateException("Can't 
work with capacity < 1");}
  -                     if (m_count > m_maxCapacity) {throw new 
IllegalStateException("Cache list entries number (" + m_count + ") > than the maximum 
allowed (" + m_maxCapacity + ")");}
  -                     if (m_count == m_maxCapacity)
  -                     {
  -                             LRUCacheEntry entry = m_tail;
  -
  -                             // the entry will be removed by ageOut
  -                             ageOut(entry);
  -                     }
  -                     else {} // cache is not full, do nothing
  -             }
  -             /**
  -              * Removes from the cache list the specified entry.
  -              */
  -             protected void remove(LRUCacheEntry entry)
  -             {
  -                     if (entry == null) {throw new IllegalArgumentException("Cannot 
remove a null entry from the cache");}
  -                     if (m_count < 1) {throw new IllegalStateException("Trying to 
remove an entry from an empty cache");}
  -
  -                     entry.m_key = entry.m_object = null;
  -                     if (m_count == 1)
  -                     {
  -                             m_head = m_tail = null;
  -                     }
  -                     else
  -                     {
  -                             if (entry.m_prev == null) // the head
  -                             {
  -                                     m_head = entry.m_next;
  -                                     m_head.m_prev = null;
  -                                     entry.m_next = null;
  -                             }
  -                             else if (entry.m_next == null) // the tail
  -                             {
  -                                     m_tail = entry.m_prev;
  -                                     m_tail.m_next = null;
  -                                     entry.m_prev = null;
  -                             }
  -                             else // in the middle
  -                             {
  -                                     entry.m_next.m_prev = entry.m_prev;
  -                                     entry.m_prev.m_next = entry.m_next;
  -                                     entry.m_prev = null;
  -                                     entry.m_next = null;
  -                             }
  -                     }
  -                     --m_count;
  -                     entryRemoved(entry);
  -             }
  -             /**
  -              * Callback that signals that the given entry has been added to the 
cache.
  -              */
  -             protected void entryAdded(LRUCacheEntry entry) {}
  -             /**
  -              * Callback that signals that the given entry has been removed from 
the cache.
  -              */
  -             protected void entryRemoved(LRUCacheEntry entry) {}
  -             /**
  -              * Callback that signals that the capacity of the cache is changed.
  -              * @param oldCapacity the capacity before the change happened
  -              */
  -             protected void capacityChanged(int oldCapacity) {}
  -
  -             public String toString()
  -             {
  -                     String s = Integer.toHexString(super.hashCode());
  -                     s += " size: " + m_count;
  -                     for (LRUCacheEntry entry = m_head; entry != null; entry = 
entry.m_next)
  -                     {
  -                             s += "\n" + entry;
  -                     }
  -                     return s;
  -             }
  -     }
  -
  -     /**
  -      * Double linked cell used as entry in the cache list.
  -      */
  -     public class LRUCacheEntry
  -     {
  -             /** Reference to the next cell in the list */
  -             public  LRUCacheEntry m_next;
  -             /** Reference to the previous cell in the list */
  -             public LRUCacheEntry m_prev;
  -             /** The key used to retrieve the cached object */
  -             public Object m_key;
  -             /** The cached object */
  -             public Object m_object;
  -             /** The timestamp of the creation */
  -             public long m_time;
  -             /**
  -              * Creates a new double linked cell, storing the object we
  -              * want to cache and the key that is used to retrieve it.
  -              */
  -             protected LRUCacheEntry(Object key, Object object)
  -             {
  -                     m_key = key;
  -                     m_object = object;
  -                     m_next = null;
  -                     m_prev = null;
  -                     m_time = 0; // Set when inserted in the list.
  -             }
  -             public String toString()
  -             {
  -                     return "key: " + m_key + ", object: " + 
Integer.toHexString(m_object.hashCode()) + ", entry: " + 
Integer.toHexString(super.hashCode());
  -             }
  -     }
  +   // Attributes ----------------------------------------------------
  +   /**
  +    * The map holding the cached objects
  +    */
  +   protected HashMap m_map;
  +   /**
  +    * The linked list used to implement the LRU algorithm
  +    */
  +   protected LRUList m_list;
  +   /**
  +    * The maximum capacity of this cache
  +    */
  +   protected int m_maxCapacity;
  +   /**
  +    * The minimum capacity of this cache
  +    */
  +   protected int m_minCapacity;
  +
  +   // Static --------------------------------------------------------
  +
  +   // Constructors --------------------------------------------------
  +   /**
  +    * Creates a LRU cache policy object with zero cache capacity.
  +    * @see #init
  +    */
  +   public LRUCachePolicy()
  +   {
  +   }
  +   /**
  +    * Creates a LRU cache policy object with the specified minimum
  +    * and maximum capacity.
  +    * @see #init
  +    */
  +   public LRUCachePolicy(int min, int max)
  +   {
  +      if (min < 2 || min > max) {throw new IllegalArgumentException("Illegal cache 
capacities");}
  +      m_minCapacity = min;
  +      m_maxCapacity = max;
  +   }
  +
  +   // Public --------------------------------------------------------
  +
  +   // Service implementation ----------------------------------------------
  +   /**
  +    * Initializes the cache, creating all required objects and initializing their
  +    * values.
  +    * @see #start
  +    * @see #destroy
  +    */
  +   public void create()
  +   {
  +      m_map = new HashMap();
  +      m_list = createList();
  +      m_list.m_maxCapacity = m_maxCapacity;
  +      m_list.m_minCapacity = m_minCapacity;
  +      m_list.m_capacity = m_maxCapacity;
  +   }
  +   /**
  +    * Starts this cache that is now ready to be used.
  +    * @see #init
  +    * @see #stop
  +    */
  +   public void start()
  +   {
  +   }
  +   /**
  +    * Stops this cache thus {@link #flush}ing all cached objects. <br>
  +    * After this method is called, a call to {@link #start} will restart the cache.
  +    * @see #start
  +    * @see #destroy
  +    */
  +   public void stop()
  +   {
  +      if (m_list != null)
  +      {
  +         flush();
  +      }
  +   }
  +   /**
  +    * Destroys the cache that is now unusable. <br>
  +    * To have it working again it must be re-{@link #init}ialized and
  +    * re-{@link #start}ed.
  +    * @see #init
  +    */
  +   public void destroy()
  +   {
  +   }
  +
  +   public Object get(Object key)
  +   {
  +      if (key == null)
  +      {
  +         throw new IllegalArgumentException("Requesting an object using a null 
key");
  +      }
  +
  +      LRUCacheEntry value = (LRUCacheEntry)m_map.get(key);
  +      if (value != null)
  +      {
  +         m_list.promote(value);
  +         return value.m_object;
  +      }
  +      else
  +      {
  +         cacheMiss();
  +         return null;
  +      }
  +   }
  +   public Object peek(Object key)
  +   {
  +      if (key == null)
  +      {
  +         throw new IllegalArgumentException("Requesting an object using a null 
key");
  +      }
  +
  +      LRUCacheEntry value = (LRUCacheEntry)m_map.get(key);
  +      if (value == null)
  +      {
  +         return null;
  +      }
  +      else
  +      {
  +         return value.m_object;
  +      }
  +   }
  +   public void insert(Object key, Object o)
  +   {
  +      if (o == null) {throw new IllegalArgumentException("Cannot insert a null 
object in the cache");}
  +      if (key == null) {throw new IllegalArgumentException("Cannot insert an object 
in the cache with null key");}
  +      Object obj = m_map.get(key);
  +      if (obj == null)
  +      {
  +         m_list.demote();
  +         LRUCacheEntry entry = createCacheEntry(key, o);
  +         m_list.promote(entry);
  +         m_map.put(key, entry);
  +      }
  +      else
  +      {
  +         throw new IllegalStateException("Attempt to put in the cache an object 
that is already there");
  +      }
  +   }
  +   public void remove(Object key)
  +   {
  +      if (key == null) {throw new IllegalArgumentException("Removing an object 
using a null key");}
  +
  +      Object value = m_map.get(key);
  +      if (value != null)
  +      {
  +         m_list.remove((LRUCacheEntry)value);
  +      }
  +      else {} // Do nothing, the object isn't in the cache list
  +      m_map.remove(key);
  +   }
  +   public void flush()
  +   {
  +      LRUCacheEntry entry = null;
  +      while ((entry = m_list.m_tail) != null)
  +      {
  +         ageOut(entry);
  +      }
  +   }
  +
  +   public int size() {
  +      return m_list.m_count;
  +   }
  +
  +   // Y overrides ---------------------------------------------------
  +
  +   // Package protected ---------------------------------------------
  +
  +   // Protected -----------------------------------------------------
  +   /**
  +    * Factory method for the linked list used by this cache implementation.
  +    */
  +   protected LRUList createList() {return new LRUList();}
  +   /**
  +    * Callback method called when the cache algorithm ages out of the cache
  +    * the given entry. <br>
  +    * The implementation here is removing the given entry from the cache.
  +    */
  +   protected void ageOut(LRUCacheEntry entry)
  +   {
  +      remove(entry.m_key);
  +   }
  +   /**
  +    * Callback method called when a cache miss happens.
  +    */
  +   protected void cacheMiss()
  +   {
  +   }
  +   /**
  +    * Factory method for cache entries
  +    */
  +   protected LRUCacheEntry createCacheEntry(Object key, Object value)
  +   {
  +      return new LRUCacheEntry(key, value);
  +   }
  +
  +   // Private -------------------------------------------------------
  +
  +   // Inner classes -------------------------------------------------
  +   /**
  +    * Double queued list used to store cache entries.
  +    */
  +   public class LRUList
  +   {
  +      /** The maximum capacity of the cache list */
  +      public int m_maxCapacity;
  +      /** The minimum capacity of the cache list */
  +      public int m_minCapacity;
  +      /** The current capacity of the cache list */
  +      public int m_capacity;
  +      /** The number of cached objects */
  +      public int m_count;
  +      /** The head of the double linked list */
  +      public LRUCacheEntry m_head;
  +      /** The tail of the double linked list */
  +      public LRUCacheEntry m_tail;
  +      /** The cache misses happened */
  +      public int m_cacheMiss;
  +      /**
  +       * Creates a new double queued list.
  +       */
  +      protected LRUList()
  +      {
  +         m_head = null;
  +         m_tail = null;
  +         m_count = 0;
  +      }
  +      /**
  +       * Promotes the cache entry <code>entry</code> to the last used position
  +       * of the list. <br>
  +       * If the object is already there, does nothing.
  +       * @param entry the object to be promoted, cannot be null
  +       * @see #demote
  +       * @throws IllegalStateException if this method is called with a full cache
  +       */
  +      protected void promote(LRUCacheEntry entry)
  +      {
  +         if (entry == null) {throw new IllegalArgumentException("Trying to promote 
a null object");}
  +         if (m_capacity < 1) {throw new IllegalStateException("Can't work with 
capacity < 1");}
  +
  +         entry.m_time = System.currentTimeMillis();
  +         if (entry.m_prev == null)
  +         {
  +            if (entry.m_next == null)
  +            {
  +               // entry is new or there is only the head
  +               if (m_count == 0) // cache is empty
  +               {
  +                  m_head = entry;
  +                  m_tail = entry;
  +                  ++m_count;
  +                  entryAdded(entry);
  +               }
  +               else if (m_count == 1 && m_head == entry) {} // there is only the 
head and I want to promote it, do nothing
  +               else if (m_count < m_capacity)
  +               {
  +                  entry.m_prev = null;
  +                  entry.m_next = m_head;
  +                  m_head.m_prev = entry;
  +                  m_head = entry;
  +                  ++m_count;
  +                  entryAdded(entry);
  +               }
  +               else if (m_count < m_maxCapacity)
  +               {
  +                  entry.m_prev = null;
  +                  entry.m_next = m_head;
  +                  m_head.m_prev = entry;
  +                  m_head = entry;
  +                  ++m_count;
  +                  int oldCapacity = m_capacity;
  +                  ++m_capacity;
  +                  entryAdded(entry);
  +                  capacityChanged(oldCapacity);
  +               }
  +               else {throw new IllegalStateException("Attempt to put a new cache 
entry on a full cache");}
  +            }
  +            else {} // entry is the head, do nothing
  +         }
  +         else
  +         {
  +            if (entry.m_next == null) // entry is the tail
  +            {
  +               LRUCacheEntry beforeLast = entry.m_prev;
  +               beforeLast.m_next = null;
  +               entry.m_prev = null;
  +               entry.m_next = m_head;
  +               m_head.m_prev = entry;
  +               m_head = entry;
  +               m_tail = beforeLast;
  +            }
  +            else // entry is in the middle of the list
  +            {
  +               LRUCacheEntry previous = entry.m_prev;
  +               previous.m_next = entry.m_next;
  +               entry.m_next.m_prev = previous;
  +               entry.m_prev = null;
  +               entry.m_next = m_head;
  +               m_head.m_prev = entry;
  +               m_head = entry;
  +            }
  +         }
  +      }
  +      /**
  +       * Demotes from the cache the least used entry. <br>
  +       * If the cache is not full, does nothing.
  +       * @see #promote
  +       */
  +      protected void demote()
  +      {
  +         if (m_capacity < 1) {throw new IllegalStateException("Can't work with 
capacity < 1");}
  +         if (m_count > m_maxCapacity) {throw new IllegalStateException("Cache list 
entries number (" + m_count + ") > than the maximum allowed (" + m_maxCapacity + ")");}
  +         if (m_count == m_maxCapacity)
  +         {
  +            LRUCacheEntry entry = m_tail;
  +
  +            // the entry will be removed by ageOut
  +            ageOut(entry);
  +         }
  +         else {} // cache is not full, do nothing
  +      }
  +      /**
  +       * Removes from the cache list the specified entry.
  +       */
  +      protected void remove(LRUCacheEntry entry)
  +      {
  +         if (entry == null) {throw new IllegalArgumentException("Cannot remove a 
null entry from the cache");}
  +         if (m_count < 1) {throw new IllegalStateException("Trying to remove an 
entry from an empty cache");}
  +
  +         entry.m_key = entry.m_object = null;
  +         if (m_count == 1)
  +         {
  +            m_head = m_tail = null;
  +         }
  +         else
  +         {
  +            if (entry.m_prev == null) // the head
  +            {
  +               m_head = entry.m_next;
  +               m_head.m_prev = null;
  +               entry.m_next = null;
  +            }
  +            else if (entry.m_next == null) // the tail
  +            {
  +               m_tail = entry.m_prev;
  +               m_tail.m_next = null;
  +               entry.m_prev = null;
  +            }
  +            else // in the middle
  +            {
  +               entry.m_next.m_prev = entry.m_prev;
  +               entry.m_prev.m_next = entry.m_next;
  +               entry.m_prev = null;
  +               entry.m_next = null;
  +            }
  +         }
  +         --m_count;
  +         entryRemoved(entry);
  +      }
  +      /**
  +       * Callback that signals that the given entry has been added to the cache.
  +       */
  +      protected void entryAdded(LRUCacheEntry entry) {}
  +      /**
  +       * Callback that signals that the given entry has been removed from the cache.
  +       */
  +      protected void entryRemoved(LRUCacheEntry entry) {}
  +      /**
  +       * Callback that signals that the capacity of the cache is changed.
  +       * @param oldCapacity the capacity before the change happened
  +       */
  +      protected void capacityChanged(int oldCapacity) {}
  +
  +      public String toString()
  +      {
  +         String s = Integer.toHexString(super.hashCode());
  +         s += " size: " + m_count;
  +         for (LRUCacheEntry entry = m_head; entry != null; entry = entry.m_next)
  +         {
  +            s += "\n" + entry;
  +         }
  +         return s;
  +      }
  +   }
  +
  +   /**
  +    * Double linked cell used as entry in the cache list.
  +    */
  +   public class LRUCacheEntry
  +   {
  +      /** Reference to the next cell in the list */
  +      public  LRUCacheEntry m_next;
  +      /** Reference to the previous cell in the list */
  +      public LRUCacheEntry m_prev;
  +      /** The key used to retrieve the cached object */
  +      public Object m_key;
  +      /** The cached object */
  +      public Object m_object;
  +      /** The timestamp of the creation */
  +      public long m_time;
  +      /**
  +       * Creates a new double linked cell, storing the object we
  +       * want to cache and the key that is used to retrieve it.
  +       */
  +      protected LRUCacheEntry(Object key, Object object)
  +      {
  +         m_key = key;
  +         m_object = object;
  +         m_next = null;
  +         m_prev = null;
  +         m_time = 0; // Set when inserted in the list.
  +      }
  +      public String toString()
  +      {
  +         return "key: " + m_key + ", object: " + 
Integer.toHexString(m_object.hashCode()) + ", entry: " + 
Integer.toHexString(super.hashCode());
  +      }
  +   }
   }
  
  
  

_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to