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

pages support

parent 1f365455
No related branches found
No related tags found
No related merge requests found
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
......@@ -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++){
......
......@@ -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);
......
......@@ -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
......
<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
......@@ -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">
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment