diff --git a/src/main/java/org/cobbzilla/util/collection/ExpirationEvictionPolicy.java b/src/main/java/org/cobbzilla/util/collection/ExpirationEvictionPolicy.java new file mode 100644 index 0000000..9ebadc7 --- /dev/null +++ b/src/main/java/org/cobbzilla/util/collection/ExpirationEvictionPolicy.java @@ -0,0 +1,7 @@ +package org.cobbzilla.util.collection; + +public enum ExpirationEvictionPolicy { + + ctime_or_atime, ctime, atime + +} diff --git a/src/main/java/org/cobbzilla/util/collection/ExpirationMap.java b/src/main/java/org/cobbzilla/util/collection/ExpirationMap.java index 1fb1a94..f0c5112 100644 --- a/src/main/java/org/cobbzilla/util/collection/ExpirationMap.java +++ b/src/main/java/org/cobbzilla/util/collection/ExpirationMap.java @@ -32,13 +32,18 @@ public class ExpirationMap implements Map { return this; } + @Getter @Setter private ExpirationEvictionPolicy evictionPolicy = ExpirationEvictionPolicy.ctime_or_atime; private long lastCleaned = 0; - public ExpirationMap() { - this.map = new ConcurrentHashMap<>(); - } + public ExpirationMap() { this.map = new ConcurrentHashMap<>(); } + public ExpirationMap(long val) { this(); setExpirations(val); } + public ExpirationMap(long val, ExpirationEvictionPolicy evictionPolicy) { + this(val); + this.evictionPolicy = evictionPolicy; + } + @Accessors(chain=true) private class ExpirationMapEntry { public final VAL value; @@ -47,7 +52,13 @@ public class ExpirationMap implements Map { public ExpirationMapEntry(VAL value) { this.value = value; } public ExpirationMapEntry touch() { atime = now(); return this; } - public boolean expired() { return now() > ctime+maxExpiration || now() > atime+expiration; } + public boolean expired() { + switch (evictionPolicy) { + case ctime_or_atime: default: return now() > ctime+maxExpiration || now() > atime+expiration; + case atime: return now() > atime+expiration; + case ctime: return now() > ctime+expiration; + } + } } @Override public int size() { return map.size(); }