From 3a48c531073bcd3f235923a9ab0e13ea3428f3d4 Mon Sep 17 00:00:00 2001 From: SebastianEbert <sebastian.ebert@tu-dresden.de> Date: Thu, 19 May 2022 18:26:20 +0200 Subject: [PATCH] fixed configuration reader, fixed flattening of topics --- gradle/wrapper/gradle-wrapper.jar | Bin 58910 -> 55627 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- src/main/config/config.json | 6 ++ .../tudresden/inf/st/pnml/flatter/Main.java | 99 +++++++++++++++++- .../st/pnml/flatter/config/ConfigReader.java | 1 + .../flatter/template/TemplateConstants.java | 5 +- .../pnml/flatter/template/TopicTemplates.java | 19 ++-- .../flatter/transform/ChannelFlatter.java | 96 ++++++++++++++--- .../templates/TopicSubDispatcherTemplate.pnml | 2 + 9 files changed, 203 insertions(+), 27 deletions(-) create mode 100644 src/main/config/config.json diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 62d4c053550b91381bbd28b1afc82d634bf73a8a..d9b7505b1096bc428abaa017cb79c9d2da247111 100644 GIT binary patch delta 24986 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 B2y*}c delta 28169 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a4b4429..19869d6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip diff --git a/src/main/config/config.json b/src/main/config/config.json new file mode 100644 index 0000000..f2afe7e --- /dev/null +++ b/src/main/config/config.json @@ -0,0 +1,6 @@ +{ + "tina" : "-R -s 1 -c 0 -t 0 -b 0 -m 0 -v -PNML -bcg", + "pathto" : "", + "sift" : "", + "struct" : "" +} \ No newline at end of file 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 0e38ad4..40db411 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 @@ -3,6 +3,7 @@ package de.tudresden.inf.st.pnml.flatter; import de.tudresden.inf.st.pnml.flatter.config.ConfigReader; import de.tudresden.inf.st.pnml.flatter.transform.ChannelFlatter; import de.tudresden.inf.st.pnml.flatter.transform.ReferenceFlatter; +import de.tudresden.inf.st.pnml.jastadd.model.*; import de.tudresden.inf.st.pnml.jastadd.model.PnmlParser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,7 +29,8 @@ public class Main { }*/ // parse the global not flatted petri net - pnmlPath = "pnml-relast-flatter/src/main/resources/minimal.pnml"; + pnmlPath = "../pnml-relast-nets/src/main/resources/topicTestNets/structureTestNets/topic-structure-correct-3.pnml"; + configPath = "src/main/config/config.json"; PetriNet petriNet = PnmlParser.parsePnml(pnmlPath).get(0); // read config for analyzer from file @@ -46,10 +48,12 @@ public class Main { // flat topic publishers / subscribers to instance based semantics logger.info("[FLATTER] Breaking down topic channels."); PetriNet topicFlattedPetriNet = ChannelFlatter.flatTopicChannels(petriNet); + printNet(topicFlattedPetriNet); + // flat service clients / servers to instance based semantics logger.info("[FLATTER] Breaking down service channels."); - PetriNet serviceFlattedPetriNet = ChannelFlatter.flatTopicChannels(topicFlattedPetriNet); + // PetriNet serviceFlattedPetriNet = ChannelFlatter.flatServiceChannels(topicFlattedPetriNet); // flat input signals @@ -60,8 +64,8 @@ public class Main { // TODO // convert and add inhibitor arcs - NdrioProxy ndrioProxy = new NdrioProxy(); - ndrioProxy.pnml2net(pnmlPath, "pnml-relast-flatter/src/main/resources/minimal.net"); + // NdrioProxy ndrioProxy = new NdrioProxy(); + // ndrioProxy.pnml2net(pnmlPath, "pnml-relast-flatter/src/main/resources/minimal.net"); // insert into tina @@ -84,4 +88,91 @@ public class Main { // TODO } + + public static void printNet(PetriNet petriNet) { + + logger.error("--------------- STRUCTURE ---------------"); + logger.error("----------------- PLACES ----------------"); + + for (Place p : petriNet.allPlaces()) { + //logger.error("id: " + p.getId()); + logger.error("Place " + p.asOutputSignalPlace().getId() + " -- " + p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet()); + } + + logger.error("-------------- TRANSITIONS --------------"); + + for (Transition t : petriNet.allTransitions()) { + + if (t.asInputSignalTransition().getStaticTransitionInformation().isServiceTransitionInformation()) { + logger.error("--- Transition: " + t.getId() + " subnet: " + t.asInputSignalTransition().getStaticTransitionInformation().getSubNet() + + " service: " + t.asInputSignalTransition().getStaticTransitionInformation().asServiceTransitionInformation().getServiceName() + " ---------"); + } else if(t.asInputSignalTransition().getStaticTransitionInformation().isTopicTransitionInformation()){ + logger.error("--- Transition: " + t.getId() + " subnet: " + t.asInputSignalTransition().getStaticTransitionInformation().getSubNet() + + " topic: " + t.asInputSignalTransition().getStaticTransitionInformation().asTopicTransitionInformation().getTopic() + " ---------"); + }else{ + logger.error("--- Transition: " + t.getId()); + } + + if(t.asInputSignalTransition().getInputSignalClause() != null && t.asInputSignalTransition().getInputSignalClause().getNumChild() > 0){ + // logger.error("------ Clause: " + t.asInputSignalTransition().getInputSignalClause().printExp()); + } + + for (Place p : t.asInputSignalTransition().incomingPlaces()) { + + logger.error("------ Inputplace: " + p.getId() + " subnet: " + p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet() + " ---------"); + } + + for (Place p : t.asInputSignalTransition().outgoingPlaces()) { + + logger.error("------ Outputplace: " + p.getId() + " subnet: " + p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet() + " ---------"); + } + } + + logger.error("----------------- REF PLACES -----------------"); + + for (RefPlace rp : petriNet.allRefPlaces()){ + logger.error("--- RefPlace: " + rp.getId()); + } + + logger.error("----------------- REF TRANSITIONS -----------------"); + + for (RefTransition rt : petriNet.allRefTransitions()){ + logger.error("--- RefTransition: " + rt.getId()); + } + + logger.error("----------------- ARCS -----------------"); + + for (Arc a : petriNet.allArcs()) { + logger.error("Arc: " + a.getId() + " -- source: " + a.getSource().getId() + " -- target: " + a.getTarget().getId()); + } + + logger.error("--------------- T SIGNALS (STATIC)---------------"); + + for (Transition t : petriNet.allTransitions()) { + InputSignalTransition ist = t.asInputSignalTransition(); + + if (ist != null && ist.getStaticInputSignalBindingList() != null) { + ist.getStaticInputSignalBindingList().forEach(inputSignalBinding -> logger.error(" (" + t.getName().getText() + ") Signal: " + inputSignalBinding.getInputSignalID())); + } + } + + logger.error("--------------- T SIGNALS (MUTUAL)---------------"); + + for (Transition t : petriNet.allTransitions()) { + InputSignalTransition ist = t.asInputSignalTransition(); + + if (ist != null && ist.getMutualInputSignalBindingList() != null) { + ist.getMutualInputSignalBindingList().forEach(inputSignalBinding -> logger.error(" (" + t.getName().getText() + ") Signal: " + inputSignalBinding.getInputSignalID())); + } + } + + // logger.error("--------------- TOOL SPECIFIC ---------------"); + + for (Transition t : petriNet.allTransitions()) { + InputSignalTransition ist = t.asInputSignalTransition(); + if(ist != null && ist.getNumToolspecific() > 0) { + // logger.error("ToolSpecific: (" + ist.getName().getText() + ") " + ist.getToolspecific(0).getFormattedXMLBuffer().toString()); + } + } + } } diff --git a/src/main/java/de/tudresden/inf/st/pnml/flatter/config/ConfigReader.java b/src/main/java/de/tudresden/inf/st/pnml/flatter/config/ConfigReader.java index 45e899c..3933f30 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/flatter/config/ConfigReader.java +++ b/src/main/java/de/tudresden/inf/st/pnml/flatter/config/ConfigReader.java @@ -49,6 +49,7 @@ public class ConfigReader { public String[] getTinaConfigParams(){ Gson gson = new Gson(); + System.out.println("Content " + getConfigFileContent()); FlatterConfig fc = gson.fromJson(getConfigFileContent(), FlatterConfig.class); return fc.tina.split(" "); } 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 aaa209d..62eba79 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 @@ -7,11 +7,13 @@ public final class TemplateConstants { public static final String PUBLISHER_CONNECTOR_PLACE = "PublisherConnectorPlace"; public static final String PUBLISHER_INPUT_TRANSITION = "PublisherInputTransition"; public static final String PUBLISHER_OVERFLOW_TRANSITION = "PublisherOverflowTransition"; - public static final String PUBLISHER_OUTPUT_TRANSITION = "PublisherOverflowTransition"; + public static final String PUBLISHER_OUTPUT_TRANSITION = "PublisherOutputTransition"; // topic dispatcher public static final String DISPATCHER_INPUT_TRANSITION = "DispatcherInputTransition"; public static final String DISPATCHER_OUTPUT_TRANSITION = "DispatcherOutputTransition"; + public static final String DISPATCHER_INPUT_PLACE = "DispatcherInputPlace"; + public static final String DISPATCHER_OVERFLOW_TRANSITION = "DispatcherOverflowTransition"; // topic callback public static final String CALLBACK_INPUT_PLACE = "CallbackInputPlace"; @@ -26,4 +28,5 @@ public final class TemplateConstants { // channel elements public static final String CHANNEL_CONNECTOR_PLACE = "ChannelConnectorPlace"; public static final String CHANNEL_CONNECTOR_TRANSITION = "ChannelConnectorTransition"; + } diff --git a/src/main/java/de/tudresden/inf/st/pnml/flatter/template/TopicTemplates.java b/src/main/java/de/tudresden/inf/st/pnml/flatter/template/TopicTemplates.java index 59b19ea..e77d7e9 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/flatter/template/TopicTemplates.java +++ b/src/main/java/de/tudresden/inf/st/pnml/flatter/template/TopicTemplates.java @@ -1,5 +1,6 @@ package de.tudresden.inf.st.pnml.flatter.template; +import de.tudresden.inf.st.pnml.jastadd.model.Name; import de.tudresden.inf.st.pnml.jastadd.model.PetriNet; import de.tudresden.inf.st.pnml.jastadd.model.PnObject; import de.tudresden.inf.st.pnml.jastadd.model.PnmlParser; @@ -8,12 +9,14 @@ public class TopicTemplates extends PnmlTemplate { public static PetriNet getTopicPublisherPetriNet(String idSuffix){ - PetriNet templateNet = PnmlParser.parsePnml(homeDirectory + "/src/main/resources/TopicPublisherTemplate.pnml").get(0); + PetriNet templateNet = PnmlParser.parsePnml(homeDirectory + "/src/main/resources/templates/TopicPublisherTemplate.pnml").get(0); for(PnObject po : templateNet.allObjects()){ if(!po.getId().equals(TemplateConstants.PUBLISHER_TEMPLATE_PAGE)){ po.setId(po.getId() + "-" + idSuffix); - po.getName().setText(po.getName().getText() + "-" + idSuffix); + Name name = new Name(); + name.setText(po.getId() + "-" + idSuffix); + po.setName(name); } } @@ -22,12 +25,14 @@ public class TopicTemplates extends PnmlTemplate { public static PetriNet getTopicDispatcherPetriNet(String idSuffix){ - PetriNet templateNet = PnmlParser.parsePnml(homeDirectory + "/src/main/resources/TopicSubDispatcherTemplate.pnml").get(0); + PetriNet templateNet = PnmlParser.parsePnml(homeDirectory + "/src/main/resources/templates/TopicSubDispatcherTemplate.pnml").get(0); for(PnObject po : templateNet.allObjects()){ if(!po.getId().equals(TemplateConstants.DISPATCHER_TEMPLATE_PAGE)){ po.setId(po.getId() + "-" + idSuffix); - po.getName().setText(po.getName().getText() + "-" + idSuffix); + Name name = new Name(); + name.setText(po.getId() + "-" + idSuffix); + po.setName(name); } } @@ -36,12 +41,14 @@ public class TopicTemplates extends PnmlTemplate { public static PetriNet getTopicCallbackQueuePetriNet(String idSuffix){ - PetriNet templateNet = PnmlParser.parsePnml(homeDirectory + "/src/main/resources/TopicSubCallbackQueueTemplate.pnml").get(0); + PetriNet templateNet = PnmlParser.parsePnml(homeDirectory + "/src/main/resources/templates/TopicSubCallbackQueueTemplate.pnml").get(0); for(PnObject po : templateNet.allObjects()){ if(!po.getId().equals(TemplateConstants.CALLBACK_QUEUE_TEMPLATE_PAGE)){ po.setId(po.getId() + "-" + idSuffix); - po.getName().setText(po.getName().getText() + "-" + idSuffix); + Name name = new Name(); + name.setText(po.getId() + "-" + idSuffix); + po.setName(name); } } 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 acd23b3..b4b3a0a 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 @@ -1,5 +1,6 @@ package de.tudresden.inf.st.pnml.flatter.transform; +import de.tudresden.inf.st.pnml.base.constants.PnmlConstants; import de.tudresden.inf.st.pnml.flatter.template.TemplateConstants; import de.tudresden.inf.st.pnml.flatter.template.TopicTemplates; import de.tudresden.inf.st.pnml.jastadd.model.*; @@ -22,6 +23,8 @@ public class ChannelFlatter { int channelCount = 0; List<Transition> topicTransitions = new ArrayList<>(); + List<Arc> arcsToRemove = new ArrayList<>(); + List<Transition> transitionsToRemove = new ArrayList<>(); // process topic transitions for(Transition t : petriNet.allTransitions()){ @@ -61,13 +64,17 @@ public class ChannelFlatter { for (Map.Entry<String, Place> entry : inputMapping.entrySet()) { // include the template publisher - PetriNet publisherPetriNet = TopicTemplates.getTopicPublisherPetriNet("-" + publisherCount); + PetriNet publisherPetriNet = TopicTemplates.getTopicPublisherPetriNet(String.valueOf(publisherCount)); includeTemplateInstance(petriNet, publisherPetriNet, entry.getKey(), entry.getValue().asOutputSignalPlace().getStaticPlaceInformation().getLocation()); // connect the publisher inputs Arc inputArc = new Arc(); Arc overFlowArc = new Arc(); Arc outArc = new Arc(); + inputArc.setId("pub-inputArc-" + publisherCount); + overFlowArc.setId("pub-overFlowArc-" + publisherCount); + outArc.setId("pub-outArc-" + publisherCount); + inputArc.setSource(entry.getValue()); inputArc.setTarget((Node) getPnObjectByID(petriNet, TemplateConstants.PUBLISHER_INPUT_TRANSITION + "-" + publisherCount)); @@ -92,12 +99,13 @@ public class ChannelFlatter { for (Map.Entry<String, List<Place>> entry : outputMapping.entrySet()) { // include dispatcher queues - PetriNet dispatcherNet = TopicTemplates.getTopicDispatcherPetriNet("-" + dispatcherCount); + PetriNet dispatcherNet = TopicTemplates.getTopicDispatcherPetriNet(String.valueOf(dispatcherCount)); includeTemplateInstance(petriNet, dispatcherNet, entry.getKey(), entry.getValue().get(0).asOutputSignalPlace().getStaticPlaceInformation().getLocation()); Arc channelToDispatcherArc = new Arc(); + channelToDispatcherArc.setId("channelToDispatcherArc-" + dispatcherCount); channelToDispatcherArc.setSource((Node) getPnObjectByID(petriNet, TemplateConstants.CHANNEL_CONNECTOR_TRANSITION + "-" + channelCount)); - channelToDispatcherArc.setTarget((Node) getPnObjectByID(petriNet, TemplateConstants.DISPATCHER_INPUT_TRANSITION + "-" + dispatcherCount)); + channelToDispatcherArc.setTarget((Node) getPnObjectByID(petriNet, TemplateConstants.DISPATCHER_INPUT_PLACE + "-" + dispatcherCount)); topPage.addObject(channelToDispatcherArc); petriNet.flushTreeCache(); @@ -105,15 +113,19 @@ public class ChannelFlatter { // include subscriber queues for(Place p : entry.getValue()){ - PetriNet subscriberNet = TopicTemplates.getTopicCallbackQueuePetriNet("-" + callbackCount); + PetriNet subscriberNet = TopicTemplates.getTopicCallbackQueuePetriNet(String.valueOf(callbackCount)); includeTemplateInstance(petriNet, subscriberNet, entry.getKey(), p.asOutputSignalPlace().getStaticPlaceInformation().getLocation()); Arc callbackInputArc = new Arc(); Arc callbackOverFlowArc = new Arc(); Arc callbackOutArc = new Arc(); + callbackInputArc.setId("callbackInputArc-" + dispatcherCount); + callbackOverFlowArc.setId("callbackOverFlowArc-" + dispatcherCount); + callbackOutArc.setId("callbackOutArc-" + dispatcherCount); + callbackInputArc.setSource((Node) getPnObjectByID(petriNet, TemplateConstants.DISPATCHER_OUTPUT_TRANSITION + "-" + dispatcherCount)); - callbackOverFlowArc.setSource((Node) getPnObjectByID(petriNet, TemplateConstants.DISPATCHER_OUTPUT_TRANSITION + "-" + dispatcherCount)); + callbackOverFlowArc.setSource((Node) getPnObjectByID(petriNet, TemplateConstants.CALLBACK_INPUT_PLACE + "-" + dispatcherCount)); callbackInputArc.setTarget((Node) getPnObjectByID(petriNet, TemplateConstants.CALLBACK_INPUT_PLACE + "-" + callbackCount)); callbackOverFlowArc.setTarget((Node) getPnObjectByID(petriNet, TemplateConstants.CALLBACK_OVERFLOW_TRANSITION + "-" + callbackCount)); @@ -129,22 +141,45 @@ public class ChannelFlatter { petriNet.flushTreeCache(); - // clean up old channel - - // TODO + // objects to be cleaned up + arcsToRemove.addAll(t.getInArcs()); + arcsToRemove.addAll(t.getOutArcs()); + transitionsToRemove.add(t); } channelCount++; } - return null; + // clean up old channel data + for(Arc a : arcsToRemove){ + a.removeSelf(); + } + + for(Transition t : transitionsToRemove){ + t.removeSelf(); + } + + petriNet.flushTreeCache(); + + return petriNet; } private static void insertChannelElements(PetriNet petriNet, int channelCount) { - Place channelPlace = new Place(); - Transition channelTransition = new Transition(); + OutputSignalPlace channelPlace = new OutputSignalPlace(); + PlaceInformation newPi = new PlaceInformation(); + newPi.setLocation("channel"); + newPi.setSubNet("channel"); + newPi.setType(PnmlConstants.PLACE_TYPE_DISCRETE); + channelPlace.setMutualPlaceInformation(newPi); + + InputSignalTransition channelTransition = new InputSignalTransition(); + TransitionInformation newTi = new DefaultTransitionInformation(); + newTi.setLocation("channel"); + newTi.setSubNet("channel"); + newTi.setType(PnmlConstants.TRANSITION_TYPE_DISCRETE); + channelTransition.setMutualTransitionInformation(newTi); channelPlace.setId(TemplateConstants.CHANNEL_CONNECTOR_PLACE + "-" + channelCount); channelTransition.setId(TemplateConstants.CHANNEL_CONNECTOR_TRANSITION + "-" + channelCount); @@ -153,6 +188,12 @@ public class ChannelFlatter { topPage.addObject(channelPlace); topPage.addObject(channelTransition); + Arc channelArc = new Arc(); + channelArc.setId("ChannelArc-" + channelCount); + channelArc.setTarget(channelTransition); + channelArc.setSource(channelPlace); + topPage.addObject(channelArc); + petriNet.flushTreeCache(); } @@ -168,22 +209,47 @@ public class ChannelFlatter { // include places, transitions for(Transition t : templateInstance.allTransitions()){ - t.asInputSignalTransition().getMutualTransitionInformation().setSubNet(subnet); - t.asInputSignalTransition().getMutualTransitionInformation().setLocation(location); + + System.out.println("Adding: " + t.getId()); + + TransitionInformation newTi = new DefaultTransitionInformation(); + newTi.setLocation(location); + newTi.setSubNet(subnet); + newTi.setType(t.asInputSignalTransition().getStaticTransitionInformation().getType()); + t.asInputSignalTransition().setMutualTransitionInformation(newTi); + topPage.addObject(t); } for(Place p : templateInstance.allPlaces()){ - p.asOutputSignalPlace().getMutualPlaceInformation().setSubNet(subnet); - p.asOutputSignalPlace().getMutualPlaceInformation().setLocation(location); + + PlaceInformation newPi = new PlaceInformation(); + newPi.setLocation(location); + newPi.setSubNet(subnet); + newPi.setType(p.asOutputSignalPlace().getStaticPlaceInformation().getType()); + p.asOutputSignalPlace().setMutualPlaceInformation(newPi); + topPage.addObject(p); } + petriNet.flushTreeCache(); + // connect elements by arcs for(Arc a : templateInstance.allArcs()){ Arc newArc = new Arc(); + newArc.setId("arc-" + a.getSource().getId() + "-" + a.getTarget().getId()); + System.out.println("Target: " + a.getTarget().getId()); newArc.setTarget((Node) getPnObjectByID(petriNet, a.getTarget().getId())); newArc.setSource((Node) getPnObjectByID(petriNet, a.getSource().getId())); + + if(a.getNumToolspecific() > 0) { + ToolInfo ti = new ToolInfo(); + ti.setFormattedXMLBuffer(a.getToolspecific(0).getFormattedXMLBuffer()); + ti.setTool(a.getToolspecific(0).getTool()); + ti.setVersion(a.getToolspecific(0).getVersion()); + newArc.addToolspecific(ti); + } + topPage.addObject(newArc); } diff --git a/src/main/resources/templates/TopicSubDispatcherTemplate.pnml b/src/main/resources/templates/TopicSubDispatcherTemplate.pnml index 5bf5679..e060187 100644 --- a/src/main/resources/templates/TopicSubDispatcherTemplate.pnml +++ b/src/main/resources/templates/TopicSubDispatcherTemplate.pnml @@ -142,6 +142,8 @@ </arc> <arc id="arc-6" source="DispatcherInputPlace" target="DispatcherInputTransition"> </arc> + <arc id="arc-7" source="DispatcherInputPlace" target="DispatcherOverflowTransition"> + </arc> </page> </net> </pnml> -- GitLab