package hello.dcsms.omzen.coverflu;
import java.util.LinkedHashMap;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class DataCache<K, E> {
private int mCapacity;
private LinkedHashMap<K, E> mCache;
private final ReadWriteLock mReadWriteLock = new ReentrantReadWriteLock();
public DataCache(int capacity) {
mCapacity = capacity;
mCache = new LinkedHashMap<K, E>(mCapacity) {
private static final long serialVersionUID = -9165777183357349715L;
@Override
protected boolean removeEldestEntry(Entry<K, E> eldest) {
if (size() > mCapacity) {
mReadWriteLock.writeLock().lock();
remove(eldest.getKey());
mReadWriteLock.writeLock().unlock();
}
return false;
}
};
}
public E objectForKey(K key) {
mReadWriteLock.readLock().lock();
final E result = mCache.get(key);
// android.util.Log.i("DataCache", "get key: " + key.toString() + " " +
// result);
mReadWriteLock.readLock().unlock();
return result;
}
public void putObjectForKey(final K key, final E value) {
if (key != null && value != null) {
mReadWriteLock.writeLock().lock();
mCache.put(key, value);
// android.util.Log.i("DataCache", "put key: " + key.toString() +
// " " + value.toString());
mReadWriteLock.writeLock().unlock();
}
}
public boolean containsKey(final K key) {
mReadWriteLock.readLock().lock();
final boolean result = mCache.containsKey(key);
mReadWriteLock.readLock().unlock();
return result;
}
public void clear() {
mReadWriteLock.writeLock().lock();
mCache.clear();
mReadWriteLock.writeLock().unlock();
}
public void setCapacity(int capacity) {
mCapacity = capacity;
}
}