package org.eclipse.orion.server.cf; import java.util.*; public class ExpiryCache<T> { Map<Object, Expirable<T>> cache = Collections.synchronizedMap(new HashMap<Object, Expirable<T>>()); private int maxSize; private int expires_ms; static class Expirable<T> { T value; long expires; public Expirable(T value, long expires) { this.value = value; this.expires = expires; } public boolean valid() { return System.currentTimeMillis() < expires; } } public ExpiryCache(int maxSize, int expires_ms) { this.maxSize = maxSize; this.expires_ms = expires_ms; } public T get(Object key) { Expirable<T> expirable = cache.get(key); if (expirable != null) { if (expirable.valid()) { return expirable.value; } else { cache.remove(key); } } return null; } public void put(Object key, T value) { synchronized (cache) { if (cache.size() > maxSize) { for (Iterator<Expirable<T>> it = cache.values().iterator(); it.hasNext();) { Expirable<T> expirable = it.next(); if (!expirable.valid()) { it.remove(); } } if (cache.size() > maxSize) { cache.clear(); } } cache.put(key, new Expirable<T>(value, System.currentTimeMillis() + expires_ms)); } } public void remove(Object key) { cache.remove(key); } }