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