@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 <T extends ComponentDefinition> Component doCreate(Class<T> definition, Optional<Init<T>> initEvent) { Optional<ConfigUpdate> update = Optional.absent(); return doCreate(definition, initEvent, update); }
@Override public <P extends PortType> Negative<P> required(Class<P> portType) { return getNegative(portType); }
@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 } }
logger().debug("Not scheduling component."); schedule(wid); logger().debug("Couldn't find event to schedule: wc={}", wc); wc = workCount.decrementAndGet(); count++; if (executeEvent(event, handlers.subscriptions[i])) { break; // state changed don't handle the rest of the event if ((mhandlers != null) && (mhandlers.length > 0)) { for (int i = 0; i < mhandlers.length; i++) { if (executeEvent(pe, mhandlers.subscriptions[i])) { break; // state changed don't handle the rest of the event schedule(wid);
@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(); } } } }
childrenLock.readLock().lock(); if (!children.isEmpty()) { logger().debug("Slowly dying..."); state = Component.State.STOPPING; ((PortCore<ControlPort>) getControl().getPair()).cleanEvents(); // if multiple kills are queued up just ignore everything for (ComponentCore child : children) { if (child.state() != Component.State.ACTIVE) { continue; // don't send stop events to already stopping components logger().debug("Sending Kill to child: {}", child); logger().debug("dying..."); state = Component.State.PASSIVE; ((PortCore<ControlPort>) getControl().getPair()).cleanEvents(); // if multiple kills are queued up just ignore everything component.tearDown(); if (parent != null) {
public static Map<Class<? extends PortType>, JavaPort<? extends PortType>> getNegativePorts(Component component) { return ((JavaComponent) component).getNegativePorts(); }
@Override public <T extends ComponentDefinition> Component doCreate(Class<T> definition, Optional<Init<T>> initEvent, Optional<ConfigUpdate> update) { // create an instance of the implementing component type ComponentDefinition component; childrenLock.writeLock().lock(); try { parentThreadLocal.set(this); childUpdate.set(update); component = createInstance(definition, initEvent); ComponentCore child = component.getComponentCore(); //child.workCount.incrementAndGet(); child.setScheduler(scheduler); children.add(child); return child; } catch (InstantiationException e) { throw new RuntimeException("Cannot create component " + definition.getCanonicalName(), e); } catch (IllegalAccessException e) { throw new RuntimeException("Cannot create component " + definition.getCanonicalName(), e); } catch (NoSuchMethodException e) { throw new RuntimeException("Cannot create component " + definition.getCanonicalName(), e); } catch (InvocationTargetException e) { throw new RuntimeException("Cannot create component " + definition.getCanonicalName(), e); } finally { childrenLock.writeLock().unlock(); } }
/** * Instantiates a new component definition. */ protected ComponentDefinition() { core = new JavaComponent(this); control = core.createControlPort(); loopback = core.createNegativePort(LoopbackPort.class); onSelf = loopback.getPair(); loggingCtxInit(); }
@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 } }