From 7aa15a3eabdef55dade6ab49e55d847b2a396bbf Mon Sep 17 00:00:00 2001
From: SebastianEbert <sebastian.ebert@tu-dresden.de>
Date: Wed, 14 Jun 2023 18:07:28 +0200
Subject: [PATCH] rewrite: server proto -> server instances

---
 .../flatter/rewrites/ServiceRewrites.jadd     | 15 ++++++
 .../transform/ToolspecificsTransformer.java   | 54 +++++++++++++++++++
 2 files changed, 69 insertions(+)
 create mode 100644 src/main/java/de/tudresden/inf/st/pnml/flatter/transform/ToolspecificsTransformer.java

diff --git a/src/main/jastadd/flatter/rewrites/ServiceRewrites.jadd b/src/main/jastadd/flatter/rewrites/ServiceRewrites.jadd
index 1702d88..e66998c 100644
--- a/src/main/jastadd/flatter/rewrites/ServiceRewrites.jadd
+++ b/src/main/jastadd/flatter/rewrites/ServiceRewrites.jadd
@@ -4,14 +4,29 @@ aspect ServiceRewrites {
      when ( getType() != null && getType().equals(PnmlConstants.PAGE_TYPE_SERVER) && !getId().endsWith(PnmlConstants.PAGE_SERVER_INSTANCE_SUFFIX) )
         to Page {
 
+
               int serverCapacity = 0;
+              String serviceName = this.getServiceName();
+              DinerosTransition serviceTransition = null;
+
               for(DinerosTransition dt : petriNet().allDinerosTransitions()){
                 if(dt.getStaticTransitionInformation().isServiceTransitionInformation()){
                   serverCapacity = dt.getStaticTransitionInformation().asServiceTransitionInformation().getServerChannel().getCapacity();
+                }
+                if(dt.getStaticTransitionInformation().isServiceTransitionInformation()){
+                  if(dt.getStaticTransitionInformation().asServiceTransitionInformation().getServiceName().equals(serviceName)){
+                    serviceTransition = dt;
+                  }
+                }
+
+                if(serverCapacity != 0 && serviceTransition != null){
                   break;
                 }
               }
 
+              de.tudresden.inf.st.pnml.flatter.transform.ToolspecificsTransformer
+                    .updateServiceTransitionToolspecifics(petriNet(), serverCapacity, this);
+
               Page containerPage = new Page();
               containerPage.setId(this.getId() + "-" + PnmlConstants.PAGE_SERVER_CONTAINER_SUFFIX);
 
diff --git a/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/ToolspecificsTransformer.java b/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/ToolspecificsTransformer.java
new file mode 100644
index 0000000..cf20562
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/ToolspecificsTransformer.java
@@ -0,0 +1,54 @@
+package de.tudresden.inf.st.pnml.flatter.transform;
+
+import de.tudresden.inf.st.pnml.base.constants.PnmlConstants;
+import de.tudresden.inf.st.pnml.jastadd.model.*;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+
+public class ToolspecificsTransformer {
+
+    /**
+     * Updates service transitions toolspecifics after service instance flattening
+     * serverInput/serverOutput remain unchanged because we know the new one are id + index + suffix
+     * only client-wise channels are updated
+     */
+    public static void updateServiceTransitionToolspecifics(PetriNet petriNet, int serviceCapacity, Page sPage) {
+
+        Set<String> pagePlaceIds = new HashSet<>();
+
+        for (PnObject p : sPage.getObjectList()) {
+            if (p.isPlaceObject()) {
+                pagePlaceIds.add(p.getId());
+            }
+        }
+
+        for (DinerosTransition dt : petriNet.allDinerosTransitions()) {
+            if (dt.getStaticTransitionInformation().isServiceTransitionInformation()) {
+                for (ServiceChannel sc : dt.getMutableTransitionInformation().asServiceTransitionInformation().getClientChannelList()) {
+
+                    if (pagePlaceIds.contains(sc.getRequestPlaceId().split("-")[0])
+                            && pagePlaceIds.contains(sc.getResponsePlaceId().split("-")[0])) {
+
+                        if (dt.getMutableTransitionInformation() == null) {
+                            dt.setMutableTransitionInformation(dt.getStaticTransitionInformation().asServiceTransitionInformation().treeCopyNoTransform());
+                        }
+
+                        for (int i = 0; i < serviceCapacity; i++) {
+
+                            ServiceChannel newSc = new ServiceChannel();
+                            newSc.setId(UUID.randomUUID().toString());
+                            newSc.setRequestPlaceId(sc.getRequestPlaceId() + "-" + i + "-" + PnmlConstants.PAGE_SERVER_INSTANCE_SUFFIX);
+                            newSc.setResponsePlaceId(sc.getResponsePlaceId() + "-" + i + "-" + PnmlConstants.PAGE_SERVER_INSTANCE_SUFFIX);
+                            dt.getMutableTransitionInformation().asServiceTransitionInformation().getClientChannelList().add(newSc);
+                        }
+
+                        sc.removeSelf();
+                        break;
+                    }
+                }
+            }
+        }
+    }
+}
-- 
GitLab