From e8c5caed175dfc3d81a7880a0b61285c211fca35 Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Wed, 22 Jan 2020 23:32:16 -0500 Subject: [PATCH] add configurable eviction policy to ExpirationMap --- .../collection/ExpirationEvictionPolicy.java | 7 +++++++ .../util/collection/ExpirationMap.java | 19 +++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/cobbzilla/util/collection/ExpirationEvictionPolicy.java 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(); }