Skip to content
Snippets Groups Projects
Commit 37835fda authored by Sebastian Ebert's avatar Sebastian Ebert
Browse files

working on petri net subscribers

parent df2d3798
No related branches found
No related tags found
No related merge requests found
Showing
with 577 additions and 29 deletions
...@@ -11,8 +11,11 @@ aspect BalloonExecution { ...@@ -11,8 +11,11 @@ aspect BalloonExecution {
List<BalloonToken> inToken=new ArrayList<>(); List<BalloonToken> inToken=new ArrayList<>();
// build set of direct / indirect incoming places and remove from them
Set<Place> incomingPlaces = transition.resolveInputPlaces();
// take a token from each incoming place // take a token from each incoming place
for(Place place:transition.incomingPlaces()){ for(Place place:incomingPlaces){
BalloonMarkedPlace bmp=this.resolveBalloonPlace(place); BalloonMarkedPlace bmp=this.resolveBalloonPlace(place);
...@@ -28,8 +31,11 @@ aspect BalloonExecution { ...@@ -28,8 +31,11 @@ aspect BalloonExecution {
BalloonToken result=de.tudresden.inf.st.pnml.engine.execution.TransitionCallbackExecutor.execute(inToken,balloonTransition.getBalloonCallbacks()); BalloonToken result=de.tudresden.inf.st.pnml.engine.execution.TransitionCallbackExecutor.execute(inToken,balloonTransition.getBalloonCallbacks());
// build set of direct / indirect outgoing places and remove from them
Set<Place> outgoingPlaces = transition.resolveOutputPlaces();
// place a token in each outgoing place // place a token in each outgoing place
for(Place place:transition.outgoingPlaces()){ for(Place place:outgoingPlaces){
BalloonMarkedPlace bmp=this.resolveBalloonPlace(place); BalloonMarkedPlace bmp=this.resolveBalloonPlace(place);
bmp.getBalloonMarkingList().add(result); bmp.getBalloonMarkingList().add(result);
} }
...@@ -43,8 +49,26 @@ aspect BalloonExecution { ...@@ -43,8 +49,26 @@ aspect BalloonExecution {
return Optional.of(this); return Optional.of(this);
} }
public Optional<BalloonMarking> BalloonMarking.fireTopicSubscriberTransition(java.util.Random random, Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) { public Optional<BalloonMarking> BalloonMarking.fireTopicSubscriberTransition(Transition transition, BalloonToken bt, boolean requireFlush) {
return null;
synchronized(this){
// build set of direct / indirect outgoing places and remove from them
Set<Place> outgoingPlaces = transition.resolveOutputPlaces();
// place a token in each outgoing place
for(Place place : outgoingPlaces){
BalloonMarkedPlace bmp=this.resolveBalloonPlace(place);
bmp.getBalloonMarkingList().add(bt);
}
if(requireFlush){
// flush the entire marking tree
this.flushTreeCache();
}
}
return Optional.of(this);
} }
public Optional<BalloonMarking> BalloonMarking.fireServiceClientTransition(java.util.Random random, Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) { public Optional<BalloonMarking> BalloonMarking.fireServiceClientTransition(java.util.Random random, Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) {
...@@ -77,6 +101,29 @@ aspect BalloonExecution { ...@@ -77,6 +101,29 @@ aspect BalloonExecution {
return storage; return storage;
} }
public BalloonCallbackStorage BalloonCallbackStorage.initializeSubnetCallbackStorage(List<Transition> transitions, PetriNet petriNet) {
for (Transition newT : transitions){
if(newT.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()) {
BalloonTransition balloonTransition = new BalloonTransition();
balloonTransition.setTransition(newT);
this.addTransition(balloonTransition);
for(Transition t : petriNet.allTransitions()){
int splitIdx = newT.getId().lastIndexOf("-");
if(t.getId().equals(newT.getId().substring(0, splitIdx))){
balloonTransition.setBalloonCallbacks(resolveBalloonTransition(t).getBalloonCallbacks());
}
}
}
}
return this;
}
syn BalloonTransition BalloonCallbackStorage.resolveBalloonTransition(Transition transition) = execMap().get(transition); syn BalloonTransition BalloonCallbackStorage.resolveBalloonTransition(Transition transition) = execMap().get(transition);
syn lazy java.util.Map<Transition, BalloonTransition> BalloonCallbackStorage.execMap() { syn lazy java.util.Map<Transition, BalloonTransition> BalloonCallbackStorage.execMap() {
......
...@@ -11,6 +11,8 @@ aspect BalloonMarking { ...@@ -11,6 +11,8 @@ aspect BalloonMarking {
for (Place place : allPlaces()) { for (Place place : allPlaces()) {
System.out.println("Creating marking for: " + place.getId());
BalloonMarkedPlace markedPlace = new BalloonMarkedPlace(); BalloonMarkedPlace markedPlace = new BalloonMarkedPlace();
markedPlace.setPlace(place); markedPlace.setPlace(place);
...@@ -27,6 +29,41 @@ aspect BalloonMarking { ...@@ -27,6 +29,41 @@ aspect BalloonMarking {
return marking; return marking;
} }
public BalloonMarking BalloonMarking.initializeSubnetBalloonMarking(List<Place> subnetPlaces) throws IOException, SAXException, ParserConfigurationException {
for (Place place : subnetPlaces) {
BalloonMarkedPlace markedPlace = new BalloonMarkedPlace();
markedPlace.setPlace(place);
for(String val : de.tudresden.inf.st.pnml.engine.parsing.BalloonTokenParsing.parseBalloonPlaceMarkingToolSpecifics(place)){
BalloonToken token = new BalloonToken();
token.setValue(val);
markedPlace.getBalloonMarkingList().add(token);
}
this.addPlace(markedPlace);
}
return this;
}
public BalloonMarking BalloonMarking.deinitializeSubnet(List<Place> subnetPlaces, List<Transition> subnetTransitions, BalloonCallbackStorage bcs) throws IOException, SAXException, ParserConfigurationException{
for(Place place:subnetPlaces){
System.out.println("Deinit: " + place.getId());
this.resolveBalloonPlace(place).removeSelf();
}
for(Transition transition:subnetTransitions){
bcs.resolveBalloonTransition(transition).removeSelf();
}
return this;
}
syn BalloonMarkedPlace BalloonMarking.resolveBalloonPlace(Place place) = balloonPlaceMap().get(place); syn BalloonMarkedPlace BalloonMarking.resolveBalloonPlace(Place place) = balloonPlaceMap().get(place);
syn lazy java.util.Map<Place, BalloonMarkedPlace> BalloonMarking.balloonPlaceMap() { syn lazy java.util.Map<Place, BalloonMarkedPlace> BalloonMarking.balloonPlaceMap() {
......
...@@ -2,7 +2,13 @@ package de.tudresden.inf.st.pnml.engine; ...@@ -2,7 +2,13 @@ package de.tudresden.inf.st.pnml.engine;
import de.tudresden.inf.st.pnml.engine.execution.DefaultFinalTransitionCallback; import de.tudresden.inf.st.pnml.engine.execution.DefaultFinalTransitionCallback;
import de.tudresden.inf.st.pnml.engine.execution.TransitionCallback; import de.tudresden.inf.st.pnml.engine.execution.TransitionCallback;
import de.tudresden.inf.st.pnml.engine.ros.DiNeRosDefaultNode;
import de.tudresden.inf.st.pnml.engine.ros.DiNeRosDefaultSubscriber;
import de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode;
import de.tudresden.inf.st.pnml.jastadd.model.*; import de.tudresden.inf.st.pnml.jastadd.model.*;
import org.ros.node.DefaultNodeMainExecutor;
import org.ros.node.NodeConfiguration;
import org.ros.node.NodeMainExecutor;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
...@@ -10,11 +16,47 @@ import java.io.IOException; ...@@ -10,11 +16,47 @@ import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.net.URI;
public class Main { public class Main {
private static NodeMainExecutor nodeMainExecutor = DefaultNodeMainExecutor.newDefault();
private static NodeConfiguration nodeConfiguration = NodeConfiguration.newPublic("localhost");
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
String pnmlPath = "../pnml-relast-nets/src/main/resources/balloonTestNets/balloon-correct-3.pnml"; String pnmlPath = "../pnml-relast-engine/src/main/resources/nets/subscriber-test-1.pnml";
PetriNet petriNet = PnmlParser.parsePnml(pnmlPath).get(0);
BalloonMarking bm = petriNet.initializeBalloonMarking();
BalloonCallbackStorage bcs = petriNet.initializeCallbackStorage();
TransitionCallback tc = new DefaultFinalTransitionCallback("default_final_cb", 1);
List<TransitionCallback> tcl = new ArrayList<>();
tcl.add(tc);
System.out.println("----- BEFORE -----");
System.out.println(bm.print());
for(Transition t : petriNet.allTransitions()){
if(t.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()) {
bcs.resolveBalloonTransition(t).setBalloonCallbacks(tcl);
}
}
nodeConfiguration.setMasterUri(URI.create("http://localhost:11311"));
DiNeRosNode diNeRosNode = new DiNeRosDefaultNode("TestNode", petriNet, bm, bcs);
diNeRosNode.getDinerosSubscribers().put("locB", new DiNeRosDefaultSubscriber());
new Thread(() -> {
nodeMainExecutor.execute(diNeRosNode, nodeConfiguration);
}) {{
start();
}};
/*
String pnmlPath = "../pnml-relast-nets/src/main/resources/balloonTestNets/balloon-correct-4.pnml";
PetriNet petriNet = PnmlParser.parsePnml(pnmlPath).get(0); PetriNet petriNet = PnmlParser.parsePnml(pnmlPath).get(0);
BalloonMarking bm = petriNet.initializeBalloonMarking(); BalloonMarking bm = petriNet.initializeBalloonMarking();
...@@ -40,6 +82,8 @@ public class Main { ...@@ -40,6 +82,8 @@ public class Main {
} }
System.out.println("----- AFTER -----"); System.out.println("----- AFTER -----");
System.out.println(bm.print()); System.out.println(bm.print());*/
} }
} }
...@@ -14,6 +14,7 @@ public class DefaultFinalTransitionCallback extends TransitionCallback{ ...@@ -14,6 +14,7 @@ public class DefaultFinalTransitionCallback extends TransitionCallback{
@Override @Override
public List<BalloonToken> processToken(List<BalloonToken> tokens) { public List<BalloonToken> processToken(List<BalloonToken> tokens) {
System.out.println("Executing default callback on " + tokens.size() + " balloon tokens");
List<BalloonToken> tl = new ArrayList<>(); List<BalloonToken> tl = new ArrayList<>();
tl.add(tokens.get(0)); tl.add(tokens.get(0));
return tl; return tl;
......
package de.tudresden.inf.st.pnml.engine.execution; package de.tudresden.inf.st.pnml.engine.execution;
import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken; import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -37,4 +38,5 @@ public abstract class TransitionCallback { ...@@ -37,4 +38,5 @@ public abstract class TransitionCallback {
public List<BalloonToken> processToken(List<BalloonToken> tokens) { public List<BalloonToken> processToken(List<BalloonToken> tokens) {
return tokens; return tokens;
} }
} }
...@@ -21,7 +21,7 @@ public class TransitionCallbackExecutor { ...@@ -21,7 +21,7 @@ public class TransitionCallbackExecutor {
List<TransitionCallback> callbacksSorted = new ArrayList<>(); List<TransitionCallback> callbacksSorted = new ArrayList<>();
List<BalloonToken> outTokens = new ArrayList<>(); List<BalloonToken> outTokens = new ArrayList<>();
outTokens.addAll(inTokens); outTokens.addAll(inTokens);
callbacks.addAll(callbacks); callbacksSorted.addAll(callbacks);
Collections.sort(callbacksSorted, Comparator.comparingInt(TransitionCallback::getPriority)); Collections.sort(callbacksSorted, Comparator.comparingInt(TransitionCallback::getPriority));
...@@ -29,8 +29,9 @@ public class TransitionCallbackExecutor { ...@@ -29,8 +29,9 @@ public class TransitionCallbackExecutor {
if(i < callbacksSorted.size() - 1){ if(i < callbacksSorted.size() - 1){
outTokens = callbacksSorted.get(i).processToken(outTokens); outTokens = callbacksSorted.get(i).processToken(outTokens);
} else { } else {
BalloonToken tb = callbacksSorted.get(i).processToken(outTokens).get(0);
outTokens = new ArrayList<>(); outTokens = new ArrayList<>();
outTokens.add(callbacksSorted.get(i).processToken(outTokens).get(0)); outTokens.add(tb);
} }
} }
......
package de.tudresden.inf.st.pnml.engine.ros; 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; import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
public class DiNeRosDefaultNode extends DiNeRosNode{ public class DiNeRosDefaultNode extends DiNeRosNode{
public DiNeRosDefaultNode(String nodeName, PetriNet petriNet) { public DiNeRosDefaultNode(String nodeName, PetriNet petriNet) {
super(nodeName, petriNet); super(nodeName, petriNet);
} }
public DiNeRosDefaultNode(String nodeName, PetriNet petriNet, BalloonMarking marking, BalloonCallbackStorage callbackStorage) {
super(nodeName, petriNet, marking, callbackStorage);
}
} }
package de.tudresden.inf.st.pnml.engine.ros;
import de.tudresden.inf.st.pnml.jastadd.model.*;
public class DiNeRosDefaultSubscriber implements DiNeRosSubscriber{
@Override
public boolean execute(BalloonMarking balloonMarking, BalloonCallbackStorage balloonCallbackStorage, PetriNet petriNet, String subnet) {
boolean hasFired = false;
while(hasEnabledTransition(petriNet, subnet, balloonMarking)) {
for (Transition transition : petriNet.allTransitions()) {
if (transition.asInputSignalTransition().getStaticTransitionInformation().getSubNet().equals(subnet) &&
transition.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()) {
if (balloonMarking.isBalloonEnabled(transition)) {
System.out.println("Firing transition: " + transition.getId());
balloonMarking.fireTransition(transition, balloonCallbackStorage, true);
hasFired = true;
}
}
}
}
return hasFired;
}
private boolean hasEnabledTransition(PetriNet petriNet, String subnet, BalloonMarking balloonMarking){
for(Transition transition : petriNet.allTransitions()) {
if (transition.asInputSignalTransition().getStaticTransitionInformation().getSubNet().equals(subnet)) {
if(balloonMarking.isBalloonEnabled(transition) && transition.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()){
return true;
}
}
}
return false;
}
}
\ No newline at end of file
...@@ -2,10 +2,8 @@ package de.tudresden.inf.st.pnml.engine.ros; ...@@ -2,10 +2,8 @@ package de.tudresden.inf.st.pnml.engine.ros;
import de.tudresden.inf.st.pnml.base.constants.PnmlConstants; import de.tudresden.inf.st.pnml.base.constants.PnmlConstants;
import de.tudresden.inf.st.pnml.engine.transform.TopicTransformer; 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.*;
import de.tudresden.inf.st.pnml.jastadd.model.BalloonMarking; import org.ros.message.MessageListener;
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.namespace.GraphName;
import org.ros.node.AbstractNodeMain; import org.ros.node.AbstractNodeMain;
import org.ros.node.ConnectedNode; import org.ros.node.ConnectedNode;
...@@ -39,11 +37,30 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -39,11 +37,30 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
} }
} }
public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet, BalloonMarking marking, BalloonCallbackStorage callbackStorage){
this.nodeName = nodeName;
this.petriNet = petriNet;
this.marking = marking;
this.callbackStorage = callbackStorage;
}
@Override @Override
public GraphName getDefaultNodeName() { public GraphName getDefaultNodeName() {
return GraphName.of(nodeName); return GraphName.of(nodeName);
} }
/* @Override
public void onStart(ConnectedNode connectedNode) {
Subscriber<std_msgs.String> subscriber = connectedNode.newSubscriber("chatter", std_msgs.String._TYPE);
subscriber.addMessageListener(new MessageListener<String>() {
@Override
public void onNewMessage(std_msgs.String message) {
System.out.println("I heard: \"" + message.getData() + "\"");
}
});
}*/
@Override @Override
public void onStart(final ConnectedNode connectedNode) { public void onStart(final ConnectedNode connectedNode) {
...@@ -51,8 +68,8 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -51,8 +68,8 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
for(Transition t : petriNet.allTransitions()){ for(Transition t : petriNet.allTransitions()){
if(t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TOPIC_SUBSCRIBER) 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_LIMITED_IN)
|| t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_UNLIMITED_OUT)){ || t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_UNLIMITED_IN)){
Subscriber<String> subscriber = connectedNode.newSubscriber(t.asInputSignalTransition() Subscriber<String> subscriber = connectedNode.newSubscriber(t.asInputSignalTransition()
.getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), std_msgs.String._TYPE); .getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), std_msgs.String._TYPE);
...@@ -60,14 +77,43 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -60,14 +77,43 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
int finalInCount = inCount; int finalInCount = inCount;
subscriber.addMessageListener(message -> { subscriber.addMessageListener(message -> {
System.out.println("I heard: \"" + message.getData() + "\"");
List<java.lang.String> addedElementIds = new ArrayList<>(); List<java.lang.String> addedElementIds = new ArrayList<>();
TopicTransformer.includeSubscriberInstance(petriNet, t.asInputSignalTransition() TopicTransformer.includeSubscriberInstance(petriNet, t.asInputSignalTransition()
.getStaticTransitionInformation().getSubNet(), java.lang.String.valueOf(finalInCount), addedElementIds); .getStaticTransitionInformation().getSubNet(), java.lang.String.valueOf(finalInCount), addedElementIds);
for (Map.Entry<java.lang.String, DiNeRosSubscriber> entry : dinerosSubscribers.entrySet()) { try {
marking.initializeSubnetBalloonMarking(getSubnetPlacesByIds(addedElementIds, petriNet));
callbackStorage.initializeSubnetCallbackStorage(getSubnetTransitionsByIds(addedElementIds, petriNet), petriNet);
} catch (IOException | ParserConfigurationException | SAXException e) {
e.printStackTrace();
}
for (Map.Entry<java.lang.String, DiNeRosSubscriber> entry : getDinerosSubscribers().entrySet()) {
if(entry.getKey().equals(t.asInputSignalTransition().getStaticTransitionInformation().getSubNet())){ if(entry.getKey().equals(t.asInputSignalTransition().getStaticTransitionInformation().getSubNet())){
// fire input
BalloonToken bt = new BalloonToken();
bt.setValue(message.getData());
System.out.println("Firing topic subscriber transition.");
marking.fireTopicSubscriberTransition(t, bt, true);
// execute
entry.getValue().execute(marking, callbackStorage, petriNet, t.asInputSignalTransition().getStaticTransitionInformation().getSubNet()); entry.getValue().execute(marking, callbackStorage, petriNet, t.asInputSignalTransition().getStaticTransitionInformation().getSubNet());
// clean
try {
marking.deinitializeSubnet(getSubnetPlacesByIds(addedElementIds, petriNet), getSubnetTransitionsByIds(addedElementIds, petriNet), callbackStorage);
TopicTransformer.removeSubscriberInstance(petriNet, addedElementIds); TopicTransformer.removeSubscriberInstance(petriNet, addedElementIds);
} catch (IOException | ParserConfigurationException | SAXException e) {
e.printStackTrace();
}
// flush
petriNet.flushTreeCache();
marking.flushTreeCache();
callbackStorage.flushTreeCache();
break; break;
} }
} }
...@@ -76,7 +122,36 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -76,7 +122,36 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
inCount++; inCount++;
} }
} }
}
public List<Place> getSubnetPlacesByIds(List<java.lang.String> ids, PetriNet petriNet){
List<Place> places = new ArrayList<>();
for(java.lang.String id : ids){
for(Place p : petriNet.allPlaces()){
if(p.getId().equals(id)){
places.add(p);
}
}
}
return places;
}
public List<Transition> getSubnetTransitionsByIds(List<java.lang.String> ids, PetriNet petriNet){
List<Transition> transitions = new ArrayList<>();
for(java.lang.String id : ids){
for(Transition t : petriNet.allTransitions()){
if(t.getId().equals(id)){
transitions.add(t);
}
}
}
return transitions;
} }
public Map<java.lang.String, DiNeRosSubscriber> getDinerosSubscribers() { public Map<java.lang.String, DiNeRosSubscriber> getDinerosSubscribers() {
......
package de.tudresden.inf.st.pnml.engine.transform; 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 de.tudresden.inf.st.pnml.jastadd.model.*;
import java.util.HashSet; import java.util.HashSet;
...@@ -20,7 +19,10 @@ public class TopicTransformer { ...@@ -20,7 +19,10 @@ public class TopicTransformer {
copy.setId(p.getId() + "-" + suffix); copy.setId(p.getId() + "-" + suffix);
copy.setToolspecificList(p.getToolspecificList().treeCopy()); copy.setToolspecificList(p.getToolspecificList().treeCopy());
copy.getName().setText(p.getName().getText()); copy.getName().setText(p.getName().getText());
if(p.getNodeGraphics() != null) {
copy.setNodeGraphics(p.getNodeGraphics().treeCopy()); copy.setNodeGraphics(p.getNodeGraphics().treeCopy());
}
// copy initial marking of places // copy initial marking of places
PTMarking m = new PTMarking(); PTMarking m = new PTMarking();
...@@ -40,6 +42,26 @@ public class TopicTransformer { ...@@ -40,6 +42,26 @@ public class TopicTransformer {
petriNet.flushTreeCache(); petriNet.flushTreeCache();
// TODO: Reference Transitions
for(RefPlace rp : getRefPlaceBySubnet(petriNet, subnet)){
RefPlace copy = new RefPlace();
copy.setName(rp.getName().treeCopy());
copy.setId(rp.getId() + "-" + suffix);
if(rp.getNodeGraphics() != null) {
copy.setNodeGraphics(rp.getNodeGraphics().treeCopy());
}
copy.setToolspecificList(rp.getToolspecificList().treeCopy());
String refId = rp.getRef().getId() + "-" + suffix;
copy.setRef(getPlaceNodeById(petriNet, refId));
topPage.addObject(copy);
addedElementIds.add(copy.getId());
}
petriNet.flushTreeCache();
for (Transition t : getTransitionsBySubnet(petriNet, subnet)) { for (Transition t : getTransitionsBySubnet(petriNet, subnet)) {
InputSignalTransition copy = getInputSignalTransition(); InputSignalTransition copy = getInputSignalTransition();
copy.setId(t.getId() + "-" + suffix); copy.setId(t.getId() + "-" + suffix);
...@@ -47,14 +69,12 @@ public class TopicTransformer { ...@@ -47,14 +69,12 @@ public class TopicTransformer {
copy.setMutualInputSignalBindingList(t.asInputSignalTransition().getMutualInputSignalBindingList().treeCopy()); copy.setMutualInputSignalBindingList(t.asInputSignalTransition().getMutualInputSignalBindingList().treeCopy());
copy.getName().setText(t.getName().getText()); copy.getName().setText(t.getName().getText());
copy.setToolspecificList(t.getToolspecificList().treeCopy()); copy.setToolspecificList(t.getToolspecificList().treeCopy());
if(t.getNodeGraphics() != null) {
copy.setNodeGraphics(t.getNodeGraphics().treeCopy()); copy.setNodeGraphics(t.getNodeGraphics().treeCopy());
}
TransitionInformation ti = new DefaultTransitionInformation(); buildTransitionInformation(suffix, t, copy);
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); topPage.addObject(copy);
addedElementIds.add(copy.getId()); addedElementIds.add(copy.getId());
...@@ -78,12 +98,18 @@ public class TopicTransformer { ...@@ -78,12 +98,18 @@ public class TopicTransformer {
} }
} }
if(a.getTarget().isPlaceNode()){ if(a.getTarget().isPlaceObject()){
if(!a.getTarget().asPlaceNode().asPlace().asOutputSignalPlace().getStaticPlaceInformation().getSubNet().equals(subnet)){ if(!a.getTarget().asPlaceNode().asPlace().asOutputSignalPlace().getStaticPlaceInformation().getSubNet().equals(subnet)){
targetId = a.getTarget().getId(); targetId = a.getTarget().getId();
} }
} }
if(a.getTarget().asRefPlace() != null){
if(!a.getTarget().asRefPlace().getSubNet().equals(subnet)){
targetId = a.getTarget().getId();
}
}
newArc.setTarget((Node) getPnObjectByID(petriNet, targetId)); newArc.setTarget((Node) getPnObjectByID(petriNet, targetId));
newArc.setId(sourceId + "-to-" + targetId); newArc.setId(sourceId + "-to-" + targetId);
...@@ -91,13 +117,42 @@ public class TopicTransformer { ...@@ -91,13 +117,42 @@ public class TopicTransformer {
addedElementIds.add(newArc.getId()); addedElementIds.add(newArc.getId());
} }
// TODO: references
petriNet.flushTreeCache(); petriNet.flushTreeCache();
return petriNet; return petriNet;
} }
private static void buildTransitionInformation(String suffix, Transition t, InputSignalTransition copy) {
if(t.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()) {
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);
} else if(t.asInputSignalTransition().getStaticTransitionInformation().isTopicTransitionInformation()) {
TopicTransitionInformation tri = new TopicTransitionInformation();
tri.setInstance(t.asInputSignalTransition().getStaticTransitionInformation().getInstance());
tri.setOutputLimit(t.asInputSignalTransition().getStaticTransitionInformation().getOutputLimit());
tri.setLocation(t.asInputSignalTransition().getStaticTransitionInformation().getLocation());
tri.setSubNet(t.asInputSignalTransition().getStaticTransitionInformation().getSubNet() + "-" + suffix);
tri.setType(t.asInputSignalTransition().getStaticTransitionInformation().getType());
tri.setInputLimit(t.asInputSignalTransition().getStaticTransitionInformation().getInputLimit());
tri.setTopic(t.asInputSignalTransition().getStaticTransitionInformation().asTopicTransitionInformation().getTopic());
copy.setMutualTransitionInformation(tri);
} else if(t.asInputSignalTransition().getStaticTransitionInformation().isServiceTransitionInformation()) {
ServiceTransitionInformation tri = new ServiceTransitionInformation();
tri.setInstance(t.asInputSignalTransition().getStaticTransitionInformation().getInstance());
tri.setOutputLimit(t.asInputSignalTransition().getStaticTransitionInformation().getOutputLimit());
tri.setLocation(t.asInputSignalTransition().getStaticTransitionInformation().getLocation());
tri.setSubNet(t.asInputSignalTransition().getStaticTransitionInformation().getSubNet() + "-" + suffix);
tri.setType(t.asInputSignalTransition().getStaticTransitionInformation().getType());
tri.setInputLimit(t.asInputSignalTransition().getStaticTransitionInformation().getInputLimit());
tri.setServiceName(t.asInputSignalTransition().getStaticTransitionInformation().asServiceTransitionInformation().getServiceName());
copy.setMutualTransitionInformation(tri);
}
}
public static PetriNet removeSubscriberInstance(PetriNet petriNet, List<String> addedElementIds){ public static PetriNet removeSubscriberInstance(PetriNet petriNet, List<String> addedElementIds){
for(String id : addedElementIds){ for(String id : addedElementIds){
...@@ -218,4 +273,14 @@ public class TopicTransformer { ...@@ -218,4 +273,14 @@ public class TopicTransformer {
return transitions; return transitions;
} }
private static PlaceNode getPlaceNodeById(PetriNet petriNet, String id) {
for (PlaceNode p : petriNet.allPlaceNodes()) {
if (p.getId().equals(id)) {
return p;
}
}
return null;
}
} }
<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
<net id="n-E2D0-BCF46-0" type="http://www.pnml.org/version-2009/grammar/ptnet">
<page id="top">
<page id="sourcePage">
<referencePlace id="rp1" ref="channelInPlace">
<name>
<text>rp1</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
<location>loc2</location>
<subnet>locA</subnet>
</toolspecific>
</referencePlace>
</page>
<page id="targetPage">
<transition id="t1">
<name>
<text>t1</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
<location>loc3</location>
<subnet>locB</subnet>
</toolspecific>
</transition>
<transition id="t3">
<name>
<text>t3</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
<location>loc3</location>
<subnet>locB</subnet>
</toolspecific>
</transition>
<transition id="t2">
<name>
<text>t2</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
<location>loc3</location>
<subnet>locB</subnet>
</toolspecific>
</transition>
</page>
<page id="channelPage">
<place id="channelInPlace">
<name>
<text>channelInPlace</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
<location>loc2</location>
<subnet>locA</subnet>
</toolspecific>
<initialMarking>
<text>0</text>
</initialMarking>
</place>
<transition id="channelTransition-publisher-0">
<name>
<text>channelTransition-publisher-0</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1">
<location>loc2</location><type>limitedChannelOutType</type><subnet>locA</subnet><topic>sampleTopic</topic><inputlimit>10</inputlimit><outputlimit>10</outputlimit><inputsignalbindings/> </toolspecific>
</transition>
<arc id="a1" source="channelInPlace" target="channelTransition-publisher-0">
</arc>
</page>
</page>
<name>
<text>topicTest2</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
<communicators>
<communicator>
<cType>topicSub</cType>
<cSubnet>locB</cSubnet>
</communicator>
</communicators>
</toolspecific>
</net>
</pnml>
<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
<net id="n-E2D0-BCF46-0" type="http://www.pnml.org/version-2009/grammar/ptnet">
<page id="top">
<page id="channelPage">
<transition id="channelTransition-subscriber-0">
<name>
<text>channelTransition-subscriber-0</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1">
<location>loc3</location>
<type>limitedChannelInType</type>
<subnet>locB</subnet>
<topic>sampleTopic</topic>
<inputlimit>10</inputlimit>
<outputlimit>10</outputlimit>
<inputsignalbindings/>
</toolspecific>
</transition>
<referencePlace id="rp2" ref="outRefPlace">
<name>
<text>rp2</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
<location>loc3</location>
<subnet>locB</subnet>
</toolspecific>
</referencePlace>
<arc id="a2" source="channelTransition-subscriber-0" target="rp2">
</arc>
</page>
<page id="targetPage">
<place id="p1">
<name>
<text>p1</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
<location>loc3</location>
<subnet>locB</subnet>
</toolspecific>
<initialMarking>
<text>0</text>
</initialMarking>
</place>
<place id="p2">
<name>
<text>p2</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
<location>loc3</location>
<subnet>locB</subnet>
</toolspecific>
<initialMarking>
<text>0</text>
</initialMarking>
</place>
<place id="outRefPlace">
<name>
<text>outRefPlace</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
<location>loc3</location>
<subnet>locB</subnet>
</toolspecific>
<initialMarking>
<text>0</text>
</initialMarking>
</place>
<transition id="t2">
<name>
<text>t2</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
<location>loc3</location>
<subnet>locB</subnet>
</toolspecific>
</transition>
<transition id="t3">
<name>
<text>t3</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
<location>loc3</location>
<subnet>locB</subnet>
</toolspecific>
</transition>
<transition id="t1">
<name>
<text>t1</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
<location>loc3</location>
<subnet>locB</subnet>
</toolspecific>
</transition>
<arc id="a4" source="t1" target="p1">
</arc>
<arc id="a5" source="p1" target="t2">
</arc>
<arc id="a7" source="p2" target="t3">
</arc>
<arc id="a6" source="t2" target="p2">
</arc>
<arc id="a3" source="outRefPlace" target="t1">
</arc>
</page>
</page>
<name>
<text>topicTest2</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
<communicators>
<communicator>
<cType>topicSub</cType>
<cSubnet>locB</cSubnet>
</communicator>
</communicators>
</toolspecific>
</net>
</pnml>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment