From 0797726db38937225c176ba0ee7ec9b06dba1311 Mon Sep 17 00:00:00 2001 From: SebastianEbert <sebastian.ebert@tu-dresden.de> Date: Mon, 23 Oct 2023 18:12:22 +0200 Subject: [PATCH] added opposing-place-info to LRPNs --- .../tudresden/inf/st/pnml/splitter/Main.java | 2 +- .../GlobalToLocalNetsPostProcessor.java | 51 ++++--- src/main/nets/TestNet3.pnml | 142 ++++++++++++++++++ 3 files changed, 176 insertions(+), 19 deletions(-) create mode 100644 src/main/nets/TestNet3.pnml diff --git a/src/main/java/de/tudresden/inf/st/pnml/splitter/Main.java b/src/main/java/de/tudresden/inf/st/pnml/splitter/Main.java index de39f4d..d5fd7e2 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/splitter/Main.java +++ b/src/main/java/de/tudresden/inf/st/pnml/splitter/Main.java @@ -23,7 +23,7 @@ public class Main { return; } - List<PetriNet> petriNets = PnmlParser.parsePnml(inputPath); + List<PetriNet> petriNets = PnmlParser.parsePnml(inputPath, false); List<List<PetriNet>> disconnectedPetriNets = new ArrayList<>(); GlobalToLocalNetsPostProcessor processor = new GlobalToLocalNetsPostProcessor(); diff --git a/src/main/java/de/tudresden/inf/st/pnml/splitter/postprocessing/GlobalToLocalNetsPostProcessor.java b/src/main/java/de/tudresden/inf/st/pnml/splitter/postprocessing/GlobalToLocalNetsPostProcessor.java index b78d9af..f53175a 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/splitter/postprocessing/GlobalToLocalNetsPostProcessor.java +++ b/src/main/java/de/tudresden/inf/st/pnml/splitter/postprocessing/GlobalToLocalNetsPostProcessor.java @@ -1,7 +1,6 @@ package de.tudresden.inf.st.pnml.splitter.postprocessing; import de.tudresden.inf.st.pnml.base.constants.PnmlConstants; -import de.tudresden.inf.st.pnml.base.data.CommunicatorInformation; import de.tudresden.inf.st.pnml.jastadd.model.*; import de.tudresden.inf.st.pnml.splitter.constants.SplitterPnmlConstants; import fr.lip6.move.pnml.framework.utils.exception.InvalidIDException; @@ -29,8 +28,8 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { private final Map<String, Map<DinerosPlace, Integer>> topicSubscriberPlaces = new HashMap<>(); private final Map<String, Map<DinerosPlace, Integer>> topicPublisherPlaces = new HashMap<>(); - private final Map<String, List<DinerosPlace>> serviceClientResPlaces = new HashMap<>(); - private final Map<String, List<DinerosPlace>> serviceClientReqPlaces = new HashMap<>(); + private final Map<String, List<Tuple2<DinerosPlace, String>>> serviceClientResPlaces = new HashMap<>(); + private final Map<String, List<Tuple2<DinerosPlace, String>>> serviceClientReqPlaces = new HashMap<>(); private final Map<String, Tuple2<DinerosPlace, Integer>> serviceServerResPlaces = new HashMap<>(); private final Map<String, Tuple2<DinerosPlace, Integer>> serviceServerReqPlaces = new HashMap<>(); @@ -61,7 +60,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { // filter deep copy elements by location for (String location : locations) { - List<PetriNet> reParsedPetriNets = PnmlParser.parsePnml(serializedNetPath); + List<PetriNet> reParsedPetriNets = PnmlParser.parsePnml(serializedNetPath, false); for (PetriNet pn : reParsedPetriNets) { PetriNet separatedNet = createdSeparatedNetByNode(pn, location); separatedNet.setId(separatedNet.getType() + "-" + netSuffix); @@ -126,8 +125,8 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { if (!serviceClientReqPlaces.containsKey(serviceName)) { serviceClientReqPlaces.put(serviceName, new ArrayList<>()); } - serviceClientReqPlaces.get(serviceName).add(petriNet.getPlaceById(sc.getRequestPlaceId()).asDinerosPlace()); - serviceClientResPlaces.get(serviceName).add(petriNet.getPlaceById(sc.getResponsePlaceId()).asDinerosPlace()); + serviceClientReqPlaces.get(serviceName).add(new Tuple2<>(petriNet.getPlaceById(sc.getRequestPlaceId()).asDinerosPlace(), sc.getResponsePlaceId())); + serviceClientResPlaces.get(serviceName).add(new Tuple2<>(petriNet.getPlaceById(sc.getResponsePlaceId()).asDinerosPlace(), sc.getRequestPlaceId())); } serviceServerReqPlaces.put(serviceName, new Tuple2<>(petriNet.getPlaceById(serviceTransition. @@ -298,33 +297,28 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { } - private void buildPlaceInfoListPartWithoutCap(Document doc, Element ports, Map<String, List<DinerosPlace>> map, String placeType) { + private void buildPlaceInfoListPartWithoutCap(Document doc, Element ports, Map<String, List<Tuple2<DinerosPlace, String>>> map, String placeType) { Map<String, Map<DinerosPlace, Integer>> defaultMap = new HashMap<>(); for(String s : map.keySet()){ Map<DinerosPlace, Integer> tMap = new HashMap<>(); - for(DinerosPlace d : map.get(s)){ - tMap.put(d, -1); + for(Tuple2<DinerosPlace, String> t : map.get(s)){ + tMap.put(t.get_1(), -1); } defaultMap.put(s, tMap); } - buildPlaceInfoListPart(doc, ports, defaultMap, placeType, false); + buildPlaceInfoListPart(doc, ports, defaultMap, placeType, false, true); } - private void buildPlaceInfoListPart(Document doc, Element ports, Map<String, Map<DinerosPlace, Integer>> map, String placeType, boolean withLimit) { + private void buildPlaceInfoListPart(Document doc, Element ports, Map<String, Map<DinerosPlace, Integer>> map, String placeType, boolean withLimit, boolean isClient) { for (Map.Entry<String, Map<DinerosPlace, Integer>> entry : map.entrySet()) { - - System.out.println("- " + entry.getKey()); - for (Map.Entry<DinerosPlace, Integer> innerEntry : entry.getValue().entrySet()) { - System.out.println("- - - " + innerEntry.getKey().getId()); - Element port = doc.createElement(PnmlConstants.CHANNEL_PORT_KEY); port.appendChild(doc.createTextNode(innerEntry.getKey().getId())); @@ -342,11 +336,32 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { port.setAttributeNode(attr3); } + if(placeType.equals(PnmlConstants.CHANNEL_PLACE_TYPE_CLIENT_REQ_KEY)){ + Attr attr4 = doc.createAttribute(PnmlConstants.PORTS_CRES_KEY); + findOppositePlace(innerEntry, port, attr4, serviceClientReqPlaces); + } + + if(placeType.equals(PnmlConstants.CHANNEL_PLACE_TYPE_CLIENT_RES_KEY)){ + Attr attr4 = doc.createAttribute(PnmlConstants.PORTS_CREQ_KEY); + findOppositePlace(innerEntry, port, attr4, serviceClientResPlaces); + } + ports.appendChild(port); } } } + private void findOppositePlace(Map.Entry<DinerosPlace, Integer> innerEntry, Element port, Attr attr4, Map<String, List<Tuple2<DinerosPlace, String>>> map) { + for(Map.Entry<String, List<Tuple2<DinerosPlace, String>>> e : map.entrySet()){ + for(Tuple2<DinerosPlace, String> et : e.getValue()){ + if(et.get_1().getId().equals(innerEntry.getKey().getId())){ + attr4.setValue(et.get_2()); + port.setAttributeNode(attr4); + } + } + } + } + private void buildPlaceInfoListServerPart(Document doc, Element ports, Map<String, Tuple2<DinerosPlace, Integer>> map, String placeType) { for (Map.Entry<String, Tuple2<DinerosPlace, Integer>> entry : map.entrySet()) { @@ -385,8 +400,8 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { Element ports = doc.createElement(PnmlConstants.CHANNEL_PORTS_KEY); - buildPlaceInfoListPart(doc, ports, topicPublisherPlaces, PnmlConstants.CHANNEL_PLACE_TYPE_PUB_KEY, true); - buildPlaceInfoListPart(doc, ports, topicSubscriberPlaces, PnmlConstants.CHANNEL_PLACE_TYPE_SUB_KEY, true); + buildPlaceInfoListPart(doc, ports, topicPublisherPlaces, PnmlConstants.CHANNEL_PLACE_TYPE_PUB_KEY, true, false); + buildPlaceInfoListPart(doc, ports, topicSubscriberPlaces, PnmlConstants.CHANNEL_PLACE_TYPE_SUB_KEY, true, false); buildPlaceInfoListPartWithoutCap(doc, ports, serviceClientReqPlaces, PnmlConstants.CHANNEL_PLACE_TYPE_CLIENT_REQ_KEY); buildPlaceInfoListPartWithoutCap(doc, ports, serviceClientResPlaces, PnmlConstants.CHANNEL_PLACE_TYPE_CLIENT_RES_KEY); buildPlaceInfoListServerPart(doc, ports, serviceServerReqPlaces, PnmlConstants.CHANNEL_PLACE_TYPE_SERVER_REQ_KEY); diff --git a/src/main/nets/TestNet3.pnml b/src/main/nets/TestNet3.pnml new file mode 100644 index 0000000..df6cc35 --- /dev/null +++ b/src/main/nets/TestNet3.pnml @@ -0,0 +1,142 @@ +<?xml version="1.0" encoding="UTF-8"?> +<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>ServiceChainNet</text> + </name> + <page id="top"> + <page id="sourcePage"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <type>nodePage</type> + </toolspecific> + <place id="p1"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <node>n1</node> + <subnet>s1</subnet> + </toolspecific> + <initialMarking> + <text>1</text> + </initialMarking> + <name> + <text>p1</text> + </name> + </place> + <place id="p2"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <node>n1</node> + <subnet>s1</subnet> + </toolspecific> + <initialMarking> + <text>0</text> + </initialMarking> + <name> + <text>p2</text> + </name> + </place> + <place id="p3"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <node>n1</node> + <subnet>s1</subnet> + </toolspecific> + <initialMarking> + <text>0</text> + </initialMarking> + <name> + <text>p3</text> + </name> + </place> + </page> + + <transition id="serviceTransition0"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <type>serviceTransitionType</type> + <serviceName>sampleService0</serviceName> + <serverInput>serverIn0</serverInput> + <serverOutput>serverOut0</serverOutput> + <serverCapacity>2</serverCapacity> + <channels> + <channel> + <cid>c1</cid> + <request>p1</request> + <response>p2</response> + </channel> + </channels> + </toolspecific> + <name> + <text>serviceTransition0</text> + </name> + </transition> + <transition id="serviceTransition1"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <type>serviceTransitionType</type> + <serviceName>sampleService1</serviceName> + <serverInput>serverIn1</serverInput> + <serverOutput>serverOut1</serverOutput> + <serverCapacity>2</serverCapacity> + <channels> + <channel> + <cid>c1</cid> + <request>p2</request> + <response>p3</response> + </channel> + </channels> + </toolspecific> + <name> + <text>serviceTransition1</text> + </name> + </transition> + + <page id="targetPage0"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <type>serverPrototype</type> + <serviceName>sampleService0</serviceName> + </toolspecific> + + <place id="serverIn0"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <node>n2</node> + <subnet>s2</subnet> + </toolspecific> + <name> + <text>serverIn0</text> + </name> + </place> + <place id="serverOut0"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <node>n2</node> + <subnet>s2</subnet> + </toolspecific> + <name> + <text>serverOut0</text> + </name> + </place> + </page> + + <page id="targetPage1"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <type>serverPrototype</type> + <serviceName>sampleService1</serviceName> + </toolspecific> + + <place id="serverIn1"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <node>n3</node> + <subnet>s3</subnet> + </toolspecific> + <name> + <text>serverIn1</text> + </name> + </place> + <place id="serverOut1"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <node>n3</node> + <subnet>s3</subnet> + </toolspecific> + <name> + <text>serverOut1</text> + </name> + </place> + </page> + </page> + </net> +</pnml> \ No newline at end of file -- GitLab