From 4e8f55164e18a22ee5cbb478e374983343624aa6 Mon Sep 17 00:00:00 2001
From: jerray <jawher.jerray@eurecom.fr>
Date: Thu, 20 Apr 2023 19:01:23 +0200
Subject: [PATCH] Fix some bugs in the translation from TML to AVATAR Sec

---
 .../java/tmltranslator/TMLDecryption.java     |  56 +++++
 .../java/tmltranslator/TMLEncryption.java     |  56 +++++
 .../toavatar/FullTML2Avatar.java              |   4 +-
 .../tmltranslator/toavatarsec/TML2Avatar.java | 212 +++++++++++-------
 .../ui/ActivityDiagram2TMLTranslator.java     |  22 +-
 5 files changed, 263 insertions(+), 87 deletions(-)
 create mode 100644 src/main/java/tmltranslator/TMLDecryption.java
 create mode 100644 src/main/java/tmltranslator/TMLEncryption.java

diff --git a/src/main/java/tmltranslator/TMLDecryption.java b/src/main/java/tmltranslator/TMLDecryption.java
new file mode 100644
index 0000000000..a879a8ff4c
--- /dev/null
+++ b/src/main/java/tmltranslator/TMLDecryption.java
@@ -0,0 +1,56 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ * 
+ * ludovic.apvrille AT enst.fr
+ * 
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ * 
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ * 
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ * 
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ * 
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+
+
+package tmltranslator;
+
+
+/**
+ * Class TMLDecryption
+ * Creation: 18/04/2023
+ * @version 1.0 18/04/2023
+ */
+public class TMLDecryption extends TMLActivityElementWithAction {
+
+    public TMLDecryption(String _name, Object _referenceObject) {
+         super(_name, _referenceObject);
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/tmltranslator/TMLEncryption.java b/src/main/java/tmltranslator/TMLEncryption.java
new file mode 100644
index 0000000000..7734869798
--- /dev/null
+++ b/src/main/java/tmltranslator/TMLEncryption.java
@@ -0,0 +1,56 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ * 
+ * ludovic.apvrille AT enst.fr
+ * 
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ * 
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ * 
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ * 
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ * 
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+
+
+package tmltranslator;
+
+
+/**
+ * Class TMLEncryption
+ * Creation: 21/05/2008
+ * @version 1.0 21/05/2008
+ */
+public class TMLEncryption extends TMLActivityElementWithAction {
+
+    public TMLEncryption(String _name, Object _referenceObject) {
+         super(_name, _referenceObject);
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/tmltranslator/toavatar/FullTML2Avatar.java b/src/main/java/tmltranslator/toavatar/FullTML2Avatar.java
index 03734756e2..63a257bb1d 100644
--- a/src/main/java/tmltranslator/toavatar/FullTML2Avatar.java
+++ b/src/main/java/tmltranslator/toavatar/FullTML2Avatar.java
@@ -1168,7 +1168,7 @@ public class FullTML2Avatar {
 
             if (security && ae.securityPattern != null) {
                 //If encryption
-                if (ae.securityPattern != null && ae.getName().contains("encrypt")) {
+                if (ae.securityPattern != null && ae instanceof TMLEncryption) {
                     secPatterns.add(ae.securityPattern);
                     if (ae.securityPattern.type.equals("Advanced")) {
                         //Type Advanced
@@ -1352,7 +1352,7 @@ public class FullTML2Avatar {
                         signalAuthOriginMap.put(ae.securityPattern.name, authOrigin);
                     }
 
-                } else if (ae.securityPattern != null && ae.getName().contains("decrypt")) {
+                } else if (ae.securityPattern != null && ae instanceof TMLDecryption) {
                     //Decryption action
                     //block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));
                     //block.addAttribute(new AvatarAttribute(ae.securityPattern.name+"_encrypted", AvatarType.INTEGER, block, null));
diff --git a/src/main/java/tmltranslator/toavatarsec/TML2Avatar.java b/src/main/java/tmltranslator/toavatarsec/TML2Avatar.java
index 5ee67d39b1..0a6d72bf62 100644
--- a/src/main/java/tmltranslator/toavatarsec/TML2Avatar.java
+++ b/src/main/java/tmltranslator/toavatarsec/TML2Avatar.java
@@ -59,6 +59,7 @@ public class TML2Avatar {
     private final static Integer channelPublic = 0;
     private final static Integer channelPrivate = 1;
     private final static Integer channelUnreachable = 2;
+    private final static String NOTIFIED = "_NOTIFIED";
     //private AvatarAttribute pKey;
     public Map<TMLChannel, Integer> channelMap = new HashMap<TMLChannel, Integer>();
     public Map<TMLTask, AvatarBlock> taskBlockMap = new HashMap<TMLTask, AvatarBlock>();
@@ -412,7 +413,7 @@ public class TML2Avatar {
             if (ae.getReferenceObject() != null) {
                 checked = ((TGComponent) ae.getReferenceObject()).hasCheckedAccessibility();
             }
-            AvatarState signalState = new AvatarState("signalstate_" + ae.getName().replaceAll(" ", "") + "_" + req.getName().replaceAll(" ", ""), ae.getReferenceObject(), checkAcc, checked);
+            AvatarState signalState = new AvatarState("signalstate_" + reworkStringName(ae.getName()) + "_" + reworkStringName(req.getName()), ae.getReferenceObject(), checkAcc, checked);
             AvatarTransition signalTran = new AvatarTransition(block, "__after_signalstate_" + ae.getName() + "_" + req.getName(), ae.getReferenceObject());
             if (!signalOutMap.containsKey(req.getName())) {
                 sig = new AvatarSignal(getName(req.getName()), AvatarSignal.OUT, req.getReferenceObject());
@@ -450,7 +451,7 @@ public class TML2Avatar {
             elementList.add(tran);
         } else if (ae instanceof TMLRandomSequence) {
             //HashMap<Integer, List<AvatarStateMachineElement>> seqs = new HashMap<Integer, List<AvatarStateMachineElement>>();
-            AvatarState choiceState = new AvatarState("seqchoice__" + ae.getName().replaceAll(" ", ""), ae.getReferenceObject());
+            AvatarState choiceState = new AvatarState("seqchoice__" + reworkStringName(ae.getName()), ae.getReferenceObject());
             elementList.add(choiceState);
             if (ae.getNbNext() == 2) {
                 List<AvatarStateMachineElement> set0 = translateState(ae.getNextElement(0), block);
@@ -531,7 +532,7 @@ public class TML2Avatar {
 
 
                     AvatarState choiceStateEnd = new AvatarState("seqchoiceend__" + i + "_" +
-                            ae.getName().replaceAll(" ", ""), ae.getReferenceObject());
+                        reworkStringName(ae.getName()), ae.getReferenceObject());
                     elementList.add(choiceStateEnd);
 
 
@@ -588,18 +589,19 @@ public class TML2Avatar {
             if (ae.getReferenceObject() != null) {
                 checked = ((TGComponent) ae.getReferenceObject()).hasCheckedAccessibility();
             }
-            AvatarState signalState = new AvatarState("signalstate_" + ae.getName().replaceAll(" ", "") + "_" + evt.getName(), ae.getReferenceObject(), checkAcc, checked);
+            AvatarState signalState = new AvatarState("signalstate_" + reworkStringName(ae.getName()) + "_" + evt.getName(), ae.getReferenceObject(), checkAcc, checked);
             AvatarTransition signalTran = new AvatarTransition(block, "__after_signalstate_" + ae.getName() + "_" + evt.getName(), ae.getReferenceObject());
 
             if (ae instanceof TMLSendEvent) {
                 AvatarSignal sig;
                 if (!signalOutMap.containsKey(evt.getName())) {
-                    sig = new AvatarSignal(getName(evt.getName()), AvatarSignal.OUT, evt.getReferenceObject());
+                    sig = new AvatarSignal(evt.getName(), AvatarSignal.OUT, evt.getReferenceObject());
                     signals.add(sig);
                     block.addSignal(sig);
                     signalOutMap.put(evt.getName(), sig);
                 } else {
                     sig = signalOutMap.get(evt.getName());
+                    TraceManager.addDev("Send event: " + evt.getName()+" exist");
                 }
                 AvatarActionOnSignal as = new AvatarActionOnSignal(ae.getName(), sig, ae.getReferenceObject());
                 for (int i = 0; i < aee.getNbOfParams(); i++) {
@@ -627,12 +629,13 @@ public class TML2Avatar {
             } else if (ae instanceof TMLWaitEvent) {
                 AvatarSignal sig;
                 if (!signalInMap.containsKey(evt.getName())) {
-                    sig = new AvatarSignal(getName(evt.getName()), AvatarSignal.IN, evt.getReferenceObject());
+                    sig = new AvatarSignal(evt.getName(), AvatarSignal.IN, evt.getReferenceObject());
                     signals.add(sig);
                     block.addSignal(sig);
                     signalInMap.put(evt.getName(), sig);
                 } else {
                     sig = signalInMap.get(evt.getName());
+                    TraceManager.addDev("Wait event: " + evt.getName()+" exist");
                 }
                 AvatarActionOnSignal as = new AvatarActionOnSignal(ae.getName(), sig, ae.getReferenceObject());
                 for (int i = 0; i < aee.getNbOfParams(); i++) {
@@ -658,6 +661,7 @@ public class TML2Avatar {
                 elementList.add(tran);
             } else {
                 //Notify Event, I don't know how to translate this
+                TraceManager.addDev("Notify event");
                 AvatarRandom as = new AvatarRandom(ae.getName(), ae.getReferenceObject());
                 tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
                 as.setVariable(aee.getVariable());
@@ -676,7 +680,7 @@ public class TML2Avatar {
             elementList.add(tran);
             if (security && ae.securityPattern != null) {
                 //If encryption
-                if (ae.securityPattern != null && ae.getName().contains("encrypt")) {
+                if (ae.securityPattern != null && ae instanceof TMLEncryption) {
                     secPatterns.add(ae.securityPattern);
                     if (ae.securityPattern.type.equals("Advanced")) {
                         //Type Advanced
@@ -860,9 +864,10 @@ public class TML2Avatar {
                         AvatarAttributeState authOrigin = new AvatarAttributeState(block.getName() + "." + as.getName() + "." +
                                 ae.securityPattern.name, ae.getReferenceObject(), block.getAvatarAttributeWithName(ae.securityPattern.name), as);
                         signalAuthOriginMap.put(ae.securityPattern.name, authOrigin);
+                        TraceManager.addDev("signalAuthOriginMap 866: " + ae.securityPattern.name + " " + authOrigin.getName() + " " +as.getName());
                     }
 
-                } else if (ae.securityPattern != null && ae.getName().contains("decrypt")) {
+                } else if (ae.securityPattern != null && ae instanceof TMLDecryption) {
                     //Decryption action
                     //block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));
                     //block.addAttribute(new AvatarAttribute(ae.securityPattern.name+"_encrypted", AvatarType.INTEGER, block, null));
@@ -912,7 +917,7 @@ public class TML2Avatar {
                             }
 
                             //Add state after get2 statement
-                            AvatarState guardState = new AvatarState(ae.getName().replaceAll(" ", "") + "_guarded", ae.getReferenceObject());
+                            AvatarState guardState = new AvatarState(reworkStringName(ae.getName()) + "_guarded", ae.getReferenceObject());
                             tran.addNext(guardState);
                             tran = new AvatarTransition(block, "__guard_" + ae.getName(), ae.getReferenceObject());
                             guardState.addNext(tran);
@@ -924,7 +929,7 @@ public class TML2Avatar {
                         }
 
                         // Add a dummy state afterwards for authenticity after decrypting the data
-                        AvatarState dummy = new AvatarState(ae.getName().replaceAll(" ", "") + "_dummy", ae.getReferenceObject());
+                        AvatarState dummy = new AvatarState(reworkStringName(ae.getName()) + "_dummy", ae.getReferenceObject());
                         ae.securityPattern.state2 = dummy;
                         tran.addNext(dummy);
                         tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
@@ -935,6 +940,7 @@ public class TML2Avatar {
                             AvatarAttributeState authDest = new AvatarAttributeState(block.getName() + "." + dummy.getName() + "." +
                                     ae.securityPattern.name, ae.getReferenceObject(), block.getAvatarAttributeWithName(ae.securityPattern.name), dummy);
                             signalAuthDestMap.put(ae.securityPattern.name, authDest);
+                            TraceManager.addDev("signalAuthDestMap 942: " + ae.securityPattern.name + " " + authDest.getName() + " " +dummy.getName());
                         }
                     } else if (ae.securityPattern.type.equals("Asymmetric Encryption")) {
                         AvatarMethod adecrypt = new AvatarMethod("adecrypt", ae);
@@ -983,7 +989,7 @@ public class TML2Avatar {
                             }
 
                             tran.addAction("get2(" + ae.securityPattern.name + "," + ae.securityPattern.name + ",testnonce_" + ae.securityPattern.nonce + ")");
-                            AvatarState guardState = new AvatarState(ae.getName().replaceAll(" ", "") + "_guarded", ae.getReferenceObject());
+                            AvatarState guardState = new AvatarState(reworkStringName(ae.getName()) + "_guarded", ae.getReferenceObject());
                             tran.addNext(guardState);
                             tran = new AvatarTransition(block, "__guard_" + ae.getName(), ae.getReferenceObject());
                             elementList.add(guardState);
@@ -991,7 +997,7 @@ public class TML2Avatar {
                             guardState.addNext(tran);
                             tran.setGuard("testnonce_" + ae.securityPattern.nonce + "==" + ae.securityPattern.nonce);
                         }
-                        AvatarState dummy = new AvatarState(ae.getName().replaceAll(" ", "") + "_dummy", ae.getReferenceObject());
+                        AvatarState dummy = new AvatarState(reworkStringName(ae.getName()) + "_dummy", ae.getReferenceObject());
                         tran.addNext(dummy);
                         tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
                         dummy.addNext(tran);
@@ -1001,6 +1007,7 @@ public class TML2Avatar {
                         if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null) {
                             AvatarAttributeState authDest = new AvatarAttributeState(block.getName() + "." + dummy.getName() + "." + ae.securityPattern.name, ae.getReferenceObject(), block.getAvatarAttributeWithName(ae.securityPattern.name), dummy);
                             signalAuthDestMap.put(ae.securityPattern.name, authDest);
+                            TraceManager.addDev("signalAuthDestMap 1009: " + ae.securityPattern.name + " " + authDest.getName() + " " +dummy.getName());
                         }
                     } else if (ae.securityPattern.type.equals("MAC")) {
                         //Separate MAC from MSG
@@ -1041,7 +1048,7 @@ public class TML2Avatar {
                             tran.addAction("get2(" + ae.securityPattern.name + "," + ae.securityPattern.name + ",testnonce_" + ae.securityPattern.nonce + ")");
                         }
 
-                        AvatarState guardState = new AvatarState(ae.getName().replaceAll(" ", "") + "_guarded", ae.getReferenceObject());
+                        AvatarState guardState = new AvatarState(reworkStringName(ae.getName()) + "_guarded", ae.getReferenceObject());
                         tran.addNext(guardState);
                         tran = new AvatarTransition(block, "__guard_" + ae.getName(), ae.getReferenceObject());
                         elementList.add(guardState);
@@ -1053,7 +1060,7 @@ public class TML2Avatar {
 
                             //Add extra state and transition
 
-                            AvatarState guardState2 = new AvatarState(ae.getName().replaceAll(" ", "") + "_guarded2", ae.getReferenceObject());
+                            AvatarState guardState2 = new AvatarState(reworkStringName(ae.getName()) + "_guarded2", ae.getReferenceObject());
                             tran.addNext(guardState2);
                             tran = new AvatarTransition(block, "__guard_" + ae.getName(), ae.getReferenceObject());
                             tran.setGuard("testnonce_" + ae.securityPattern.nonce + "==" + ae.securityPattern.nonce);
@@ -1062,7 +1069,7 @@ public class TML2Avatar {
 
                             guardState2.addNext(tran);
                         }
-                        AvatarState dummy = new AvatarState(ae.getName().replaceAll(" ", "") + "_dummy", ae.getReferenceObject());
+                        AvatarState dummy = new AvatarState(reworkStringName(ae.getName()) + "_dummy", ae.getReferenceObject());
                         ae.securityPattern.state2 = dummy;
                         tran.addNext(dummy);
                         elementList.add(tran);
@@ -1074,6 +1081,7 @@ public class TML2Avatar {
                         if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null) {
                             AvatarAttributeState authDest = new AvatarAttributeState(block.getName() + "." + dummy.getName() + "." + ae.securityPattern.name, ae.getReferenceObject(), block.getAvatarAttributeWithName(ae.securityPattern.name), dummy);
                             signalAuthDestMap.put(ae.securityPattern.name, authDest);
+                            TraceManager.addDev("signalAuthDestMap 1083: " + ae.securityPattern.name + " " + authDest.getName() + " " +dummy.getName());
                         }
                     }
 
@@ -1084,7 +1092,7 @@ public class TML2Avatar {
                 //Translate state without security
             }
         } else if (ae instanceof TMLActivityElementWithIntervalAction) {
-            AvatarState as = new AvatarState(ae.getName().replaceAll(" ", ""), ae.getReferenceObject());
+            AvatarState as = new AvatarState(reworkStringName(ae.getName()), ae.getReferenceObject());
             tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
             as.addNext(tran);
             elementList.add(as);
@@ -1103,7 +1111,7 @@ public class TML2Avatar {
             if (ae.getReferenceObject() != null) {
                 checked = ((TGComponent) ae.getReferenceObject()).hasCheckedAccessibility();
             }
-            AvatarState signalState = new AvatarState("signalstate_" + ae.getName().replaceAll(" ", "") + "_" +
+            AvatarState signalState = new AvatarState("signalstate_" + reworkStringName(ae.getName()) + "_" +
                     ch.getName(), ae.getReferenceObject(), checkAcc, checked);
             AvatarTransition signalTran = new AvatarTransition(block, "__after_signalstate_" + ae.getName() + "_" + ch.getName(),
                     ae.getReferenceObject());
@@ -1162,7 +1170,8 @@ public class TML2Avatar {
                         }
                     }
                 } else {
-                    as.addValue(getName(ch.getName()) + "_chData");
+                    as.addValue(ch.getDestinationPort().getName() + "_chData");
+                    TraceManager.addDev("NO SECURITY FOR : " + getName(ch.getName()));
                 }
 
                 tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
@@ -1175,22 +1184,23 @@ public class TML2Avatar {
                 elementList.add(tran);
                 if (ch.checkAuth) {
                     //Add aftersignal state
-                    AvatarState afterSignalState = new AvatarState("aftersignalstate_" + ae.getName().replaceAll(" ", "") +
+                    AvatarState afterSignalState = new AvatarState("aftersignalstate_" + reworkStringName(ae.getName()) +
                             "_" + ch.getName(), ae.getReferenceObject());
                     tran.addNext(afterSignalState);
                     tran = new AvatarTransition(block, "__aftersignalstate_" + ae.getName(), ae.getReferenceObject());
                     afterSignalState.addNext(tran);
                     elementList.add(afterSignalState);
                     elementList.add(tran);
-                    if (block.getAvatarAttributeWithName(getName(ch.getName()) + "_chData") == null) {
-                        AvatarAttribute channelData = new AvatarAttribute(getName(ch.getName()) + "_chData", AvatarType.INTEGER, block,
-                                null);
-                        block.addAttribute(channelData);
-                    }
-                    AvatarAttributeState authDest = new AvatarAttributeState(block.getName() + "." + afterSignalState.getName() + "." +
+                    if (block.getAvatarAttributeWithName(getName(ch.getName()) + "_chData") != null) {
+                        //AvatarAttribute channelData = new AvatarAttribute(getName(ch.getName()) + "_chData", AvatarType.INTEGER, block, null);
+                        //block.addAttribute(channelData);
+                        AvatarAttributeState authDest = new AvatarAttributeState(block.getName() + "." + reworkStringName(afterSignalState.getName()) + "." +
                             getName(ch.getName()) + "_chData", ae.getReferenceObject(), block.getAvatarAttributeWithName(getName(ch.getName())
                             + "_chData"), afterSignalState);
-                    signalAuthDestMap.put(ch.getName(), authDest);
+                        signalAuthDestMap.put(ch.getName(), authDest);
+                        TraceManager.addDev("signalAuthDestMap 1201: " + ch.getName() + " " + authDest.getName() + " " +afterSignalState.getName());
+                    }
+                    
                 }
 
             } else {
@@ -1248,13 +1258,15 @@ public class TML2Avatar {
                 // To be removed in case another authenticity pragma is used on the channel
                 // Also, to be duplicated for each send / receive
                 if (ch.checkAuth) {
-                    if (block.getAvatarAttributeWithName(getName(ch.getName()) + "_chData") == null) {
-                        AvatarAttribute channelData = new AvatarAttribute(getName(ch.getName()) + "_chData", AvatarType.INTEGER, block, null);
-                        block.addAttribute(channelData);
-                    }
-                    AvatarAttributeState authOrigin = new AvatarAttributeState(block.getName() + "." + signalState.getName() + "." +
+                    if (block.getAvatarAttributeWithName(getName(ch.getName()) + "_chData") != null) {
+                        //AvatarAttribute channelData = new AvatarAttribute(getName(ch.getName()) + "_chData", AvatarType.INTEGER, block, null);
+                        //block.addAttribute(channelData);
+                        AvatarAttributeState authOrigin = new AvatarAttributeState(block.getName() + "." + reworkStringName(signalState.getName()) + "." +
                             getName(ch.getName()) + "_chData", ae.getReferenceObject(), block.getAvatarAttributeWithName(getName(ch.getName()) + "_chData"), signalState);
-                    signalAuthOriginMap.put(ch.getName(), authOrigin);
+                        signalAuthOriginMap.put(ch.getName(), authOrigin);
+                        TraceManager.addDev("signalAuthOriginMap 1266: " + ch.getName() + " " + authOrigin.getName() + " " +signalState.getName());
+                    }
+                    
                 }
 
                 AvatarActionOnSignal as = new AvatarActionOnSignal(ae.getName(), sig, ae.getReferenceObject());
@@ -1314,7 +1326,7 @@ public class TML2Avatar {
                 List<AvatarStateMachineElement> elements = translateState(ae.getNextElement(0), block);
                 /*List<AvatarStateMachineElement> afterloop =*/
                 translateState(ae.getNextElement(1), block);
-                AvatarState initState = new AvatarState(ae.getName().replaceAll(" ", "") + "__init", ae.getReferenceObject());
+                AvatarState initState = new AvatarState(reworkStringName(ae.getName()) + "__init", ae.getReferenceObject());
                 elementList.add(initState);
                 //Build transition to choice
                 tran = new AvatarTransition(block, "loop_init__" + ae.getName(), ae.getReferenceObject());
@@ -1322,7 +1334,7 @@ public class TML2Avatar {
                 elementList.add(tran);
                 initState.addNext(tran);
                 //Choice state
-                AvatarState as = new AvatarState(ae.getName().replaceAll(" ", "") + "__choice", ae.getReferenceObject());
+                AvatarState as = new AvatarState(reworkStringName(ae.getName()) + "__choice", ae.getReferenceObject());
                 elementList.add(as);
                 tran.addNext(as);
                 //transition to first element of loop
@@ -1364,7 +1376,7 @@ public class TML2Avatar {
                 //Make initializaton, then choice state with transitions
                 List<AvatarStateMachineElement> elements = translateState(ae.getNextElement(0), block);
                 List<AvatarStateMachineElement> afterloop = translateState(ae.getNextElement(1), block);
-                AvatarState initState = new AvatarState(ae.getName().replaceAll(" ", "") + "__init", ae.getReferenceObject());
+                AvatarState initState = new AvatarState(reworkStringName(ae.getName()) + "__init", ae.getReferenceObject());
                 elementList.add(initState);
                 //Build transition to choice
                 tran = new AvatarTransition(block, "loop_init__" + ae.getName(), ae.getReferenceObject());
@@ -1373,7 +1385,7 @@ public class TML2Avatar {
                 elementList.add(tran);
                 initState.addNext(tran);
                 //Choice state
-                AvatarState as = new AvatarState(ae.getName().replaceAll(" ", "") + "__choice", ae.getReferenceObject());
+                AvatarState as = new AvatarState(reworkStringName(ae.getName()) + "__choice", ae.getReferenceObject());
                 elementList.add(as);
                 tran.addNext(as);
                 //transition to first element of loop
@@ -1422,7 +1434,7 @@ public class TML2Avatar {
                 return elementList;
             }
         } else if (ae instanceof TMLChoice) {
-            AvatarState as = new AvatarState(ae.getName().replaceAll(" ", ""), ae.getReferenceObject());
+            AvatarState as = new AvatarState(reworkStringName(ae.getName()), ae.getReferenceObject());
             //Make many choices
             elementList.add(as);
             TMLChoice c = (TMLChoice) ae;
@@ -1440,7 +1452,7 @@ public class TML2Avatar {
             return elementList;
 
         } else if (ae instanceof TMLSelectEvt) {
-            AvatarState as = new AvatarState(ae.getName().replaceAll(" ", ""), ae.getReferenceObject());
+            AvatarState as = new AvatarState(reworkStringName(ae.getName()), ae.getReferenceObject());
             elementList.add(as);
             //Make many choices
             //TMLSelectEvt c = (TMLSelectEvt) ae;
@@ -1467,7 +1479,7 @@ public class TML2Avatar {
     }
 
     public String processName(String name, int id) {
-        name = name.replaceAll("-", "_").replaceAll(" ", "");
+        name = reworkStringName(name).replaceAll("-", "_");
         if (allStates.contains(name)) {
             return name + id;
 
@@ -1603,7 +1615,7 @@ public class TML2Avatar {
             AvatarBlock block = taskBlockMap.get(task);
             //Add temp variable for unsendable signals
 
-            //Add all signals
+            //Add all channel signals
             for (TMLChannel chan : tmlmodel.getChannels(task)) {
 
                 if (chan.hasOriginTask(task)) {
@@ -1625,14 +1637,62 @@ public class TML2Avatar {
                     block.addSignal(sig);
                     signals.add(sig);
                     signalInMap.put(chan.getName(), sig);
-                    AvatarAttribute channelData = new AvatarAttribute(getName(chan.getName()) + "_chData", AvatarType.INTEGER, block,
+                    AvatarAttribute channelData = new AvatarAttribute(chan.getDestinationPort().getName() + "_chData", AvatarType.INTEGER, block,
                             null);
-                    if (block.getAvatarAttributeWithName(getName(chan.getName()) + "_chData") == null) {
+                    if (block.getAvatarAttributeWithName(chan.getDestinationPort().getName() + "_chData") == null) {
                         block.addAttribute(channelData);
                     }
                     sig.addParameter(channelData);
                 }
             }
+
+            // Add all event signals
+            for (TMLEvent evt : tmlmodel.getEvents(task)) {
+                //TraceManager.addDev("Handling evt: " + evt.getName() + " in task " + task.getName());
+                if (evt.hasOriginTask(task)) {
+                    String name = getNameReworked(evt.getName(), 1) + "_out";
+                    TraceManager.addDev("Adding OUT evt:" + name);
+                    AvatarSignal sig = new AvatarSignal(name, AvatarSignal.OUT, evt.getReferenceObject());
+                    block.addSignal(sig);
+                    signals.add(sig);
+                    //Adding parameter
+                    int cpt = 0;
+                    for (TMLType tmlt : evt.getParams()) {
+                        AvatarAttribute aa = new AvatarAttribute("p" + cpt, getAvatarType(tmlt), null, null);
+                        sig.addParameter(aa);
+                        cpt++;
+                    }
+                    signalOutMap.put(evt.getName(), sig);
+
+                }
+
+                if (evt.hasDestinationTask(task)) {
+                    String name = getNameReworked(evt.getName(), 3) + "_in";
+                    TraceManager.addDev("Adding IN evt:" + name);
+                    AvatarSignal sig = new AvatarSignal(name, AvatarSignal.IN, evt.getReferenceObject());
+                    block.addSignal(sig);
+                    signals.add(sig);
+                    signalInMap.put(evt.getName(), sig);
+
+                    //Adding parameter
+                    int cpt = 0;
+                    for (TMLType tmlt : evt.getParams()) {
+                        AvatarAttribute aa = new AvatarAttribute("p" + cpt, getAvatarType(tmlt), null, null);
+                        sig.addParameter(aa);
+                        cpt++;
+                    }/*
+
+                    name = getNameReworked(evt.getName(), 3) + NOTIFIED;
+                    sig = block.addSignalIfApplicable(name, AvatarSignal.IN, evt.getReferenceObject());
+                    signalInMap.put(evt.getName() + NOTIFIED, sig);
+
+                    //Adding parameter
+                    AvatarAttribute aa = new AvatarAttribute("p" + cpt, AvatarType.INTEGER, null, null);
+                    sig.addParameter(aa); */
+
+                }
+            }
+
             AvatarAttribute tmp = new AvatarAttribute("tmp", AvatarType.INTEGER, block, null);
             block.addAttribute(tmp);
 
@@ -2146,39 +2206,16 @@ public class TML2Avatar {
         }
         for (TMLEvent event : tmlmodel.getEvents()) {
 
-            AvatarRelation ar = new AvatarRelation(event.getName(), taskBlockMap.get(event.getOriginTask()), taskBlockMap.get(event.getDestinationTask()), event.getReferenceObject());
-            ar.setPrivate(originDestMap.get(event.getOriginTask().getName() + "__" + event.getDestinationTask().getName()) == 1);
-            List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>();
-            List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>();
-            for (AvatarSignal sig : signals) {
-                if (sig.getInOut() == AvatarSignal.IN) {
-                    String name = sig.getName();
-                    if (name.equals(getName(event.getName()))) {
-                        sig1.add(sig);
-                    }
-                }
-            }
-            //Find out signal
-            for (AvatarSignal sig : signals) {
-                if (sig.getInOut() == AvatarSignal.OUT) {
-                    String name = sig.getName();
-                    if (name.equals(getName(event.getName()))) {
-                        sig2.add(sig);
-                    }
-                }
-            }
-            if (sig1.size() == 0) {
-                sig1.add(new AvatarSignal(getName(event.getName()), AvatarSignal.IN, null));
-            }
-            if (sig2.size() == 0) {
-                sig2.add(new AvatarSignal(getName(event.getName()), AvatarSignal.OUT, null));
-            }
-            if (sig1.size() == 1 && sig2.size() == 1) {
-                ar.addSignals(sig2.get(0), sig1.get(0));
-            } else {
-                //Throw error
-                System.out.println("Could not match for " + event.getName());
-            }
+            AvatarRelation ar = new AvatarRelation(event.getName(), taskBlockMap.get(event.getOriginTask()), taskBlockMap.get(event.getDestinationTask()),
+                    event.getReferenceObject());
+            ar.setAsynchronous(true);
+            ar.setPrivate(true);
+
+
+            AvatarSignal sigOut = signalOutMap.get(event.getName());
+            AvatarSignal sigIn = signalInMap.get(event.getName());
+            ar.addSignals(sigOut, sigIn);
+
             if (event.isBlocking()) {
                 ar.setAsynchronous(true);
                 ar.setBlocking(true);
@@ -2368,6 +2405,31 @@ public class TML2Avatar {
         return spec;
     }
 
+    public AvatarType getAvatarType(TMLType p) {
+        switch (p.getType()) {
+            case TMLType.NATURAL:
+                return AvatarType.INTEGER;
+            case TMLType.BOOLEAN:
+                return AvatarType.BOOLEAN;
+        }
+        return AvatarType.UNDEFINED;
+    }
+
+    public String getNameReworked(String name, int index) {
+        String[] split = name.split("__");
+        if (split.length > index) {
+            return split[index];
+        }
+        return name;
+    }
+
+    private String reworkStringName(String _name) {
+        String ret =  _name.replaceAll(" ", "");
+        ret = ret.replaceAll("__", "_");
+        ret = ret.replaceAll("-", "");
+        return ret;
+    }
+
 }
 
 
diff --git a/src/main/java/ui/ActivityDiagram2TMLTranslator.java b/src/main/java/ui/ActivityDiagram2TMLTranslator.java
index f465af2cb6..39567c7319 100644
--- a/src/main/java/ui/ActivityDiagram2TMLTranslator.java
+++ b/src/main/java/ui/ActivityDiagram2TMLTranslator.java
@@ -99,6 +99,8 @@ public class ActivityDiagram2TMLTranslator {
         TMLRandomSequence tmlrsequence;
         TMLSelectEvt tmlselectevt;
         TMLDelay tmldelay;
+        TMLEncryption tmlencryption;
+        TMLDecryption tmldecryption;
         int staticLoopIndex = 0;
         String sl = "", tmp;
         TMLType tt;
@@ -188,8 +190,8 @@ public class ActivityDiagram2TMLTranslator {
                     corrTgElement.addCor(tmlexecii, tgc);
 
                 } else if (tgc instanceof TMLADEncrypt) {
-                    tmlexecc = new TMLExecC("encrypt_" + ((TMLADEncrypt) tgc).securityContext, tgc);
-                    activity.addElement(tmlexecc);
+                    tmlencryption = new TMLEncryption("encrypt_" + ((TMLADEncrypt) tgc).securityContext, tgc);
+                    activity.addElement(tmlencryption);
                     SecurityPattern sp = securityPatterns.get(((TMLADEncrypt) tgc).securityContext);
                     if (sp == null) {
                         //Throw error for missing security pattern
@@ -198,15 +200,15 @@ public class ActivityDiagram2TMLTranslator {
                         ce.setTGComponent(tgc);
                         checkingErrors.add(ce);
                     } else {
-                        tmlexecc.securityPattern = sp;
-                        tmlexecc.setAction(Integer.toString(sp.encTime));
+                        tmlencryption.securityPattern = sp;
+                        tmlencryption.setAction(Integer.toString(sp.encTime));
                         ((BasicErrorHighlight) tgc).setStateAction(ErrorHighlight.OK);
                         tmlm.securityTaskMap.get(sp).add(tmltask);
-                        corrTgElement.addCor(tmlexecc, tgc);
+                        corrTgElement.addCor(tmlencryption, tgc);
                     }
                 } else if (tgc instanceof TMLADDecrypt) {
-                    tmlexecc = new TMLExecC("decrypt_" + ((TMLADDecrypt) tgc).securityContext, tgc);
-                    activity.addElement(tmlexecc);
+                    tmldecryption = new TMLDecryption("decrypt_" + ((TMLADDecrypt) tgc).securityContext, tgc);
+                    activity.addElement(tmldecryption);
                     SecurityPattern sp = securityPatterns.get(((TMLADDecrypt) tgc).securityContext);
                     if (sp == null) {
                         //Throw error for missing security pattern
@@ -215,10 +217,10 @@ public class ActivityDiagram2TMLTranslator {
                         ce.setTGComponent(tgc);
                         checkingErrors.add(ce);
                     } else {
-                        tmlexecc.securityPattern = sp;
-                        tmlexecc.setAction(Integer.toString(sp.decTime));
+                        tmldecryption.securityPattern = sp;
+                        tmldecryption.setAction(Integer.toString(sp.decTime));
                         ((BasicErrorHighlight) tgc).setStateAction(ErrorHighlight.OK);
-                        corrTgElement.addCor(tmlexecc, tgc);
+                        corrTgElement.addCor(tmldecryption, tgc);
                         tmlm.securityTaskMap.get(sp).add(tmltask);
                     }
 
-- 
GitLab