From df2d3798cac990381f4329580597f5ffddadaaae Mon Sep 17 00:00:00 2001 From: SebastianEbert <sebastian.ebert@tu-dresden.de> Date: Mon, 27 Jun 2022 17:13:27 +0200 Subject: [PATCH] worked on callbacks, dineros node concept --- build.gradle | 36 ++- libs/rosgraph_msgs-1.10.12.jar | Bin 0 -> 1938 bytes libs/std_msgs-0.5.11.jar | Bin 0 -> 15011 bytes .../balloonMarking/BalloonExecution.jadd | 56 +++-- .../de/tudresden/inf/st/pnml/engine/Main.java | 2 +- .../engine/execution/TransitionCallback.java | 8 + .../pnml/engine/ros/DiNeRosDefaultNode.java | 10 + .../inf/st/pnml/engine/ros/DiNeRosNode.java | 85 +++++++ .../st/pnml/engine/ros/DiNeRosSubscriber.java | 10 + .../pnml/engine/ros/RosCommunicationUtil.java | 54 +++++ .../engine/transform/ServiceTransformer.java | 4 + .../engine/transform/TopicTransformer.java | 221 ++++++++++++++++++ .../elements/InputSignalTransition.pnml | 29 +++ .../resources/elements/OutputSignalPlace.pnml | 30 +++ 14 files changed, 520 insertions(+), 25 deletions(-) create mode 100644 libs/rosgraph_msgs-1.10.12.jar create mode 100644 libs/std_msgs-0.5.11.jar create mode 100644 src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosDefaultNode.java create mode 100644 src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java create mode 100644 src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosSubscriber.java create mode 100644 src/main/java/de/tudresden/inf/st/pnml/engine/ros/RosCommunicationUtil.java create mode 100644 src/main/java/de/tudresden/inf/st/pnml/engine/transform/ServiceTransformer.java create mode 100644 src/main/java/de/tudresden/inf/st/pnml/engine/transform/TopicTransformer.java create mode 100644 src/main/resources/elements/InputSignalTransition.pnml create mode 100644 src/main/resources/elements/OutputSignalPlace.pnml diff --git a/build.gradle b/build.gradle index f794746..70547ab 100644 --- a/build.gradle +++ b/build.gradle @@ -27,6 +27,14 @@ repositories { name 'gitlab-maven' url 'https://git-st.inf.tu-dresden.de/api/v4/groups/jastadd/-/packages/maven' } + maven { + name 'rosjava-maven' + url "https://git-st.inf.tu-dresden.de/api/v4/projects/1106/packages/maven" + } + maven { + name 'rosjava-msg-maven' + url 'https://git-st.inf.tu-dresden.de/api/v4/projects/1108/packages/maven' + } } configurations { @@ -56,8 +64,7 @@ dependencies { api group: 'fr.lip6.pnml', name: 'fr.lip6.pnml.framework.utils', version: '2.2.12' implementation group: 'org.apache.ws.commons.axiom', name: 'axiom-api', version: '1.2.22' implementation group: 'org.apache.ws.commons.axiom', name: 'axiom-impl', version: '1.2.22' - implementation group: 'com.thaiopensourc' + - 'e', name: 'jing', version: '20091111' + implementation group: 'com.thaiopensource', name: 'jing', version: '20091111' implementation 'org.jetbrains:annotations:19.0.0' // https://mvnrepository.com/artifact/xalan/xalan implementation group: 'xalan', name: 'xalan', version: '2.7.2' @@ -71,8 +78,31 @@ dependencies { jastadd2 "org.jastadd:jastadd:2.3.4" relast group: 'org.jastadd', name: 'relast', version: "${relast_version}" ecore files("libs/ecore2relast-0.1.jar") - // relast files("libs/relast.jar") + // ros java + compile 'org.ros.rosjava_core:rosjava:0.3.9' + + // ros java subpackages + implementation 'org.ros.rosjava_core:apache_xmlrpc_server:0.3.8' + implementation 'org.ros.rosjava_core:apache_xmlrpc_common:0.3.8' + implementation 'org.ros.rosjava_core:apache_xmlrpc_client:0.3.8' + implementation 'org.ros.rosjava_core:rosjava_helpers:0.3.8' + implementation 'org.ros.rosjava_bootstrap:message_generation:0.3.3' + + // ros java dependencies + implementation("com.google.guava:guava:31.0.1-jre") + implementation group: 'org.jboss.netty', name: 'netty', version: '3.2.10.Final' + implementation group: 'commons-codec', name: 'commons-codec', version: '1.15' + implementation group: 'commons-pool', name: 'commons-pool', version: '1.6' + implementation group: 'commons-httpclient', name: 'commons-httpclient', version: '3.1' + implementation group: 'org.apache.ws.commons.util', name: 'ws-commons-util', version: '1.0.2' + implementation group: 'dnsjava', name: 'dnsjava', version: '2.1.1' + + // ros java messages + compile fileTree(include: ['std_msgs-0.5.11.jar'], dir: './libs') + compile fileTree(include: ['rosgraph_msgs-1.10.12.jar'], dir: './libs') + + // testing testImplementation('org.junit.jupiter:junit-jupiter:5.8.2') } diff --git a/libs/rosgraph_msgs-1.10.12.jar b/libs/rosgraph_msgs-1.10.12.jar new file mode 100644 index 0000000000000000000000000000000000000000..ea7ed16a55770077b4d494727875d40ca725e33b GIT binary patch literal 1938 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 I!5Yj10Oo%BssI20 literal 0 HcmV?d00001 diff --git a/libs/std_msgs-0.5.11.jar b/libs/std_msgs-0.5.11.jar new file mode 100644 index 0000000000000000000000000000000000000000..f4bda8eda378e01d97a29456929286d14e04f73e GIT binary patch literal 15011 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 Al>h($ literal 0 HcmV?d00001 diff --git a/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd index 89db560..b081078 100644 --- a/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd +++ b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd @@ -2,36 +2,42 @@ aspect BalloonExecution { public Optional<BalloonMarking> BalloonMarking.fireTransition(Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) { - if(enabledBalloonTransitions().isEmpty()) return Optional.empty(); + if(!transition.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()) return Optional.empty(); - List<BalloonToken> inToken = new ArrayList<>(); + // synchronize marking modification to prevent concurrent modifications + synchronized(this){ - // take a token from each incoming place - for(Place place : transition.incomingPlaces()){ + if(!this.isBalloonEnabled(transition)) return Optional.empty(); - BalloonMarkedPlace bmp = this.resolveBalloonPlace(place); + List<BalloonToken> inToken=new ArrayList<>(); - Random rand = new Random(); - int randVal = rand.nextInt(bmp.getNumBalloonMarking()); - BalloonToken bt = bmp.getBalloonMarking(randVal); + // take a token from each incoming place + for(Place place:transition.incomingPlaces()){ - inToken.add(bt); - bmp.getBalloonMarking(randVal).removeSelf(); - } + BalloonMarkedPlace bmp=this.resolveBalloonPlace(place); + + Random rand=new Random(); + int randVal=rand.nextInt(bmp.getNumBalloonMarking()); + BalloonToken bt=bmp.getBalloonMarking(randVal); - BalloonTransition balloonTransition = callbackStorage.resolveBalloonTransition(transition); + inToken.add(bt); + bmp.getBalloonMarking(randVal).removeSelf(); + } - BalloonToken result = de.tudresden.inf.st.pnml.engine.execution.TransitionCallbackExecutor.execute(inToken, balloonTransition.getBalloonCallbacks()); + BalloonTransition balloonTransition=callbackStorage.resolveBalloonTransition(transition); - // place a token in each outgoing place - for(Place place : transition.outgoingPlaces()){ - BalloonMarkedPlace bmp = this.resolveBalloonPlace(place); - bmp.getBalloonMarkingList().add(result); - } + BalloonToken result=de.tudresden.inf.st.pnml.engine.execution.TransitionCallbackExecutor.execute(inToken,balloonTransition.getBalloonCallbacks()); - if (requireFlush) { - // flush the entire marking tree - this.flushTreeCache(); + // place a token in each outgoing place + for(Place place:transition.outgoingPlaces()){ + BalloonMarkedPlace bmp=this.resolveBalloonPlace(place); + bmp.getBalloonMarkingList().add(result); + } + + if(requireFlush){ + // flush the entire marking tree + this.flushTreeCache(); + } } return Optional.of(this); @@ -45,6 +51,14 @@ aspect BalloonExecution { return null; } + public Optional<BalloonMarking> BalloonMarking.fireTopicPublisherTransition(java.util.Random random, Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) { + return null; + } + + public Optional<BalloonMarking> BalloonMarking.fireServiceServerTransition(java.util.Random random, Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) { + return null; + } + public BalloonCallbackStorage PetriNet.initializeCallbackStorage() { BalloonCallbackStorage storage = new BalloonCallbackStorage(); diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java b/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java index 4856622..fe60b58 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java @@ -14,7 +14,7 @@ public class Main { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { - String pnmlPath = "../pnml-relast-nets/src/main/resources/balloonTestNets/balloon-correct-2.pnml"; + String pnmlPath = "../pnml-relast-nets/src/main/resources/balloonTestNets/balloon-correct-3.pnml"; PetriNet petriNet = PnmlParser.parsePnml(pnmlPath).get(0); BalloonMarking bm = petriNet.initializeBalloonMarking(); diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallback.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallback.java index cce1f5d..cac9b55 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallback.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallback.java @@ -4,6 +4,7 @@ import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.ArrayList; import java.util.List; public abstract class TransitionCallback { @@ -12,6 +13,13 @@ public abstract class TransitionCallback { private String id; private int priority; + private List<String> params = new ArrayList<>(); + + public TransitionCallback(String id, int priority, List<String> params) { + this.id = id; + this.priority = priority; + this.params.addAll(params); + } public TransitionCallback(String id, int priority) { this.id = id; diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosDefaultNode.java b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosDefaultNode.java new file mode 100644 index 0000000..d694532 --- /dev/null +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosDefaultNode.java @@ -0,0 +1,10 @@ +package de.tudresden.inf.st.pnml.engine.ros; + +import de.tudresden.inf.st.pnml.jastadd.model.PetriNet; + +public class DiNeRosDefaultNode extends DiNeRosNode{ + + public DiNeRosDefaultNode(String nodeName, PetriNet petriNet) { + super(nodeName, petriNet); + } +} 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 new file mode 100644 index 0000000..54890c6 --- /dev/null +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java @@ -0,0 +1,85 @@ +package de.tudresden.inf.st.pnml.engine.ros; + +import de.tudresden.inf.st.pnml.base.constants.PnmlConstants; +import de.tudresden.inf.st.pnml.engine.transform.TopicTransformer; +import de.tudresden.inf.st.pnml.jastadd.model.BalloonCallbackStorage; +import de.tudresden.inf.st.pnml.jastadd.model.BalloonMarking; +import de.tudresden.inf.st.pnml.jastadd.model.PetriNet; +import de.tudresden.inf.st.pnml.jastadd.model.Transition; +import org.ros.namespace.GraphName; +import org.ros.node.AbstractNodeMain; +import org.ros.node.ConnectedNode; +import org.ros.node.topic.Subscriber; +import org.xml.sax.SAXException; +import std_msgs.String; + +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public abstract class DiNeRosNode extends AbstractNodeMain { + + public final java.lang.String nodeName; + public final PetriNet petriNet; + private BalloonMarking marking; + private BalloonCallbackStorage callbackStorage; + private final Map<java.lang.String, DiNeRosSubscriber> dinerosSubscribers = new HashMap<>(); + + public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet){ + this.nodeName = nodeName; + this.petriNet = petriNet; + try { + marking = petriNet.initializeBalloonMarking(); + callbackStorage = petriNet.initializeCallbackStorage(); + } catch (IOException | SAXException | ParserConfigurationException e) { + e.printStackTrace(); + } + } + + @Override + public GraphName getDefaultNodeName() { + return GraphName.of(nodeName); + } + + @Override + public void onStart(final ConnectedNode connectedNode) { + + int inCount = 0; + + for(Transition t : petriNet.allTransitions()){ + if(t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TOPIC_SUBSCRIBER) + || t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_LIMITED_OUT) + || t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_UNLIMITED_OUT)){ + + Subscriber<String> subscriber = connectedNode.newSubscriber(t.asInputSignalTransition() + .getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), std_msgs.String._TYPE); + + int finalInCount = inCount; + subscriber.addMessageListener(message -> { + + List<java.lang.String> addedElementIds = new ArrayList<>(); + TopicTransformer.includeSubscriberInstance(petriNet, t.asInputSignalTransition() + .getStaticTransitionInformation().getSubNet(), java.lang.String.valueOf(finalInCount), addedElementIds); + + for (Map.Entry<java.lang.String, DiNeRosSubscriber> entry : dinerosSubscribers.entrySet()) { + if(entry.getKey().equals(t.asInputSignalTransition().getStaticTransitionInformation().getSubNet())){ + entry.getValue().execute(marking, callbackStorage, petriNet, t.asInputSignalTransition().getStaticTransitionInformation().getSubNet()); + TopicTransformer.removeSubscriberInstance(petriNet, addedElementIds); + break; + } + } + }); + + inCount++; + } + } + + } + + public Map<java.lang.String, DiNeRosSubscriber> getDinerosSubscribers() { + return dinerosSubscribers; + } +} diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosSubscriber.java b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosSubscriber.java new file mode 100644 index 0000000..f93a6cc --- /dev/null +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosSubscriber.java @@ -0,0 +1,10 @@ +package de.tudresden.inf.st.pnml.engine.ros; + +import de.tudresden.inf.st.pnml.jastadd.model.BalloonCallbackStorage; +import de.tudresden.inf.st.pnml.jastadd.model.BalloonMarking; +import de.tudresden.inf.st.pnml.jastadd.model.PetriNet; + +public interface DiNeRosSubscriber { + + public boolean execute(BalloonMarking balloonMarking, BalloonCallbackStorage balloonCallbackStorage, PetriNet petriNet, String subnet); +} diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/RosCommunicationUtil.java b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/RosCommunicationUtil.java new file mode 100644 index 0000000..a75a2cd --- /dev/null +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/RosCommunicationUtil.java @@ -0,0 +1,54 @@ +package de.tudresden.inf.st.pnml.engine.ros; + +import de.tudresden.inf.st.pnml.jastadd.model.BalloonMarking; +import de.tudresden.inf.st.pnml.jastadd.model.PetriNet; +import de.tudresden.inf.st.pnml.jastadd.model.Transition; +import org.ros.node.ConnectedNode; +import org.ros.node.topic.Publisher; +import org.ros.node.topic.Subscriber; +import std_msgs.String; + +import java.nio.charset.StandardCharsets; +import java.util.function.BiConsumer; + +import org.ros.message.MessageListener; + +public class RosCommunicationUtil { + + public static boolean publish(java.lang.String topic, byte[] msgContent, ConnectedNode node){ + + System.out.println("Publishing new message to " + topic); + Publisher<std_msgs.String> pub = node.newPublisher(topic, std_msgs.String._TYPE); + + if(pub == null){ + while(true){ + if(node != null){ + break; + } + } + + std_msgs.String msg = pub.newMessage(); + java.lang.String s = new java.lang.String(msgContent, StandardCharsets.UTF_8); + msg.setData(s); + pub.publish(msg); + + return true; + } + return false; + } + + public static Subscriber listen(java.lang.String topic, ConnectedNode node, Transition t, PetriNet pn, BalloonMarking bm){ + + Subscriber<String> subscriber = node.newSubscriber(topic, std_msgs.String._TYPE); + // subscriber.addMessageListener(message -> callback.accept(topic, message.getData().getBytes())); + + subscriber.addMessageListener(message -> { + + + + }); + + return subscriber; + + } +} diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/transform/ServiceTransformer.java b/src/main/java/de/tudresden/inf/st/pnml/engine/transform/ServiceTransformer.java new file mode 100644 index 0000000..ff94618 --- /dev/null +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/transform/ServiceTransformer.java @@ -0,0 +1,4 @@ +package de.tudresden.inf.st.pnml.engine.transform; + +public class ServiceTransformer { +} diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/transform/TopicTransformer.java b/src/main/java/de/tudresden/inf/st/pnml/engine/transform/TopicTransformer.java new file mode 100644 index 0000000..efb009e --- /dev/null +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/transform/TopicTransformer.java @@ -0,0 +1,221 @@ +package de.tudresden.inf.st.pnml.engine.transform; + +import de.tudresden.inf.st.pnml.base.constants.PnmlConstants; +import de.tudresden.inf.st.pnml.jastadd.model.*; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class TopicTransformer { + + public static PetriNet includeSubscriberInstance(PetriNet petriNet, String subnet, String suffix, List<String> addedElementIds){ + + Page topPage = petriNet.getPage(0); + + // Elements + for (Place p : getPlacesBySubnet(petriNet, subnet)) { + + OutputSignalPlace copy = getOutputSignalPlace(); + copy.setId(p.getId() + "-" + suffix); + copy.setToolspecificList(p.getToolspecificList().treeCopy()); + copy.getName().setText(p.getName().getText()); + copy.setNodeGraphics(p.getNodeGraphics().treeCopy()); + + // copy initial marking of places + PTMarking m = new PTMarking(); + m.setText(p.getInitialMarking().getText()); + + PlaceInformation pi = new PlaceInformation(); + pi.setSubNet(p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet() + "-" + suffix); + pi.setLocation(p.asOutputSignalPlace().getStaticPlaceInformation().getLocation()); + pi.setInstance(p.asOutputSignalPlace().getStaticPlaceInformation().getInstance()); + pi.setType(p.asOutputSignalPlace().getStaticPlaceInformation().getType()); + + copy.setMutualPlaceInformation(pi); + + topPage.addObject(copy); + addedElementIds.add(copy.getId()); + } + + petriNet.flushTreeCache(); + + for (Transition t : getTransitionsBySubnet(petriNet, subnet)) { + InputSignalTransition copy = getInputSignalTransition(); + copy.setId(t.getId() + "-" + suffix); + copy.getName().setText(t.getName().getText()); + copy.setMutualInputSignalBindingList(t.asInputSignalTransition().getMutualInputSignalBindingList().treeCopy()); + copy.getName().setText(t.getName().getText()); + copy.setToolspecificList(t.getToolspecificList().treeCopy()); + copy.setNodeGraphics(t.getNodeGraphics().treeCopy()); + + TransitionInformation ti = new DefaultTransitionInformation(); + ti.setType(t.asInputSignalTransition().getStaticTransitionInformation().getType()); + ti.setSubNet(t.asInputSignalTransition().getStaticTransitionInformation().getSubNet() + "-" + suffix); + ti.setLocation(t.asInputSignalTransition().getStaticTransitionInformation().getLocation()); + ti.setInstance(t.asInputSignalTransition().getStaticTransitionInformation().getInstance()); + copy.setMutualTransitionInformation(ti); + + topPage.addObject(copy); + addedElementIds.add(copy.getId()); + } + + petriNet.flushTreeCache(); + + // Arcs + for (Arc a : getInnerAndBorderSubnetArcs(petriNet, subnet)) { + + Arc newArc = a.treeCopy(); + + String sourceId = a.getSource().getId() + "-" + suffix; + newArc.setSource((Node) getPnObjectByID(petriNet, sourceId)); + + String targetId = a.getTarget().getId() + "-" + suffix; + + if(a.getTarget().isTransitionNode()){ + if(!a.getTarget().asTransitionNode().asTransition().asInputSignalTransition().getStaticTransitionInformation().getSubNet().equals(subnet)){ + targetId = a.getTarget().getId(); + } + } + + if(a.getTarget().isPlaceNode()){ + if(!a.getTarget().asPlaceNode().asPlace().asOutputSignalPlace().getStaticPlaceInformation().getSubNet().equals(subnet)){ + targetId = a.getTarget().getId(); + } + } + + newArc.setTarget((Node) getPnObjectByID(petriNet, targetId)); + newArc.setId(sourceId + "-to-" + targetId); + + topPage.addObject(newArc); + addedElementIds.add(newArc.getId()); + } + + // TODO: references + + petriNet.flushTreeCache(); + + return petriNet; + } + + public static PetriNet removeSubscriberInstance(PetriNet petriNet, List<String> addedElementIds){ + + for(String id : addedElementIds){ + getPnObjectByID(petriNet, id).removeSelf(); + } + + petriNet.flushTreeCache(); + return petriNet; + } + + private static Set<Arc> getInnerAndBorderSubnetArcs(PetriNet petriNet, String subnet) { + + Set<Arc> arcs = new HashSet<>(); + + for (Arc a : petriNet.allArcs()) { + + if(a.getTarget().isTransitionNode() && a.getSource().isPlaceNode()){ + + if(a.getSource().asPlaceNode().asPlace().asOutputSignalPlace().getStaticPlaceInformation().getSubNet().equals(subnet)){ + arcs.add(a); + } + + } else { + if(a.getSource().asTransitionNode().asTransition().asInputSignalTransition().getStaticTransitionInformation().getSubNet().equals(subnet)){ + arcs.add(a); + } + } + } + + return arcs; + } + + private static InputSignalTransition getInputSignalTransition(){ + + PetriNet templateNet = PnmlParser.parsePnml(System.getProperty("user.dir") + "/src/main/resources/elements/InputSignalTransition.pnml").get(0); + + for(Transition t : templateNet.allTransitions()){ + if(t.getId().equals("InputSignalTransition")){ + return t.asInputSignalTransition(); + } + } + + return null; + } + + private static OutputSignalPlace getOutputSignalPlace(){ + + PetriNet templateNet = PnmlParser.parsePnml(System.getProperty("user.dir") + "/src/main/resources/elements/OutputSignalPlace.pnml").get(0); + + for(Place p : templateNet.allPlaces()){ + if(p.getId().equals("OutputSignalPlace")){ + return p.asOutputSignalPlace(); + } + } + + return null; + } + + private static PnObject getPnObjectByID(PetriNet petriNet, String Id) { + + for (PnObject po : petriNet.allObjects()) { + if (po.getId().equals(Id)) { + return po; + } + } + + return null; + } + + private static Set<Place> getPlacesBySubnet(PetriNet petriNet, String subnet) { + + Set<Place> places = new HashSet<>(); + + for (Place p : petriNet.allPlaces()) { + if (p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet().equals(subnet)) { + places.add(p); + } + } + + return places; + } + + private static Set<Transition> getTransitionsBySubnet(PetriNet petriNet, String subnet) { + + Set<Transition> transitions = new HashSet<>(); + + for (Transition t : petriNet.allTransitions()) { + if (t.asInputSignalTransition().getStaticTransitionInformation().getSubNet().equals(subnet)) { + transitions.add(t); + } + } + + return transitions; + } + + private static Set<RefPlace> getRefPlaceBySubnet(PetriNet petriNet, String subnet) { + + Set<RefPlace> places = new HashSet<>(); + + for (RefPlace rp : petriNet.allRefPlaces()) { + if (rp.getSubNet().equals(subnet)) { + places.add(rp); + } + } + + return places; + } + + private static Set<RefTransition> getRefTransitionBySubnet(PetriNet petriNet, String subnet) { + + Set<RefTransition> transitions = new HashSet<>(); + + for (RefTransition rt : petriNet.allRefTransitions()) { + if (rt.getSubNet().equals(subnet)) { + transitions.add(rt); + } + } + + return transitions; + } +} diff --git a/src/main/resources/elements/InputSignalTransition.pnml b/src/main/resources/elements/InputSignalTransition.pnml new file mode 100644 index 0000000..a94aa63 --- /dev/null +++ b/src/main/resources/elements/InputSignalTransition.pnml @@ -0,0 +1,29 @@ +<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml"> + <net id="TopicPublisherTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet"> + <name> + <text>InputSignalTransitionNet</text> + </name> + <page id="InputSignalTransitionPage"> + <transition id="InputSignalTransition"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <location>none</location> + <subnet>none</subnet> + <type>discreteTransitionType</type> + <inputsignalbindings> + </inputsignalbindings> + <inputsignalclause></inputsignalclause> + </toolspecific> + <name> + <text>ServiceClientOutputTransition</text> + <graphics> + <offset x="0" y="0" /> + </graphics> + </name> + <graphics> + <position x="0" y="0"/> + </graphics> + </transition> + + </page> + </net> +</pnml> \ No newline at end of file diff --git a/src/main/resources/elements/OutputSignalPlace.pnml b/src/main/resources/elements/OutputSignalPlace.pnml new file mode 100644 index 0000000..a9ab44b --- /dev/null +++ b/src/main/resources/elements/OutputSignalPlace.pnml @@ -0,0 +1,30 @@ +<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml"> + <net id="TopicPublisherTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet"> + <name> + <text>OutputSignalPlaceNet</text> + </name> + <page id="OutputSignalPlacePage"> + <place id="OutputSignalPlace"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <location>none</location> + <subnet>none</subnet> + <type>discretePlaceType</type> + <outputsignalbindings> + </outputsignalbindings> + </toolspecific> + <name> + <text>ServiceTogglePlace</text> + <graphics> + <offset x="0" y="0" /> + </graphics> + </name> + <initialMarking> + <text>0</text> + </initialMarking> + <graphics> + <position x="0" y="0"/> + </graphics> + </place> + </page> + </net> +</pnml> \ No newline at end of file -- GitLab