package de.axone.cache.ng; import java.util.Collections; import java.util.Map; import java.util.Set; import de.axone.cache.ng.CacheNG.Cache; import de.axone.cache.ng.CacheNG.Realm; import de.axone.data.LRUCache; /** * BackendCache as implemented by a LRUCache * @author flo * * @param <K> * @param <O> */ public class CacheLRUMap<K,O> extends AbstractCache<K,O> implements CacheNG.Cache<K,O> { private final Realm<K,O> realm; private final LRUCache<K,Cache.Entry<O>> unsafeBackend; private final Map<K,Cache.Entry<O>> backend; public CacheLRUMap( Realm<K,O> realm, int maxCapacity ) { this.realm = realm; this.unsafeBackend = new LRUCache<K,Cache.Entry<O>>( maxCapacity ); this.backend = Collections.<K,Cache.Entry<O>>synchronizedMap( unsafeBackend ); } @Override public double ratio() { return -1; } @Override public String info() { return String.format( "LRU '%s' (Size: %d of %d)", realm, size(), unsafeBackend.getCapacity() ); } @Override public boolean isCached( K key ){ return backend.containsKey( key ); } @Override public Cache.Entry<O> fetchEntry( K key ){ return backend.get( key ); } @Override public void put( K key, O value ) { backend.put( key, new DefaultEntry<>( value ) ); } @Override public void invalidateEvent( K key ) { backend.remove( key ); } @Override public void invalidateAllEvent( boolean force ) { backend.clear(); } @Override public int size() { return backend.size(); } @Override public int capacity() { return unsafeBackend.getCapacity(); } @Override public Set<K> keySet() { return backend.keySet(); } @Override public Iterable<O> values() { return new IterableEntryAsValue<>( backend.values() ); } @Override public String toString(){ return backend.toString(); } }