package dk.thoerup.traininfoservice.banedk; import java.util.ArrayList; import java.util.Collection; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; public class TimeoutMap implements Map{ class CacheItem { public CacheItem(T v) { value = v; lastupdate = System.currentTimeMillis(); } public long lastupdate; public T value; } private ConcurrentHashMap> cache = new ConcurrentHashMap>(); private long timeout; public TimeoutMap(int timeout) { this.timeout = timeout; } @Override public void clear() { cache.clear(); } @Override public boolean containsKey(Object key) { return cache.containsKey(key); } @Override public boolean containsValue(Object arg0) { //return values().contains(arg0); throw new UnsupportedOperationException(); } @Override public Set> entrySet() { //TODO someday implement this throw new UnsupportedOperationException(); } @Override public boolean isEmpty() { return cache.isEmpty(); } @Override public Set keySet() { return cache.keySet(); } @Override public void putAll(Map arg0) { for(K key : arg0.keySet()) { this.put(key, arg0.get(key) ); } } @Override public V remove(Object arg0) { return cache.remove(arg0).value; } @Override public int size() { return cache.size(); } @Override public Collection values() { ArrayList values = new ArrayList(); for (CacheItem item : cache.values()) { values.add( item.value ); } return values; } @Override public V get(Object key) { long now = System.currentTimeMillis(); CacheItem item = cache.get(key); if (item != null) { if ( (item.lastupdate+timeout) < now) { //item too old return null; } else { return item.value; //item still good } } else { return null; // no item found } } @Override public V put(K key, V value) { CacheItem item= new CacheItem(value); item = cache.put(key, item); if (item != null) return item.value; else return null; } }