From 5567cc837b5866fcbbca6a556dbc1f42dc604eac Mon Sep 17 00:00:00 2001
From: SebastianEbert <sebastian.ebert@tu-dresden.de>
Date: Wed, 28 Sep 2022 17:31:14 +0200
Subject: [PATCH] implemented flattening for services v4

---
 .../tudresden/inf/st/pnml/flatter/Main.java   |   4 +-
 .../flatter/template/TemplateConstants.java   |   6 +
 .../flatter/transform/ChannelFlatter.java     |  99 ++++++-------
 .../templates/ServiceConnectionTemplate.pnml  | 131 +++++++++++++++---
 4 files changed, 165 insertions(+), 75 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 17b1c03..b7c4dfe 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";
-        // String pnmlPath = "../pnml-relast-nets/src/main/resources/serviceTestNets/structureTestNets/service-structure-correct.pnml";
-        // String 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
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 b1b6119..4599232 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
@@ -61,4 +61,10 @@ public final class TemplateConstants {
     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";
+
+    public static final String SERVICE_QUEUE_TO_SERVER_PLACE = "ServiceQueueToServerPlace";
+    public static final String SERVICE_TO_QUEUE_PLACE = "ServiceToQueuePlace";
+    public static final String SERVICE_QUEUE_CONNECTOR_TRANSITION = "ServiceQueueConnectorTransition";
+    public static final String SERVICE_QUEUE_OVERFLOW_TRANSITION = "ServiceQueueOverflowTransition";
 }
+
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 3aaee99..4ffbc68 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
@@ -589,8 +589,16 @@ public class ChannelFlatter {
 
         // insert channel queue template
         String queue_suffix = "serverInstance-" + serverInstanceCount;
-        PetriNet serviceQueuePetriNet = ServiceTemplates.getQueueConnectionTemplate(queue_suffix);
-        includeTemplateInstance(petriNet, serviceQueuePetriNet, "channel", "channel");
+        OutputSignalPlace queueCapacityPlace = PrimitiveTemplates.getOutputSignalPlace();
+        queueCapacityPlace.setId(TemplateConstants.SERVICE_QUEUE_CAPACITY_PLACE + "-" + queue_suffix);
+
+        PlaceInformation pi = new PlaceInformation();
+        pi.setSubNet("channel");
+        pi.setLocation("channel");
+        pi.setType(PnmlConstants.PLACE_TYPE_DISCRETE);
+        queueCapacityPlace.setMutualPlaceInformation(pi);
+        queueCapacityPlace.getInitialMarking().setText(16);
+        topPage.addObject(queueCapacityPlace);
 
         int clientCount = 0;
 
@@ -647,48 +655,36 @@ public class ChannelFlatter {
             includeTemplateInstance(petriNet, serviceChannelPetriNet, "channel", "channel");
 
             // link the template instance to the net via arcs
-            Arc channelClientInputArc = new Arc();
-            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.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.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.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.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.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.setSource(getTransitionByID(petriNet, TemplateConstants.SERVICE_SERVER_OUTPUT_TRANSITION + "-" + channel_suffix));
-            serverToQueueArc.setTarget(getPlaceByID(petriNet, TemplateConstants.SERVICE_QUEUE_CAPACITY_PLACE + "-" + queue_suffix));
-            topPage.addObject(serverToQueueArc);
+
+            createAndIncludeArc(topPage, "channel-client-input-arc-" + channel_suffix, incomingPlace,
+                    getTransitionByID(petriNet, TemplateConstants.SERVICE_CLIENT_INPUT_TRANSITION + "-" + channel_suffix));
+            createAndIncludeArc(topPage, "channel-client-output-arc-" + channel_suffix, getTransitionByID(petriNet, TemplateConstants.SERVICE_CLIENT_OUTPUT_TRANSITION + "-" + channel_suffix),
+                    responseTransition.getOutArcs().get(clientCount).getTarget());
+
+            // service instance input transition -> service input place
+            createAndIncludeArc(topPage, "channel-server-input-arc-" + channel_suffix,
+                    getTransitionByID(petriNet, TemplateConstants.SERVICE_SERVER_INPUT_TRANSITION + "-" + channel_suffix), ioPlacePair._1);
+
+            // service instance output place -> service instance output transition
+            createAndIncludeArc(topPage, "channel-server-output-arc-" + channel_suffix, ioPlacePair._2,
+                    getTransitionByID(petriNet, TemplateConstants.SERVICE_SERVER_OUTPUT_TRANSITION + "-" + channel_suffix));
+
+            createAndIncludeArc(topPage, "queue-to-server-place-arc-" + channel_suffix, getPlaceByID(petriNet, TemplateConstants.SERVICE_QUEUE_TO_SERVER_PLACE + "-" + channel_suffix),
+                    getTransitionByID(petriNet, TemplateConstants.SERVICE_SERVER_INPUT_TRANSITION + "-" + channel_suffix));
+            createAndIncludeArc(topPage,"client-to-server-input" + channel_suffix, getPlaceByID(petriNet, TemplateConstants.SERVICE_TO_QUEUE_PLACE + "-" + channel_suffix),
+                    getTransitionByID(petriNet, TemplateConstants.SERVICE_SERVER_INPUT_TRANSITION + "-" + channel_suffix));
+            createAndIncludeArc(topPage, "server-output-to-queue-cap-arc-" + channel_suffix, getTransitionByID(petriNet, TemplateConstants.SERVICE_SERVER_OUTPUT_TRANSITION + "-" + channel_suffix),
+                    getPlaceByID(petriNet, TemplateConstants.SERVICE_QUEUE_CAPACITY_PLACE + "-" + queue_suffix));
+            createAndIncludeArc(topPage, "client-connector-to-serviceToqueue-arc-" + channel_suffix, getTransitionByID(petriNet, TemplateConstants.SERVICE_CLIENT_CONNECTOR_TRANSITION + "-" + channel_suffix),
+                    getPlaceByID(petriNet, TemplateConstants.SERVICE_TO_QUEUE_PLACE + "-" + channel_suffix));
+
+            // Arcs integrating the capacity place
+            createAndIncludeInhibitorArc(topPage, "server-cap-to-overflow-arc-" + channel_suffix,
+                    queueCapacityPlace, getTransitionByID(petriNet, TemplateConstants.SERVICE_QUEUE_OVERFLOW_TRANSITION + "-" + channel_suffix));
+            createAndIncludeArc(topPage, "server-to-queue-arc-" + channel_suffix,
+                    queueCapacityPlace, getTransitionByID(petriNet, TemplateConstants.SERVICE_QUEUE_CONNECTOR_TRANSITION + "-" + channel_suffix));
+            createAndIncludeArc(topPage,"serveroutput-to-capacity-arc-" + channel_suffix, getTransitionByID(petriNet, TemplateConstants.SERVICE_SERVER_OUTPUT_TRANSITION + "-" + channel_suffix),
+                    queueCapacityPlace);
 
             serverOutTransitions.add(getTransitionByID(petriNet, TemplateConstants.SERVICE_SERVER_OUTPUT_TRANSITION + "-" + channel_suffix));
             serverInTransitions.add(getTransitionByID(petriNet, TemplateConstants.SERVICE_SERVER_INPUT_TRANSITION + "-" + channel_suffix));
@@ -703,17 +699,10 @@ public class ChannelFlatter {
             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);
+            createAndIncludeArc(topPage, "feedbackplace-to-inputtransition-arc-" + channel_suffix, serverFeedbackPlace,
+                    getTransitionByID(petriNet, TemplateConstants.SERVICE_SERVER_INPUT_TRANSITION + "-" + channel_suffix));
+            createAndIncludeArc(topPage, "outputtransition-to-feedbackplace-arc-" + channel_suffix,
+                    getTransitionByID(petriNet, TemplateConstants.SERVICE_SERVER_OUTPUT_TRANSITION + "-" + channel_suffix), serverFeedbackPlace);
 
             // flush
             petriNet.flushTreeCache();
diff --git a/src/main/resources/templates/ServiceConnectionTemplate.pnml b/src/main/resources/templates/ServiceConnectionTemplate.pnml
index 8c12e82..a679c0c 100644
--- a/src/main/resources/templates/ServiceConnectionTemplate.pnml
+++ b/src/main/resources/templates/ServiceConnectionTemplate.pnml
@@ -92,6 +92,51 @@
                 </graphics>
             </place>
 
+            <!-- new places after rework -->
+            <place id="ServiceToQueuePlace">
+                <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
+                    <location>none</location>
+                    <subnet>none</subnet>
+                    <type>discretePlaceType</type>
+                    <outputsignalbindings>
+                    </outputsignalbindings>
+                </toolspecific>
+                <name>
+                    <text>ServiceToQueuePlace</text>
+                    <graphics>
+                        <offset x="0" y="0" />
+                    </graphics>
+                </name>
+                <initialMarking>
+                    <text>0</text>
+                </initialMarking>
+                <graphics>
+                    <position x="0" y="0"/>
+                </graphics>
+            </place>
+
+            <place id="ServiceQueueToServerPlace">
+                <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
+                    <location>none</location>
+                    <subnet>none</subnet>
+                    <type>discretePlaceType</type>
+                    <outputsignalbindings>
+                    </outputsignalbindings>
+                </toolspecific>
+                <name>
+                    <text>ServiceQueueToServerPlace</text>
+                    <graphics>
+                        <offset x="0" y="0" />
+                    </graphics>
+                </name>
+                <initialMarking>
+                    <text>0</text>
+                </initialMarking>
+                <graphics>
+                    <position x="0" y="0"/>
+                </graphics>
+            </place>
+
             <transition id="ServiceClientInputTransition">
                 <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
                     <location>none</location>
@@ -172,24 +217,6 @@
                 </graphics>
             </transition>
 
-            <arc id="arc-1" source="ServiceTogglePlace" target="ServiceClientInputTransition">
-            </arc>
-            <arc id="arc-2" source="ServiceClientInputTransition" target="ClientToServicePlace">
-            </arc>
-            <!-- <arc id="arc-3" source="ClientToServicePlace" target="ServiceServerInputTransition">
-            </arc> -->
-            <arc id="arc-4" source="ServiceServerInputTransition" target="InputToOutputServicePlace">
-            </arc>
-            <arc id="arc-5" source="InputToOutputServicePlace" target="ServiceServerOutputTransition">
-            </arc>
-            <arc id="arc-6" source="ServiceServerOutputTransition" target="ServiceOutputPlace">
-            </arc>
-            <arc id="arc-7" source="ServiceOutputPlace" target="ServiceClientOutputTransition">
-            </arc>
-            <arc id="arc-8" source="ServiceClientOutputTransition" target="ServiceTogglePlace">
-            </arc>
-
-            <!-- Elements new in v3 -->
             <transition id="ServiceClientConnectorTransition">
                 <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
                     <location>none</location>
@@ -210,9 +237,77 @@
                 </graphics>
             </transition>
 
+            <!-- new transitions after rework -->
+            <transition id="ServiceQueueConnectorTransition">
+                <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
+                    <location>none</location>
+                    <subnet>none</subnet>
+                    <type>discreteTransitionType</type>
+                    <inputsignalbindings>
+                    </inputsignalbindings>
+                    <inputsignalclause></inputsignalclause>
+                </toolspecific>
+                <name>
+                    <text>ServiceQueueConnectorTransition</text>
+                    <graphics>
+                        <offset x="0" y="0" />
+                    </graphics>
+                </name>
+                <graphics>
+                    <position x="0" y="0"/>
+                </graphics>
+            </transition>
+
+            <transition id="ServiceQueueOverflowTransition">
+                <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
+                    <location>none</location>
+                    <subnet>none</subnet>
+                    <type>discreteTransitionType</type>
+                    <inputsignalbindings>
+                    </inputsignalbindings>
+                    <inputsignalclause></inputsignalclause>
+                </toolspecific>
+                <name>
+                    <text>ServiceQueueOverflowTransition</text>
+                    <graphics>
+                        <offset x="0" y="0" />
+                    </graphics>
+                </name>
+                <graphics>
+                    <position x="0" y="0"/>
+                </graphics>
+            </transition>
+
+            <arc id="arc-1" source="ServiceTogglePlace" target="ServiceClientInputTransition">
+            </arc>
+            <arc id="arc-2" source="ServiceClientInputTransition" target="ClientToServicePlace">
+            </arc>
+            <!-- <arc id="arc-3" source="ClientToServicePlace" target="ServiceServerInputTransition">
+            </arc> -->
+            <arc id="arc-4" source="ServiceServerInputTransition" target="InputToOutputServicePlace">
+            </arc>
+            <arc id="arc-5" source="InputToOutputServicePlace" target="ServiceServerOutputTransition">
+            </arc>
+            <arc id="arc-6" source="ServiceServerOutputTransition" target="ServiceOutputPlace">
+            </arc>
+            <arc id="arc-7" source="ServiceOutputPlace" target="ServiceClientOutputTransition">
+            </arc>
+            <arc id="arc-8" source="ServiceClientOutputTransition" target="ServiceTogglePlace">
+            </arc>
+
+            <!-- new arcs after rework -->
             <arc id="arc-9" source="ClientToServicePlace" target="ServiceClientConnectorTransition">
             </arc>
 
+            <arc id="arc-10" source="ServiceQueueConnectorTransition" target="ServiceToQueuePlace">
+            </arc>
+            <arc id="arc-11" source="ServiceToQueuePlace" target="ServiceQueueConnectorTransition">
+            </arc>
+            <arc id="arc-12" source="ServiceToQueuePlace" target="ServiceQueueOverflowTransition">
+            </arc>
+            <arc id="arc-13" source="ServiceQueueConnectorTransition" target="ServiceQueueToServerPlace">
+            </arc>
+
         </page>
     </net>
 </pnml>
\ No newline at end of file
-- 
GitLab