From a1d86068d189da9c65e0951fda8a6fa2d70c75f4 Mon Sep 17 00:00:00 2001
From: SebastianEbert <sebastian.ebert@tu-dresden.de>
Date: Fri, 23 Sep 2022 16:41:19 +0200
Subject: [PATCH] fixed service modelling

---
 .../tudresden/inf/st/pnml/flatter/Main.java   |  9 +++--
 .../flatter/template/TemplateConstants.java   |  1 +
 .../flatter/transform/ChannelFlatter.java     | 38 +++++++++++++++----
 3 files changed, 36 insertions(+), 12 deletions(-)

diff --git a/src/main/java/de/tudresden/inf/st/pnml/flatter/Main.java b/src/main/java/de/tudresden/inf/st/pnml/flatter/Main.java
index d43bd9b..17b1c03 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/flatter/Main.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/flatter/Main.java
@@ -33,8 +33,8 @@ public class Main {
 
         // parse the global not flatted petri net
         // pnmlPath = "../pnml-relast-nets/src/main/resources/signalFlatteningTestNets/inputsignal-simple-3.pnml";
-        //pnmlPath = "../pnml-relast-nets/src/main/resources/serviceTestNets/structureTestNets/service-structure-correct.pnml";
-        //configPath = "src/main/config/config.json";
+        // String pnmlPath = "../pnml-relast-nets/src/main/resources/serviceTestNets/structureTestNets/service-structure-correct.pnml";
+        // String configPath = "src/main/config/config.json";
         PetriNet petriNet = PnmlParser.parsePnml(pnmlPath).get(0);
 
         // read config for analyzer from file
@@ -64,12 +64,12 @@ public class Main {
         // flat service clients / servers to instance based semantics
         logger.error("[FLATTER] Breaking down service channels.");
         PetriNet serviceFlattedPetriNet = ChannelFlatter.flatServiceChannels(topicFlattedPetriNet);
-        printNet(serviceFlattedPetriNet);
+        // printNet(serviceFlattedPetriNet);
 
         // flat input signals
         logger.error("[FLATTER] Breaking down signals.");
         PetriNet signalFlattedPetriNet = ChannelFlatter.flatSignals(serviceFlattedPetriNet);
-        // printNet(signalFlattedPetriNet);
+        printNet(signalFlattedPetriNet);
 
         // export flatted net to pnml
         logger.error("[FLATTER] Exporting to pnml.");
@@ -171,6 +171,7 @@ public class Main {
         logger.error("----------------- ARCS -----------------");
 
         for (Arc a : petriNet.allArcs()) {
+            logger.error("Arc: " + a.getId());
             logger.error("Arc: " + a.getId() + " -- source: " + a.getSource().getId() + " -- target: " + a.getTarget().getId());
 
             if(a.getNumToolspecific() > 0){
diff --git a/src/main/java/de/tudresden/inf/st/pnml/flatter/template/TemplateConstants.java b/src/main/java/de/tudresden/inf/st/pnml/flatter/template/TemplateConstants.java
index feeff02..b1b6119 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/flatter/template/TemplateConstants.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/flatter/template/TemplateConstants.java
@@ -60,4 +60,5 @@ public final class TemplateConstants {
     public static final String SERVICE_CLIENT_CONNECTOR_TRANSITION = "ServiceClientConnectorTransition";
     public static final String SERVICE_QUEUE_OUTPUT_PLACE = "ServiceQueueOutputPlace";
     public static final String SERVICE_QUEUE_CAPACITY_PLACE = "ServiceQueueCapacityPlace";
+    public static final String SERVICE_FEEDBACK_PLACE = "ServiceFeedbackPlace";
 }
diff --git a/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/ChannelFlatter.java b/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/ChannelFlatter.java
index 3fc9256..3aaee99 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/ChannelFlatter.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/ChannelFlatter.java
@@ -84,7 +84,7 @@ public class ChannelFlatter {
                         petriNet.flushTreeCache();
                     } else {
                         attachANDSignalNetToBaseSignalNet(petriNet, entry.getValue().get(i),
-                                getTransitionByID(petriNet, actToInActId).asInputSignalTransition(),
+                                Objects.requireNonNull(getTransitionByID(petriNet, actToInActId)).asInputSignalTransition(),
                                 getTransitionByID(petriNet, inActToActId).asInputSignalTransition(), i, entry.getKey(), isActiveSignal);
                     }
 
@@ -648,44 +648,44 @@ public class ChannelFlatter {
 
             // link the template instance to the net via arcs
             Arc channelClientInputArc = new Arc();
-            channelClientInputArc.setId("channel-client-input-arc" + channel_suffix);
+            channelClientInputArc.setId("channel-client-input-arc-" + channel_suffix);
             channelClientInputArc.setSource(incomingPlace);
             channelClientInputArc.setTarget(getTransitionByID(petriNet, TemplateConstants.SERVICE_CLIENT_INPUT_TRANSITION + "-" + channel_suffix));
             topPage.addObject(channelClientInputArc);
 
             Arc channelClientOutputArc = new Arc();
-            channelClientOutputArc.setId("channel-client-output-arc" + channel_suffix);
+            channelClientOutputArc.setId("channel-client-output-arc-" + channel_suffix);
             channelClientOutputArc.setSource(getTransitionByID(petriNet, TemplateConstants.SERVICE_CLIENT_OUTPUT_TRANSITION + "-" + channel_suffix));
             channelClientOutputArc.setTarget(responseTransition.getOutArcs().get(clientCount).getTarget());
             topPage.addObject(channelClientOutputArc);
 
             Arc channelServerInputArc = new Arc();
-            channelServerInputArc.setId("channel-server-input-arc" + channel_suffix);
+            channelServerInputArc.setId("channel-server-input-arc-" + channel_suffix);
             channelServerInputArc.setSource(getTransitionByID(petriNet, TemplateConstants.SERVICE_SERVER_INPUT_TRANSITION + "-" + channel_suffix));
             channelServerInputArc.setTarget(ioPlacePair._1);
             topPage.addObject(channelServerInputArc);
 
             Arc channelServerOutputArc = new Arc();
-            channelServerOutputArc.setId("channel-server-output-arc" + channel_suffix);
+            channelServerOutputArc.setId("channel-server-output-arc-" + channel_suffix);
             channelServerOutputArc.setSource(ioPlacePair._2);
             channelServerOutputArc.setTarget(getTransitionByID(petriNet, TemplateConstants.SERVICE_SERVER_OUTPUT_TRANSITION + "-" + channel_suffix));
             topPage.addObject(channelServerOutputArc);
 
             // new arcs in service v3
             Arc serviceQueueInputArc = new Arc();
-            serviceQueueInputArc.setId("channel-server-queue-input-arc" + channel_suffix);
+            serviceQueueInputArc.setId("channel-server-queue-input-arc-" + channel_suffix);
             serviceQueueInputArc.setSource(getTransitionByID(petriNet, TemplateConstants.SERVICE_CLIENT_CONNECTOR_TRANSITION + "-" + channel_suffix));
             serviceQueueInputArc.setTarget(getPlaceByID(petriNet, TemplateConstants.SERVICE_QUEUE_INPUT_PLACE + "-" + queue_suffix));
             topPage.addObject(serviceQueueInputArc);
 
             Arc queueToServerArc = new Arc();
-            queueToServerArc.setId("queue-to-server-arc" + channel_suffix);
+            queueToServerArc.setId("queue-to-server-arc-" + channel_suffix);
             queueToServerArc.setSource(getPlaceByID(petriNet, TemplateConstants.SERVICE_QUEUE_OUTPUT_PLACE + "-" + queue_suffix));
             queueToServerArc.setTarget(getTransitionByID(petriNet, TemplateConstants.SERVICE_SERVER_INPUT_TRANSITION + "-" + channel_suffix));
             topPage.addObject(queueToServerArc);
 
             Arc serverToQueueArc = new Arc();
-            serverToQueueArc.setId("server-to-queue-arc" + channel_suffix);
+            serverToQueueArc.setId("server-to-queue-arc-" + channel_suffix);
             serverToQueueArc.setSource(getTransitionByID(petriNet, TemplateConstants.SERVICE_SERVER_OUTPUT_TRANSITION + "-" + channel_suffix));
             serverToQueueArc.setTarget(getPlaceByID(petriNet, TemplateConstants.SERVICE_QUEUE_CAPACITY_PLACE + "-" + queue_suffix));
             topPage.addObject(serverToQueueArc);
@@ -693,6 +693,28 @@ public class ChannelFlatter {
             serverOutTransitions.add(getTransitionByID(petriNet, TemplateConstants.SERVICE_SERVER_OUTPUT_TRANSITION + "-" + channel_suffix));
             serverInTransitions.add(getTransitionByID(petriNet, TemplateConstants.SERVICE_SERVER_INPUT_TRANSITION + "-" + channel_suffix));
 
+            // FeedbackPlace Integration
+            OutputSignalPlace serverFeedbackPlace = PrimitiveTemplates.getOutputSignalPlace();
+            serverFeedbackPlace.setId(TemplateConstants.SERVICE_FEEDBACK_PLACE + "-" + channel_suffix);
+            Place capPlace = getPlaceByID(petriNet, TemplateConstants.SERVICE_QUEUE_CAPACITY_PLACE + "-" + queue_suffix);
+            serverFeedbackPlace.setToolspecificList(capPlace.getToolspecificList().treeCopy());
+            serverFeedbackPlace.getName().setText(TemplateConstants.SERVICE_FEEDBACK_PLACE + "-" + channel_suffix);
+            serverFeedbackPlace.setNodeGraphics(capPlace.getNodeGraphics().treeCopy());
+            serverFeedbackPlace.getInitialMarking().setText(1);
+            topPage.addObject(serverFeedbackPlace);
+
+            Arc feedbackToInputArc = new Arc();
+            feedbackToInputArc.setId("feedbackplace-to-inputtransition-arc-" + channel_suffix);
+            feedbackToInputArc.setSource(serverFeedbackPlace);
+            feedbackToInputArc.setTarget(getTransitionByID(petriNet, TemplateConstants.SERVICE_SERVER_INPUT_TRANSITION + "-" + channel_suffix));
+            topPage.addObject(feedbackToInputArc);
+
+            Arc outputToFeedbackArc = new Arc();
+            outputToFeedbackArc.setId("outputtransition-to-feedbackplace-arc-" + channel_suffix);
+            outputToFeedbackArc.setSource(getTransitionByID(petriNet, TemplateConstants.SERVICE_SERVER_OUTPUT_TRANSITION + "-" + channel_suffix));
+            outputToFeedbackArc.setTarget(serverFeedbackPlace);
+            topPage.addObject(outputToFeedbackArc);
+
             // flush
             petriNet.flushTreeCache();
             clientCount++;
-- 
GitLab