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