@Override public void handle(Started event) { logger().debug("Got Started event from {}", event.component); activeSet.add(event.component); logger().debug("Active set has {} members", activeSet.size()); try { childrenLock.readLock().lock(); if ((activeSet.size() == children.size()) && (state == Component.State.STARTING)) { logger().debug("Started!"); state = Component.State.ACTIVE; if (parent != null) { ((PortCore<ControlPort>) parent.getControl()).doTrigger(new Started(component.getComponentCore()), wid, component.getComponentCore()); } } } finally { childrenLock.readLock().unlock(); } }
@Override public void handle(Fault event) { ResolveAction ra = component.handleFault(event); switch (ra) { case RESOLVED: logger().info("Fault {} was resolved by user.", event); break; case IGNORE: logger().info("Fault {} was declared to be ignored by user. Resuming component...", event); markSubtreeAtAs(event.source, State.PASSIVE); event.source.control().doTrigger(Start.event, wid, JavaComponent.this); break; case DESTROY: logger().info("User declared that Fault {} should destroy component tree...", event); destroyTreeAtParentOf(event.source); logger().info("finished destroying the subtree."); break; default: escalateFault(event); } } };
@Override public void handle(Stopped event) { logger().debug("Got Stopped event from {}", event.component); activeSet.remove(event.component); logger().debug("Active set has {} members", activeSet.size()); if (activeSet.isEmpty() && (state == Component.State.STOPPING)) { logger().debug("Stopped!"); state = Component.State.PASSIVE; component.tearDown(); if (parent != null) { ((PortCore<ControlPort>) parent.getControl()).doTrigger(new Stopped(component.getComponentCore()), wid, component.getComponentCore()); } else { synchronized (component.getComponentCore()) { component.getComponentCore().notifyAll(); } } } }
@Override public void handle(Killed event) { logger().debug("Got Killed event from {}", event.component); activeSet.remove(event.component); doDestroy(event.component); logger().debug("Active set has {} members", activeSet.size()); if (activeSet.isEmpty() && (state == Component.State.STOPPING)) { logger().debug("Stopped!"); state = Component.State.PASSIVE; component.tearDown(); if (parent != null) { ((PortCore<ControlPort>) parent.getControl()).doTrigger(new Killed(component.getComponentCore()), wid, component.getComponentCore()); } else { synchronized (component.getComponentCore()) { component.getComponentCore().notifyAll(); } } } }
@Override public void handle(Start event) { if (state != Component.State.PASSIVE) { throw new KompicsException(JavaComponent.this + " received a Start event while in " + state + " state. " + "Duplicate Start events are not allowed!"); } try { childrenLock.readLock().lock(); if (!children.isEmpty()) { logger().debug("Starting..."); state = Component.State.STARTING; for (ComponentCore child : children) { logger().debug("Sending Start to child: {}", child); // start child ((PortCore<ControlPort>) child.getControl()).doTrigger( Start.event, wid, component.getComponentCore()); } } else { logger().debug("Started!"); state = Component.State.ACTIVE; if (parent != null) { ((PortCore<ControlPort>) parent.getControl()).doTrigger(new Started(component.getComponentCore()), wid, component.getComponentCore()); } } } finally { childrenLock.readLock().unlock(); } }
@SuppressWarnings("unchecked") private boolean executeEvent(KompicsEvent event, Handler<?> handler) { try { ((Handler<KompicsEvent>) handler).handle(event); return false; // no state change } catch (Throwable throwable) { logger().error("Handling an event caused a fault! Might be handled later...", throwable); markSubtreeAs(State.FAULTY); escalateFault(new Fault(throwable, this, event)); return true; // state changed } }
@Override public void escalateFault(Fault fault) { if (parent != null) { parent.control().doTrigger(fault, wid, this); } else { // StackTraceElement[] stackTrace = throwable.getStackTrace(); // System.err.println("Kompics isolated fault: " // + throwable.getMessage()); // do { // for (int i = 0; i < stackTrace.length; i++) { // System.err.println(" " + stackTrace[i]); // } // throwable = throwable.getCause(); // if (throwable != null) { // stackTrace = throwable.getStackTrace(); // System.err.println("Caused by: " + throwable + ": " // + throwable.getMessage()); // } // } while (throwable != null); logger().error("A fault was escalated to the root component: \n{} \n\n", fault); Kompics.handleFault(fault); // System.exit(1); } }
childrenLock.readLock().lock(); if (!children.isEmpty()) { logger().debug("Stopping..."); state = Component.State.STOPPING; for (ComponentCore child : children) { continue; // don't send stop events to already stopping components logger().debug("Sending Stop to child: {}", child); logger().debug("Stopped!"); state = Component.State.PASSIVE; component.tearDown();
@SuppressWarnings("unchecked") private boolean executeEvent(PatternExtractor<?, ?> event, MatchedHandler<?, ?, ?> handler) { try { PatternExtractor<?, Object> pe = (PatternExtractor<?, Object>) event; MatchedHandler<?, Object, PatternExtractor<?, Object>> h = (MatchedHandler<?, Object, PatternExtractor<?, Object>>) handler; h.handle(pe.extractValue(), pe); return false; // no state change } catch (Throwable throwable) { logger().error("Handling an event caused a fault! Might be handled later...", throwable); markSubtreeAs(State.FAULTY); escalateFault(new Fault(throwable, this, event)); return true; // state changed } }
childrenLock.readLock().lock(); if (!children.isEmpty()) { logger().debug("Slowly dying..."); state = Component.State.STOPPING; continue; // don't send stop events to already stopping components logger().debug("Sending Kill to child: {}", child); logger().debug("dying..."); state = Component.State.PASSIVE;