/** * Adds a handler to the Lifecycle and starts it if the lifecycle has already been started. * * @param handler The hander to add to the lifecycle * @param stage The stage to add the lifecycle at * @throws Exception an exception thrown from handler.start(). If an exception is thrown, the * handler is *not* added */ public void addMaybeStartHandler(Handler handler, Stage stage) throws Exception { synchronized (handlers) { if (started.get()) { if (currStage == null || stage.compareTo(currStage) < 1) { handler.start(); } } handlers.get(stage).add(handler); } }
public void start() throws Exception { synchronized (handlers) { started.set(true); for (Stage stage : stagesOrdered()) { currStage = stage; for (Handler handler : handlers.get(stage)) { handler.start(); } } } }
/** * Removes the range between start and end from the given exception handlers. * * @param h an exception handler list. * @param start the start of the range to be removed. * @param end the end of the range to be removed. Maybe null. * @return the exception handler list with the start-end range removed. */ static Handler remove(Handler h, Label start, Label end) { if (h == null) { return null; } else { h.next = remove(h.next, start, end); } int hstart = h.start.position; int hend = h.end.position; int s = start.position; int e = end == null ? Integer.MAX_VALUE : end.position; // if [hstart,hend[ and [s,e[ intervals intersect... if (s < hend && e > hstart) { if (s <= hstart) { if (e >= hend) { // [hstart,hend[ fully included in [s,e[, h removed h = h.next; } else { // [hstart,hend[ minus [s,e[ = [e,hend[ h.start = end; } } else if (e >= hend) { // [hstart,hend[ minus [s,e[ = [hstart,s[ h.end = start; } else { // [hstart,hend[ minus [s,e[ = [hstart,s[ + [e,hend[ Handler g = new Handler(); g.start = end; g.end = h.end; g.handler = h.handler; g.desc = h.desc; g.type = h.type; g.next = h.next; h.end = start; h.next = g; } } return h; }