package org.jumpmind.util; import java.io.Serializable; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class KeyedCache<K, T> implements Serializable { private static final long serialVersionUID = 1L; long timeoutTimeInMs; long lastRefreshTimeMs = 0; protected LinkedHashMap<K, T> keyedCache = new LinkedHashMap<K, T>(); protected IRefreshCache<K, T> refresher; public KeyedCache(long timeoutTimeInMs, IRefreshCache<K, T> refresher) { this.timeoutTimeInMs = timeoutTimeInMs; this.refresher = refresher; } public boolean containsKey(String key) { refreshCacheIfNeeded(false); return keyedCache.containsKey(key); } public T find(K key, boolean refreshCache) { refreshCacheIfNeeded(refreshCache); return keyedCache.get(key); } public List<T> getAll(boolean refreshCache) { refreshCacheIfNeeded(refreshCache); return new ArrayList<T>(keyedCache.values()); } public void clear() { lastRefreshTimeMs = 0; } protected void refreshCacheIfNeeded(boolean refreshCache) { Map<K, T> copy = keyedCache; if (copy == null || refreshCache || (System.currentTimeMillis() - lastRefreshTimeMs) > timeoutTimeInMs) { synchronized (this) { if (copy == null || refreshCache || (System.currentTimeMillis() - lastRefreshTimeMs) > timeoutTimeInMs) { refreshCache(); } } } } protected void refreshCache() { keyedCache = refresher.refresh(); lastRefreshTimeMs = System.currentTimeMillis(); } public interface IRefreshCache<K, T> { public LinkedHashMap<K, T> refresh(); } }