diff --git a/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java index 66b8b3ae864ff70147269bbe9d6413d2eb6a63a9..66112442359f5aa3a551bdf05b22e9898741d308 100644 --- a/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java +++ b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java @@ -69,14 +69,17 @@ public class Avatar2SysML { * Memorized while naming states, to be reused for generating states */ class StateInfo { - private String name; - private int number; - StateInfo(String _name, int _number) { + private String name; + private String prename = ""; + StateInfo(String _name) { + name = _name; + } + StateInfo(String _name, String _prename) { name = _name; - number = _number; + prename = _prename; } public String getName(){ return name; } - public int getNumber(){ return number; } + public String getPreName(){ return prename; } } public Avatar2SysML(AvatarSpecification _avspec) { avspec = _avspec; } @@ -284,7 +287,7 @@ public class Avatar2SysML { // sub-blocks ------------------- for(AvatarBlock blk: avspec.getListOfBlocks()) { if (blk.getFather() == block) block2SysML(blk); } - //indent = indent.substring(indentStepSize); + indent = indent.substring(indentStepSize); avsysml.append(indent + "}\n"); } @@ -296,9 +299,8 @@ public class Avatar2SysML { } void statemachine2SysML(AvatarStateMachine asm) { - + stateList.clear(); // associate names to future SysML states - int stateNumber = 0; int randomNumber = 0; int countNumber = 0; int sendNumber = 0; @@ -306,31 +308,34 @@ public class Avatar2SysML { for (AvatarStateMachineElement asme : asm.getListOfElements()) { StateInfo stateinfo; if (asme instanceof AvatarStartState) - stateinfo = new StateInfo(startStateSysMLname(), 0); + stateinfo = new StateInfo(startStateSysMLname()); else if (asme instanceof AvatarStopState) - stateinfo = new StateInfo(stopStateSysMLname(), 0); + stateinfo = new StateInfo(stopStateSysMLname()); else if (asme instanceof AvatarState) - stateinfo = new StateInfo(standardStateSysMLname(stateNumber), stateNumber++); + stateinfo = new StateInfo(standardStateSysMLname(asme.getName())); else if (asme instanceof AvatarActionOnSignal) { if(((AvatarActionOnSignal)asme).isSending()) - stateinfo = new StateInfo(sendStateSysMLname(stateNumber), sendNumber++); + stateinfo = new StateInfo( + sendStateSysMLname(((AvatarActionOnSignal)asme).getSignal().getName(), sendNumber), + presendStateSysMLname(((AvatarActionOnSignal)asme).getSignal().getName(), sendNumber++)); else - stateinfo = new StateInfo(receiveStateSysMLname(stateNumber), receiveNumber++); + stateinfo = new StateInfo(receiveStateSysMLname(((AvatarActionOnSignal)asme).getSignal().getName(), receiveNumber++), + prereceiveStateSysMLname(((AvatarActionOnSignal)asme).getSignal().getName(), receiveNumber++)); } else if (asme instanceof AvatarQueryOnSignal) - stateinfo = new StateInfo(countStateSysMLname(stateNumber), countNumber++); + stateinfo = new StateInfo(countStateSysMLname(((AvatarQueryOnSignal)asme).getSignal().getName(), countNumber++)); else if (asme instanceof AvatarRandom) - stateinfo = new StateInfo(randomStateSysMLname(stateNumber), randomNumber++); + stateinfo = new StateInfo(randomStateSysMLname(randomNumber++)); else continue; stateList.add(asme); stateMap.put(asme, stateinfo); } avsysml.append(indent + "// state-machine description +++++\n" + - indent + "exhibit state '@statemachine' : '#AvatarStateMachine' {\n"); + indent + "exhibit state '@statemachine' : '#AvatarStateMachine' {\n\n"); indent += indentStep; // generate SysML states with associated transitions for (AvatarStateMachineElement asme : stateList) state2SysML(asme); - //indent = indent.substring(indentStepSize); + indent = indent.substring(indentStepSize); avsysml.append(indent + "}\n"); } StringBuffer sysMLtransitions = new StringBuffer(); @@ -355,7 +360,7 @@ public class Avatar2SysML { } else if(asme instanceof AvatarRandom){ - avsysml.append("indent + state " + stateMap.get(asme).getName() + " : '#AvatarRandomState' = '#AvatarRandomState'(\n"); + avsysml.append(indent + "state " + stateMap.get(asme).getName() + " : '#AvatarRandomState' = '#AvatarRandomState'(\n"); if (!requests.equals("")) avsysml.append(requests); indent += indentStep; avsysml.append(indent + "state_action = '#Assignment'(\n"); @@ -423,10 +428,8 @@ public class Avatar2SysML { ChannelInfo signalinfo = signalMap.get(aos.getSignal()); if (aos.isSending()) { - String prestatename = presendStateSysMLname(stateinfo.getNumber()); - // preComm State - avsysml.append(indent + "state " + prestatename + " : '#AvatarPreSendState' = '#AvatarPreSendState' (\n"); + avsysml.append(indent + "state " + stateinfo.getPreName() + " : '#AvatarPreSendState' = '#AvatarPreSendState' (\n"); indent += indentStep; avsysml.append(indent + "request =\n"); indent += indentStep; @@ -434,11 +437,10 @@ public class Avatar2SysML { indent = indent.substring(2 * indentStepSize); avsysml.append(indent + ");\n"); // its transition - sysMLtransitions.append(indent + "transition : '#AvatarTransition' first " + prestatename + + sysMLtransitions.append(indent + "transition : '#AvatarTransition' first " + stateinfo.getPreName() + " then " + stateinfo.getName() + ";\n"); } else { - String prestatename = prereceiveStateSysMLname(stateinfo.getNumber()); - avsysml.append(indent + "state " + prestatename + " : '#AvatarPreReceiveState' = '#AvatarPreReceiveState' (\n"); + avsysml.append(indent + "state " + stateinfo.getPreName() + " : '#AvatarPreReceiveState' = '#AvatarPreReceiveState' (\n"); indent += indentStep; avsysml.append(indent + "request =\n"); indent += indentStep; @@ -446,7 +448,7 @@ public class Avatar2SysML { indent = indent.substring(2 * indentStepSize); avsysml.append(indent + ");\n"); // its transition - sysMLtransitions.append(indent + "transition : '#AvatarTransition' first " + prestatename + "\n"); + sysMLtransitions.append(indent + "transition : '#AvatarTransition' first " + stateinfo.getPreName() + "\n"); indent += indentStep; String doAction = receiveActions2SysM(signalinfo, aos.getValues()); if (doAction.length() == 0) @@ -460,6 +462,7 @@ public class Avatar2SysML { } } void transitionsAndRequests(String srcName, List<AvatarStateMachineElement> nexts, String poolName) { + requirePreCom.clear(); sysMLtransitions.delete(0, sysMLtransitions.length()); sysMLrequests.delete(0, sysMLrequests.length()); int nb = nexts.size(); @@ -504,10 +507,7 @@ public class Avatar2SysML { if((at.getActions()!=null && at.getActions().size()!=0) && target instanceof AvatarActionOnSignal) { // preCommunication Required requirePreCom.add((AvatarActionOnSignal)target); - if (((AvatarActionOnSignal)target).isSending()) - tgtName = presendStateSysMLname(stateMap.get(target).getNumber()); - else - tgtName = prereceiveStateSysMLname(stateMap.get(target).getNumber()); + tgtName = stateMap.get(target).getPreName(); } else { tgtName = stateMap.get(target).getName(); @@ -639,7 +639,7 @@ public class Avatar2SysML { if(aa instanceof AvatarActionAssignment) { AvatarLeftHand lh = ((AvatarActionAssignment)aa).getLeftHand(); if(lh instanceof AvatarAttribute) { // tuples are not yet handled - result.append(indent + "then assign " + attributeSysMLname(aa.getName()) + ":= "); + result.append(indent + "then assign " + attributeSysMLname(lh.getName()) + ":= "); result.append(expr2SysML(((AvatarActionAssignment)aa).getRightHand().getName()) + ";\n"); } } diff --git a/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLNames.java b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLNames.java index 95aecb0c9a36a3509c3d473c3b3924a73e8b55f1..40eb82e70d8273e4c3fc26ee3e38b1a0dd8c1e67 100644 --- a/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLNames.java +++ b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLNames.java @@ -68,13 +68,13 @@ public class Avatar2SysMLNames { public static String startStateSysMLname(){ return "'@st:start'"; } public static String stopStateSysMLname(){ return "'@st:stop'"; } - public static String standardStateSysMLname(int number){ return "'@st:state" + number + "'"; } - public static String randomStateSysMLname(int number){ return "'@st:random" + number + "'"; } - public static String countStateSysMLname(int number){ return "'@st:count" + number + "'"; } - public static String sendStateSysMLname(int number){ return "'@st:send" + number + "'"; } - public static String receiveStateSysMLname(int number){ return "'@st:receive" + number + "'"; } - public static String presendStateSysMLname(int number){ return "'@st:presend" + number + "'"; } - public static String prereceiveStateSysMLname(int number){ return "'@st:prereceive" + number + "'"; } + public static String standardStateSysMLname(String name){ return "'@st:standard." + name + "'"; } + public static String randomStateSysMLname(int number){ return "'@st:random." + number + "'"; } + public static String countStateSysMLname(String sigName, int number){ return "'@st:count." + sigName + "." + number + "'"; } + public static String sendStateSysMLname(String sigName, int number){ return "'@st:send." + sigName + "." + number + "'"; } + public static String receiveStateSysMLname(String sigName, int number){ return "'@st:receive." + sigName + "." + number + "'"; } + public static String presendStateSysMLname(String sigName, int number){ return "'@st:presend." + sigName + "." + number + "'"; } + public static String prereceiveStateSysMLname(String sigName, int number){ return "'@st:prereceive." + sigName + "." + number + "'"; } public static String expr2SysML(String _expr){ return "expression"; } // TO IMPLEMENT