diff --git a/src/main/java/de/tudresden/inf/st/data/Tuple2.java b/src/main/java/de/tudresden/inf/st/data/Tuple2.java new file mode 100644 index 0000000000000000000000000000000000000000..d5adc5f6b4f52366a6c3cbfcf6260b4046c74694 --- /dev/null +++ b/src/main/java/de/tudresden/inf/st/data/Tuple2.java @@ -0,0 +1,20 @@ +package de.tudresden.inf.st.data; + +public class Tuple2<K, V> { + + private K _1; + private V _2; + + public Tuple2(K _1, V _2){ + this._1 = _1; + this._2 = _2; + } + + public K get_1() { + return _1; + } + + public V get_2() { + return _2; + } +} \ No newline at end of file diff --git a/src/main/java/de/tudresden/inf/st/pnml/Main.java b/src/main/java/de/tudresden/inf/st/pnml/Main.java index a4e4341e46170cbdf73d973eb81a05efe34c0bbb..62323d4a457a1b83937eb052f2096281d96f0c17 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/Main.java +++ b/src/main/java/de/tudresden/inf/st/pnml/Main.java @@ -2,6 +2,7 @@ package de.tudresden.inf.st.pnml; import de.tudresden.inf.st.export.PnmlExporter; import de.tudresden.inf.st.pnml.jastadd.model.PetriNet; +import de.tudresden.inf.st.pnml.jastadd.model.RefTransition; import de.tudresden.inf.st.postprocessing.GlobalToLocalNetsPostProcessor; import de.tudresden.inf.st.postprocessing.PostProcessingUtils; import fr.lip6.move.pnml.framework.utils.exception.InvalidIDException; @@ -19,18 +20,25 @@ public class Main { String inputPath = (args.length > 0) ? args[0] : null; - /* if(inputPath == null){ + if(inputPath == null){ logger.error("No model found on given input path."); return; - }*/ + } - List<PetriNet> petriNets = PnmlParser.parsePnml("src/main/nets/jointTestNet1.pnml"); - //List<PetriNet> petriNets = PnmlParser.parsePnml(inputPath); + //List<PetriNet> petriNets = PnmlParser.parsePnml("src/main/nets/jointTestNet2.pnml"); + List<PetriNet> petriNets = PnmlParser.parsePnml(inputPath); List<List<PetriNet>> disconnectedPetriNets = new ArrayList<>(); petriNets.forEach(pn -> disconnectedPetriNets.add(GlobalToLocalNetsPostProcessor.disconnectNets(pn))); + for(List<PetriNet> petriNetList : disconnectedPetriNets){ + for(PetriNet petriNet : petriNetList){ + PostProcessingUtils.cleanEmptyPages(petriNet); + petriNet.flushTreeCache(); + } + } + logger.info("------------------------------------------------------------------------------------"); for(int i = 0; i < disconnectedPetriNets.size(); i++){ diff --git a/src/main/java/de/tudresden/inf/st/postprocessing/GlobalToLocalNetsPostProcessor.java b/src/main/java/de/tudresden/inf/st/postprocessing/GlobalToLocalNetsPostProcessor.java index 66c72a54b5252a0ac349af66d48beef4a0c8886c..16d2626bd8f9d59e31ec88c87d66e9aa50768cb0 100644 --- a/src/main/java/de/tudresden/inf/st/postprocessing/GlobalToLocalNetsPostProcessor.java +++ b/src/main/java/de/tudresden/inf/st/postprocessing/GlobalToLocalNetsPostProcessor.java @@ -2,6 +2,7 @@ package de.tudresden.inf.st.postprocessing; import de.tudresden.inf.st.constants.SplitterPnmlConstants; import de.tudresden.inf.st.constants.PnmlConstants; +import de.tudresden.inf.st.data.Tuple2; import de.tudresden.inf.st.export.PnmlExporter; import de.tudresden.inf.st.pnml.PnmlParser; import de.tudresden.inf.st.pnml.jastadd.model.*; @@ -22,10 +23,7 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.StringWriter; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { @@ -89,6 +87,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { Set<Transition> transitionsToAdd = new HashSet<>(); Set<Transition> transitionsToRemove = new HashSet<>(); + Map<String, Page> transitionToContainingPageMapping = new HashMap<>(); for (Transition transition : petriNet.allTransitions()) { @@ -104,10 +103,10 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { if (ist.getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_SERVICE_REQUEST)) { // target transitions - refactorServiceTransitionTargets(transitionsToAdd, transition, ist, serviceTargetCount, processedRequestTargetSubnets, PnmlConstants.TRANSITION_TYPE_SERVICE_REQUEST_OUT, "-service-req-target-"); + refactorServiceTransitionTargets(transitionsToAdd, transitionToContainingPageMapping, transition, ist, serviceTargetCount, processedRequestTargetSubnets, PnmlConstants.TRANSITION_TYPE_SERVICE_REQUEST_OUT, "-service-req-target-"); // source transitions - refactorServiceTransitionSources(transitionsToAdd, transition, ist, serviceSourceCount, processedRequestSourceSubnets, PnmlConstants.TRANSITION_TYPE_SERVICE_REQUEST_IN, "-service-req-source-"); + refactorServiceTransitionSources(transitionsToAdd, transitionToContainingPageMapping, transition, ist, serviceSourceCount, processedRequestSourceSubnets, PnmlConstants.TRANSITION_TYPE_SERVICE_REQUEST_IN, "-service-req-source-"); transitionsToRemove.add(transition); } @@ -115,10 +114,10 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { if (ist.getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_SERVICE_RESPONSE)) { // target transitions - refactorServiceTransitionTargets(transitionsToAdd, transition, ist, serviceTargetCount, processedResponseTargetSubnets, PnmlConstants.TRANSITION_TYPE_SERVICE_RESPONSE_OUT, "-service-res-target-"); + refactorServiceTransitionTargets(transitionsToAdd, transitionToContainingPageMapping, transition, ist, serviceTargetCount, processedResponseTargetSubnets, PnmlConstants.TRANSITION_TYPE_SERVICE_RESPONSE_OUT, "-service-res-target-"); // source transitions - refactorServiceTransitionSources(transitionsToAdd, transition, ist, serviceSourceCount, processedResponseSourceSubnets, PnmlConstants.TRANSITION_TYPE_SERVICE_RESPONSE_OUT, "-service-res-source-"); + refactorServiceTransitionSources(transitionsToAdd, transitionToContainingPageMapping, transition, ist, serviceSourceCount, processedResponseSourceSubnets, PnmlConstants.TRANSITION_TYPE_SERVICE_RESPONSE_OUT, "-service-res-source-"); transitionsToRemove.add(transition); } @@ -130,7 +129,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { } for (Transition t : transitionsToAdd) { - petriNet.getPage(0).addObject(t); + transitionToContainingPageMapping.get(t.getId()).addObject(t); } petriNet.flushTreeCache(); @@ -138,7 +137,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { return petriNet; } - private static void refactorServiceTransitionSources(Set<Transition> transitionsToAdd, Transition transition, InputSignalTransition ist, int serviceCount, Set<String> processedSubnets, String targetType, String sufix) { + private static void refactorServiceTransitionSources(Set<Transition> transitionsToAdd, Map<String, Page> transitionToContainingPageMapping , Transition transition, InputSignalTransition ist, int serviceCount, Set<String> processedSubnets, String targetType, String sufix) { for (Place p : ist.incomingPlaces()) { @@ -147,7 +146,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { String inLocation = p.asOutputSignalPlace().getStaticPlaceInformation().getLocation(); String inSubNet = p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet(); - InputSignalTransition sourceIst = createRosInputTransition(ist, serviceCount, sufix); + InputSignalTransition sourceIst = createRosTransition(ist, serviceCount, sufix); ServiceTransitionInformation tInfoSource = copyServiceTransitionInformation(ist, inLocation, inSubNet); @@ -163,6 +162,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { // Add new transitions to net transitionsToAdd.add(sourceIst); + transitionToContainingPageMapping.put(sourceIst.getId(), transition.ContainingPage()); serviceCount++; processedSubnets.add(p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet()); @@ -180,7 +180,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { } } - private static void refactorServiceTransitionTargets(Set<Transition> transitionsToAdd, Transition transition, InputSignalTransition ist, int serviceCount, Set<String> processedSubnets, String targetType, String sufix) { + private static void refactorServiceTransitionTargets(Set<Transition> transitionsToAdd, Map<String, Page> transitionToContainingPageMapping , Transition transition, InputSignalTransition ist, int serviceCount, Set<String> processedSubnets, String targetType, String sufix) { for (Place p : ist.outgoingPlaces()) { @@ -189,7 +189,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { String outLocation = p.asOutputSignalPlace().getStaticPlaceInformation().getLocation(); String outSubNet = p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet(); - InputSignalTransition requestServerIst = createRosInputTransition(ist, serviceCount, sufix); + InputSignalTransition targetIst = createRosTransition(ist, serviceCount, sufix); ServiceTransitionInformation tInfoTarget = copyServiceTransitionInformation(ist, outLocation, outSubNet); @@ -199,18 +199,19 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { tInfoTarget.setType(targetType); outputToolInfoJastAddList.add(buildServiceToolSpecifics(targetType, outLocation, outSubNet, tInfoTarget.getServiceName(), null)); - requestServerIst.setToolspecificList(outputToolInfoJastAddList); - requestServerIst.setMutualTransitionInformation(tInfoTarget); + targetIst.setToolspecificList(outputToolInfoJastAddList); + targetIst.setMutualTransitionInformation(tInfoTarget); // Gel all outgoing arcs and connect them to new input transition for (Arc arc : p.asOutputSignalPlace().getInArcList().toArray(new Arc[0])) { if (arc.getSource().getId().equals(transition.getId())) { - arc.setSource(requestServerIst); + arc.setSource(targetIst); } } // Add new transitions to net - transitionsToAdd.add(requestServerIst); + transitionsToAdd.add(targetIst); + transitionToContainingPageMapping.put(targetIst.getId(), transition.ContainingPage()); serviceCount++; processedSubnets.add(p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet()); @@ -231,6 +232,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { Set<Transition> transitionsToAdd = new HashSet<>(); Set<Transition> transitionsToRemove = new HashSet<>(); + Map<String, Page> transitionToContainingPageMapping = new HashMap<>(); for (Transition transition : petriNet.allTransitions()) { @@ -246,10 +248,10 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { transitionsToRemove.add(transition); // Create and integrate new publisher transitions - refactorPublisherSide(transitionsToAdd, transition, channelIst); + refactorPublisherSide(transitionsToAdd, transitionToContainingPageMapping, transition, channelIst); // Create and integrate new subscriber transitions - refactorSubscriberSide(transitionsToAdd, transition, channelIst); + refactorSubscriberSide(transitionsToAdd, transitionToContainingPageMapping, transition, channelIst); } } @@ -259,7 +261,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { } for (Transition t : transitionsToAdd) { - petriNet.getPage(0).addObject(t); + transitionToContainingPageMapping.get(t.getId()).addObject(t); } //petriNet.flushAttrAndCollectionCache(); @@ -268,7 +270,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { return petriNet; } - private static void refactorSubscriberSide(Set<Transition> transitionsToAdd, Transition transition, InputSignalTransition channelIst) { + private static void refactorSubscriberSide(Set<Transition> transitionsToAdd, Map<String, Page> transitionToContainingPageMapping, Transition transition, InputSignalTransition channelIst) { int subscriberCount = 0; Set<String> processedSubnets = new HashSet<>(); @@ -280,7 +282,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { String outLocation = p.asOutputSignalPlace().getStaticPlaceInformation().getLocation(); String outSubNet = p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet(); - InputSignalTransition subscriberIst = createRosInputTransition(channelIst, subscriberCount, "-subscriber-"); + InputSignalTransition subscriberIst = createRosTransition(channelIst, subscriberCount, "-subscriber-"); TopicTransitionInformation tInfoTarget = new TopicTransitionInformation(); tInfoTarget.setSubNet(outSubNet); @@ -313,6 +315,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { // Add new transitions to net transitionsToAdd.add(subscriberIst); + transitionToContainingPageMapping.put(subscriberIst.getId(), transition.ContainingPage()); subscriberCount++; processedSubnets.add(p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet()); @@ -330,7 +333,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { } } - private static void refactorPublisherSide(Set<Transition> transitionsToAdd, Transition transition, InputSignalTransition channelIst) { + private static void refactorPublisherSide(Set<Transition> transitionsToAdd, Map<String, Page> transitionToContainingPageMapping, Transition transition, InputSignalTransition channelIst) { int publisherCount = 0; Set<String> processedSubnets = new HashSet<>(); @@ -342,7 +345,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { String inLocation = p.asOutputSignalPlace().getStaticPlaceInformation().getLocation(); String inSubNet = p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet(); - InputSignalTransition publisherIst = createRosInputTransition(channelIst, publisherCount, "-publisher-"); + InputSignalTransition publisherIst = createRosTransition(channelIst, publisherCount, "-publisher-"); TopicTransitionInformation tInfoSource = new TopicTransitionInformation(); tInfoSource.setSubNet(inSubNet); @@ -372,6 +375,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { // Add new transitions to net transitionsToAdd.add(publisherIst); + transitionToContainingPageMapping.put(publisherIst.getId(), transition.ContainingPage()); publisherCount++; processedSubnets.add(p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet()); @@ -564,7 +568,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { } @NotNull - private static InputSignalTransition createRosInputTransition(InputSignalTransition ist, int serviceCount, String sufix) { + private static InputSignalTransition createRosTransition(InputSignalTransition ist, int serviceCount, String sufix) { InputSignalTransition sourceIst = new InputSignalTransition(); sourceIst.setName(new Name().setText(ist.getName().getText() + sufix + serviceCount)); sourceIst.setId(ist.getId() + sufix + serviceCount); diff --git a/src/main/java/de/tudresden/inf/st/postprocessing/PostProcessingUtils.java b/src/main/java/de/tudresden/inf/st/postprocessing/PostProcessingUtils.java index 458327c145bc9ec735100322c89d57033e4ff1b2..5df65934284e46c882fb3a76d6ca70f5483cc757 100644 --- a/src/main/java/de/tudresden/inf/st/postprocessing/PostProcessingUtils.java +++ b/src/main/java/de/tudresden/inf/st/postprocessing/PostProcessingUtils.java @@ -7,7 +7,9 @@ import de.tudresden.inf.st.pnml.jastadd.model.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -90,6 +92,20 @@ public class PostProcessingUtils { // NET MANIPULATION /////////// /////////////////////////////// + public static void cleanEmptyPages(PetriNet petriNet){ + + List<Page> pagesToRemove = new ArrayList<>(); + + for(Page p : petriNet.allPages()){ + if(p.getNumObject() == 0){ + pagesToRemove.add(p); + } + } + + pagesToRemove.forEach(p -> p.removeSelf()); + + } + /** * Updates the mutual instance ids, and (if not already existing creates a nre mutual information, based on the static one. * @param petriNet diff --git a/src/main/nets/jointTestNet2.pnml b/src/main/nets/jointTestNet2.pnml new file mode 100644 index 0000000000000000000000000000000000000000..e9193aa961e3c0929ba3bed92a9cbe3907391af0 --- /dev/null +++ b/src/main/nets/jointTestNet2.pnml @@ -0,0 +1,198 @@ +<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"> + <name> + <text>minimal</text> + </name> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + </toolspecific> + <page id="page1"> + <place id="p1"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <location>node-1</location> + <subnet>subnet-1</subnet> + <type>discretePlaceType</type> + </toolspecific> + <name> + <text>p1</text> + <graphics> + <offset x="0" y="-10" /> + </graphics> + </name> + <initialMarking> + <text>1</text> + </initialMarking> + <graphics> + <position x="30" y="50"/> + </graphics> + </place> + <place id="p2"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <location>node-2</location> + <subnet>subnet-2</subnet> + <type>discretePlaceType</type> + </toolspecific> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + </toolspecific> + <name> + <text>p2</text> + <graphics> + <offset x="0" y="-10" /> + </graphics> + </name> + <initialMarking> + <text>0</text> + </initialMarking> + <graphics> + <position x="635" y="90"/> + </graphics> + </place> + <place id="p3"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <location>node-2</location> + <subnet>subnet-2</subnet> + <type>discretePlaceType</type> + </toolspecific> + <name> + <text>p3</text> + <graphics> + <offset x="0" y="-10" /> + </graphics> + </name> + <initialMarking> + <text>1</text> + </initialMarking> + <graphics> + <position x="30" y="50"/> + </graphics> + </place> + <place id="p4"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <location>node-1</location> + <subnet>subnet-1</subnet> + <type>discretePlaceType</type> + </toolspecific> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + </toolspecific> + <name> + <text>p4</text> + <graphics> + <offset x="0" y="-10" /> + </graphics> + </name> + <initialMarking> + <text>0</text> + </initialMarking> + <graphics> + <position x="635" y="90"/> + </graphics> + </place> + <place id="p5"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <location>node-1</location> + <subnet>subnet-1</subnet> + <type>discretePlaceType</type> + </toolspecific> + <name> + <text>p5</text> + <graphics> + <offset x="0" y="-10" /> + </graphics> + </name> + <initialMarking> + <text>1</text> + </initialMarking> + <graphics> + <position x="30" y="50"/> + </graphics> + </place> + <place id="p6"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <location>node-3</location> + <subnet>subnet-3</subnet> + <type>discretePlaceType</type> + </toolspecific> + <name> + <text>p6</text> + <graphics> + <offset x="0" y="-10" /> + </graphics> + </name> + <initialMarking> + <text>1</text> + </initialMarking> + <graphics> + <position x="30" y="50"/> + </graphics> + </place> + + <transition id="t1"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <location>channel</location> + <subnet>channel</subnet> + <type>serviceTransitionTypeRequest</type> + <serviceName>sampleService</serviceName> + </toolspecific> + <name> + <text>t1</text> + <graphics> + <offset x="0" y="0" /> + </graphics> + </name> + <graphics> + <position x="300" y="50"/> + </graphics> + </transition> + <transition id="t2"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <location>channel</location> + <subnet>channel</subnet> + <type>serviceTransitionTypeResponse</type> + <serviceName>sampleService</serviceName> + </toolspecific> + <name> + <text>t2</text> + <graphics> + <offset x="0" y="0" /> + </graphics> + </name> + <graphics> + <position x="300" y="50"/> + </graphics> + </transition> + <page id="page2"> + <transition id="t3"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <location>channel</location> + <subnet>channel</subnet> + <type>topicTransitionType</type> + <topic>sampleTopic</topic> + <inputlimit>10</inputlimit> + <outputlimit>10</outputlimit> + </toolspecific> + <name> + <text>t3</text> + <graphics> + <offset x="0" y="0" /> + </graphics> + </name> + <graphics> + <position x="300" y="50"/> + </graphics> + </transition> + </page> + + <arc id="arc-p1-t1" source="p1" target="t1"> + </arc> + <arc id="arc-t1-p2" source="t1" target="p2"> + </arc> + <arc id="arc-p3-t2" source="p3" target="t2"> + </arc> + <arc id="arc-t2-p4" source="t2" target="p4"> + </arc> + <arc id="arc-p5-t3" source="p5" target="t3"> + </arc> + <arc id="arc-t3-p6" source="t3" target="p6"> + </arc> + </page> + </net> +</pnml> \ No newline at end of file diff --git a/src/main/nets/testNet1.pnml b/src/main/nets/testNet1.pnml index 60c317f220a946b164303c757081b03893798977..850dae65159af7e4a0a321b7f5f28d203156830e 100644 --- a/src/main/nets/testNet1.pnml +++ b/src/main/nets/testNet1.pnml @@ -94,6 +94,7 @@ <position x="635" y="90"/> </graphics> </place> + <page id="page2"> <transition id="t1"> <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> <location>channel</location> @@ -120,6 +121,7 @@ <position x="300" y="50"/> </graphics> </transition> + </page> <arc id="arc-p1-t1" source="p1" target="t1"> </arc> <arc id="arc-t1-p2" source="t1" target="p2">