diff --git a/src/main/java/org/cobbzilla/util/collection/ExpirationMap.java b/src/main/java/org/cobbzilla/util/collection/ExpirationMap.java index b01d9f5..61de175 100644 --- a/src/main/java/org/cobbzilla/util/collection/ExpirationMap.java +++ b/src/main/java/org/cobbzilla/util/collection/ExpirationMap.java @@ -11,6 +11,8 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; +import java.util.function.BiFunction; +import java.util.function.Function; import java.util.stream.Collectors; import static org.cobbzilla.util.daemon.ZillaRuntime.notSupported; @@ -92,6 +94,20 @@ public class ExpirationMap implements Map { return map.values().stream().map(v -> v.value).collect(Collectors.toList()); } + @Override public V putIfAbsent(K key, V value) { + final ExpirationMapEntry val = map.putIfAbsent(key, new ExpirationMapEntry<>(value)); + return val == null ? null : val.value; + } + + @Override public V computeIfAbsent(K key, Function mappingFunction) { + return map.computeIfAbsent(key, k -> new ExpirationMapEntry<>(mappingFunction.apply(k))).value; + } + + @Override public V computeIfPresent(K key, BiFunction remappingFunction) { + final ExpirationMapEntry found = map.computeIfPresent(key, (k, vExpirationMapEntry) -> new ExpirationMapEntry<>(remappingFunction.apply(k, vExpirationMapEntry.value))); + return found == null ? null : found.value; + } + @AllArgsConstructor private static class EMEntry implements Entry { @Getter private K key; diff --git a/src/main/java/org/cobbzilla/util/daemon/ZillaRuntime.java b/src/main/java/org/cobbzilla/util/daemon/ZillaRuntime.java index a5c3bbe..481f2ad 100644 --- a/src/main/java/org/cobbzilla/util/daemon/ZillaRuntime.java +++ b/src/main/java/org/cobbzilla/util/daemon/ZillaRuntime.java @@ -330,7 +330,15 @@ public class ZillaRuntime { final StringBuilder b = new StringBuilder(); for (Object thing : things) { if (b.length() > 0) b.append("\t"); - b.append(thing == null ? "null" : (thing instanceof Object[]) ? Arrays.deepHashCode((Object[]) thing) : thing.hashCode()); + if (thing == null) { + b.append("null"); + } else if (thing instanceof String) { + b.append(thing); + } else if (thing instanceof Object[]) { + b.append(Arrays.deepHashCode((Object[]) thing)); + } else { + b.append(thing.hashCode()); + } } return sha256_hex(b.toString()); } diff --git a/src/main/java/org/cobbzilla/util/time/TimeUtil.java b/src/main/java/org/cobbzilla/util/time/TimeUtil.java index 0b4a55a..9b830aa 100644 --- a/src/main/java/org/cobbzilla/util/time/TimeUtil.java +++ b/src/main/java/org/cobbzilla/util/time/TimeUtil.java @@ -29,6 +29,7 @@ public class TimeUtil { public static final DateTimeFormatter DATE_FORMAT_YYYY_MMM_DD = DateTimeFormat.forPattern("yyyy MMM dd"); public static final DateTimeFormatter DATE_FORMAT_MMM_DD_YYYY = DateTimeFormat.forPattern("MMM dd, yyyy"); public static final DateTimeFormatter DATE_FORMAT_YYYY_MM_DD_HH_mm_ss = DateTimeFormat.forPattern("yyyy-MM-dd-HH-mm-ss"); + public static final DateTimeFormatter DATE_FORMAT_YYYY_MM_DD_HH_mm_ss_SSS = DateTimeFormat.forPattern("yyyy-MM-dd-HH-mm-ss-SSS"); public static final DateTimeFormatter DATE_FORMAT_YYYYMMDDHHMMSS = DateTimeFormat.forPattern("yyyyMMddHHmmss"); public static final DateTimeFormatter DATE_FORMAT_YYYY_MM_DD_HH = DateTimeFormat.forPattern("yyyy-MM-dd-HH"); public static final DateTimeFormatter DATE_FORMAT_HYPHEN_MMDDYYYY = DateTimeFormat.forPattern("MM-dd-yyyy");