generify cache service

git-svn-id: https://svn.apache.org/repos/asf/archiva/redback/redback-components/trunk@1429391 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/spring-cache-api/src/main/java/org/apache/archiva/redback/components/cache/AbstractCache.java b/spring-cache-api/src/main/java/org/apache/archiva/redback/components/cache/AbstractCache.java
index dcc48f8..d8d39a8 100644
--- a/spring-cache-api/src/main/java/org/apache/archiva/redback/components/cache/AbstractCache.java
+++ b/spring-cache-api/src/main/java/org/apache/archiva/redback/components/cache/AbstractCache.java
@@ -22,8 +22,8 @@
  * @author Olivier Lamy
  * @since 2.1
  */
-public abstract class AbstractCache
-    implements Cache
+public abstract class AbstractCache<V,T>
+    implements Cache<V,T>
 {
     private int timeToIdleSeconds = 0;
 
diff --git a/spring-cache-api/src/main/java/org/apache/archiva/redback/components/cache/Cache.java b/spring-cache-api/src/main/java/org/apache/archiva/redback/components/cache/Cache.java
index 1666312..8dee894 100644
--- a/spring-cache-api/src/main/java/org/apache/archiva/redback/components/cache/Cache.java
+++ b/spring-cache-api/src/main/java/org/apache/archiva/redback/components/cache/Cache.java
@@ -24,7 +24,7 @@
  *
  * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
  */
-public interface Cache
+public interface Cache<V,T>
 {
     /**
      * Tests to see if the provided key exists within the cache.
@@ -37,7 +37,7 @@
      * @param key the key to test.
      * @return true if the key exists.
      */
-    boolean hasKey( Object key );
+    boolean hasKey( V key );
 
     /**
      * Get the value of the specified key, if it exists in the cache.
@@ -45,17 +45,9 @@
      * @param key the key to fetch the contents of.
      * @return the value of the key, or null if not found.
      */
-    Object get( Object key );
+    T get( V key );
 
-    /**
-     * Get the value of the specified key, if it exists in the cache.
-     *
-     * @param key   the key to fetch the contents of.
-     * @param clazz class of object type to retrieve
-     * @return the value of the key, or null if not found.
-     * @since 2.1
-     */
-    <T> T get( Object key, Class<T> clazz );
+
 
     /**
      * Put the specified value into the cache under the provided key.
@@ -64,17 +56,9 @@
      * @param value the object to place into the cache.
      * @return the previous value for the key, or null if the key contained no value.
      */
-    Object put( Object key, Object value );
+    T put( V key, T value );
 
-    /**
-     * Put the specified value into the cache under the provided key.
-     *
-     * @param key   the key to put the value into
-     * @param value the object to place into the cache.
-     * @param clazz class of object type to retrieve
-     * @return the previous value for the key, or null if the key contained no value.
-     */
-    <T> T put( Object key, Object value, Class<T> clazz );
+
 
     /**
      * Register the specified value into the cache under the provided key.
@@ -85,7 +69,7 @@
      * @param key   the key to put the value into
      * @param value the object to place into the cache.
      */
-    void register( Object key, Object value );
+    void register( V key, T value );
 
     /**
      * Remove the specified key and value from the cache.
@@ -93,7 +77,7 @@
      * @param key the key to the value to remove.
      * @return the value of the key that was removed.
      */
-    Object remove( Object key );
+    T remove( V key );
 
     /**
      * Clear the cache of all entries.
diff --git a/spring-cache-api/src/main/java/org/apache/archiva/redback/components/cache/CacheableWrapper.java b/spring-cache-api/src/main/java/org/apache/archiva/redback/components/cache/CacheableWrapper.java
index bb20c5b..3455e04 100644
--- a/spring-cache-api/src/main/java/org/apache/archiva/redback/components/cache/CacheableWrapper.java
+++ b/spring-cache-api/src/main/java/org/apache/archiva/redback/components/cache/CacheableWrapper.java
@@ -27,25 +27,25 @@
  * @author Olivier Lamy
  *
  */
-public class CacheableWrapper
+public class CacheableWrapper<T>
     implements Serializable
 {
-    private Object value;
+    private T value;
 
     private long storedTime;
 
-    public CacheableWrapper( Object value, long storedTime )
+    public CacheableWrapper( T value, long storedTime )
     {
         this.value = value;
         this.storedTime = storedTime;
     }
 
-    public Object getValue()
+    public T getValue()
     {
         return value;
     }
 
-    public void setValue( Object value )
+    public void setValue( T value )
     {
         this.value = value;
     }
diff --git a/spring-cache-api/src/main/java/org/apache/archiva/redback/components/cache/impl/NoCacheCache.java b/spring-cache-api/src/main/java/org/apache/archiva/redback/components/cache/impl/NoCacheCache.java
index 7a615ed..a29da23 100644
--- a/spring-cache-api/src/main/java/org/apache/archiva/redback/components/cache/impl/NoCacheCache.java
+++ b/spring-cache-api/src/main/java/org/apache/archiva/redback/components/cache/impl/NoCacheCache.java
@@ -32,9 +32,9 @@
  * @author Olivier Lamy
  * @since 5 February, 2007
  */
-public class NoCacheCache
-    extends AbstractCache
-    implements Cache
+public class NoCacheCache<V, T>
+    extends AbstractCache<V, T>
+    implements Cache<V, T>
 {
     static final class NoStats
         implements CacheStatistics
@@ -78,7 +78,7 @@
         /* do nothing */
     }
 
-    public Object get( Object key )
+    public T get( V key )
     {
         return null;
     }
@@ -88,32 +88,22 @@
         return stats;
     }
 
-    public boolean hasKey( Object key )
+    public boolean hasKey( V key )
     {
         return false;
     }
 
-    public Object put( Object key, Object value )
+    public T put( V key, T value )
     {
         return null;
     }
 
-    public void register( Object key, Object value )
+    public void register( V key, T value )
     {
         /* do nothing */
     }
 
-    public Object remove( Object key )
-    {
-        return null;
-    }
-
-    public <T> T get( Object key, Class<T> clazz )
-    {
-        return null;
-    }
-
-    public <T> T put( Object key, Object value, Class<T> clazz )
+    public T remove( V key )
     {
         return null;
     }
diff --git a/spring-cache-providers/spring-cache-ehcache/src/main/java/org/apache/archiva/redback/components/cache/ehcache/EhcacheCache.java b/spring-cache-providers/spring-cache-ehcache/src/main/java/org/apache/archiva/redback/components/cache/ehcache/EhcacheCache.java
index ee9bbd4..2ec8d18 100644
--- a/spring-cache-providers/spring-cache-ehcache/src/main/java/org/apache/archiva/redback/components/cache/ehcache/EhcacheCache.java
+++ b/spring-cache-providers/spring-cache-ehcache/src/main/java/org/apache/archiva/redback/components/cache/ehcache/EhcacheCache.java
@@ -38,8 +38,8 @@
  *
  * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
  */
-public class EhcacheCache
-    implements org.apache.archiva.redback.components.cache.Cache
+public class EhcacheCache<V,T>
+    implements org.apache.archiva.redback.components.cache.Cache<V,T>
 {
 
     private Logger log = LoggerFactory.getLogger( getClass() );
@@ -239,7 +239,7 @@
         }
     }
 
-    public Object get( Object key )
+    public T get( V key )
     {
         if ( key == null )
         {
@@ -251,17 +251,7 @@
         {
             return null;
         }
-        return elem.getObjectValue();
-    }
-
-    public <T> T get( Object key, Class<T> clazz )
-    {
-        return (T) get( key );
-    }
-
-    public <T> T put( Object key, Object value, Class<T> clazz )
-    {
-        return (T) put( key, value );
+        return (T) elem.getObjectValue();
     }
 
     public long getDiskExpiryThreadIntervalSeconds()
@@ -309,7 +299,7 @@
         return timeToLiveSeconds;
     }
 
-    public boolean hasKey( Object key )
+    public boolean hasKey( V key )
     {
         return ehcache.isKeyInCache( key );
     }
@@ -329,12 +319,12 @@
         return overflowToDisk;
     }
 
-    public void register( Object key, Object value )
+    public void register( V key, T value )
     {
         ehcache.put( new Element( key, value ) );
     }
 
-    public Object put( Object key, Object value )
+    public T put( V key, T value )
     {
         // Multiple steps done to satisfy Cache API requirement for Previous object return.
         Element elem = null;
@@ -346,10 +336,10 @@
         }
         elem = new Element( key, value );
         ehcache.put( elem );
-        return previous;
+        return (T) previous;
     }
 
-    public Object remove( Object key )
+    public T remove( V key )
     {
         Element elem = null;
         Object previous = null;
@@ -360,7 +350,7 @@
             ehcache.remove( key );
         }
 
-        return previous;
+        return (T) previous;
     }
 
     public void setDiskExpiryThreadIntervalSeconds( long diskExpiryThreadIntervalSeconds )
diff --git a/spring-cache-providers/spring-cache-hashmap/src/main/java/org/apache/archiva/redback/components/cache/hashmap/HashMapCache.java b/spring-cache-providers/spring-cache-hashmap/src/main/java/org/apache/archiva/redback/components/cache/hashmap/HashMapCache.java
index 44a5bae..227d7a0 100644
--- a/spring-cache-providers/spring-cache-hashmap/src/main/java/org/apache/archiva/redback/components/cache/hashmap/HashMapCache.java
+++ b/spring-cache-providers/spring-cache-hashmap/src/main/java/org/apache/archiva/redback/components/cache/hashmap/HashMapCache.java
@@ -57,9 +57,9 @@
  * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
  */
 @Service("cache#hashmap")
-public class HashMapCache
-    extends AbstractCache
-    implements Cache
+public class HashMapCache<V,T>
+    extends AbstractCache<V,T>
+    implements Cache<V,T>
 {
 
     private Logger log = LoggerFactory.getLogger( getClass() );
@@ -84,7 +84,7 @@
 
     }
 
-    private Map cache;
+    private Map<V,CacheableWrapper<T>> cache;
 
     /**
      *
@@ -127,9 +127,9 @@
      * @param key the key used to map the cached object
      * @return the object mapped to the given key, or null if no cache object is mapped to the given key
      */
-    public Object get( Object key )
+    public T get( V key )
     {
-        CacheableWrapper retValue = null;
+        CacheableWrapper<T> retValue = null;
         // prevent search
         if ( !this.isCacheAvailable() )
         {
@@ -140,7 +140,7 @@
             if ( cache.containsKey( key ) )
             {
                 // remove and put: this promotes it to the top since we use a linked hash map
-                retValue = (CacheableWrapper) cache.remove( key );
+                retValue = cache.remove( key );
 
                 if ( needRefresh( retValue ) )
                 {
@@ -162,15 +162,7 @@
         return retValue == null ? null : retValue.getValue();
     }
 
-    public <T> T get( Object key, Class<T> clazz )
-    {
-        return (T) get( key );
-    }
 
-    public <T> T put( Object key, Object value, Class<T> clazz )
-    {
-        return (T) put( key, value );
-    }
 
     protected boolean needRefresh( CacheableWrapper cacheableWrapper )
     {
@@ -201,7 +193,7 @@
      * @param key the key used to map the cached object
      * @return true if the cache contains an object associated with the given key
      */
-    public boolean hasKey( Object key )
+    public boolean hasKey( V key )
     {
         // prevent search
         if ( !this.isCacheAvailable() )
@@ -233,11 +225,11 @@
 
         if ( cacheMaxSize > 0 )
         {
-            cache = new LinkedHashMap( cacheMaxSize );
+            cache = new LinkedHashMap<V,CacheableWrapper<T>>( cacheMaxSize );
         }
         else
         {
-            cache = new LinkedHashMap();
+            cache = new LinkedHashMap<V,CacheableWrapper<T>>();
         }
     }
 
@@ -247,9 +239,9 @@
      * @param key   the object to map the valued object
      * @param value the object to cache
      */
-    public Object put( Object key, Object value )
+    public T put( V key, T value )
     {
-        CacheableWrapper ret = null;
+        CacheableWrapper<T> ret = null;
 
         // remove and put: this promotes it to the top since we use a linked hash map
         synchronized ( cache )
@@ -259,7 +251,7 @@
                 cache.remove( key );
             }
 
-            ret = (CacheableWrapper) cache.put( key, new CacheableWrapper( value, System.currentTimeMillis() ) );
+            ret = cache.put( key, new CacheableWrapper<T>( value, System.currentTimeMillis() ) );
         }
 
         manageCache();
@@ -273,7 +265,7 @@
      * @param key   the object to map the valued object
      * @param value the object to cache
      */
-    public void register( Object key, Object value )
+    public void register( V key, T value )
     {
         // remove and put: this promotes it to the top since we use a linked hash map
         synchronized ( cache )
@@ -283,19 +275,19 @@
                 cache.remove( key );
             }
 
-            cache.put( key, new CacheableWrapper( value, System.currentTimeMillis() ) );
+            cache.put( key, new CacheableWrapper<T>( value, System.currentTimeMillis() ) );
         }
 
         manageCache();
     }
 
-    public Object remove( Object key )
+    public T remove( V key )
     {
         synchronized ( cache )
         {
             if ( cache.containsKey( key ) )
             {
-                return cache.remove( key );
+                return cache.remove( key ).getValue();
             }
         }
 
diff --git a/spring-cache-providers/spring-cache-oscache/src/main/java/org/apache/archiva/redback/components/cache/oscache/OsCacheCache.java b/spring-cache-providers/spring-cache-oscache/src/main/java/org/apache/archiva/redback/components/cache/oscache/OsCacheCache.java
index 4334b4b..feba3da 100644
--- a/spring-cache-providers/spring-cache-oscache/src/main/java/org/apache/archiva/redback/components/cache/oscache/OsCacheCache.java
+++ b/spring-cache-providers/spring-cache-oscache/src/main/java/org/apache/archiva/redback/components/cache/oscache/OsCacheCache.java
@@ -37,9 +37,9 @@
  *
  * @author @author Olivier Lamy
  */
-public class OsCacheCache
-    extends AbstractCache
-    implements Cache
+public class OsCacheCache<V, T>
+    extends AbstractCache<V, T>
+    implements Cache<V, T>
 {
 
     private GeneralCacheAdministrator generalCacheAdministrator;
@@ -173,18 +173,18 @@
         this.generalCacheAdministrator.flushAll();
     }
 
-    public Object get( Object key )
+    public T get( V key )
     {
         try
         {
-            Object object = null;
+            T object = null;
             if ( this.getRefreshPeriod() >= 0 )
             {
-                object = this.generalCacheAdministrator.getFromCache( key.toString(), this.getRefreshPeriod() );
+                object = (T) this.generalCacheAdministrator.getFromCache( key.toString(), this.getRefreshPeriod() );
             }
             else
             {
-                object = this.generalCacheAdministrator.getFromCache( key.toString() );
+                object = (T) this.generalCacheAdministrator.getFromCache( key.toString() );
             }
             if ( object != null )
             {
@@ -204,15 +204,6 @@
         }
     }
 
-    public <T> T get( Object key, Class<T> clazz )
-    {
-        return (T) get( key );
-    }
-
-    public <T> T put( Object key, Object value, Class<T> clazz )
-    {
-        return (T) put( key, value );
-    }
 
     public CacheStatistics getStatistics()
     {
@@ -220,18 +211,18 @@
         return this.osCacheStatistics;
     }
 
-    public boolean hasKey( Object key )
+    public boolean hasKey( V key )
     {
         // TODO if null increase/decrease statistics ?
         return this.get( key ) == null;
     }
 
-    public void register( Object key, Object value )
+    public void register( V key, T value )
     {
         this.generalCacheAdministrator.putInCache( key.toString(), value );
     }
 
-    public Object put( Object key, Object value )
+    public T put( V key, T value )
     {
         Object previous = null;
         try
@@ -243,10 +234,10 @@
             // ignore this because the content will be updated
         }
         this.generalCacheAdministrator.putInCache( key.toString(), value );
-        return previous;
+        return (T) previous;
     }
 
-    public Object remove( Object key )
+    public T remove( V key )
     {
         Object previous = null;
         try
@@ -260,7 +251,7 @@
         }
         this.generalCacheAdministrator.cancelUpdate( key.toString() );
         this.generalCacheAdministrator.flushEntry( key.toString() );
-        return previous;
+        return (T) previous;
     }
 
     //---------------------------------------------