diff --git a/build.gradle b/build.gradle index 336f5bbfa8cc158893aa58864f95cdb8e4fa8e5a..b52774b9140029264c09280f35519450a67fe876 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { } group 'de.tudresden.inf.st' -version '0.1' +version '1.0' apply plugin: 'java' apply plugin: 'java-library' @@ -46,17 +46,72 @@ jar { } -task fatJar(type: Jar) { - dependsOn jar +task jarSubscriberNode(type: Jar) { group = "build" - archiveAppendix = "fatjar" + manifest { + attributes "Main-Class": "de.tudresden.inf.st.sample.launch.SubscriberNodeLauncher" + } + + from sourceSets.main.output + from { + configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } + } + + exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA' + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + archiveBaseName = 'pnml-pkg-sample-subscriberNode' +} + +task jarPublisherNode(type: Jar) { + group = "build" + + manifest { + attributes "Main-Class": "de.tudresden.inf.st.sample.launch.PublisherNodeLauncher" + } + + from sourceSets.main.output + from { + configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } + } + + exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA' + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + archiveBaseName = 'pnml-pkg-sample-publisherNode' +} + +task jarServerNode(type: Jar) { + group = "build" + + manifest { + attributes "Main-Class": "de.tudresden.inf.st.sample.launch.ServerNodeLauncher" + } + + from sourceSets.main.output + from { + configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } + } + + exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA' + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + archiveBaseName = 'pnml-pkg-sample-serverNode' +} + +task jarClientNode(type: Jar) { + group = "build" + + manifest { + attributes "Main-Class": "de.tudresden.inf.st.sample.launch.ClientNodeLauncher" + } + from sourceSets.main.output from { - configurations.runtimeClasspath.collect {it.isDirectory() ? it : zipTree(it) } + configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } - manifest.attributes "Main-Class": "de.tudresden.inf.st.sample.Main" + exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA' + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + archiveBaseName = 'pnml-pkg-sample-clientNode' } run { diff --git a/libs/pnml-relast-engine-fatjar-0.1.jar b/libs/pnml-relast-engine-fatjar-0.1.jar index 962eac47cbea654f89f42dfb0775e21f7ec936ba..cd70cdc0c41b4275912ac74fed28170c08d679aa 100644 Binary files a/libs/pnml-relast-engine-fatjar-0.1.jar and b/libs/pnml-relast-engine-fatjar-0.1.jar differ diff --git a/src/main/java/de/tudresden/inf/st/sample/Main.java b/src/main/java/de/tudresden/inf/st/sample/Main.java index 740e6c056a3a3a36983c4306c0dec6481710a42d..60261af9f885698728f58510529cb6d76be320d9 100644 --- a/src/main/java/de/tudresden/inf/st/sample/Main.java +++ b/src/main/java/de/tudresden/inf/st/sample/Main.java @@ -38,13 +38,13 @@ public class Main { List<String> petriNetPaths = new ArrayList<>(); petriNetPaths.add("src/main/resources/nets/publisher-net.pnml"); petriNetPaths.add("src/main/resources/nets/subscriber-net.pnml"); - petriNetPaths.add("src/main/resources/nets/client-net.pnml"); - petriNetPaths.add("src/main/resources/nets/server-net.pnml"); + // petriNetPaths.add("src/main/resources/nets/client-net.pnml"); + // petriNetPaths.add("src/main/resources/nets/server-net.pnml"); // Parse the PNML files List<PetriNet> petriNets = new ArrayList<>(); for(String petriNetPath : petriNetPaths){ - petriNets.add(PnmlParser.parsePnml(petriNetPath).get(0)); + petriNets.add(PnmlParser.parsePnml(petriNetPath, false).get(0)); } // Initialize the Handling @@ -57,20 +57,27 @@ public class Main { // Create the ROS nodes DiNeRosNode node0 = new PublisherNode("PublisherNode", petriNets.get(0), MQTT_HOST, "mqtt"); DiNeRosNode node1 = new SubscriberNode("SubscriberNode", petriNets.get(1), MQTT_HOST, "mqtt"); - DiNeRosNode node2 = new ClientNode("ClientNode", petriNets.get(2), MQTT_HOST, "mqtt"); - DiNeRosNode node3 = new ServerNode("ServerNode", petriNets.get(3), MQTT_HOST, "mqtt"); + // DiNeRosNode node2 = new ClientNode("ClientNode", petriNets.get(2), MQTT_HOST, "mqtt"); + // DiNeRosNode node3 = new ServerNode("ServerNode", petriNets.get(3), MQTT_HOST, "mqtt"); // Setup handlers of the ROS nodes - HandlingBinder.bindHandlersToPublisherNode(petriNets.get(0)); - HandlingBinder.bindHandlersToSubscriberNode(petriNets.get(0)); - HandlingBinder.bindHandlersToClientNode(petriNets.get(0)); - HandlingBinder.bindHandlersToServerNode(petriNets.get(0)); + HandlingBinder.bindHandlersToPublisherNode(node0); + HandlingBinder.bindHandlersToSubscriberNode(node1); + // HandlingBinder.bindHandlersToClientNode(node2); + // HandlingBinder.bindHandlersToServerNode(node3); // Start the ROS nodes new Thread(() -> nodeMainExecutor.execute(node0, nodeConfiguration)) {{start();}}; + + /*try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + }*/ + new Thread(() -> nodeMainExecutor.execute(node1, nodeConfiguration)) {{start();}}; - new Thread(() -> nodeMainExecutor.execute(node2, nodeConfiguration)) {{start();}}; - new Thread(() -> nodeMainExecutor.execute(node3, nodeConfiguration)) {{start();}}; + // new Thread(() -> nodeMainExecutor.execute(node2, nodeConfiguration)) {{start();}}; + // new Thread(() -> nodeMainExecutor.execute(node3, nodeConfiguration)) {{start();}}; } } diff --git a/src/main/java/de/tudresden/inf/st/sample/handling/HandlerFunctions.java b/src/main/java/de/tudresden/inf/st/sample/handling/HandlerFunctions.java index 79a90fd5e9fd52ec4550137bae51679acf6175c6..f6fa8c49f51aa3d20516bd06e5a1e3c1b44b96cb 100644 --- a/src/main/java/de/tudresden/inf/st/sample/handling/HandlerFunctions.java +++ b/src/main/java/de/tudresden/inf/st/sample/handling/HandlerFunctions.java @@ -8,6 +8,7 @@ import java.util.function.Function; public final class HandlerFunctions { final static Function<List<Map<String, Object>>, List<Map<String, Object>>> SAMPLE_COLOR_HANDLING_FUNCTION = maps -> { + System.out.println("Executing SAMPLE_COLOR_HANDLING_FUNCTION."); for(Map<String, Object> m : maps){ m.keySet().stream().filter(s -> false).forEach(s -> m.replace("color", "light-red")); } @@ -15,6 +16,7 @@ public final class HandlerFunctions { }; final static Function<List<Map<String, Object>>, List<Map<String, Object>>> SAMPLE_SUCCESS_HANDLING_FUNCTION = maps -> { + System.out.println("Executing SAMPLE_SUCCESS_HANDLING_FUNCTION."); for(Map<String, Object> m : maps){ m.keySet().stream().filter(s -> false).forEach(s -> m.replace("pickPlaceSuccess", true)); } @@ -22,7 +24,7 @@ public final class HandlerFunctions { }; final static Function<List<Map<String, Object>>, List<Map<String, Object>>> SAMPLE_FINAL_HANDLING_FUNCTION = maps -> { - + System.out.println("Executing SAMPLE_FINAL_HANDLING_FUNCTION."); List<Map<String, Object>> sList = new ArrayList<>(); sList.add(maps.get(0)); return sList; diff --git a/src/main/java/de/tudresden/inf/st/sample/handling/HandlingBinder.java b/src/main/java/de/tudresden/inf/st/sample/handling/HandlingBinder.java index 522fdb87a35362452386dc4fefbca0f2c02d9d3f..75cae44b337403e9ccc97125ab8bbee31ddddf5d 100644 --- a/src/main/java/de/tudresden/inf/st/sample/handling/HandlingBinder.java +++ b/src/main/java/de/tudresden/inf/st/sample/handling/HandlingBinder.java @@ -1,6 +1,7 @@ package de.tudresden.inf.st.sample.handling; +import de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode; import de.tudresden.inf.st.pnml.jastadd.model.PetriNet; /** @@ -8,21 +9,21 @@ import de.tudresden.inf.st.pnml.jastadd.model.PetriNet; */ public class HandlingBinder { - public static void bindHandlersToClientNode(PetriNet petriNet){ - petriNet.registerHandler("ClientTransition1", 1, HandlerFunctions.SAMPLE_FINAL_HANDLING_FUNCTION); + public static void bindHandlersToClientNode(DiNeRosNode node){ + node.registerHandler("ClientTransition1", 1, HandlerFunctions.SAMPLE_FINAL_HANDLING_FUNCTION); } - public static void bindHandlersToServerNode(PetriNet petriNet){ - petriNet.registerHandler("ConnectorTransition", 1, HandlerFunctions.SAMPLE_SUCCESS_HANDLING_FUNCTION); - petriNet.registerHandler("ConnectorTransition", 2, HandlerFunctions.SAMPLE_FINAL_HANDLING_FUNCTION); + public static void bindHandlersToServerNode(DiNeRosNode node){ + node.registerHandler("ConnectorTransition", 1, HandlerFunctions.SAMPLE_SUCCESS_HANDLING_FUNCTION); + node.registerHandler("ConnectorTransition", 2, HandlerFunctions.SAMPLE_FINAL_HANDLING_FUNCTION); } - public static void bindHandlersToPublisherNode(PetriNet petriNet){ - petriNet.registerHandler("SortRed", 1, HandlerFunctions.SAMPLE_COLOR_HANDLING_FUNCTION); - petriNet.registerHandler("SortRed", 2, HandlerFunctions.SAMPLE_FINAL_HANDLING_FUNCTION); + public static void bindHandlersToPublisherNode(DiNeRosNode node){ + node.registerHandler("SortRed", 1, HandlerFunctions.SAMPLE_COLOR_HANDLING_FUNCTION); + node.registerHandler("SortRed", 2, HandlerFunctions.SAMPLE_FINAL_HANDLING_FUNCTION); } - public static void bindHandlersToSubscriberNode(PetriNet petriNet){ - petriNet.registerHandler("SubTransition", 1, HandlerFunctions.SAMPLE_FINAL_HANDLING_FUNCTION); + public static void bindHandlersToSubscriberNode(DiNeRosNode node){ + node.registerHandler("SubTransition", 1, HandlerFunctions.SAMPLE_FINAL_HANDLING_FUNCTION); } } diff --git a/src/main/java/de/tudresden/inf/st/sample/launch/ClientNodeLauncher.java b/src/main/java/de/tudresden/inf/st/sample/launch/ClientNodeLauncher.java new file mode 100644 index 0000000000000000000000000000000000000000..695a2649d383c893f17e0baf8b91af8f4ef5ec8c --- /dev/null +++ b/src/main/java/de/tudresden/inf/st/sample/launch/ClientNodeLauncher.java @@ -0,0 +1,52 @@ +package de.tudresden.inf.st.sample.launch; + +import de.tudresden.inf.st.pnml.engine.execution.TransitionHandlerService; +import de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode; +import de.tudresden.inf.st.pnml.jastadd.model.BalloonCallbackStorage; +import de.tudresden.inf.st.pnml.jastadd.model.PetriNet; +import de.tudresden.inf.st.pnml.jastadd.model.PnmlParser; +import de.tudresden.inf.st.sample.handling.HandlingBinder; +import de.tudresden.inf.st.sample.nodes.ClientNode; +import org.ros.node.DefaultNodeMainExecutor; +import org.ros.node.NodeConfiguration; +import org.ros.node.NodeMainExecutor; + +import java.net.URI; + +public class ClientNodeLauncher { + + // actual ros / mqtt host url is inserted based on configuration + private static final String ROS_HOST = "localhost"; + private static final String ROS_MASTER_URI = "http://localhost:11311"; + private static final String MQTT_HOST = "localhost"; + + private static final NodeConfiguration nodeConfiguration = NodeConfiguration.newPublic(ROS_HOST); + private static final NodeMainExecutor nodeMainExecutor = DefaultNodeMainExecutor.newDefault(); + + public static void main(java.lang.String[] args) { + + // Setup ROS Master + nodeConfiguration.setMasterUri(URI.create(ROS_MASTER_URI)); + + // Petri Net base data initialization + String petriNetPath = "/nets/client-net.pnml"; + + // Parse the PNML file + PetriNet petriNet = PnmlParser.parsePnml(petriNetPath, true).get(0); + + // Initialize the Handling + TransitionHandlerService transitionHandlerService = TransitionHandlerService.getInstance(); + BalloonCallbackStorage storage = petriNet.initializeCallbackStorage(); + transitionHandlerService.init(petriNet.getId(), storage); + + // Create the ROS nodes + DiNeRosNode node2 = new ClientNode("ClientNode", petriNet, MQTT_HOST, "mqtt"); + + // Setup handlers of the ROS nodes + HandlingBinder.bindHandlersToClientNode(node2); + + // Start the ROS node + new Thread(() -> nodeMainExecutor.execute(node2, nodeConfiguration)) {{start();}}; + + } +} diff --git a/src/main/java/de/tudresden/inf/st/sample/launch/PublisherNodeLauncher.java b/src/main/java/de/tudresden/inf/st/sample/launch/PublisherNodeLauncher.java new file mode 100644 index 0000000000000000000000000000000000000000..5486a5b9f193a8f611ca2db98c981c5396d5db77 --- /dev/null +++ b/src/main/java/de/tudresden/inf/st/sample/launch/PublisherNodeLauncher.java @@ -0,0 +1,51 @@ +package de.tudresden.inf.st.sample.launch; + +import de.tudresden.inf.st.pnml.engine.execution.TransitionHandlerService; +import de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode; +import de.tudresden.inf.st.pnml.jastadd.model.BalloonCallbackStorage; +import de.tudresden.inf.st.pnml.jastadd.model.PetriNet; +import de.tudresden.inf.st.pnml.jastadd.model.PnmlParser; +import de.tudresden.inf.st.sample.handling.HandlingBinder; +import de.tudresden.inf.st.sample.nodes.PublisherNode; +import org.ros.node.DefaultNodeMainExecutor; +import org.ros.node.NodeConfiguration; +import org.ros.node.NodeMainExecutor; + +import java.net.URI; + +public class PublisherNodeLauncher { + + // actual ros / mqtt host url is inserted based on configuration + private static final String ROS_HOST = "localhost"; + private static final String ROS_MASTER_URI = "http://localhost:11311"; + private static final String MQTT_HOST = "localhost"; + + private static final NodeConfiguration nodeConfiguration = NodeConfiguration.newPublic(ROS_HOST); + private static final NodeMainExecutor nodeMainExecutor = DefaultNodeMainExecutor.newDefault(); + + public static void main(java.lang.String[] args) { + + // Setup ROS Master + nodeConfiguration.setMasterUri(URI.create(ROS_MASTER_URI)); + + // Petri Net base data initialization + String petriNetPath = "/nets/publisher-net.pnml"; + + // Parse the PNML file + PetriNet petriNet = PnmlParser.parsePnml(petriNetPath, true).get(0); + + // Initialize the Handling + TransitionHandlerService transitionHandlerService = TransitionHandlerService.getInstance(); + BalloonCallbackStorage storage = petriNet.initializeCallbackStorage(); + transitionHandlerService.init(petriNet.getId(), storage); + + // Create the ROS node + DiNeRosNode node0 = new PublisherNode("PublisherNode", petriNet, MQTT_HOST, "mqtt"); + + // Setup handlers of the ROS node + HandlingBinder.bindHandlersToPublisherNode(node0); + + // Start the ROS node + new Thread(() -> nodeMainExecutor.execute(node0, nodeConfiguration)) {{start();}}; + } +} diff --git a/src/main/java/de/tudresden/inf/st/sample/launch/ServerNodeLauncher.java b/src/main/java/de/tudresden/inf/st/sample/launch/ServerNodeLauncher.java new file mode 100644 index 0000000000000000000000000000000000000000..b94773e4bafe69da19fc1aed1e6d904ebb2e09d1 --- /dev/null +++ b/src/main/java/de/tudresden/inf/st/sample/launch/ServerNodeLauncher.java @@ -0,0 +1,52 @@ +package de.tudresden.inf.st.sample.launch; + +import de.tudresden.inf.st.pnml.engine.execution.TransitionHandlerService; +import de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode; +import de.tudresden.inf.st.pnml.jastadd.model.BalloonCallbackStorage; +import de.tudresden.inf.st.pnml.jastadd.model.PetriNet; +import de.tudresden.inf.st.pnml.jastadd.model.PnmlParser; +import de.tudresden.inf.st.sample.handling.HandlingBinder; +import de.tudresden.inf.st.sample.nodes.ServerNode; +import org.ros.node.DefaultNodeMainExecutor; +import org.ros.node.NodeConfiguration; +import org.ros.node.NodeMainExecutor; + +import java.net.URI; + +public class ServerNodeLauncher { + + // actual ros / mqtt host url is inserted based on configuration + private static final String ROS_HOST = "localhost"; + private static final String ROS_MASTER_URI = "http://localhost:11311"; + private static final String MQTT_HOST = "localhost"; + + private static final NodeConfiguration nodeConfiguration = NodeConfiguration.newPublic(ROS_HOST); + private static final NodeMainExecutor nodeMainExecutor = DefaultNodeMainExecutor.newDefault(); + + public static void main(java.lang.String[] args) { + + // Setup ROS Master + nodeConfiguration.setMasterUri(URI.create(ROS_MASTER_URI)); + + // Petri Net base data initialization + String petriNetPath = "/nets/server-net.pnml"; + + // Parse the PNML file + PetriNet petriNet = PnmlParser.parsePnml(petriNetPath, true).get(0); + + // Initialize the Handling + TransitionHandlerService transitionHandlerService = TransitionHandlerService.getInstance(); + BalloonCallbackStorage storage = petriNet.initializeCallbackStorage(); + transitionHandlerService.init(petriNet.getId(), storage); + + // Create the ROS nodes + DiNeRosNode node3 = new ServerNode("ServerNode", petriNet, MQTT_HOST, "mqtt"); + + // Setup handlers of the ROS node + HandlingBinder.bindHandlersToServerNode(node3); + + // Start the ROS node + new Thread(() -> nodeMainExecutor.execute(node3, nodeConfiguration)) {{start();}}; + + } +} diff --git a/src/main/java/de/tudresden/inf/st/sample/launch/SubscriberNodeLauncher.java b/src/main/java/de/tudresden/inf/st/sample/launch/SubscriberNodeLauncher.java new file mode 100644 index 0000000000000000000000000000000000000000..7950ef1d5a5c11711c30a13863f42ee93fa5e3cd --- /dev/null +++ b/src/main/java/de/tudresden/inf/st/sample/launch/SubscriberNodeLauncher.java @@ -0,0 +1,52 @@ +package de.tudresden.inf.st.sample.launch; + +import de.tudresden.inf.st.pnml.engine.execution.TransitionHandlerService; +import de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode; +import de.tudresden.inf.st.pnml.jastadd.model.BalloonCallbackStorage; +import de.tudresden.inf.st.pnml.jastadd.model.PetriNet; +import de.tudresden.inf.st.pnml.jastadd.model.PnmlParser; +import de.tudresden.inf.st.sample.handling.HandlingBinder; +import de.tudresden.inf.st.sample.nodes.SubscriberNode; +import org.ros.node.DefaultNodeMainExecutor; +import org.ros.node.NodeConfiguration; +import org.ros.node.NodeMainExecutor; + +import java.net.URI; + +public class SubscriberNodeLauncher { + + // actual ros / mqtt host url is inserted based on configuration + private static final String ROS_HOST = "localhost"; + private static final String ROS_MASTER_URI = "http://localhost:11311"; + private static final String MQTT_HOST = "localhost"; + + private static final NodeConfiguration nodeConfiguration = NodeConfiguration.newPublic(ROS_HOST); + private static final NodeMainExecutor nodeMainExecutor = DefaultNodeMainExecutor.newDefault(); + + public static void main(java.lang.String[] args) { + + // Setup ROS Master + nodeConfiguration.setMasterUri(URI.create(ROS_MASTER_URI)); + + // Petri Net base data initialization + String petriNetPath = "/nets/subscriber-net.pnml"; + + // Parse the PNML files + PetriNet petriNet = PnmlParser.parsePnml(petriNetPath, true).get(0); + + // Initialize the Handling + TransitionHandlerService transitionHandlerService = TransitionHandlerService.getInstance(); + BalloonCallbackStorage storage = petriNet.initializeCallbackStorage(); + transitionHandlerService.init(petriNet.getId(), storage); + + // Create the ROS node + DiNeRosNode node1 = new SubscriberNode("SubscriberNode", petriNet, MQTT_HOST, "mqtt"); + + // Setup handlers of the ROS node + HandlingBinder.bindHandlersToSubscriberNode(node1); + + // Start the ROS node + new Thread(() -> nodeMainExecutor.execute(node1, nodeConfiguration)) {{start();}}; + + } +} diff --git a/src/main/java/de/tudresden/inf/st/sample/nodes/ClientNode.java b/src/main/java/de/tudresden/inf/st/sample/nodes/ClientNode.java index d199e5221c0a6753f7457c398a555a70d8410235..de4cc9c7b45a4bbee8d173efb1cdc5a6ccbbec09 100644 --- a/src/main/java/de/tudresden/inf/st/sample/nodes/ClientNode.java +++ b/src/main/java/de/tudresden/inf/st/sample/nodes/ClientNode.java @@ -11,14 +11,26 @@ public class ClientNode extends DiNeRosNode { super(nodeName, petriNet, rcHost, gcProtocol); } + @Override + protected void nodeLoop() { + try { + Thread.sleep(4000); + System.out.println(this.marking.print()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + @Override protected TransitionSelectionResult onChange(List<Transition> list) { + System.out.println("Executing onChange in ClientNode."); return list.size() == 0 ? new FiringSelectionNone() : fireRandomEnabledTransition(list); } @Override protected TransitionSelectionResult onStartupEnded(List<Transition> list) { + System.out.println("Executing onStartupEnded in ClientNode."); return list.size() == 0 ? new FiringSelectionNone() : fireRandomEnabledTransition(list); } diff --git a/src/main/java/de/tudresden/inf/st/sample/nodes/PublisherNode.java b/src/main/java/de/tudresden/inf/st/sample/nodes/PublisherNode.java index 3bac0bea18a0329f264641e78caf06a6ff8a28ce..9253455b0806107c1d20151a70397111fa742175 100644 --- a/src/main/java/de/tudresden/inf/st/sample/nodes/PublisherNode.java +++ b/src/main/java/de/tudresden/inf/st/sample/nodes/PublisherNode.java @@ -11,15 +11,45 @@ public class PublisherNode extends DiNeRosNode { super(nodeName, petriNet, rcHost, gcProtocol); } + @Override + protected void nodeLoop() { + try { + Thread.sleep(3000); + System.out.println(this.marking.print()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + @Override protected TransitionSelectionResult onChange(List<Transition> list) { - return list.size() == 0 ? + System.out.println("Executing onChange in ClientNode."); + + TransitionSelectionResult res = list.size() == 0 ? new FiringSelectionNone() : fireRandomEnabledTransition(list); + + if(res.isFiringSelectionNone()){ + System.out.println("FiringSelectionNone (onChange, Pub)"); + } else { + System.out.println("Sub firing (onChange): " + res.asFiringSelectionSuccess().getTransition().getId()); + } + + return res; } @Override protected TransitionSelectionResult onStartupEnded(List<Transition> list) { - return list.size() == 0 ? + System.out.println("Executing onStartupEnded in ClientNode."); + + TransitionSelectionResult res = list.size() == 0 ? new FiringSelectionNone() : fireRandomEnabledTransition(list); + + if(res.isFiringSelectionNone()){ + System.out.println("FiringSelectionNone (onChange, Pub)"); + } else { + System.out.println("Sub firing (onChange): " + res.asFiringSelectionSuccess().getTransition().getId()); + } + + return res; } } diff --git a/src/main/java/de/tudresden/inf/st/sample/nodes/ServerNode.java b/src/main/java/de/tudresden/inf/st/sample/nodes/ServerNode.java index 858c20d0497b6d9caa19555d4f00ecc776ee901d..a702b999992738a436111757677faf9e5f74a5f8 100644 --- a/src/main/java/de/tudresden/inf/st/sample/nodes/ServerNode.java +++ b/src/main/java/de/tudresden/inf/st/sample/nodes/ServerNode.java @@ -11,15 +11,55 @@ public class ServerNode extends DiNeRosNode { super(nodeName, petriNet, rcHost, gcProtocol); } + @Override + protected void nodeLoop() { + try { + Thread.sleep(4000); + System.out.println(this.marking.print()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + @Override protected TransitionSelectionResult onChange(List<Transition> list) { - return list.size() == 0 ? + + for(Transition t : petriNet.allTransitions()){ + System.out.println("T:" + t.getId()); + } + + for(Arc a : petriNet.allArcs()){ + System.out.println("A: " + a.getId() + " s: " + a.getSource().getId() + " t: " + a.getTarget().getId()); + } + + TransitionSelectionResult res = list.size() == 0 ? new FiringSelectionNone() : fireRandomEnabledTransition(list); + + if(res.isFiringSelectionNone()){ + System.out.println(this.marking.print()); + System.out.println("[" + nodeName + "] FiringSelectionNone (onChange)"); + return res.asFiringSelectionNone(); + } else { + System.out.println(this.marking.print()); + System.out.println("[" + nodeName + "] Firing (onChange): " + + res.asFiringSelectionSuccess().getTransition().getId()); + return res.asFiringSelectionSuccess(); + } } @Override protected TransitionSelectionResult onStartupEnded(List<Transition> list) { - return list.size() == 0 ? + + TransitionSelectionResult res = list.size() == 0 ? new FiringSelectionNone() : fireRandomEnabledTransition(list); + + if(res.isFiringSelectionNone()){ + System.out.println("[" + nodeName + "] FiringSelectionNone (onStartupEnded)"); + } else { + System.out.println("[" + nodeName + "] Firing (onStartupEnded): " + + res.asFiringSelectionSuccess().getTransition().getId()); + } + + return res; } } diff --git a/src/main/java/de/tudresden/inf/st/sample/nodes/SubscriberNode.java b/src/main/java/de/tudresden/inf/st/sample/nodes/SubscriberNode.java index 8baa58e23397520306bdc60e70c0b806410fdea8..d3de2819277902e469569a2f52db890898d877af 100644 --- a/src/main/java/de/tudresden/inf/st/sample/nodes/SubscriberNode.java +++ b/src/main/java/de/tudresden/inf/st/sample/nodes/SubscriberNode.java @@ -11,15 +11,44 @@ public class SubscriberNode extends DiNeRosNode { super(nodeName, petriNet, rcHost, gcProtocol); } + @Override + protected void nodeLoop() { + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + @Override protected TransitionSelectionResult onChange(List<Transition> list) { - return list.size() == 0 ? + + TransitionSelectionResult res = list.size() == 0 ? new FiringSelectionNone() : fireRandomEnabledTransition(list); + + if(res.isFiringSelectionNone()){ + System.out.println("[" + nodeName + "] FiringSelectionNone (onChange)"); + return res.asFiringSelectionNone(); + } else { + System.out.println("[" + nodeName + "] Firing (onChange): " + + res.asFiringSelectionSuccess().getTransition().getId()); + return res.asFiringSelectionSuccess(); + } } @Override protected TransitionSelectionResult onStartupEnded(List<Transition> list) { - return list.size() == 0 ? + + TransitionSelectionResult res = list.size() == 0 ? new FiringSelectionNone() : fireRandomEnabledTransition(list); + + if(res.isFiringSelectionNone()){ + System.out.println("[" + nodeName + "] FiringSelectionNone (onStartupEnded)"); + } else { + System.out.println("[" + nodeName + "] Firing (onStartupEnded): " + + res.asFiringSelectionSuccess().getTransition().getId()); + } + + return res; } } diff --git a/src/main/resources/nets/publisher-net.pnml b/src/main/resources/nets/publisher-net.pnml index 24807d74cfce60d1672f6a2adfc7a11594a1ad08..7a4b5a60d0a763cda1890e502a6047ae708ffbff 100644 --- a/src/main/resources/nets/publisher-net.pnml +++ b/src/main/resources/nets/publisher-net.pnml @@ -1,5 +1,5 @@ <pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml"> - <net id="PTNET-0" type="http://www.pnml.org/version-2009/grammar/ptnet"> + <net id="PTNET-1" type="http://www.pnml.org/version-2009/grammar/ptnet"> <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> <inputsignals> <inputsignal> @@ -7,6 +7,9 @@ <initialvalue>false</initialvalue> </inputsignal> </inputsignals> + <ports> + <port name="sampleTopic" placeType="pub" limit="10">pub1</port> + </ports> </toolspecific> <page id="top"> @@ -64,11 +67,5 @@ <name> <text>TopicNet</text> </name> - <toolspecific tool="de.tudresden.inf.st.pnml.splitter" version="0.0.1"> - <ports> - <port name="sampleTopic" placeType="pub">pub1</port> - <port name="sampleTopic" placeType="sub">sub1</port> - </ports> - </toolspecific> </net> </pnml> diff --git a/src/main/resources/nets/server-net.pnml b/src/main/resources/nets/server-net.pnml index 3b603fee15cb5050ab09aa9f4b06381d08b29dbd..27cb7eacd08c396368000becc22ed6d5f8f83014 100644 --- a/src/main/resources/nets/server-net.pnml +++ b/src/main/resources/nets/server-net.pnml @@ -1,5 +1,5 @@ <pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml"> - <net id="PTNET-0" type="http://www.pnml.org/version-2009/grammar/ptnet"> + <net id="PTNET-2" type="http://www.pnml.org/version-2009/grammar/ptnet"> <page id="top"> <page id="targetPage"> <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> @@ -53,10 +53,8 @@ </name> <toolspecific tool="de.tudresden.inf.st.pnml.splitter" version="0.0.1"> <ports> - <port limit="-1" name="sampleService" placeType="creq">req1</port> - <port limit="-1" name="sampleService" placeType="cres">res1</port> - <port limit="16" name="sampleService" placeType="sreq">serverIn</port> - <port limit="16" name="sampleService" placeType="sres">serverOut</port> + <port limit="2" name="sampleService" placeType="sreq">serverIn</port> + <port limit="2" name="sampleService" placeType="sres">serverOut</port> </ports> </toolspecific> </net> diff --git a/src/main/resources/nets/subscriber-net.pnml b/src/main/resources/nets/subscriber-net.pnml index 0b951970011d061ed03b9be6962939f68f7af74e..c036088ed38fb3b3f9d4aa6f88366f9667e65080 100644 --- a/src/main/resources/nets/subscriber-net.pnml +++ b/src/main/resources/nets/subscriber-net.pnml @@ -1,5 +1,8 @@ <pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml"> - <net id="PTNET-0" type="http://www.pnml.org/version-2009/grammar/ptnet"> + <net id="PTNET-3" type="http://www.pnml.org/version-2009/grammar/ptnet"> + <ports> + <port name="sampleTopic" placeType="sub" limit="10">sub1</port> + </ports> <page id="top"> <page id="targetPage"> <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> @@ -41,15 +44,13 @@ </initialMarking> </place> </page> + <arc id="sa0" source="sub1" target="SubTransition"> + </arc> + <arc id="sa1" source="SubTransition" target="sub2"> + </arc> </page> <name> <text>TopicNet</text> </name> - <toolspecific tool="de.tudresden.inf.st.pnml.splitter" version="0.0.1"> - <ports> - <port name="sampleTopic" placeType="pub">pub1</port> - <port name="sampleTopic" placeType="sub">sub1</port> - </ports> - </toolspecific> </net> </pnml>