@Override public Negative<ControlPort> createControlPort() { negativeControl = new JavaPort<ControlPort>(false, PortType.getPortType(ControlPort.class), this); positiveControl = new JavaPort<ControlPort>(true, PortType.getPortType(ControlPort.class), parent); positiveControl.setPair(negativeControl); negativeControl.setPair(positiveControl); negativeControl.doSubscribe(handleStart); negativeControl.doSubscribe(handleStop); negativeControl.doSubscribe(handleKill); negativeControl.doSubscribe(handleStarted); negativeControl.doSubscribe(handleStopped); negativeControl.doSubscribe(handleKilled); negativeControl.doInternalSubscribe(handleFault); negativeControl.doInternalSubscribe(configHandler); return negativeControl; }
@Override protected void cleanPorts() { for (JavaPort<? extends PortType> port : negativePorts.values()) { port.cleanChannels(); } for (JavaPort<? extends PortType> port : positivePorts.values()) { port.cleanChannels(); } }
@Override public <P extends PortType> Negative<P> createNegativePort(Class<P> portType) { JavaPort<P> negativePort = new JavaPort<P>(false, PortType.getPortType(portType), this); JavaPort<P> positivePort = new JavaPort<P>(true, PortType.getPortType(portType), parent); negativePort.setPair(positivePort); positivePort.setPair(negativePort); Positive<?> existing = positivePorts.put(portType, positivePort); if (existing != null) { throw new RuntimeException("Cannot create multiple negative " + portType.getCanonicalName()); } return negativePort; }
if (caller != null) { delivered = deliverToCallerChannel(event, wid, caller); ComponentCore component = pe.getComponent(); if (component == owner) { delivered = deliverToSubscribers(event, wid, eventType); } else { delivered = deliverToSubscribers(event, wid, eventType); delivered |= deliverToChannels(event, wid); delivered = deliverToSubscribers(event, wid, eventType); } else { delivered = deliverToSubscribers(event, wid, eventType); delivered |= deliverToChannels(event, wid);
@Override public void doTrigger(KompicsEvent event, int wid, ChannelCore<?> channel) { //System.out.println(this.getClass()+": "+event+" triggert from "+channel); if (event instanceof Request) { Request request = (Request) event; request.pushPathElement(channel); } pair.deliver(event, wid); }
protected final void unsubscribe(MatchedHandler<?, ?, ?> handler, Port port) { if (port instanceof JavaPort) { JavaPort p = (JavaPort) port; p.doUnsubscribe(handler); } else { throw new ConfigurationException("Port (" + port.toString() + " is not an instance of JavaPort!" + "Handler unsubscription only works with matching ports and components"); } }
/** * Subscribe. * * @param handler the handler * @param port the port * @throws ConfigurationException */ protected final <E extends KompicsEvent, P extends PortType> void subscribe( Handler<E> handler, Port<P> port) { if (port instanceof JavaPort) { JavaPort<P> p = (JavaPort<P>) port; p.doSubscribe(handler); } else { throw new ConfigurationException("Port (" + port.toString() + " is not an instance of JavaPort!" + "Handler subscription only works in Java"); } }
public static <P extends PortType> JavaPort<P> createJavaPort(boolean positive, P portType, ComponentCore owner) { return new JavaPort<P>(positive, portType, owner); } }
private boolean deliverToSubscribers(KompicsEvent event, int wid, Class<? extends KompicsEvent> eventType) { //Kompics.logger.debug("{}: trying to deliver {} to subscribers...", owner, event); if (handlers.hasSubscription(event)) { doDeliver(event, wid); return true; } //Kompics.logger.debug("{}: Couldn't deliver {}, no matching subscribers", owner.getComponent(), event); return false; }
@Override public <P extends PortType> Positive<P> createPositivePort(Class<P> portType) { JavaPort<P> negativePort = new JavaPort<P>(false, PortType.getPortType(portType), parent); JavaPort<P> positivePort = new JavaPort<P>(true, PortType.getPortType(portType), this); negativePort.setPair(positivePort); positivePort.setPair(negativePort); Negative<?> existing = negativePorts.put(portType, negativePort); if (existing != null) { throw new RuntimeException("Cannot create multiple positive " + portType.getCanonicalName()); } return positivePort; }
@Override public void doTrigger(KompicsEvent event, int wid, ComponentCore component) { //System.out.println(this.getClass()+": "+event+" triggert from "+component); if (event instanceof Request) { Request request = (Request) event; request.pushPathElement(component); } pair.deliver(event, wid); }
/** * Unsubscribe. * * @param handler the handler * @param port the port * @throws ConfigurationException */ protected final <E extends KompicsEvent, P extends PortType> void unsubscribe( Handler<E> handler, Port<P> port) throws ConfigurationException { if (port instanceof JavaPort) { JavaPort<P> p = (JavaPort<P>) port; p.doUnsubscribe(handler); } else { throw new ConfigurationException("Port (" + port.toString() + " is not an instance of JavaPort!" + "Handler (un)subscription only works in Java"); } }
protected final void subscribe(MatchedHandler<?, ?, ?> handler, Port port) { if (port instanceof JavaPort) { JavaPort p = (JavaPort) port; if (p.owner.equals(this.core)) { p.doSubscribe(handler); } else { throw new ConfigurationException( "Cannot subscribe Handlers to other component's ports, " + "since the behaviour of this is unspecifed. " + "(The handler might be executed on the wrong thread)"); } } else { throw new ConfigurationException("Port (" + port.toString() + " is not an instance of JavaPort!" + "Handler subscription only works with matching ports and components"); } }