From ab53ab36d2d79e234a211af195ff18b63ea29704 Mon Sep 17 00:00:00 2001
From: SebastianEbert <sebastian.ebert@tu-dresden.de>
Date: Fri, 22 Jul 2022 18:16:03 +0200
Subject: [PATCH] fixed several bugs

---
 src/main/jastadd/base/Navigation.jrag         | 40 ++++++++++++-
 .../base/distribution/DistributedPN.jadd      |  4 +-
 src/main/jastadd/base/io/IoPN.jadd            | 56 +++++++++++++++++++
 src/main/jastadd/base/io/IoPN.relast          |  3 +-
 src/main/jastadd/base/marking/Marking.jrag    |  2 +-
 src/main/jastadd/base/marking/Marking.relast  |  2 +-
 .../base/parsing/ToolSpecificsParser.jadd     |  6 +-
 .../PnmlTransitionInputResolver.jadd          | 55 ++++++++++++++++++
 8 files changed, 160 insertions(+), 8 deletions(-)
 create mode 100644 src/main/jastadd/base/resolving/PnmlTransitionInputResolver.jadd

diff --git a/src/main/jastadd/base/Navigation.jrag b/src/main/jastadd/base/Navigation.jrag
index adad23c..f90d77c 100644
--- a/src/main/jastadd/base/Navigation.jrag
+++ b/src/main/jastadd/base/Navigation.jrag
@@ -7,7 +7,9 @@ aspect Navigation {
       java.util.Set<Place> s = new java.util.HashSet<>();
 
       for (Arc incomingArc : getInArcList()) {
-          s.add(incomingArc.getSource().asPlaceNode().place());
+        if(!incomingArc.getSource().asPlaceNode().isRefPlace()){
+            s.add(incomingArc.getSource().asPlaceNode().place());
+        }
       }
 
       for (TransitionNode ref : getReferencingTransitions()) {
@@ -16,6 +18,23 @@ aspect Navigation {
 
       return s;
   }
+
+  syn java.util.Collection<RefPlace> TransitionNode.incomingRefPlaces() {
+
+      java.util.Set<RefPlace> s = new java.util.HashSet<>();
+
+        for (Arc incomingArc : getInArcList()) {
+            if(incomingArc.getSource().asPlaceNode().isRefPlace()){
+                s.add(incomingArc.getSource().asPlaceNode().asRefPlace());
+            }
+        }
+
+        for (TransitionNode ref : getReferencingTransitions()) {
+            s.addAll(ref.incomingRefPlaces());
+        }
+
+        return s;
+  }
   
   syn java.util.Collection<Place> TransitionNode.outgoingPlaces() {
 
@@ -41,6 +60,9 @@ aspect Navigation {
   syn boolean PnObject.isPageNode() = false;
   eq Page.isPageNode() = true;
 
+  syn boolean PnObject.isPlaceObject() = false;
+  eq Place.isPlaceObject() = true;
+
   syn boolean Node.isPlaceNode() = false;
   eq PlaceNode.isPlaceNode() = true;
 
@@ -119,6 +141,11 @@ aspect Navigation {
     to PetriNet.allPlaces()
     for petriNet();
 
+  coll java.util.Set<PlaceNode> PetriNet.allPlaceNodes() [new java.util.HashSet()] root PetriNet;
+  PlaceNode contributes this
+    to PetriNet.allPlaceNodes()
+    for petriNet();
+
   coll java.util.Set<Transition> PetriNet.allTransitions() [new java.util.HashSet()] root PetriNet;
   Transition contributes this
     to PetriNet.allTransitions()
@@ -181,6 +208,17 @@ aspect Navigation {
         return null;
    }
 
+   syn Transition PetriNet.getTransitionById(String id) {
+
+        for (Transition t : this.allTransitions()) {
+            if (t.getId().equals(id)) {
+                return t;
+            }
+        }
+
+        return null;
+   }
+
     syn RefTransition PetriNet.getRefTransitionFromTransitionNode(TransitionNode tNode) {
 
         if (tNode.isRefTransition()) {
diff --git a/src/main/jastadd/base/distribution/DistributedPN.jadd b/src/main/jastadd/base/distribution/DistributedPN.jadd
index 6aefa36..8ef3a73 100644
--- a/src/main/jastadd/base/distribution/DistributedPN.jadd
+++ b/src/main/jastadd/base/distribution/DistributedPN.jadd
@@ -4,7 +4,7 @@ aspect PnDistribution {
 
     syn TransitionInformation InputSignalTransition.getStaticTransitionInformation() {
 
-        if(this.getMutualTransitionInformation() == null){
+        if(!this.hasMutualTransitionInformation()){
             TransitionInformation tInfo = ToolSpecificsParser.getTransitionInformation(this.getToolspecificList());
             return tInfo;
         }
@@ -14,7 +14,7 @@ aspect PnDistribution {
 
     syn PlaceInformation OutputSignalPlace.getStaticPlaceInformation() {
 
-        if(this.getMutualPlaceInformation() == null){
+        if(!this.hasMutualPlaceInformation()){
             PlaceInformation tInfo = ToolSpecificsParser.getPlaceInformationInformation(this.getToolspecificList());
             return tInfo;
         }
diff --git a/src/main/jastadd/base/io/IoPN.jadd b/src/main/jastadd/base/io/IoPN.jadd
index e6d9f22..9d6671d 100644
--- a/src/main/jastadd/base/io/IoPN.jadd
+++ b/src/main/jastadd/base/io/IoPN.jadd
@@ -6,6 +6,12 @@ aspect IoPnExtension{
 
         eq Marking.getPetriNet().marking() = this;
 
+        inh BalloonMarking OutputSignalPlace.balloonMarking();
+
+        eq PetriNetDoc.getChild().balloonMarking() = null;
+
+        eq BalloonMarking.getPetriNet().balloonMarking() = this;
+
         inh Place OutputSignalBinding.containingPlace();
 
         eq OutputSignalPlace.getOutputSignalBinding().containingPlace() = this;
@@ -36,6 +42,56 @@ aspect IoPnExtension{
         // updates automatically based on dependencies to the corresponding place
         syn String OutputSignalBinding.getOutputSignalValue(){
 
+            OutputSignalPlace osp = this.containingPlace().asOutputSignalPlace();
+            BalloonMarking marking = osp.balloonMarking();
+            BalloonMarkedPlace markedPlace = marking.resolveBalloonPlaceById(this.getPlaceID());
+
+            JastAddList<EqualityOutputMapping> eomList = this.getEqualityOMListNoTransform();
+            JastAddList<ThresholdOutputMapping> tomList = this.getThresholdOMListNoTransform();
+            JastAddList<RangeOutputMapping> romList = this.getRangeOMListNoTransform();
+
+            // eom
+            int result = -1;
+                for (EqualityOutputMapping eom : eomList) {
+                    if ((eom.getValue() == markedPlace.getNumBalloonMarking()) && result == -1) {
+                        result = eom.getResult();
+                        break;
+                    }
+            }
+
+            // tom
+            if (result > -1) {
+                for (ThresholdOutputMapping tom : tomList) {
+                    if (tom.getValue() <= markedPlace.getNumBalloonMarking()) {
+                        result = tom.getResult();
+                        break;
+                    }
+                }
+            }
+
+            // rom
+            if (result > -1) {
+                for (RangeOutputMapping rom : romList) {
+                    if ((rom.getLowerBound() <= markedPlace.getNumBalloonMarking()) && (rom.getUpperBound() >= markedPlace.getNumBalloonMarking())) {
+                        result = rom.getResult();
+                        break;
+                    }
+                }
+            }
+
+            // 0 (disabled Signal) is default
+            if (result == -1) {
+                result = 0;
+            }
+
+            String output = String.valueOf(result) + "-" + this.getOutputSignalID();
+
+            return output;
+        }
+
+
+        syn String OutputSignalBinding.getOutputSignalValueForDefaultMarking(){
+
             OutputSignalPlace osp = this.containingPlace().asOutputSignalPlace();
             Marking marking = osp.marking();
             MarkedPlace markedPlace = marking.resolvePlaceById(this.getPlaceID());
diff --git a/src/main/jastadd/base/io/IoPN.relast b/src/main/jastadd/base/io/IoPN.relast
index 60241c8..2bcffec 100644
--- a/src/main/jastadd/base/io/IoPN.relast
+++ b/src/main/jastadd/base/io/IoPN.relast
@@ -15,5 +15,4 @@ 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/jastadd/base/marking/Marking.jrag b/src/main/jastadd/base/marking/Marking.jrag
index 17c5f98..eb4df0d 100644
--- a/src/main/jastadd/base/marking/Marking.jrag
+++ b/src/main/jastadd/base/marking/Marking.jrag
@@ -33,7 +33,7 @@ aspect Marking {
 
   syn MarkedPlace Marking.resolvePlace(Place place) = placeMap().get(place);
 
-  syn lazy java.util.Map<Place, MarkedPlace> Marking.placeMap() {
+  syn java.util.Map<Place, MarkedPlace> Marking.placeMap() {
     java.util.Map<Place, MarkedPlace> map = new java.util.HashMap<>();
     for (MarkedPlace markedPlace : getPlaceList()) {
       map.put(markedPlace.getPlace(), markedPlace);
diff --git a/src/main/jastadd/base/marking/Marking.relast b/src/main/jastadd/base/marking/Marking.relast
index 487b282..aedc4d5 100644
--- a/src/main/jastadd/base/marking/Marking.relast
+++ b/src/main/jastadd/base/marking/Marking.relast
@@ -1,4 +1,4 @@
 Marking ::= PetriNet:PetriNet Place:MarkedPlace*;
 MarkedPlace ::= <Marking:int>;
 
-rel MarkedPlace.Place -> Place;
+rel MarkedPlace.Place -> Place;
\ No newline at end of file
diff --git a/src/main/jastadd/base/parsing/ToolSpecificsParser.jadd b/src/main/jastadd/base/parsing/ToolSpecificsParser.jadd
index e6936bc..6d25585 100644
--- a/src/main/jastadd/base/parsing/ToolSpecificsParser.jadd
+++ b/src/main/jastadd/base/parsing/ToolSpecificsParser.jadd
@@ -267,7 +267,11 @@ aspect ToolSpecificsParser{
                     Document doc = parseToolSpecifics(toolInfos);
                     String transitionType = getTransitionTypeFromToolSpecifics(toolInfos);
 
-                    if (transitionType != null && (transitionType.equals(PnmlConstants.TRANSITION_TYPE_TOPIC))) {
+                    if ((transitionType != null && (transitionType.equals(PnmlConstants.TRANSITION_TYPE_TOPIC))) ||
+                            (transitionType != null && (transitionType.equals(PnmlConstants.TRANSITION_TYPE_TOPIC_LIMITED_IN))) ||
+                            (transitionType != null && (transitionType.equals(PnmlConstants.TRANSITION_TYPE_TOPIC_LIMITED_OUT))) ||
+                            (transitionType != null && (transitionType.equals(PnmlConstants.TRANSITION_TYPE_TOPIC_UNLIMITED_IN))) ||
+                            (transitionType != null && (transitionType.equals(PnmlConstants.TRANSITION_TYPE_TOPIC_UNLIMITED_OUT)))) {
 
                         org.w3c.dom.NodeList limList = doc.getElementsByTagName(limitType);
 
diff --git a/src/main/jastadd/base/resolving/PnmlTransitionInputResolver.jadd b/src/main/jastadd/base/resolving/PnmlTransitionInputResolver.jadd
new file mode 100644
index 0000000..b5fd333
--- /dev/null
+++ b/src/main/jastadd/base/resolving/PnmlTransitionInputResolver.jadd
@@ -0,0 +1,55 @@
+aspect PnmlTransitionInputResolver {
+
+    public Set<Place> Transition.resolveInputPlaces(){
+
+        Set<Place> inputs = (Set<Place>) this.incomingPlaces();
+        Set<RefPlace> refPlaces = (Set<RefPlace>) this.incomingRefPlaces();
+
+        for(RefPlace rp : refPlaces){
+
+            Place root = null;
+            RefPlace iterRef = rp;
+
+            while (root == null){
+                if(iterRef.getRef().isPlace()){
+                    root = iterRef.getRef().asPlace();
+                }else {
+                    iterRef = rp.getRef().asRefPlace();
+                }
+            }
+
+            if(root != null){
+                inputs.add(root);
+            }
+        }
+
+        return inputs;
+    }
+
+    public Set<Place> Transition.resolveOutputPlaces(){
+
+        Set<Place> outputs = (Set<Place>) this.outgoingPlaces();
+
+        for (Arc outgoing : this.getOutArcList()) {
+            if(outgoing.getTarget() != null && outgoing.getTarget().asRefPlace() != null){
+
+                Place root = null;
+                RefPlace iterRef = outgoing.getTarget().asRefPlace();
+
+                while (root == null){
+                    if(iterRef.getRef().isPlace()){
+                        root = iterRef.getRef().asPlace();
+                    }else {
+                        iterRef = iterRef.getRef().asRefPlace();
+                    }
+                }
+
+                if(root != null){
+                    outputs.add(root);
+                }
+            }
+        }
+
+        return outputs;
+    }
+}
\ No newline at end of file
-- 
GitLab