diff --git a/src/main/java/org/cobbzilla/util/daemon/ZillaRuntime.java b/src/main/java/org/cobbzilla/util/daemon/ZillaRuntime.java index f9ac33d..830aad2 100644 --- a/src/main/java/org/cobbzilla/util/daemon/ZillaRuntime.java +++ b/src/main/java/org/cobbzilla/util/daemon/ZillaRuntime.java @@ -170,12 +170,12 @@ public class ZillaRuntime { throw e; } - public static String shortErrorString(Exception e) { return e.getClass().getName()+": "+e.getMessage(); } + public static String shortError(Exception e) { return e.getClass().getName()+": "+e.getMessage(); } public static String errorString(Exception e) { return errorString(e, 1000); } public static String errorString(Exception e, int maxlen) { - return truncate(shortErrorString(e)+"\n"+ getStackTrace(e), maxlen); + return truncate(shortError(e)+"\n"+ getStackTrace(e), maxlen); } public static boolean empty(String s) { return s == null || s.length() == 0; } diff --git a/src/main/java/org/cobbzilla/util/system/OneWayFlag.java b/src/main/java/org/cobbzilla/util/system/OneWayFlag.java new file mode 100644 index 0000000..6e34f1c --- /dev/null +++ b/src/main/java/org/cobbzilla/util/system/OneWayFlag.java @@ -0,0 +1,45 @@ +package org.cobbzilla.util.system; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.Callable; +import java.util.concurrent.atomic.AtomicBoolean; + +import static org.cobbzilla.util.daemon.ZillaRuntime.shortError; + +/** + * Wraps an Atomic Boolean that can only go from false to true. + * Useful when you have a state where checking the current status is expensive, + * but once some condition evaluates to true, it is true forever thereafter. + */ +@Slf4j +public class OneWayFlag extends AtomicBoolean { + + private final String name; + private final Callable check; + + public OneWayFlag(String name, Callable check) { + this.name = name; + this.check = check; + try { + set(check.call()); + } catch (Exception e) { + log.warn("OneWayFlag("+name+") constructor check failed (evaluates to false): "+shortError(e)); + set(false); + } + } + + public boolean check () { + if (get()) return true; + final Boolean ok; + try { + ok = check.call(); + } catch (Exception e) { + log.warn("OneWayFlag("+name+") check failed (evaluates to false): "+shortError(e)); + return false; + } + if (ok) set(true); + return ok; + } + +}