diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/example/DinerosTestNode.java b/src/main/java/de/tudresden/inf/st/pnml/engine/example/DinerosTestNode.java index 266a0f3d7cbe0c65b6fcc1bf337e47e9cc41a51d..0d269d85256d54eea944069c2e8cff8b2f22638d 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/example/DinerosTestNode.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/example/DinerosTestNode.java @@ -16,7 +16,8 @@ public class DinerosTestNode extends DiNeRosNode { super(nodeName, petriNet, "localhost", "mqtt"); } - public DinerosTestNode(String nodeName, PetriNet petriNet, BalloonMarking marking, BalloonCallbackStorage callbackStorage) { + public DinerosTestNode(String nodeName, PetriNet petriNet, BalloonMarking marking, + BalloonCallbackStorage callbackStorage) { super(nodeName, petriNet, "localhost", "mqtt"); this.marking = marking; this.callbackStorage = callbackStorage; diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java index 5e4ecf9fd8febab2dfec9d8dbdd15aa4daa4b344..8f32ae7e01cfd09e034ff70253c0b6c2128e58f1 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java @@ -38,7 +38,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain { protected BalloonMarking marking; public BalloonCallbackStorage callbackStorage; protected ConnectedNode connectedNode; - protected InputSignalConnector inputSignalConnector = new InputSignalConnector(); + protected InputSignalConnector inputSignalConnector; private boolean stopNode = false; private final Map<DinerosPlace, Publisher<String>> dinerosPublishers = new HashMap<>(); @@ -52,6 +52,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain { try { marking = petriNet.initializeBalloonMarking(); callbackStorage = petriNet.initializeCallbackStorage(); + inputSignalConnector = new InputSignalConnector(); PetriNetInitializer.initInputSignalConnections(petriNet, rcHost, gcProtocol, inputSignalConnector, this); } catch (IOException | SAXException | ParserConfigurationException e) { e.printStackTrace(); @@ -63,14 +64,22 @@ public abstract class DiNeRosNode extends AbstractNodeMain { List<Map<java.lang.String, Object>>> processTokenFunction) { TransitionHandler transitionHandler = new TransitionHandler(priority, processTokenFunction); + integrateHandler(transitionId, transitionHandler); + } + + public void registerHandler(java.lang.String transitionId, TransitionHandler transitionHandler) { - if(petriNet.getTransitionById(transitionId) == null){ + integrateHandler(transitionId, transitionHandler); + } + + private void integrateHandler(java.lang.String transitionId, TransitionHandler transitionHandler) { + if (petriNet.getTransitionById(transitionId) == null) { return; } BalloonTransition balloonTransition = callbackStorage.resolveBalloonTransition(petriNet.getTransitionById(transitionId)); - if(balloonTransition == null){ + if (balloonTransition == null) { return; } @@ -315,6 +324,12 @@ public abstract class DiNeRosNode extends AbstractNodeMain { = petriNet.getChannelElemensByKey(PnmlConstants.CHANNEL_PLACE_TYPE_SERVER_REQ_KEY); for (java.lang.String key : channelServerReqElementMap.keySet()) { + + if(petriNet.getPlaceById(channelServerReqElementMap.get(key).get(0)) == null){ + System.out.println("Skipping service request place: " + channelServerReqElementMap.get(key).get(0)); + continue; + } + for (Page p : petriNet.allPages()) { if (p.getServiceName() != null && p.getServiceName().equals(key)) { // service names are unique so we basically have a 1:1 mapping @@ -414,9 +429,11 @@ public abstract class DiNeRosNode extends AbstractNodeMain { for (java.lang.String key : channelPubElementMap.keySet()) { for (java.lang.String placeId : channelPubElementMap.get(key)) { - System.out.println("[" + nodeName + "] Initializing publisher on " + placeId); - final Publisher<String> publisher = connectedNode.newPublisher(key, String._TYPE); - dinerosPublishers.put(petriNet.getPlaceById(placeId).asDinerosPlace(), publisher); + if(petriNet.getPlaceById(placeId) != null) { + System.out.println("[" + nodeName + "] Initializing publisher on " + placeId); + final Publisher<String> publisher = connectedNode.newPublisher(key, String._TYPE); + dinerosPublishers.put(petriNet.getPlaceById(placeId).asDinerosPlace(), publisher); + } } } @@ -427,22 +444,24 @@ public abstract class DiNeRosNode extends AbstractNodeMain { for (java.lang.String key : channelSubElementMap.keySet()) { for (java.lang.String placeId : channelSubElementMap.get(key)) { + if(petriNet.getPlaceById(placeId) != null) { - DinerosPlace targetPlace = petriNet.getPlaceById(placeId).asDinerosPlace(); - Subscriber<String> subscriber = connectedNode.newSubscriber(key, String._TYPE); + DinerosPlace targetPlace = petriNet.getPlaceById(placeId).asDinerosPlace(); + Subscriber<String> subscriber = connectedNode.newSubscriber(key, String._TYPE); - subscriber.addMessageListener(message -> { + subscriber.addMessageListener(message -> { - BalloonToken bt = new BalloonToken(); - bt.setValue(message.getData()); - bt.setCreationTime(System.currentTimeMillis()); + BalloonToken bt = new BalloonToken(); + bt.setValue(message.getData()); + bt.setCreationTime(System.currentTimeMillis()); - BalloonMarkedPlace bmp = marking.resolveBalloonPlace(targetPlace); - bmp.getBalloonMarkingList().add(bt); - petriNet.flushTreeCache(); - this.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_MARKING_CHANGE)); + BalloonMarkedPlace bmp = marking.resolveBalloonPlace(targetPlace); + bmp.getBalloonMarkingList().add(bt); + petriNet.flushTreeCache(); + this.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_MARKING_CHANGE)); - }, petriNet.getChannelElementLimitById(placeId)); + }, petriNet.getChannelElementLimitById(placeId)); + } } } diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/transform/PetriNetInitializer.java b/src/main/java/de/tudresden/inf/st/pnml/engine/transform/PetriNetInitializer.java index f36c3af5abc05a497082356e0c76d8c771c8d293..319861167dc8c19e5bedec4c0e1c25d86a82741a 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/transform/PetriNetInitializer.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/transform/PetriNetInitializer.java @@ -78,25 +78,37 @@ public class PetriNetInitializer { target.setMutableTransitionInformation(tri); } + private static boolean signalIsUsed(PetriNet petriNet, String signalId){ + for(DinerosTransition t : petriNet.allDinerosTransitions()){ + if(t.getStaticTransitionInformation(). + asSignalTransitionInformation().getClause().hasLiteral(signalId)){ + return true; + } + } + return false; + } + public static void initInputSignalConnections(PetriNet petriNet, String host, String protocol, InputSignalConnector inputSignalConnector, DiNeRosNode node) throws IOException { - for(String signalId : petriNet.getInputSignalDefinition().keySet()){ - - // mqtt connections - SignalConnection sc = new SignalConnection(); - sc.setCurrentValue(Boolean.parseBoolean(petriNet.getInputSignalDefinition().get(signalId))); - sc.setId(signalId); - inputSignalConnector.addSignalConnection(sc); - sc.connectCurrentValue(protocol + "://" + host + "/" + signalId); - - // internal java connections - sc.connectCurrentValue("java://localhost:00/" + signalId, false); - //inputSignalConnector.ragconnectJavaRegisterConsumer("java://localhost:00/" + signalId, - // bytes -> node.notify(DiNeRosNode.NOTIFICATION_SIGNAL_CHANGE)); - - inputSignalConnector.ragconnectJavaRegisterConsumer(signalId, bytes -> notifyOnSignalChange(node)); + if(signalIsUsed(petriNet, signalId)) { + // mqtt connections + SignalConnection sc = new SignalConnection(); + sc.setCurrentValue(Boolean.parseBoolean(petriNet.getInputSignalDefinition().get(signalId))); + sc.setId(signalId); + inputSignalConnector.addSignalConnection(sc); + sc.connectCurrentValue(protocol + "://" + host + "/" + signalId); + + // internal java connections + sc.connectCurrentValue("java://localhost:00/" + signalId, false); + //inputSignalConnector.ragconnectJavaRegisterConsumer("java://localhost:00/" + signalId, + // bytes -> node.notify(DiNeRosNode.NOTIFICATION_SIGNAL_CHANGE)); + + inputSignalConnector.ragconnectJavaRegisterConsumer(signalId, bytes -> notifyOnSignalChange(node)); + } else { + System.out.println("Skipping unused signal: " + signalId); + } } }