package de.axone.cache.ng; import de.axone.cache.ng.CacheNG.Cache; public class CacheWrapperWatched<K,O> extends CacheWrapper<K,O> { private long hits, misses; public synchronized void hit(){ hits++; } public synchronized void miss(){ misses++; } public synchronized long hits(){ return hits; } public synchronized long misses(){ return misses; } public synchronized long accesses(){ return hits+misses; } public CacheWrapperWatched( Cache<K, O> wrapped ) { super( wrapped ); } @Override public synchronized double ratio() { long sum = hits+misses; if( sum == 0 ) return 0; return (double)hits/sum; } @Override public CacheNG.Cache.Entry<O> fetchEntry( K key ) { CacheNG.Cache.Entry<O> result = super.fetchEntry( key ); if( result == null ) miss(); else hit(); return result; } @Override public O fetch( K key ) { O result = super.fetch( key ); if( result == null ) miss(); else hit(); return result; } @Override public String info() { return super.info() + String.format( ", Hits: %d/%d = %.2f%%", hits(), accesses(), Math.round( ratio() *1000 )/10.0 ); } }