From 6cce3089d8fe03a62dbd4ec901594ad804ff2b96 Mon Sep 17 00:00:00 2001
From: Letitia Li <leli@enst.fr>
Date: Tue, 8 Mar 2016 10:22:53 +0000
Subject: [PATCH] fixed TML2Avatar

---
 src/avatartranslator/AvatarTransition.java    |  1 -
 .../toproverif/AVATAR2ProVerif.java           | 13 ++--
 src/proverifspec/ProVerifPitypeSyntaxer.java  |  6 ++
 src/tmltranslator/TMLRequest.java             | 18 +++--
 src/tmltranslator/toavatar/TML2Avatar.java    | 65 +++++++++++--------
 src/ui/GTMLModeling.java                      |  2 +
 6 files changed, 69 insertions(+), 36 deletions(-)

diff --git a/src/avatartranslator/AvatarTransition.java b/src/avatartranslator/AvatarTransition.java
index 996152c9d4..eb2ede6d2a 100644
--- a/src/avatartranslator/AvatarTransition.java
+++ b/src/avatartranslator/AvatarTransition.java
@@ -79,7 +79,6 @@ public class AvatarTransition extends AvatarStateMachineElement {
 
     public void addGuard(String _g) {
         AvatarGuard guard = AvatarGuard.createFromString (this.block, _g);
-	System.out.println("DID I ADD THE GUARD " + guard.toString());
         this.guard = AvatarGuard.addGuard (this.guard, guard, "and");
     }
 
diff --git a/src/avatartranslator/toproverif/AVATAR2ProVerif.java b/src/avatartranslator/toproverif/AVATAR2ProVerif.java
index b4e132c990..ff4c426c2f 100755
--- a/src/avatartranslator/toproverif/AVATAR2ProVerif.java
+++ b/src/avatartranslator/toproverif/AVATAR2ProVerif.java
@@ -1014,7 +1014,9 @@ public class AVATAR2ProVerif implements AvatarTranslator {
             String tmp = "out (" + CH_MAINCH + ", ";
             if (isPrivate)
                 tmp += CH_ENCRYPT + name + " (";
-
+	    if (_asme.getNbOfValues()>1){
+		tmp +="(";
+	    }
             if (_asme.getNbOfValues() == 0)
                 tmp += "data__" + this.dummyDataCounter;
             else {
@@ -1042,6 +1044,9 @@ public class AVATAR2ProVerif implements AvatarTranslator {
                 tmp += ")";
 
             tmp += ")";
+	    if (_asme.getNbOfValues()>1){
+		tmp +=")";
+	    }
             TraceManager.addDev("|    |    " + tmp);
 
             _lastInstr = _lastInstr.setNextInstr (new ProVerifProcRaw (tmp, true));
@@ -1058,7 +1063,7 @@ public class AVATAR2ProVerif implements AvatarTranslator {
                     if (term == null || ! (term instanceof AvatarAttribute)) {
                         CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Unknown attribute '" + value + "' (ignored)");
                         ce.setAvatarBlock(arg.block);
-                        ce.setTDiagramPanel(((AvatarDesignPanel)(this.avspec.getReferenceObject())).getAvatarSMDPanel(arg.block.getName()));
+                  //      ce.setTDiagramPanel(((AvatarDesignPanel)(this.avspec.getReferenceObject())).getAvatarSMDPanel(arg.block.getName()));
                         ce.setTGComponent((TGComponent)(_asme.getReferenceObject()));
                         this.warnings.add(ce);
                         continue;
@@ -1105,7 +1110,7 @@ public class AVATAR2ProVerif implements AvatarTranslator {
                 TraceManager.addDev ("!!!       Guard: " + _asme.getGuard() + " in block " + arg.block.getName() + " is not supported. Replacing by an empty guard");
                 CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Guard: " + _asme.getGuard() + " in block " + arg.block.getName() + " is not supported. Replacing by an empty guard");
                 ce.setAvatarBlock(arg.block);
-                ce.setTDiagramPanel(((AvatarDesignPanel)(avspec.getReferenceObject())).getAvatarSMDPanel(arg.block.getName()));
+                //ce.setTDiagramPanel(((AvatarDesignPanel)(avspec.getReferenceObject())).getAvatarSMDPanel(arg.block.getName()));
                 ce.setTGComponent((TGComponent)(_asme.getReferenceObject()));
                 warnings.add(ce);
                 _lastInstr = _lastInstr.setNextInstr (new ProVerifProcRaw ("(*  Unsupported guard:" + _asme.getGuard() + " *)"));
@@ -1196,7 +1201,7 @@ public class AVATAR2ProVerif implements AvatarTranslator {
                     TraceManager.addDev ("!!!       Assignment: " + action.toString () + " in block " + arg.block.getName() + " is not supported. Removing it.");
                     CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Assignment: " + action.toString () + " in block " + arg.block.getName() + " is not supported. Removing it.");
                     ce.setAvatarBlock(arg.block);
-                    ce.setTDiagramPanel(((AvatarDesignPanel)(avspec.getReferenceObject())).getAvatarSMDPanel(arg.block.getName()));
+                    //ce.setTDiagramPanel(((AvatarDesignPanel)(avspec.getReferenceObject())).getAvatarSMDPanel(arg.block.getName()));
                     ce.setTGComponent((TGComponent)(_asme.getReferenceObject()));
                     warnings.add(ce);
                 }
diff --git a/src/proverifspec/ProVerifPitypeSyntaxer.java b/src/proverifspec/ProVerifPitypeSyntaxer.java
index 99395ecf04..be64de5a75 100644
--- a/src/proverifspec/ProVerifPitypeSyntaxer.java
+++ b/src/proverifspec/ProVerifPitypeSyntaxer.java
@@ -217,6 +217,9 @@ public class ProVerifPitypeSyntaxer extends ProVerifSyntaxer {
     protected void translateProcIn (ProVerifProcIn _node, int _alinea) {
         this.fullSpec += "\n" + this.printAlinea (_alinea);
         this.fullSpec += "in (" + _node.channel + ", ";
+	if (_node.vars.length>1){
+	    this.fullSpec += "(";
+	}
         boolean first = true;
         for (ProVerifVar var: _node.vars) {
             if (first)
@@ -226,6 +229,9 @@ public class ProVerifPitypeSyntaxer extends ProVerifSyntaxer {
             this.fullSpec += var.name + ": " + var.type;
         }
         this.fullSpec += ")";
+	if (_node.vars.length>1){
+	    this.fullSpec += ")";
+	}
         if (_node.next != null) {
             this.fullSpec += ";";
             this.translate (_node.next, _alinea);
diff --git a/src/tmltranslator/TMLRequest.java b/src/tmltranslator/TMLRequest.java
index 3dc3006fe3..7484381d38 100755
--- a/src/tmltranslator/TMLRequest.java
+++ b/src/tmltranslator/TMLRequest.java
@@ -52,11 +52,12 @@ public class TMLRequest extends TMLCommunicationElement {
     protected Vector params; // List of various types of parameters
     protected ArrayList<TMLTask> originTasks; // list of tasks from which request starts
     protected TMLTask destinationTask;
-    
+    protected ArrayList<String> paramNames;
     public TMLRequest(String name, Object reference) {
         super(name, reference);
         params = new Vector();
         originTasks = new ArrayList<TMLTask>();
+	paramNames = new ArrayList<String>();
     }
     
     public int getNbOfParams() {
@@ -66,7 +67,10 @@ public class TMLRequest extends TMLCommunicationElement {
     public void addParam(TMLType _type) {
         params.add(_type);
     }
-    
+    public void addParamName(String name){
+	paramNames.add(name);
+    }
+
     public TMLType getType(int i) {
         if (i<getNbOfParams()) {
             return (TMLType)(params.elementAt(i));
@@ -74,7 +78,13 @@ public class TMLRequest extends TMLCommunicationElement {
             return null;
         }
     }
-    
+    public String getParam(int i){
+	if (i<getNbOfParams()) {
+            return paramNames.get(i);
+        } else {
+            return null;
+        }
+    }
     public void setDestinationTask(TMLTask _task) {
         destinationTask = _task;
     }
@@ -119,4 +129,4 @@ public class TMLRequest extends TMLCommunicationElement {
 		return true;
 	}
 
-}
\ No newline at end of file
+}
diff --git a/src/tmltranslator/toavatar/TML2Avatar.java b/src/tmltranslator/toavatar/TML2Avatar.java
index 917cb47fe3..ce957b220b 100644
--- a/src/tmltranslator/toavatar/TML2Avatar.java
+++ b/src/tmltranslator/toavatar/TML2Avatar.java
@@ -288,7 +288,7 @@ public class TML2Avatar {
 	}
 	else if (ae instanceof TMLStartState){
 	    AvatarStartState ss= new AvatarStartState(ae.getName(), ae.getReferenceObject());
-	    tran = new AvatarTransition(block, "__after_" + ae.getName(), ss);
+	    tran = new AvatarTransition(block, "__after_" + ae.getName(), ss.getReferenceObject());
 	    ss.addNext(tran);
 	    elementList.add(ss);
 	    elementList.add(tran);
@@ -298,7 +298,7 @@ public class TML2Avatar {
 	    TMLRandom tmlr = (TMLRandom) ae;
 	    ar.setVariable(tmlr.getVariable());
 	    ar.setValues(tmlr.getMinValue(), tmlr.getMaxValue());
-	    tran = new AvatarTransition(block, "__after_"+ae.getName(), ae);
+	    tran = new AvatarTransition(block, "__after_"+ae.getName(), ae.getReferenceObject());
 	    ar.addNext(tran);
 	    //Add to list
 	    elementList.add(ar);
@@ -367,7 +367,10 @@ public class TML2Avatar {
 	    AvatarAttribute requestData= new AvatarAttribute(req.getName()+"__reqData", AvatarType.INTEGER, block, null);
 	    as.addValue(req.getName()+"__reqData");
 	    block.addAttribute(requestData);
-	    tran= new AvatarTransition(block, "__after_"+ae.getName(), ae);
+	    for (int i=0; i< req.getNbOfParams(); i++){
+		as.addValue(req.getParam(i));
+	    }
+	    tran= new AvatarTransition(block, "__after_"+ae.getName(), ae.getReferenceObject());
 	    elementList.add(as);
 	    as.addNext(tran);
 	    elementList.add(tran);
@@ -403,7 +406,7 @@ public class TML2Avatar {
 
 
 		//Build branch 0
-		tran = new AvatarTransition(block, "__after_"+ae.getName()+"_0", ae);
+		tran = new AvatarTransition(block, "__after_"+ae.getName()+"_0", ae.getReferenceObject());
 		choiceState.addNext(tran);
 		elementList.add(tran);
 		tran.addNext(set0.get(0));
@@ -438,7 +441,7 @@ public class TML2Avatar {
 		        elementList.add(e);
 		    }
 		}
-		tran = new AvatarTransition(block, "__after_"+ae.getName()+"_1", ae);
+		tran = new AvatarTransition(block, "__after_"+ae.getName()+"_1", ae.getReferenceObject());
 		elementList.add(tran);
 		choiceState.addNext(tran);
 		tran.addNext(set1_1.get(0));
@@ -456,7 +459,7 @@ public class TML2Avatar {
 		//This gets really complicated in ProVerif
 		for (int i=0; i< ae.getNbNext(); i++){
 		    //For each of the possible state blocks, translate 1 and recurse on the remaining random sequence
-		    tran = new AvatarTransition(block, "__after_"+ae.getName()+"_"+i, ae);
+		    tran = new AvatarTransition(block, "__after_"+ae.getName()+"_"+i, ae.getReferenceObject());
 		    choiceState.addNext(tran);
 		    List<AvatarStateMachineElement> tmp = translateState(ae.getNextElement(i), block);
 		    tran.addNext(tmp.get(0));
@@ -466,7 +469,7 @@ public class TML2Avatar {
 		            newSeq.addNext(ae.getNextElement(j));
 			}
 		    }
-		    tran = new AvatarTransition(block, "__after_"+ae.getNextElement(i).getName(), ae);
+		    tran = new AvatarTransition(block, "__after_"+ae.getNextElement(i).getName(), ae.getReferenceObject());
 		    tmp.get(tmp.size()-1).addNext(tran);
 		    elementList.addAll(tmp);
 		    elementList.add(tran);
@@ -495,7 +498,7 @@ public class TML2Avatar {
  		AvatarAttribute eventData= new AvatarAttribute(ch.getName()+"__eventData", AvatarType.INTEGER, block, null);
 	        as.addValue(ch.getName()+"__eventData");
 	        block.addAttribute(eventData);
-	        tran= new AvatarTransition(block, "__after_"+ae.getName(), ae);
+	        tran= new AvatarTransition(block, "__after_"+ae.getName(), ae.getReferenceObject());
 	        elementList.add(as);
 	        as.addNext(tran);
 	        elementList.add(tran);
@@ -515,7 +518,7 @@ public class TML2Avatar {
  		AvatarAttribute eventData= new AvatarAttribute(ch.getName()+"__eventData", AvatarType.INTEGER, block, null);
 	    	as.addValue(ch.getName()+"__eventData");
 	    	block.addAttribute(eventData);
-	        tran= new AvatarTransition(block, "__after_"+ae.getName(), ae);
+	        tran= new AvatarTransition(block, "__after_"+ae.getName(), ae.getReferenceObject());
 	        elementList.add(as);
 	        as.addNext(tran);
 	        elementList.add(tran);
@@ -523,7 +526,7 @@ public class TML2Avatar {
 	    else {
 		//Notify Event, I don't know how to translate this
 		AvatarRandom as = new AvatarRandom(ae.getName(), ae.getReferenceObject());
-		tran = new AvatarTransition(block, "__after_"+ae.getName(), ae);
+		tran = new AvatarTransition(block, "__after_"+ae.getName(), ae.getReferenceObject());
 		as.setVariable(aee.getVariable());
 		as.setValues("0", "1");
 	   	as.addNext(tran);
@@ -534,7 +537,7 @@ public class TML2Avatar {
 	}
 	else if (ae instanceof TMLActivityElementWithAction){
 	    AvatarState as = new AvatarState(ae.getName(), ae.getReferenceObject());
-	    tran = new AvatarTransition(block, "__after_"+ae.getName(), ae);
+	    tran = new AvatarTransition(block, "__after_"+ae.getName(), ae.getReferenceObject());
 	    tran.addAction(((TMLActivityElementWithAction) ae).getAction());
 	    as.addNext(tran);
 	    elementList.add(as);
@@ -542,7 +545,7 @@ public class TML2Avatar {
 	}
 	else if (ae instanceof TMLActivityElementWithIntervalAction){
 	    AvatarState as = new AvatarState(ae.getName(), ae.getReferenceObject());
-	    tran = new AvatarTransition(block, "__after_"+ae.getName(), ae);
+	    tran = new AvatarTransition(block, "__after_"+ae.getName(), ae.getReferenceObject());
 	    as.addNext(tran);
 	    elementList.add(as);
 	    elementList.add(tran);
@@ -579,7 +582,7 @@ public class TML2Avatar {
 	    }
 	    AvatarActionOnSignal as = new AvatarActionOnSignal(ae.getName(), sig, ae.getReferenceObject());
 	    as.addValue(ch.getName()+"__chData");
-	    tran= new AvatarTransition(block, "__after_"+ae.getName(), ae);
+	    tran= new AvatarTransition(block, "__after_"+ae.getName(), ae.getReferenceObject());
 	    as.addNext(tran);
 	    elementList.add(as);
 	    elementList.add(tran);
@@ -618,7 +621,7 @@ public class TML2Avatar {
 		AvatarState initState = new AvatarState(ae.getName()+"__init", ae.getReferenceObject(), true);
 		elementList.add(initState);
 		//Build transition to choice
-		tran = new AvatarTransition(block, "loop_init__"+ae.getName(), ae);
+		tran = new AvatarTransition(block, "loop_init__"+ae.getName(), ae.getReferenceObject());
 		tran.addAction(AvatarTerm.createActionFromString(block, loop.getInit()));
 		elementList.add(tran);
 		initState.addNext(tran);
@@ -627,7 +630,7 @@ public class TML2Avatar {
 		elementList.add(as);
 		tran.addNext(as);
 		//transition to first element of loop
-		tran = new AvatarTransition(block, "loop_increment__"+ae.getName(), ae);
+		tran = new AvatarTransition(block, "loop_increment__"+ae.getName(), ae.getReferenceObject());
 		tran.setGuard(loop.getCondition().replaceAll("<", "!="));
 		tran.addAction(AvatarTerm.createActionFromString(block, loop.getIncrement()));
 		tran.addNext(elements.get(0));
@@ -653,7 +656,7 @@ public class TML2Avatar {
 		}
 		
 		//Transition if exiting loop
-		tran=new AvatarTransition(block, "end_loop__"+ae.getName(), ae);
+		tran=new AvatarTransition(block, "end_loop__"+ae.getName(), ae.getReferenceObject());
 		tran.setGuard("else");
 		as.addNext(tran);
 		if (afterloop.size()==0){
@@ -671,8 +674,8 @@ public class TML2Avatar {
 	    elementList.add(as);
 	    TMLChoice c = (TMLChoice) ae;
 	    for (int i=0; i<c.getNbGuard(); i++){
-		tran = new AvatarTransition(block, "__after_"+ae.getName()+"_"+i, ae);
-		tran.addGuard(c.getGuard(i));
+		tran = new AvatarTransition(block, "__after_"+ae.getName()+"_"+i, ae.getReferenceObject());
+		tran.setGuard(c.getGuard(i));
 		as.addNext(tran);
 		List<AvatarStateMachineElement> nexts = translateState(ae.getNextElement(i), block);
 		tran.addNext(nexts.get(0));
@@ -688,7 +691,7 @@ public class TML2Avatar {
 	    //Make many choices
 	    TMLSelectEvt c = (TMLSelectEvt) ae;
 	    for (int i=0; i < ae.getNbNext(); i++){
-		tran = new AvatarTransition(block, "__after_"+ae.getName()+"_"+i, ae);
+		tran = new AvatarTransition(block, "__after_"+ae.getName()+"_"+i, ae.getReferenceObject());
 		as.addNext(tran);
 		List<AvatarStateMachineElement> nexts = translateState(ae.getNextElement(i), block);
 		tran.addNext(nexts.get(0));
@@ -749,7 +752,7 @@ public class TML2Avatar {
 	    AvatarTransition last;
 	    AvatarStateMachine asm = block.getStateMachine();
 	    
-	    //Create a fork with many requests. This looks terrible
+	    //TODO: Create a fork with many requests. This looks terrible
 	    if (tmlmodel.getRequestToMe(task)!=null){
 		TMLRequest request= tmlmodel.getRequestToMe(task);
 		//Oh this is fun...let's restructure the state machine
@@ -757,7 +760,7 @@ public class TML2Avatar {
 		List<AvatarStateMachineElement> elementList= translateState(task.getActivityDiagram().get(0), block);
 		AvatarStartState ss = new AvatarStartState("start", task.getActivityDiagram().get(0).getReferenceObject());
 		asm.addElement(ss);
-		AvatarTransition at= new AvatarTransition(block, "__after_start", task.getActivityDiagram().get(0));
+		AvatarTransition at= new AvatarTransition(block, "__after_start", task.getActivityDiagram().get(0).getReferenceObject());
 		ss.addNext(at);
 		asm.addElement(at);
 		AvatarSignal sig = new AvatarSignal(block.getName()+"__"+request.getName(), AvatarSignal.IN, request.getReferenceObject());
@@ -766,7 +769,10 @@ public class TML2Avatar {
 	        AvatarActionOnSignal as= new AvatarActionOnSignal("getRequest__"+request.getName(), sig, request.getReferenceObject());
 		at.addNext(as);
 		asm.addElement(as);
-		AvatarTransition tran = new AvatarTransition(block, "__after_" + request.getName(), task.getActivityDiagram().get(0));
+		for (int i=0; i< request.getNbOfParams(); i++){
+		    as.addValue(request.getParam(i)+"__reqData");
+		}
+		AvatarTransition tran = new AvatarTransition(block, "__after_" + request.getName(), task.getActivityDiagram().get(0).getReferenceObject());
 		as.addNext(tran);
 		asm.addElement(tran);
 
@@ -777,10 +783,14 @@ public class TML2Avatar {
 		tran.addNext(newStart);
 		elementList.remove(start);
 		elementList.remove(startTran);
-		//Find every stop state, remove them, reroute transitions to them 
+		//Find every stop state, remove them, reroute transitions to them
+		//For now, route every transition to stop state to remove the loop on requests 
+		
 		for (AvatarStateMachineElement e: elementList){
 		    e.setName(processName(e.getName(), e.getID()));
-		    if (e instanceof AvatarStopState){
+		    asm.addElement(e);
+		}
+		  /*  if (e instanceof AvatarStopState){
 			//ignore it
 		    }
 		    else {
@@ -793,7 +803,7 @@ public class TML2Avatar {
 			}
 		        asm.addElement(e);
 		    }
-		}
+		}*/
 		asm.setStartState((AvatarStartState) ss);
 	    }
 	    else {
@@ -855,6 +865,7 @@ public class TML2Avatar {
 		System.out.println("Complex channel ");
 		for (TMLTask t1: channel.getOriginTasks()){
 		    for (TMLTask t2: channel.getDestinationTasks()){
+
 			AvatarRelation ar= new AvatarRelation(channel.getName(), taskBlockMap.get(t1), taskBlockMap.get(t2), channel.getReferenceObject());
 			ar.setPrivate(channelMap.get(channel)==1);
 	    		//Find in signal
@@ -863,7 +874,7 @@ public class TML2Avatar {
 	    		for (AvatarSignal sig: signals){
 			    if (sig.getInOut()==AvatarSignal.IN){
 		    	        String name = sig.getName();
-		    		if (name.equals(channel.getDestinationTask().getName()+"__"+channel.getName())){
+		    		if (name.equals(t2.getName()+"__"+channel.getName())){
 				    sig1.add(sig);
 		    		}
 			    }
@@ -872,7 +883,7 @@ public class TML2Avatar {
 	    		for (AvatarSignal sig: signals){
 			    if (sig.getInOut()==AvatarSignal.OUT){
 		    	        String name = sig.getName();
-		    	    	if (name.equals(channel.getOriginTask().getName()+"__"+channel.getName())){
+		    	    	if (name.equals(t1.getName()+"__"+channel.getName())){
 				    sig2.add(sig);
 		    	    	}
 			    }
diff --git a/src/ui/GTMLModeling.java b/src/ui/GTMLModeling.java
index d01a0ed64b..0355b20ace 100755
--- a/src/ui/GTMLModeling.java
+++ b/src/ui/GTMLModeling.java
@@ -1661,10 +1661,12 @@ public class GTMLModeling  {
                             for(int k=0; k<allVariables.size(); k++) {
                                 //TraceManager.addDev("Adding record: " + allVariables.get(k));
                                 tmlsendrequest.addParam(allVariables.get(k));
+				request.addParamName(allVariables.get(k));
                             }
                         } else {
                             //TraceManager.addDev("Adding param: " + tmp);
                             tmlsendrequest.addParam(tmp);
+			    request.addParamName(tmp);
                         }
                     }
                     if (request.getNbOfParams() != tmlsendrequest.getNbOfParams()) {
-- 
GitLab