From 45e8dac009b4d670ed11745c1de546e255e7fef3 Mon Sep 17 00:00:00 2001
From: SebastianEbert <sebastian.ebert@tu-dresden.de>
Date: Mon, 13 Nov 2023 14:32:39 +0100
Subject: [PATCH] bugfixes on service instances

---
 .../inf/st/pnml/engine/ros/DiNeRosNode.java   |   2 +-
 .../engine/transform/ServiceInstanceUtil.java | 107 +++++-------------
 2 files changed, 32 insertions(+), 77 deletions(-)

diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java
index 262fa78..5e4ecf9 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java
@@ -323,7 +323,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
                     for (int i = 0; i < limit; i++) {
 
                         System.out.println("[" + nodeName + "] Copying server page " + key + " (" + i + ").");
-                        Page copy = ServiceInstanceUtil.treeCopyWithoutArcs(p);
+                        Page copy = ServiceInstanceUtil.treeCopyWithoutArcs(petriNet, p);
                         ServiceInstanceUtil.updateInstanceIds(copy, "-INSTANCE-" + i);
                         copy.setId(p.getId() + "-INSTANCE-" + i);
                         copy.getName().setText(copy.getId());
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/transform/ServiceInstanceUtil.java b/src/main/java/de/tudresden/inf/st/pnml/engine/transform/ServiceInstanceUtil.java
index 9cf6c0c..bc27844 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/transform/ServiceInstanceUtil.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/transform/ServiceInstanceUtil.java
@@ -33,7 +33,8 @@ public class ServiceInstanceUtil {
         for (Arc a : originalArcs) {
 
             Page originalArcPage = Objects.requireNonNull(getObjectInPage(original, a.getId()))._2;
-            Page arcPage = Objects.requireNonNull(getObjectInPage(copy, originalArcPage.getId() + suffix))._1.asPage();
+            Page arcPage = Objects.requireNonNull(getObjectInPage(copy,
+                    originalArcPage.getId() + suffix))._1.asPage();
             Pair<PnObject, Page> source = getObjectInPage(copy, a.getSource().getId() + suffix);
             Pair<PnObject, Page> target = getObjectInPage(copy, a.getTarget().getId() + suffix);
             Arc copyArc = new Arc();
@@ -85,11 +86,11 @@ public class ServiceInstanceUtil {
         }
     }
 
-    public static Page treeCopyWithoutArcs(Page currentPage) {
-        return treeCopyWithoutArcsInternal(currentPage, null);
+    public static Page treeCopyWithoutArcs(PetriNet petriNet, Page currentPage) {
+        return treeCopyWithoutArcsInternal(petriNet, currentPage, null);
     }
 
-    private static Page treeCopyWithoutArcsInternal(Page currentPage, Page parent) {
+    private static Page treeCopyWithoutArcsInternal(PetriNet petriNet, Page currentPage, Page parent) {
 
         Map<String, PnObject> rMap = new HashMap<>();
 
@@ -108,7 +109,7 @@ public class ServiceInstanceUtil {
                 copyPage.setName(pnObject.getName().treeCopy());
                 parent.addObject(copyPage);
 
-                treeCopyWithoutArcsInternal(pnObject.asPage(), copyPage);
+                treeCopyWithoutArcsInternal(petriNet, pnObject.asPage(), copyPage);
             }
 
             if (pnObject.isPlaceObject()) {
@@ -132,24 +133,26 @@ public class ServiceInstanceUtil {
         }
 
         for (PnObject pnObject : currentPage.getObjects()) {
-            if (pnObject.isTransitionObject() &&
-                    pnObject.asDinerosTransition().isRefTransition()) {
+
+            Name n = new Name();
+            n.setText(pnObject.getId());
+
+            if (pnObject.isRefTransitionObject()) {
                 RefTransition copyRt = new RefTransition();
                 copyRt.setId(pnObject.getId());
-                copyRt.setName(pnObject.getName().treeCopy());
-                copyRt.setRef(rMap.get(pnObject.asDinerosTransition().
-                        asRefTransition().getRef().getId()).asDinerosTransition());
+                copyRt.setName(n.treeCopy());
+                copyRt.setRef(Objects.requireNonNull(getReferencedObject(petriNet,
+                        rMap, pnObject.asRefTransitionObject().getRef().getId())).asDinerosTransition());
                 copyRt.setToolspecificList(pnObject.getToolspecificList().treeCopy());
                 parent.addObject(copyRt);
             }
 
-            if (pnObject.isPlaceObject() &&
-                    pnObject.asDinerosPlace().isRefPlace()) {
+            if (pnObject.isRefPlaceObject()) {
                 RefPlace copyRp = new RefPlace();
                 copyRp.setId(pnObject.getId());
-                copyRp.setName(pnObject.getName().treeCopy());
-                copyRp.setRef(rMap.get(pnObject.asDinerosPlace().
-                        asRefPlace().getRef().getId()).asDinerosPlace());
+                copyRp.setName(n.treeCopy());
+                copyRp.setRef(Objects.requireNonNull(getReferencedObject(petriNet,
+                        rMap, pnObject.asRefPlaceObject().getRef().getId())).asDinerosPlace());
                 copyRp.setToolspecificList(pnObject.getToolspecificList().treeCopy());
                 parent.addObject(copyRp);
             }
@@ -158,70 +161,22 @@ public class ServiceInstanceUtil {
         return parent;
     }
 
-    /*public static void updateArcs(Page page, String suffix){
-
-        for(PnObject pnObject : page.getObjects()){
-
-            if(pnObject.isArcNode()){
-                for(PnObject pnObjectIn : page.getObjects()){
-                    if((pnObjectIn.isPlaceObject() || pnObjectIn.isTransitionObject()) &&
-                            pnObjectIn.getId()
-                                    .equals(pnObject.asArc().getSource().getId() + suffix)){
-                        pnObject.asArc().setSource(pnObjectIn.asNode());
-                        System.out.println("Updating Arc " + pnObject.getId() + " -> new Source: " + pnObjectIn.getId());
-                    }
-                    if((pnObjectIn.isPlaceObject() || pnObjectIn.isTransitionObject()) &&
-                            pnObjectIn.getId()
-                                    .equals(pnObject.asArc().getTarget().getId() + suffix)){
-                        pnObject.asArc().setTarget(pnObjectIn.asNode());
-                        System.out.println("Updating Arc " + pnObject.getId() + " -> new Target: " + pnObjectIn.getId());
-                    }
-                }
-            }
+    private static PnObject getReferencedObject(PetriNet petriNet,  Map<String, PnObject> rMap, String id){
 
-            if(pnObject.isPageNode()){
-                updateArcs(pnObject.asPage(), suffix);
-            }
-        }
-    }*/
-
-  /*  public static void removeIllegalRefsToArcs(Page page, String suffix){
-
-        for(PnObject pnObject : page.getObjects()){
-            if(pnObject.isPlaceObject()){
-                for (int i = 0; i < pnObject.asDinerosPlace().getInArcs().size(); i++){
-                    if(!pnObject.asDinerosPlace().getInArcs().get(i).getId().contains(suffix)){
-                        System.out.println("Removing ref on " +
-                                pnObject.asDinerosPlace().getInArcs().get(i).getId() + " on " + pnObject.getId());
-                        pnObject.asDinerosPlace().getInArcs().get(i).removeSelf();
-                    }
-                }
-                for (int i = 0; i < pnObject.asDinerosPlace().getOutArcs().size(); i++){
-                    if(!pnObject.asDinerosPlace().getOutArcs().get(i).getId().contains(suffix)){
-                        System.out.println("Removing ref on " +
-                                pnObject.asDinerosPlace().getOutArcs().get(i).getId() + " on " + pnObject.getId());
-                        pnObject.asDinerosPlace().getOutArcs().get(i).removeSelf();
-                    }
-                }
-            }
+        PnObject referencedObject = rMap.get(id);
 
-            if(pnObject.isTransitionObject()){
-                for (int i = 0; i < pnObject.asDinerosTransition().getInArcs().size(); i++){
-                    if(!pnObject.asDinerosTransition().getInArcs().get(i).getId().contains(suffix)){
-                        System.out.println("Removing ref on " +
-                                pnObject.asDinerosTransition().getInArcs().get(i).getId() + " on " + pnObject.getId());
-                        pnObject.asDinerosTransition().getInArcs().get(i).removeSelf();
-                    }
-                }
-                for (int i = 0; i < pnObject.asDinerosTransition().getOutArcList().size(); i++){
-                    if(!pnObject.asDinerosTransition().getOutArcs().get(i).getId().contains(suffix)){
-                        System.out.println("Removing ref on " +
-                                pnObject.asDinerosTransition().getOutArcs().get(i).getId() + " on " + pnObject.getId());
-                        pnObject.asDinerosTransition().getOutArcs().get(i).removeSelf();
-                    }
+        if(referencedObject == null){
+            System.out.println("Searching for external referenced object: " + id);
+            for(PnObject pnObject : petriNet.allObjects()){
+                if(pnObject.getId().equals(id)){
+                    System.out.println("Found external referenced object: " + id);
+                    return pnObject;
                 }
             }
+        } else {
+            return referencedObject;
         }
-    }*/
-}
 
+        return null;
+    }
+}
\ No newline at end of file
-- 
GitLab