package com.workshare.msnos.soup;
import java.util.Collections;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ShutdownHooks {
private static Logger log = LoggerFactory.getLogger(ShutdownHooks.class);
public static interface Hook extends Runnable {
public String name();
public int priority();
}
public static Set<Hook> hooks = Collections.<Hook> synchronizedSet(new TreeSet<Hook>(new Comparator<Hook>() {
@Override
public int compare(Hook h1, Hook h2) {
final int pri2 = h2.priority();
final int pri1 = h1.priority();
return (pri1 < pri2 ? 1 : (pri1 == pri2 ? 0 : -1));
}
}));
static {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
onShutdown();
}
});
}
public static Hook addHook(Hook hook) {
log.debug("Adding hook: {}", hook.name());
hooks.add(hook);
return hook;
}
public static void removeHook(Hook hook) {
log.debug("Removing hook: {}", hook.name());
hooks.remove(hook);
}
public static void clearAll() {
log.warn("Removing ALL hooks - sure about that?");
hooks.clear();
}
static void onShutdown() {
synchronized (hooks) {
for (Hook hook : hooks) {
try {
log.debug("Running hook: {}", hook.name());
hook.run();
} catch (Throwable ex) {
log.warn("Unexpected exception while running hook " + hook, ex);
}
}
}
}
}