package org.archive.accesscontrol; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; /** * A simple least recently used cache, with a discard policy based on maximum * entry count and cache time. Access * * @author aosborne * * @param <K> * @param <V> */ public class LruCache<K, V> extends LinkedHashMap<K, V> { private static final long serialVersionUID = 1L; private int maxEntries = 100; private long maxCacheTime = 10 * 60 * 1000; // ten minutes private Map<K, Date> refreshTimes = new HashMap<K, Date>(); protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { return size() > maxEntries || new Date().getTime() - refreshTimes.get(eldest.getKey()).getTime() > maxCacheTime; } public int getMaxEntries() { return maxEntries; } /** * Set the maximum number of entries to be stored in the cache. * * @param maxEntries */ public void setMaxEntries(int maxEntries) { this.maxEntries = maxEntries; } public long getMaxCacheTime() { return maxCacheTime; } /** * Set the maximum time in milliseconds an entry should be cached for. * * @param maxCacheTime */ public void setMaxCacheTime(long maxCacheTime) { this.maxCacheTime = maxCacheTime; } @Override public V put(K key, V value) { refreshTimes.put(key, new Date()); return super.put(key, value); } @Override public V remove(Object key) { refreshTimes.remove(key); return super.remove(key); } }