This is an automated email from the ASF dual-hosted git repository.

martin_s pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/archiva-components.git


The following commit(s) were added to refs/heads/master by this push:
     new 5d67146  Switching to new ehcache version
5d67146 is described below

commit 5d6714658343d31860e54195cd8b872c418f4bb4
Author: Martin Schreier <[email protected]>
AuthorDate: Mon Jan 3 20:25:30 2022 +0100

    Switching to new ehcache version
---
 .../components/cache/factory/CacheCreator.java     |   5 +-
 .../components/cache/factory/CacheFactory.java     |   8 +-
 .../spring-cache-ehcache/pom.xml                   |   4 +-
 .../components/cache/ehcache/EhcacheCache.java     | 368 ++++++++++++---------
 .../components/cache/ehcache/EhcacheCreator.java   |  11 +-
 .../cache/ehcache/StatisticsRetrieval.java         |  57 ++++
 .../src/test/resources/log4j2-test.xml             |   2 +-
 .../src/test/resources/spring-context-disk.xml     |   3 +
 .../src/test/resources/spring-context.xml          |  10 +
 .../cache/hashmap/HashMapCacheCreator.java         |   8 +-
 .../cache/test/AbstractCacheTestCase.java          |  26 +-
 .../components/cache/test/examples/wine/Wine.java  |  20 ++
 12 files changed, 334 insertions(+), 188 deletions(-)

diff --git 
a/spring-cache/spring-cache-api/src/main/java/org/apache/archiva/components/cache/factory/CacheCreator.java
 
b/spring-cache/spring-cache-api/src/main/java/org/apache/archiva/components/cache/factory/CacheCreator.java
index bb55a5e..46aed46 100644
--- 
a/spring-cache/spring-cache-api/src/main/java/org/apache/archiva/components/cache/factory/CacheCreator.java
+++ 
b/spring-cache/spring-cache-api/src/main/java/org/apache/archiva/components/cache/factory/CacheCreator.java
@@ -27,8 +27,9 @@ import org.apache.archiva.components.cache.CacheHints;
  * CacheCreator - an interface for CacheCreators
  *
  * @author <a href="mailto:[email protected]";>Joakim Erdfelt</a>
+ * @author Martin Schreier <[email protected]>
  */
-public interface CacheCreator
+public interface CacheCreator<K,V>
 {
     /**
      * Create a Cache, initialize it, and return it.
@@ -37,5 +38,5 @@ public interface CacheCreator
      * @return the created cache.
      * @throws CacheException if there was a cache creation error.
      */
-    public Cache createCache( CacheHints hints ) throws CacheException;
+    public Cache<K,V> createCache( CacheHints hints, Class<K> keyType, 
Class<V> valueType ) throws CacheException;
 }
diff --git 
a/spring-cache/spring-cache-api/src/main/java/org/apache/archiva/components/cache/factory/CacheFactory.java
 
b/spring-cache/spring-cache-api/src/main/java/org/apache/archiva/components/cache/factory/CacheFactory.java
index dbca1a0..119550f 100644
--- 
a/spring-cache/spring-cache-api/src/main/java/org/apache/archiva/components/cache/factory/CacheFactory.java
+++ 
b/spring-cache/spring-cache-api/src/main/java/org/apache/archiva/components/cache/factory/CacheFactory.java
@@ -114,7 +114,7 @@ public class CacheFactory
         CacheFactory.creator = creator;
     }
 
-    public Cache getCache( String id, CacheHints hints )
+    public <K,V> Cache<K,V> getCache( String id, Class<K> keyType, Class<V> 
valueType, CacheHints hints )
         throws CacheException
     {
         if ( creator == null )
@@ -124,7 +124,7 @@ public class CacheFactory
 
         if ( caches.containsKey( id ) )
         {
-            return (Cache) caches.get( id );
+            return (Cache<K,V>) caches.get( id );
         }
 
         if ( hints == null )
@@ -134,9 +134,9 @@ public class CacheFactory
             hints.setName( id );
         }
 
-        Cache cache = CacheFactory.creator.createCache( hints );
+        Cache<K,V> cache = CacheFactory.creator.createCache( hints, keyType, 
valueType );
 
         caches.put( id, cache );
-        return (Cache) cache;
+        return cache;
     }
 }
diff --git a/spring-cache/spring-cache-providers/spring-cache-ehcache/pom.xml 
b/spring-cache/spring-cache-providers/spring-cache-ehcache/pom.xml
index d52c2e2..7b6a75a 100644
--- a/spring-cache/spring-cache-providers/spring-cache-ehcache/pom.xml
+++ b/spring-cache/spring-cache-providers/spring-cache-ehcache/pom.xml
@@ -40,9 +40,9 @@
 
   <dependencies>
     <dependency>
-      <groupId>net.sf.ehcache</groupId>
+      <groupId>org.ehcache</groupId>
       <artifactId>ehcache</artifactId>
-      <version>2.10.9.2</version>
+      <version>3.9.9</version>
       <exclusions>
         <exclusion>
           <groupId>commons-logging</groupId>
diff --git 
a/spring-cache/spring-cache-providers/spring-cache-ehcache/src/main/java/org/apache/archiva/components/cache/ehcache/EhcacheCache.java
 
b/spring-cache/spring-cache-providers/spring-cache-ehcache/src/main/java/org/apache/archiva/components/cache/ehcache/EhcacheCache.java
index 4d6e014..4559cf9 100644
--- 
a/spring-cache/spring-cache-providers/spring-cache-ehcache/src/main/java/org/apache/archiva/components/cache/ehcache/EhcacheCache.java
+++ 
b/spring-cache/spring-cache-providers/spring-cache-ehcache/src/main/java/org/apache/archiva/components/cache/ehcache/EhcacheCache.java
@@ -19,19 +19,18 @@ package org.apache.archiva.components.cache.ehcache;
  * under the License.
  */
 
-import net.sf.ehcache.Cache;
-import net.sf.ehcache.CacheManager;
-import net.sf.ehcache.Element;
-import net.sf.ehcache.Status;
-import net.sf.ehcache.config.CacheConfiguration;
-import net.sf.ehcache.config.Configuration;
-import net.sf.ehcache.config.ConfigurationFactory;
-import net.sf.ehcache.config.DiskStoreConfiguration;
-import net.sf.ehcache.config.MemoryUnit;
-import net.sf.ehcache.config.PersistenceConfiguration;
-import net.sf.ehcache.statistics.StatisticsGateway;
-import net.sf.ehcache.store.MemoryStoreEvictionPolicy;
 import org.apache.archiva.components.cache.CacheStatistics;
+import org.ehcache.Cache;
+import org.ehcache.PersistentCacheManager;
+import org.ehcache.StateTransitionException;
+import org.ehcache.Status;
+import org.ehcache.config.builders.CacheConfigurationBuilder;
+import org.ehcache.config.builders.CacheManagerBuilder;
+import org.ehcache.config.builders.ExpiryPolicyBuilder;
+import org.ehcache.config.builders.ResourcePoolsBuilder;
+import org.ehcache.config.units.MemoryUnit;
+import org.ehcache.core.spi.service.StatisticsService;
+import org.ehcache.expiry.ExpiryPolicy;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -41,6 +40,11 @@ import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.time.Duration;
+import java.time.temporal.ChronoUnit;
+import java.util.HashSet;
+import java.util.Random;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * EhcacheCache
@@ -56,9 +60,18 @@ public class EhcacheCache<V, T>
 
     private static final String EHCACHE_DISK_STORE_PROPERTY = 
"org.apache.archiva.ehcache.diskStore";
 
-    private Logger log = LoggerFactory.getLogger( EhcacheCache.class );
+    private static final Logger log = LoggerFactory.getLogger( 
EhcacheCache.class );
 
-    class Stats
+    private final Class<V> keyType;
+    private final Class<T> valueType;
+
+    public EhcacheCache( Class<V> keyType, Class<T> valueType )
+    {
+        this.keyType = keyType;
+        this.valueType = valueType;
+    }
+
+    static class Stats
         implements CacheStatistics
     {
         private boolean useBaseLine = false;
@@ -66,17 +79,25 @@ public class EhcacheCache<V, T>
         private long missCountBL = 0;
         private long sizeBL = 0;
         private long localHeapSizeInBytesBL = 0;
+        private final String cacheName;
+        private final StatisticsRetrieval svc;
+
+        public Stats( StatisticsRetrieval svc, String cacheName )
+        {
+            this.cacheName = cacheName;
+            this.svc = svc;
+        }
 
         // No API for cache clear since 2.10. We use a baseline, if the cache 
is cleared.
         @Override
         public void clear( )
         {
             useBaseLine = true;
-            final StatisticsGateway cStats = ehcache.getStatistics( );
-            hitCountBL = cStats.cacheHitCount( );
-            missCountBL = cStats.cacheMissCount( );
-            sizeBL = cStats.getSize( );
-            localHeapSizeInBytesBL = cStats.getLocalHeapSizeInBytes( );
+            org.ehcache.core.statistics.CacheStatistics cStats = getStats( );
+            hitCountBL = cStats.getCacheHits( );
+            missCountBL = cStats.getCacheMisses( );
+            sizeBL = cStats.getTierStatistics( ).size( );
+            localHeapSizeInBytesBL = cStats.getTierStatistics( ).get( "OnHeap" 
).getAllocatedByteSize( );
         }
 
         @Override
@@ -93,31 +114,59 @@ public class EhcacheCache<V, T>
             return hits / ( hits + miss );
         }
 
+        private org.ehcache.core.statistics.CacheStatistics getStats( )
+        {
+            return svc.getStatisticsService( ).getCacheStatistics( 
this.cacheName );
+        }
+
         @Override
         public long getCacheHits( )
         {
-            return useBaseLine ? ehcache.getStatistics( ).cacheHitCount( ) - 
hitCountBL : ehcache.getStatistics( ).cacheHitCount( );
+            long hits = getStats( ).getCacheHits( );
+            return useBaseLine ? hits - hitCountBL : hits;
         }
 
         @Override
         public long getCacheMiss( )
         {
-            return useBaseLine ? ehcache.getStatistics( ).cacheMissCount( ) - 
missCountBL : ehcache.getStatistics( ).cacheMissCount( );
+            long misses = getStats( ).getCacheMisses( );
+            return useBaseLine ? misses - missCountBL : misses;
         }
 
         @Override
         public long getSize( )
         {
-            return useBaseLine ? ehcache.getStatistics( ).getSize( ) - sizeBL 
: ehcache.getStatistics( ).getSize( );
+            long size = getStats( ).getTierStatistics( ).size( );
+            return useBaseLine ? size - sizeBL : size;
         }
 
         @Override
         public long getInMemorySize( )
         {
-            return useBaseLine ? ehcache.getStatistics( 
).getLocalHeapSizeInBytes( ) - localHeapSizeInBytesBL : ehcache.getStatistics( 
).getLocalHeapSizeInBytes( );
+            long memSize = getStats( ).getTierStatistics( ).get( "OnHeap" 
).getAllocatedByteSize( );
+            return useBaseLine ? memSize - localHeapSizeInBytesBL : memSize;
+        }
+
+        public StatisticsService getService( )
+        {
+            return svc.getStatisticsService( );
         }
     }
 
+    private static class ManagerData
+    {
+        final PersistentCacheManager cacheManager;
+        final StatisticsRetrieval statisticsRetrieval;
+        final HashSet<String> cacheNames = new HashSet<>( );
+
+        ManagerData( PersistentCacheManager cacheManager, StatisticsRetrieval 
statisticsRetrieval )
+        {
+            this.cacheManager = cacheManager;
+            this.statisticsRetrieval = statisticsRetrieval;
+        }
+
+    }
+
     /**
      * how often to run the disk store expiry thread. A large number of 120 
seconds plus is recommended
      */
@@ -131,9 +180,9 @@ public class EhcacheCache<V, T>
     /**
      * Location on disk for the ehcache store.
      */
-    private String diskStorePath = System.getProperties( ).containsKey( 
EHCACHE_DISK_STORE_PROPERTY ) ?
+    private Path diskStorePath = Paths.get( System.getProperties( 
).containsKey( EHCACHE_DISK_STORE_PROPERTY ) ?
         System.getProperty( EHCACHE_DISK_STORE_PROPERTY ) :
-        System.getProperty( "java.io.tmpdir" ) + "/ehcache-archiva";
+        System.getProperty( "java.io.tmpdir" ) + "/ehcache-archiva" 
).toAbsolutePath( );
 
     private boolean eternal = false;
 
@@ -143,6 +192,9 @@ public class EhcacheCache<V, T>
 
     private String name = "cache";
 
+    private String registeredName;
+    private Path registeredPath;
+
     /**
      * Flag indicating when to use the disk store.
      */
@@ -178,20 +230,21 @@ public class EhcacheCache<V, T>
 
     private Path configurationFile = null;
 
-    private CacheManager cacheManager = null;//CacheManager.getInstance();
-
-    private net.sf.ehcache.Cache ehcache;
+    private Cache<V, T> ehcache;
 
     private Stats stats;
 
+    private static final ConcurrentHashMap<Path, ManagerData> cacheManagerRefs 
= new ConcurrentHashMap<>( );
+
+
     @Override
     public void clear( )
     {
-        if (ehcache!=null)
+        if ( ehcache != null )
         {
-            ehcache.removeAll( );
+            ehcache.clear( );
         }
-        if (stats!=null)
+        if ( stats != null )
         {
             stats.clear( );
         }
@@ -205,119 +258,161 @@ public class EhcacheCache<V, T>
         {
             System.setProperty( "net.sf.ehcache.skipUpdateCheck", "true" );
         }
+        this.registeredName = getName( );
+        Path storePath = getDiskStorePath( );
+        this.registeredPath = storePath;
+        ManagerData md = cacheManagerRefs.computeIfAbsent( 
this.registeredPath, ( key ) -> {
+            StatisticsRetrieval retrieval = new StatisticsRetrieval( );
+            return new ManagerData( initCacheManager( retrieval, 
this.registeredPath ), retrieval );
+        } );
+
+        this.stats = new Stats( md.statisticsRetrieval, this.registeredName );
 
-        stats = new Stats( );
+        final PersistentCacheManager cacheManager = md.cacheManager;
 
-        boolean cacheManagerExists = CacheManager.getCacheManager( getName( ) 
) != null;
+        Cache<V, T> cCache = cacheManager.getCache( registeredName, keyType, 
valueType );
 
-        if ( cacheManagerExists )
+        if ( cCache != null )
         {
             if ( failOnDuplicateCache )
             {
-                throw new RuntimeException( "A previous cacheManager with name 
[" + getName( ) + "] exists." );
+                throw new RuntimeException( "A previous cache with name [" + 
registeredName + "] exists." );
             }
             else
             {
-                log.warn( "skip duplicate cache {}", getName( ) );
-                cacheManager = CacheManager.getCacheManager( getName( ) );
+                log.warn( "skip duplicate cache {}", registeredName );
+                this.ehcache = cCache;
             }
         }
         else
         {
-            Configuration configuration;
-            if ( configurationFile != null && Files.exists( configurationFile 
) && Files.isReadable( configurationFile ) )
+            int diskSize = getMaxElementsOnDisk( ) > 0 ? getMaxElementsOnDisk( 
) : 100;
+            int memElements = getMaxElementsInMemory( ) > 0 ? 
getMaxElementsInMemory( ) : 1;
+            ResourcePoolsBuilder rpBuilder = ResourcePoolsBuilder
+                .heap( memElements ).disk( diskSize, MemoryUnit.MB, 
isDiskPersistent( ) );
+            if ( isOverflowToOffHeap( ) )
             {
-                configuration = ConfigurationFactory.parseConfiguration( 
configurationFile.toFile( ) );
+                rpBuilder.offheap( getMaxBytesLocalOffHeap( ), MemoryUnit.B );
             }
-            else
-            {
-                configuration = new Configuration( );
-            }
-            Path diskStore = Paths.get( getDiskStorePath( ) );
-            if (!Files.exists( diskStore ))
-            {
-                try
-                {
-                    Files.createDirectories( diskStore );
-                }
-                catch ( IOException e )
-                {
-                    log.error( "Could not create cache path " + e.getMessage( 
) );
-                }
-            }
-            this.cacheManager = new CacheManager( configuration.name( getName( 
) ).diskStore(
-                new DiskStoreConfiguration( ).path( getDiskStorePath( ) ) ) );
+            log.info( "Creating cache {}", registeredName );
+            this.ehcache = cacheManager.createCache( this.registeredName, 
CacheConfigurationBuilder.newCacheConfigurationBuilder( keyType, valueType, 
rpBuilder )
+                .withExpiry( getExpiry( ) )
+                .build( ) );
+
+            md.cacheNames.add( this.registeredName );
         }
+    }
 
-        boolean cacheExists = cacheManager.cacheExists( getName( ) );
+    ExpiryPolicy getExpiry( )
+    {
+        int ttl = getTimeToLiveSeconds( );
+        int tti = getTimeToIdleSeconds( );
+        if ( ttl <= 0 && tti <= 0 )
+        {
+            return ExpiryPolicy.NO_EXPIRY;
+        }
+        if ( ttl <= 0 && tti > 0 )
+        {
+            return ExpiryPolicyBuilder.timeToIdleExpiration( 
Duration.ofSeconds( tti ) );
+        }
+        if ( ttl > 0 && tti <= 0 )
+        {
+            return ExpiryPolicyBuilder.timeToLiveExpiration( 
Duration.ofSeconds( ttl ) );
+        }
+        return ExpiryPolicyBuilder.expiry( ).create( Duration.ofSeconds( ttl ) 
).access( Duration.ofSeconds( tti ) ).update( Duration.ofSeconds( tti ) 
).build( );
+    }
+
+    private Duration getDurationFromSeconds( int seconds )
+    {
+        return seconds <= 0 ? ChronoUnit.FOREVER.getDuration( ) : 
Duration.ofSeconds( seconds );
+    }
 
-        if ( cacheExists )
+    private synchronized PersistentCacheManager initCacheManager( 
StatisticsRetrieval svc, Path diskStorePath )
+    {
+        log.info( "Initializing Cache Manager {}, {}", isStatisticsEnabled( ), 
diskStorePath );
+        if ( !Files.exists( diskStorePath ) )
         {
-            if ( failOnDuplicateCache )
+            try
             {
-                throw new RuntimeException( "A previous cache with name [" + 
getName( ) + "] exists." );
+                Files.createDirectories( diskStorePath );
             }
-            else
+            catch ( IOException e )
             {
-                log.warn( "skip duplicate cache {}", getName( ) );
-                ehcache = cacheManager.getCache( getName( ) );
+                log.error( "Could not create cache path: {}", e.getMessage( ) 
);
             }
         }
-        else
+
+        try
         {
-            CacheConfiguration cacheConfiguration =
-                new CacheConfiguration( ).name( getName( ) 
).memoryStoreEvictionPolicy(
-                    getMemoryStoreEvictionPolicy( ) ).eternal( isEternal( ) 
).timeToLiveSeconds(
-                    getTimeToLiveSeconds( ) ).timeToIdleSeconds(
-                    getTimeToIdleSeconds( ) ).diskExpiryThreadIntervalSeconds(
-                    getDiskExpiryThreadIntervalSeconds( ) ).overflowToOffHeap(
-                    isOverflowToOffHeap( ) ).maxEntriesLocalDisk( 
getMaxElementsOnDisk( ) );
-
-            cacheConfiguration.addPersistence( new PersistenceConfiguration( ) 
);
-            if ( isDiskPersistent( ) )
+            CacheManagerBuilder<PersistentCacheManager> builder = 
CacheManagerBuilder.newCacheManagerBuilder( )
+                .with( CacheManagerBuilder.persistence( diskStorePath.toFile( 
) ) );
+            if ( isStatisticsEnabled( ) )
             {
-                cacheConfiguration.getPersistenceConfiguration( ).setStrategy( 
PersistenceConfiguration.Strategy.LOCALTEMPSWAP.name( ) );
+                builder = builder.using( svc );
             }
-            else
+            return builder.build( true );
+        } catch ( StateTransitionException ex ) {
+            // One try to use fallback path, if the cache exists already
+            Path fallBackPath = diskStorePath.getParent( ).resolve( 
diskStorePath.getFileName( ).toString( ) + "-" + ( new Random( ).nextLong( ) % 
1000 ) );
+            try
             {
-                cacheConfiguration.getPersistenceConfiguration( ).setStrategy( 
PersistenceConfiguration.Strategy.NONE.name( ) );
+                Files.createDirectories( fallBackPath );
             }
-
-            if ( getMaxElementsInMemory( ) > 0 )
+            catch ( IOException e )
             {
-                cacheConfiguration = cacheConfiguration.maxEntriesLocalHeap( 
getMaxElementsInMemory( ) );
+                log.error( "Could not create fallback cache path: {} ", 
e.getMessage( ) );
             }
-
-            if ( getMaxBytesLocalHeap( ) > 0 )
+            CacheManagerBuilder<PersistentCacheManager> builder = 
CacheManagerBuilder.newCacheManagerBuilder( )
+                .with( CacheManagerBuilder.persistence( fallBackPath.toFile( ) 
) );
+            if ( isStatisticsEnabled( ) )
             {
-                cacheConfiguration = cacheConfiguration.maxBytesLocalHeap( 
getMaxBytesLocalHeap( ), MemoryUnit.BYTES );
+                builder = builder.using( svc );
             }
-            if ( getMaxBytesLocalOffHeap( ) > 0 )
-            {
-                cacheConfiguration =
-                    cacheConfiguration.maxBytesLocalOffHeap( 
getMaxBytesLocalOffHeap( ), MemoryUnit.BYTES );
-            }
-
-            ehcache = new Cache( cacheConfiguration );
-            cacheManager.addCache( ehcache );
+            return builder.build( true );
         }
     }
 
     @PreDestroy
     public void dispose( )
     {
-        if ( this.cacheManager.getStatus( ).equals( Status.STATUS_ALIVE ) )
+        ManagerData data = cacheManagerRefs.get( registeredPath );
+        PersistentCacheManager cacheManager = data.cacheManager;
+        HashSet names = data.cacheNames;
+        if ( cacheManager != null && cacheManager.getStatus( ).equals( 
Status.AVAILABLE ) )
         {
-            log.info( "Disposing cache: {}", ehcache );
+            log.info( "Disposing cache: {}, {}", ehcache, registeredName );
             if ( this.ehcache != null )
             {
                 try
                 {
-                    this.cacheManager.removeCache( this.ehcache.getName( ) );
-                    this.ehcache = null;
-                } catch (Throwable e) {
+                    cacheManager.destroyCache( this.registeredName );
+
+                }
+                catch ( Throwable e )
+                {
                     log.error( "Cache removal failed: {}", e.getMessage( ), e 
);
                 }
+                finally
+                {
+                    names.remove( this.registeredName );
+                    this.ehcache = null;
+                }
+            }
+            if ( names.size( ) == 0 )
+            {
+                try
+                {
+                    cacheManager.close( );
+                    cacheManager.destroy( );
+                }
+                catch ( Throwable e )
+                {
+                    log.error( "Cache manager removal failed: {}", 
e.getMessage( ), e );
+                }
+                finally
+                {
+                    cacheManagerRefs.remove( registeredPath );
+                }
             }
         }
         else
@@ -326,7 +421,6 @@ public class EhcacheCache<V, T>
         }
     }
 
-    @SuppressWarnings( "unchecked" )
     @Override
     public T get( V key )
     {
@@ -335,12 +429,7 @@ public class EhcacheCache<V, T>
             return null;
         }
 
-        Element elem = ehcache.get( key );
-        if ( elem == null )
-        {
-            return null;
-        }
-        return (T) elem.getObjectValue( );
+        return ehcache.get( key );
     }
 
     public long getDiskExpiryThreadIntervalSeconds( )
@@ -348,11 +437,16 @@ public class EhcacheCache<V, T>
         return diskExpiryThreadIntervalSeconds;
     }
 
-    public String getDiskStorePath( )
+    public Path getDiskStorePath( )
     {
         return diskStorePath;
     }
 
+    public void setDiskStorePath( Path path )
+    {
+        this.diskStorePath = path.toAbsolutePath( );
+    }
+
     @Override
     public int getMaxElementsInMemory( )
     {
@@ -364,10 +458,6 @@ public class EhcacheCache<V, T>
         return memoryEvictionPolicy;
     }
 
-    public MemoryStoreEvictionPolicy getMemoryStoreEvictionPolicy( )
-    {
-        return MemoryStoreEvictionPolicy.fromString( memoryEvictionPolicy );
-    }
 
     public String getName( )
     {
@@ -395,7 +485,7 @@ public class EhcacheCache<V, T>
     @Override
     public boolean hasKey( V key )
     {
-        return ehcache.isKeyInCache( key );
+        return ehcache.containsKey( key );
     }
 
     public boolean isDiskPersistent( )
@@ -420,40 +510,25 @@ public class EhcacheCache<V, T>
     @Override
     public void register( V key, T value )
     {
-        ehcache.put( new Element( key, value ) );
+        ehcache.put( key, value );
     }
 
     @Override
-    @SuppressWarnings( "unchecked" )
     public T put( V key, T value )
     {
         // Multiple steps done to satisfy Cache API requirement for Previous 
object return.
-        Element elem;
-        Object previous = null;
-        elem = ehcache.get( key );
-        if ( elem != null )
-        {
-            previous = elem.getObjectValue( );
-        }
-        elem = new Element( key, value );
-        ehcache.put( elem );
-        return (T) previous;
+        T previous;
+        previous = ehcache.get( key );
+        ehcache.put( key, value );
+        return previous;
     }
 
     @Override
-    @SuppressWarnings( "unchecked" )
     public T remove( V key )
     {
-        Element elem;
-        Object previous = null;
-        elem = ehcache.get( key );
-        if ( elem != null )
-        {
-            previous = elem.getObjectValue( );
-            ehcache.remove( key );
-        }
-
-        return (T) previous;
+        T previous = ehcache.get( key );
+        ehcache.remove( key );
+        return previous;
     }
 
     public void setDiskExpiryThreadIntervalSeconds( long 
diskExpiryThreadIntervalSeconds )
@@ -466,11 +541,6 @@ public class EhcacheCache<V, T>
         this.diskPersistent = diskPersistent;
     }
 
-    public void setDiskStorePath( String diskStorePath )
-    {
-        this.diskStorePath = diskStorePath;
-    }
-
     public void setEternal( boolean eternal )
     {
         this.eternal = eternal;
@@ -481,11 +551,6 @@ public class EhcacheCache<V, T>
     public void setMaxElementsInMemory( int maxElementsInMemory )
     {
         this.maxElementsInMemory = maxElementsInMemory;
-        if ( this.ehcache != null )
-        {
-            this.ehcache.getCacheConfiguration( ).setMaxEntriesLocalHeap( 
this.maxElementsInMemory );
-
-        }
     }
 
     public void setMemoryEvictionPolicy( String memoryEvictionPolicy )
@@ -510,20 +575,12 @@ public class EhcacheCache<V, T>
     @Override
     public void setTimeToIdleSeconds( int timeToIdleSeconds )
     {
-        if ( this.ehcache != null )
-        {
-            this.ehcache.getCacheConfiguration( ).setTimeToIdleSeconds( 
timeToIdleSeconds );
-        }
         this.timeToIdleSeconds = timeToIdleSeconds;
     }
 
     @Override
     public void setTimeToLiveSeconds( int timeToLiveSeconds )
     {
-        if ( this.ehcache != null )
-        {
-            this.ehcache.getCacheConfiguration( ).setTimeToLiveSeconds( 
timeToIdleSeconds );
-        }
         this.timeToLiveSeconds = timeToLiveSeconds;
     }
 
@@ -534,7 +591,7 @@ public class EhcacheCache<V, T>
 
     public void setStatisticsEnabled( boolean statisticsEnabled )
     {
-        this.statisticsEnabled = statisticsEnabled;
+        // ignored for ehache
     }
 
     public boolean isFailOnDuplicateCache( )
@@ -587,11 +644,6 @@ public class EhcacheCache<V, T>
     public void setMaxElementsOnDisk( int maxElementsOnDisk )
     {
         this.maxElementsOnDisk = maxElementsOnDisk;
-        if ( this.ehcache != null )
-        {
-            this.ehcache.getCacheConfiguration( ).setMaxEntriesInCache( 
this.maxElementsOnDisk );
-            this.ehcache.getCacheConfiguration( ).maxEntriesLocalDisk( 
this.maxElementsOnDisk );
-        }
     }
 
     /**
diff --git 
a/spring-cache/spring-cache-providers/spring-cache-ehcache/src/main/java/org/apache/archiva/components/cache/ehcache/EhcacheCreator.java
 
b/spring-cache/spring-cache-providers/spring-cache-ehcache/src/main/java/org/apache/archiva/components/cache/ehcache/EhcacheCreator.java
index af521a9..e80788e 100644
--- 
a/spring-cache/spring-cache-providers/spring-cache-ehcache/src/main/java/org/apache/archiva/components/cache/ehcache/EhcacheCreator.java
+++ 
b/spring-cache/spring-cache-providers/spring-cache-ehcache/src/main/java/org/apache/archiva/components/cache/ehcache/EhcacheCreator.java
@@ -32,16 +32,17 @@ import java.nio.file.Path;
  * EhcacheCreator - runtime creation of an ehcache.
  *
  * @author <a href="mailto:[email protected]";>Joakim Erdfelt</a>
+ * @author Martin Schreier <[email protected]>
  */
-public class EhcacheCreator
-    implements CacheCreator
+public class EhcacheCreator<K,V>
+    implements CacheCreator<K,V>
 {
 
     @Override
-    public Cache createCache( CacheHints hints )
+    public Cache<K,V> createCache( CacheHints hints, Class<K> keyType, 
Class<V> valueType )
         throws CacheException
     {
-        EhcacheCache cache = new EhcacheCache( );
+        EhcacheCache<K,V> cache = new EhcacheCache( keyType, valueType );
 
         cache.setName( hints.getName( ) );
 
@@ -66,7 +67,7 @@ public class EhcacheCreator
                 }
             }
 
-            cache.setDiskStorePath( overflowPath.toAbsolutePath( ).toString( ) 
);
+            cache.setDiskStorePath( overflowPath );
         }
 
         cache.setMaxElementsInMemory( hints.getMaxElements( ) );
diff --git 
a/spring-cache/spring-cache-providers/spring-cache-ehcache/src/main/java/org/apache/archiva/components/cache/ehcache/StatisticsRetrieval.java
 
b/spring-cache/spring-cache-providers/spring-cache-ehcache/src/main/java/org/apache/archiva/components/cache/ehcache/StatisticsRetrieval.java
new file mode 100644
index 0000000..cef9059
--- /dev/null
+++ 
b/spring-cache/spring-cache-providers/spring-cache-ehcache/src/main/java/org/apache/archiva/components/cache/ehcache/StatisticsRetrieval.java
@@ -0,0 +1,57 @@
+package org.apache.archiva.components.cache.ehcache;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+import org.ehcache.core.spi.service.StatisticsService;
+import org.ehcache.spi.service.Service;
+import org.ehcache.spi.service.ServiceDependencies;
+import org.ehcache.spi.service.ServiceProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ *
+ * EhCache Service class that retrieves the Statistics instance.
+ *
+ * @author Martin Schreier <[email protected]>
+ */
+@ServiceDependencies( StatisticsService.class )
+public class StatisticsRetrieval implements Service
+{
+    private static final Logger log = LoggerFactory.getLogger( 
StatisticsRetrieval.class );
+
+    private StatisticsService statisticsService;
+
+    @Override
+    public void start( ServiceProvider<Service> serviceProvider) {
+        log.info( "Starting Statistics Retrieval" );
+        this.statisticsService = 
serviceProvider.getService(StatisticsService.class);
+    }
+
+    @Override
+    public void stop() {
+        this.statisticsService = null;
+    }
+
+    public StatisticsService getStatisticsService() {
+        return requireNonNull(statisticsService);
+    }
+}
diff --git 
a/spring-cache/spring-cache-providers/spring-cache-ehcache/src/test/resources/log4j2-test.xml
 
b/spring-cache/spring-cache-providers/spring-cache-ehcache/src/test/resources/log4j2-test.xml
index ab778b6..3c0b979 100644
--- 
a/spring-cache/spring-cache-providers/spring-cache-ehcache/src/test/resources/log4j2-test.xml
+++ 
b/spring-cache/spring-cache-providers/spring-cache-ehcache/src/test/resources/log4j2-test.xml
@@ -25,7 +25,7 @@
     </appenders>
     <loggers>
         <logger name="org.apache.archiva" level="warn"/>
-        <logger name="org.apache.archiva.components.cache" level="info"/>
+        <logger name="org.apache.archiva.components.cache" level="debug"/>
 
         <root level="error" includeLocation="true">
             <appender-ref ref="console"/>
diff --git 
a/spring-cache/spring-cache-providers/spring-cache-ehcache/src/test/resources/spring-context-disk.xml
 
b/spring-cache/spring-cache-providers/spring-cache-ehcache/src/test/resources/spring-context-disk.xml
index ecd9d17..012ae5f 100644
--- 
a/spring-cache/spring-cache-providers/spring-cache-ehcache/src/test/resources/spring-context-disk.xml
+++ 
b/spring-cache/spring-cache-providers/spring-cache-ehcache/src/test/resources/spring-context-disk.xml
@@ -25,6 +25,9 @@
 
 
     <bean name="cache#test-cache-int-disk" 
class="org.apache.archiva.components.cache.ehcache.EhcacheCache">
+        <constructor-arg index="0" value="java.lang.String"/>
+        <constructor-arg index="1" value="java.lang.Integer"/>
+
         <property name="diskExpiryThreadIntervalSeconds" value="600"/>
         <property name="diskPersistent" value="true"/>
         <property name="diskStorePath" 
value="./target/ehcache-test-store-disk-int"/>
diff --git 
a/spring-cache/spring-cache-providers/spring-cache-ehcache/src/test/resources/spring-context.xml
 
b/spring-cache/spring-cache-providers/spring-cache-ehcache/src/test/resources/spring-context.xml
index 688d09d..7e732f5 100644
--- 
a/spring-cache/spring-cache-providers/spring-cache-ehcache/src/test/resources/spring-context.xml
+++ 
b/spring-cache/spring-cache-providers/spring-cache-ehcache/src/test/resources/spring-context.xml
@@ -25,6 +25,8 @@
 
 
     <bean name="cache#ehcache" 
class="org.apache.archiva.components.cache.ehcache.EhcacheCache">
+        <constructor-arg index="0" value="java.lang.String"/>
+        <constructor-arg index="1" value="java.lang.Integer"/>
         <property name="diskExpiryThreadIntervalSeconds" value="600"/>
         <property name="diskPersistent" value="false"/>
         <property name="diskStorePath" value="./target/ehcache-test-store"/>
@@ -38,6 +40,8 @@
     </bean>
 
     <bean name="cache#alwaysrefresh" 
class="org.apache.archiva.components.cache.ehcache.EhcacheCache">
+        <constructor-arg index="0" value="java.lang.String"/>
+        <constructor-arg index="1" 
value="org.apache.archiva.components.cache.test.examples.wine.Wine"/>
         <property name="diskExpiryThreadIntervalSeconds" value="600"/>
         <property name="diskPersistent" value="false"/>
         <property name="diskStorePath" value="./target/ehcache-test-store"/>
@@ -51,6 +55,8 @@
     </bean>
 
     <bean name="cache#neverrefresh" 
class="org.apache.archiva.components.cache.ehcache.EhcacheCache">
+        <constructor-arg index="0" value="java.lang.String"/>
+        <constructor-arg index="1" 
value="org.apache.archiva.components.cache.test.examples.wine.Wine"/>
         <property name="diskExpiryThreadIntervalSeconds" value="600"/>
         <property name="diskPersistent" value="false"/>
         <property name="diskStorePath" value="./target/ehcache-test-store"/>
@@ -64,6 +70,8 @@
     </bean>
 
     <bean name="cache#onesecondrefresh" 
class="org.apache.archiva.components.cache.ehcache.EhcacheCache">
+        <constructor-arg index="0" value="java.lang.String"/>
+        <constructor-arg index="1" 
value="org.apache.archiva.components.cache.test.examples.wine.Wine"/>
         <property name="diskExpiryThreadIntervalSeconds" value="600"/>
         <property name="diskPersistent" value="false"/>
         <property name="diskStorePath" value="./target/ehcache-test-store"/>
@@ -77,6 +85,8 @@
     </bean>
 
     <bean name="cache#twosecondrefresh" 
class="org.apache.archiva.components.cache.ehcache.EhcacheCache">
+        <constructor-arg index="0" value="java.lang.String"/>
+        <constructor-arg index="1" 
value="org.apache.archiva.components.cache.test.examples.wine.Wine"/>
         <property name="diskExpiryThreadIntervalSeconds" value="600"/>
         <property name="diskPersistent" value="false"/>
         <property name="diskStorePath" value="./target/ehcache-test-store"/>
diff --git 
a/spring-cache/spring-cache-providers/spring-cache-hashmap/src/main/java/org/apache/archiva/components/cache/hashmap/HashMapCacheCreator.java
 
b/spring-cache/spring-cache-providers/spring-cache-hashmap/src/main/java/org/apache/archiva/components/cache/hashmap/HashMapCacheCreator.java
index 031e85b..4a2df3e 100644
--- 
a/spring-cache/spring-cache-providers/spring-cache-hashmap/src/main/java/org/apache/archiva/components/cache/hashmap/HashMapCacheCreator.java
+++ 
b/spring-cache/spring-cache-providers/spring-cache-hashmap/src/main/java/org/apache/archiva/components/cache/hashmap/HashMapCacheCreator.java
@@ -29,15 +29,15 @@ import 
org.apache.archiva.components.cache.factory.CacheCreator;
  *
  * @author <a href="mailto:[email protected]";>Joakim Erdfelt</a>
  */
-public class HashMapCacheCreator
-    implements CacheCreator
+public class HashMapCacheCreator<K,V>
+    implements CacheCreator<K,V>
 {
-    public Cache createCache( CacheHints cacheHint )
+    public Cache createCache( CacheHints cacheHint, Class<K> keyType, Class<V> 
valueType )
         throws CacheException
     {
         // Supports NO CacheHints.
 
-        HashMapCache cache = new HashMapCache( );
+        HashMapCache<K,V> cache = new HashMapCache<>( );
 
         cache.initialize( );
 
diff --git 
a/spring-cache/spring-cache-test/src/main/java/org/apache/archiva/components/cache/test/AbstractCacheTestCase.java
 
b/spring-cache/spring-cache-test/src/main/java/org/apache/archiva/components/cache/test/AbstractCacheTestCase.java
index 379e5d6..f096897 100644
--- 
a/spring-cache/spring-cache-test/src/main/java/org/apache/archiva/components/cache/test/AbstractCacheTestCase.java
+++ 
b/spring-cache/spring-cache-test/src/main/java/org/apache/archiva/components/cache/test/AbstractCacheTestCase.java
@@ -28,15 +28,14 @@ import 
org.apache.archiva.components.cache.test.examples.wine.Wine;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
-import java.util.logging.ConsoleHandler;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 /**
  * AbstractCacheTestCase
@@ -48,14 +47,16 @@ import java.util.logging.Logger;
 public abstract class AbstractCacheTestCase
     extends TestCase
 {
-    static
-    {
-        Logger logger = Logger.getLogger( "org.codehaus.plexus.cache" );
-        logger.setLevel( Level.ALL );
-        ConsoleHandler handler = new ConsoleHandler( );
-        handler.setLevel( Level.ALL );
-        logger.addHandler( handler );
-    }
+//    static
+//    {
+//        Logger logger = Logger.getLogger( "org.codehaus.plexus.cache" );
+//        logger.setLevel( Level.ALL );
+//        ConsoleHandler handler = new ConsoleHandler( );
+//        handler.setLevel( Level.ALL );
+//        logger.addHandler( handler );
+//    }
+
+    private static final Logger log = LoggerFactory.getLogger( 
AbstractCacheTestCase.class );
 
     protected Cache<String, Integer> cache;
 
@@ -85,6 +86,7 @@ public abstract class AbstractCacheTestCase
     @Test
     public void testLargePutGet( )
     {
+        log.info( "Starting test testLargePutGet" );
         EnglishNumberFormat fmt = new EnglishNumberFormat( );
 
         for ( int i = 4500; i <= 5000; i++ )
@@ -229,7 +231,7 @@ public abstract class AbstractCacheTestCase
     @Test
     public void testCacheFactory( ) throws CacheException
     {
-        Cache<String, Integer> cache = CacheFactory.getInstance( ).getCache( 
"foo-factory-test", null );
+        Cache<String, Integer> cache = CacheFactory.getInstance( ).getCache( 
"foo-factory-test", String.class, Integer.class,null );
 
         // This test is only here to ensure that the provider implements a 
Creator class.
         assertNotNull( "Cache should not be null", cache );
diff --git 
a/spring-cache/spring-cache-test/src/main/java/org/apache/archiva/components/cache/test/examples/wine/Wine.java
 
b/spring-cache/spring-cache-test/src/main/java/org/apache/archiva/components/cache/test/examples/wine/Wine.java
index 130ae6f..1f854f4 100644
--- 
a/spring-cache/spring-cache-test/src/main/java/org/apache/archiva/components/cache/test/examples/wine/Wine.java
+++ 
b/spring-cache/spring-cache-test/src/main/java/org/apache/archiva/components/cache/test/examples/wine/Wine.java
@@ -67,4 +67,24 @@ public class Wine
         sb.append( '}' );
         return sb.toString( );
     }
+
+    @Override
+    public boolean equals( Object o )
+    {
+        if ( this == o ) return true;
+        if ( o == null || getClass( ) != o.getClass( ) ) return false;
+
+        Wine wine = (Wine) o;
+
+        if ( name != null ? !name.equals( wine.name ) : wine.name != null ) 
return false;
+        return localisation != null ? localisation.equals( wine.localisation ) 
: wine.localisation == null;
+    }
+
+    @Override
+    public int hashCode( )
+    {
+        int result = name != null ? name.hashCode( ) : 0;
+        result = 31 * result + ( localisation != null ? localisation.hashCode( 
) : 0 );
+        return result;
+    }
 }

Reply via email to