@@ -11,6 +11,8 @@ import java.util.Map; | |||||
import java.util.Set; | import java.util.Set; | ||||
import java.util.concurrent.ConcurrentHashMap; | import java.util.concurrent.ConcurrentHashMap; | ||||
import java.util.concurrent.TimeUnit; | import java.util.concurrent.TimeUnit; | ||||
import java.util.function.BiFunction; | |||||
import java.util.function.Function; | |||||
import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||
import static org.cobbzilla.util.daemon.ZillaRuntime.notSupported; | import static org.cobbzilla.util.daemon.ZillaRuntime.notSupported; | ||||
@@ -92,6 +94,20 @@ public class ExpirationMap<K, V> implements Map<K, V> { | |||||
return map.values().stream().map(v -> v.value).collect(Collectors.toList()); | return map.values().stream().map(v -> v.value).collect(Collectors.toList()); | ||||
} | } | ||||
@Override public V putIfAbsent(K key, V value) { | |||||
final ExpirationMapEntry<V> val = map.putIfAbsent(key, new ExpirationMapEntry<>(value)); | |||||
return val == null ? null : val.value; | |||||
} | |||||
@Override public V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) { | |||||
return map.computeIfAbsent(key, k -> new ExpirationMapEntry<>(mappingFunction.apply(k))).value; | |||||
} | |||||
@Override public V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) { | |||||
final ExpirationMapEntry<V> found = map.computeIfPresent(key, (k, vExpirationMapEntry) -> new ExpirationMapEntry<>(remappingFunction.apply(k, vExpirationMapEntry.value))); | |||||
return found == null ? null : found.value; | |||||
} | |||||
@AllArgsConstructor | @AllArgsConstructor | ||||
private static class EMEntry<K, V> implements Entry<K, V> { | private static class EMEntry<K, V> implements Entry<K, V> { | ||||
@Getter private K key; | @Getter private K key; | ||||
@@ -330,7 +330,15 @@ public class ZillaRuntime { | |||||
final StringBuilder b = new StringBuilder(); | final StringBuilder b = new StringBuilder(); | ||||
for (Object thing : things) { | for (Object thing : things) { | ||||
if (b.length() > 0) b.append("\t"); | 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()); | return sha256_hex(b.toString()); | ||||
} | } | ||||
@@ -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_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_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 = 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_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_YYYY_MM_DD_HH = DateTimeFormat.forPattern("yyyy-MM-dd-HH"); | ||||
public static final DateTimeFormatter DATE_FORMAT_HYPHEN_MMDDYYYY = DateTimeFormat.forPattern("MM-dd-yyyy"); | public static final DateTimeFormatter DATE_FORMAT_HYPHEN_MMDDYYYY = DateTimeFormat.forPattern("MM-dd-yyyy"); | ||||