From a30cbc85ed44f906471073e2f542f0e65e50b1f4 Mon Sep 17 00:00:00 2001
From: SebastianEbert <sebastian.ebert@tu-dresden.de>
Date: Mon, 4 Oct 2021 17:32:08 +0200
Subject: [PATCH] extended grammar and input processing for services

---
 src/main/jastadd/Navigation.jrag              | 12 ++++
 src/main/jastadd/io/IoPN.relast               |  9 ++-
 .../java/de/tudresden/inf/st/pnml/Main.java   |  8 +--
 .../inf/st/pnml/ToolSpecificsParser.java      | 57 ++++++++++++++-----
 .../GlobalToLocalNetsPostProcessor.java       | 20 ++++---
 src/main/nets/serviceTestNet1.pnml            |  2 +-
 6 files changed, 79 insertions(+), 29 deletions(-)

diff --git a/src/main/jastadd/Navigation.jrag b/src/main/jastadd/Navigation.jrag
index 14d2e5e..35efffb 100644
--- a/src/main/jastadd/Navigation.jrag
+++ b/src/main/jastadd/Navigation.jrag
@@ -31,6 +31,12 @@ aspect Navigation {
   syn boolean Node.isTransitionNode() = false;
   eq TransitionNode.isTransitionNode() = true;
 
+  syn boolean TransitionInformation.isTopicTransitionInformation() = false;
+  eq TopicTransitionInformation.isTopicTransitionInformation() = true;
+
+  syn boolean TransitionInformation.isServiceTransitionInformation() = false;
+  eq ServiceTransitionInformation.isServiceTransitionInformation() = true;
+
   syn TransitionNode Node.asTransitionNode() = null;
   eq TransitionNode.asTransitionNode() = this;
 
@@ -40,6 +46,12 @@ aspect Navigation {
   syn OutputSignalPlace Place.asOutputSignalPlace() = null;
   eq OutputSignalPlace.asOutputSignalPlace() = this;
 
+  syn TopicTransitionInformation TransitionInformation.asTopicTransitionInformation() = null;
+  eq TopicTransitionInformation.asTopicTransitionInformation() = this;
+
+  syn ServiceTransitionInformation TransitionInformation.asServiceTransitionInformation() = null;
+  eq ServiceTransitionInformation.asServiceTransitionInformation() = this;
+
   syn Place PlaceNode.place();
   eq Place.place() = this;
   eq RefPlace.place() = getRef().place();
diff --git a/src/main/jastadd/io/IoPN.relast b/src/main/jastadd/io/IoPN.relast
index 33cab14..8adfab5 100644
--- a/src/main/jastadd/io/IoPN.relast
+++ b/src/main/jastadd/io/IoPN.relast
@@ -1,13 +1,16 @@
 InputSignalBinding : PnObject ::= <TransitionID:String> <InputSignalID:String> <InputSignalValue:int>;
 OutputSignalBinding : PnObject ::= <PlaceID:String> <OutputSignalID:String> /<OutputSignalValue:String>/ EqualityOM:EqualityOutputMapping* ThresholdOM:ThresholdOutputMapping* RangeOM:RangeOutputMapping*;
-TransitionInformation ::= <Location:String> <Type:String> <InputLimit:java.lang.Integer> <OutputLimit:java.lang.Integer> <Topic:String> <SubNet:String>;
+
+TransitionInformation ::= <Location:String> <Type:String> <InputLimit:java.lang.Integer> <OutputLimit:java.lang.Integer> <SubNet:String>;
+TopicTransitionInformation : TransitionInformation ::= <Topic:String>;
+ServiceTransitionInformation : TransitionInformation ::= <ServiceName:String>;
 PlaceInformation ::= <Location:String> <Type:String> <SubNet:String>;
 
-InputSignalTransition : Transition ::= /StaticInputSignalBinding:InputSignalBinding*/  MutualInputSignalBinding:InputSignalBinding* /StaticTransitionInformation:TransitionInformation/ [MutualTransitionInformation:TransitionInformation];
+InputSignalTransition : Transition ::= /StaticInputSignalBinding:InputSignalBinding*/ MutualInputSignalBinding:InputSignalBinding* /StaticTransitionInformation:TransitionInformation/ [MutualTransitionInformation:TransitionInformation];
 OutputSignalPlace : Place ::= /OutputSignalBinding*/;
 
 OutputMapping;
 
 EqualityOutputMapping : OutputMapping ::= <Value:java.lang.Integer> <Result:java.lang.Integer>;
 ThresholdOutputMapping : OutputMapping ::= <Value:java.lang.Integer> <Result:java.lang.Integer>;
-RangeOutputMapping : OutputMapping ::= <UpperBound:java.lang.Integer> <LowerBound:java.lang.Integer> <Result:java.lang.Integer>;
+RangeOutputMapping : OutputMapping ::= <UpperBound:java.lang.Integer> <LowerBound:java.lang.Integer> <Result:java.lang.Integer>;
\ No newline at end of file
diff --git a/src/main/java/de/tudresden/inf/st/pnml/Main.java b/src/main/java/de/tudresden/inf/st/pnml/Main.java
index 6c368c9..ef35dfe 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/Main.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/Main.java
@@ -18,13 +18,13 @@ public class Main {
 
         String inputPath = (args.length > 0) ? args[0] : null;
 
-        if(inputPath == null){
+     /*   if(inputPath == null){
             logger.error("No model found on given input path.");
             return;
-        }
+        }*/
 
-        //List<PetriNet> petriNets = PnmlParser.parsePnml("src/main/resources/minimal_global.pnml");
-        List<PetriNet> petriNets = PnmlParser.parsePnml(inputPath);
+        List<PetriNet> petriNets = PnmlParser.parsePnml("src/main/nets/serviceTestNet1.pnml");
+        //List<PetriNet> petriNets = PnmlParser.parsePnml(inputPath);
 
         List<List<PetriNet>> disconnectedPetriNets = new ArrayList<>();
 
diff --git a/src/main/java/de/tudresden/inf/st/pnml/ToolSpecificsParser.java b/src/main/java/de/tudresden/inf/st/pnml/ToolSpecificsParser.java
index 34d132b..cb20308 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/ToolSpecificsParser.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/ToolSpecificsParser.java
@@ -1,15 +1,12 @@
 package de.tudresden.inf.st.pnml;
 
 import de.tudresden.inf.st.constants.PnmlConstants;
-import de.tudresden.inf.st.pnml.jastadd.model.JastAddList;
-import de.tudresden.inf.st.pnml.jastadd.model.PlaceInformation;
-import de.tudresden.inf.st.pnml.jastadd.model.ToolInfo;
+import de.tudresden.inf.st.pnml.jastadd.model.*;
 
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.ParserConfigurationException;
 
-import de.tudresden.inf.st.pnml.jastadd.model.TransitionInformation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
@@ -53,7 +50,8 @@ public class ToolSpecificsParser {
                 if (typeList.getLength() > 0 && typeList.item(0) != null) {
                     String type = typeList.item(0).getTextContent();
                     if (!type.equals(PnmlConstants.TRANSITION_TYPE_CONTINUOUS) || type.equals(PnmlConstants.TRANSITION_TYPE_DISCRETE)
-                            || type.equals(PnmlConstants.TRANSITION_TYPE_TOPIC)) {
+                            || type.equals(PnmlConstants.TRANSITION_TYPE_TOPIC) || !type.equals(PnmlConstants.TRANSITION_TYPE_SERVICE_REQUEST)
+                            || !type.equals(PnmlConstants.TRANSITION_TYPE_SERVICE_RESPONSE)) {
                         return type;
                     } else {
                         logger.error("Error: Invalid transition type configured: " + type + ".");
@@ -95,6 +93,27 @@ public class ToolSpecificsParser {
         return null;
     }
 
+    public static String getTransitionServiceNameFromToolSpecifics(JastAddList<ToolInfo> toolInfos) {
+
+        if (toolInfos.getNumChild() > 0) {
+            try {
+                Document doc = parseToolSpecifics(toolInfos);
+                NodeList typeList = doc.getElementsByTagName(PnmlConstants.SERVICE_NAME);
+
+                if (typeList.getLength() > 0 && typeList.item(0) != null) {
+
+                    String type = typeList.item(0).getTextContent();
+                    if (!type.equals("") && type != null){
+                        return type;
+                    }
+                }
+            } catch (ParserConfigurationException | SAXException | IOException e) {
+                logger.error(e.getMessage());
+            }
+        }
+        return null;
+    }
+
     private static String getPlaceTypeFromToolSpecifics(JastAddList<ToolInfo> toolInfos) {
 
         if (toolInfos.getNumChild() > 0) {
@@ -182,15 +201,25 @@ public class ToolSpecificsParser {
 
     public static TransitionInformation getTransitionInformation(JastAddList<ToolInfo> toolInfos) {
 
-        TransitionInformation ti = new TransitionInformation();
-        ti.setInputLimit(getTransitionInputLimit(toolInfos));
-        ti.setOutputLimit(getTransitionOutputLimit(toolInfos));
-        ti.setLocation(getLocationFromToolSpecifics(toolInfos));
-        ti.setType(getTransitionTypeFromToolSpecifics(toolInfos));
-        ti.setTopic(getTransitionTopicFromToolSpecifics(toolInfos));
-        ti.setSubNet(getTransitionSubnetInfo(toolInfos));
-
-        return ti;
+        if(getTransitionTopicFromToolSpecifics(toolInfos) != null){
+            TopicTransitionInformation topicTransition = new TopicTransitionInformation();
+            topicTransition.setInputLimit(getTransitionInputLimit(toolInfos));
+            topicTransition.setOutputLimit(getTransitionOutputLimit(toolInfos));
+            topicTransition.setLocation(getLocationFromToolSpecifics(toolInfos));
+            topicTransition.setType(getTransitionTypeFromToolSpecifics(toolInfos));
+            topicTransition.setTopic(getTransitionTopicFromToolSpecifics(toolInfos));
+            topicTransition.setSubNet(getTransitionSubnetInfo(toolInfos));
+            return topicTransition;
+        }else{
+            ServiceTransitionInformation serviceTransition = new ServiceTransitionInformation();
+            serviceTransition.setInputLimit(getTransitionInputLimit(toolInfos));
+            serviceTransition.setOutputLimit(getTransitionOutputLimit(toolInfos));
+            serviceTransition.setLocation(getLocationFromToolSpecifics(toolInfos));
+            serviceTransition.setType(getTransitionTypeFromToolSpecifics(toolInfos));
+            serviceTransition.setServiceName(getTransitionServiceNameFromToolSpecifics(toolInfos));
+            serviceTransition.setSubNet(getTransitionSubnetInfo(toolInfos));
+            return serviceTransition;
+        }
     }
 
     public static PlaceInformation getPlaceInformation(JastAddList<ToolInfo> toolInfos) {
diff --git a/src/main/java/de/tudresden/inf/st/postprocessing/GlobalToLocalNetsPostProcessor.java b/src/main/java/de/tudresden/inf/st/postprocessing/GlobalToLocalNetsPostProcessor.java
index 896faef..eee70f4 100644
--- a/src/main/java/de/tudresden/inf/st/postprocessing/GlobalToLocalNetsPostProcessor.java
+++ b/src/main/java/de/tudresden/inf/st/postprocessing/GlobalToLocalNetsPostProcessor.java
@@ -128,10 +128,10 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> {
                 sourceIst.setName(new Name().setText(channelIst.getName().getText() + "-source"));
                 sourceIst.setId(channelIst.getId() + "-source");
 
-                TransitionInformation tInfoSource = new TransitionInformation();
+                TopicTransitionInformation tInfoSource = new TopicTransitionInformation();
                 tInfoSource.setSubNet(inSubNet);
                 tInfoSource.setLocation(inLocation);
-                tInfoSource.setTopic(channelIst.getStaticTransitionInformation().getTopic());
+                tInfoSource.setTopic(channelIst.getStaticTransitionInformation().asTopicTransitionInformation().getTopic());
 
                 // attributized infos need to be written back to XML
                 JastAddList<ToolInfo> inputToolInfoJastAddList = new JastAddList<>();
@@ -155,10 +155,10 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> {
                 targetIst.setName(new Name().setText(channelIst.getName().getText() + "-target"));
                 targetIst.setId(channelIst.getId() + "-target");
 
-                TransitionInformation tInfoTarget = new TransitionInformation();
+                TopicTransitionInformation tInfoTarget = new TopicTransitionInformation();
                 tInfoTarget.setSubNet(outSubNet);
                 tInfoTarget.setLocation(outLocation);
-                tInfoTarget.setTopic(channelIst.getStaticTransitionInformation().getTopic());
+                tInfoTarget.setTopic(channelIst.getStaticTransitionInformation().asTopicTransitionInformation().getTopic());
 
                 // attributized infos need to be written back to XML
                 JastAddList<ToolInfo> outputToolInfoJastAddList = new JastAddList<>();
@@ -256,7 +256,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> {
         }
 
         for (Transition transition : separatedNet.allTransitions()) {
-            if (!transition.asInputSignalTransition().getStaticTransitionInformation().getSubNet().equals(location)) {
+            if (!transition.asInputSignalTransition().getStaticTransitionInformation().asTopicTransitionInformation().getTopic().equals(location)) {
                 logger.info("removing transition " + transition.getId() + " from net");
                 transition.removeSelf();
             }
@@ -268,6 +268,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> {
         return separatedNet;
     }
 
+    // todo: extend with service name
     private static ToolInfo buildToolSpecifics(String type, String location, String subnet, String topic, int inputLimit, int outputLimit, JastAddList<InputSignalBinding> inputSignalBindings) {
 
         try {
@@ -372,8 +373,13 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> {
 
         for (Transition t : petriNet.allTransitions()) {
 
-            logger.info("--- Transition: " + t.getName().getText() + " subnet: " + t.asInputSignalTransition().getStaticTransitionInformation().getSubNet()
-                    + " topic: " + t.asInputSignalTransition().getStaticTransitionInformation().getTopic() + " ---------");
+            if(t.asInputSignalTransition().getStaticTransitionInformation().isServiceTransitionInformation()) {
+                logger.info("--- Transition: " + t.getName().getText() + " subnet: " + t.asInputSignalTransition().getStaticTransitionInformation().getSubNet()
+                        + " service: " + t.asInputSignalTransition().getStaticTransitionInformation().asServiceTransitionInformation().getServiceName() + " ---------");
+            }else{
+                logger.info("--- Transition: " + t.getName().getText() + " subnet: " + t.asInputSignalTransition().getStaticTransitionInformation().getSubNet()
+                        + " topic: " + t.asInputSignalTransition().getStaticTransitionInformation().asTopicTransitionInformation().getTopic() + " ---------");
+            }
 
             for (Place p : t.asInputSignalTransition().incomingPlaces()) {
 
diff --git a/src/main/nets/serviceTestNet1.pnml b/src/main/nets/serviceTestNet1.pnml
index f4c0f14..e271f3d 100644
--- a/src/main/nets/serviceTestNet1.pnml
+++ b/src/main/nets/serviceTestNet1.pnml
@@ -104,7 +104,7 @@
                 <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
                 </toolspecific>
                 <name>
-                    <text>p2</text>
+                    <text>p3</text>
                     <graphics>
                         <offset x="0" y="-10" />
                     </graphics>
-- 
GitLab