diff --git a/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java index f6ddc11ba83aef3aaad5818cefa2af7af5a7e745..3ce7139345a630b422d19178e63e9d4e102a895c 100644 --- a/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java +++ b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java @@ -917,7 +917,6 @@ public class Avatar2SysML { else if (target instanceof AvatarExpireTimer) requestType = 5; } - // computing request if (guarded) { sysMLrequests.append(indent + "if " + @@ -970,7 +969,7 @@ public class Avatar2SysML { doAction = receiveActions2SysML(methodMap.get(((AvatarActionOnSignal)target).getSignal()), ((AvatarActionOnSignal)target).getOriginalValues()); else - doAction = transitionActions2SysM(at); + doAction = transitionActions2SysML(at); indent = indent.substring(indentStepSize); sysMLtransitions.append("\n" + indent + "transition : '#AvatarTransition' first " + srcName); @@ -1131,12 +1130,12 @@ public class Avatar2SysML { String methodCall2SysML(AvatarTermFunction m) { return expr2SysML(m.getOriginalAction()); } - String transitionActions2SysM(AvatarTransition at) { + String transitionActions2SysML(AvatarTransition at) { StringBuffer result; - result = new StringBuffer(indent + "do action : '#TransitionAction' {\n" + indent + indentStep + "first start;\n"); - indent += indentStep; int size = at.getNbOfAction(); if (size == 0) return null; + result = new StringBuffer(indent + "do action : '#TransitionAction' {\n" + indent + indentStep + "first start;\n"); + indent += indentStep; for(int i = 0; i < size; i++) { String ac = at.getOriginalAction(i); int eq = ac.indexOf("="); diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java index 84378fbeb7daf8c70e83fc73eaf03d555fd2b9cf..c11ff22e895e55cf806a8e660fa15428a2aa3eaf 100644 --- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java +++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java @@ -118,13 +118,20 @@ public class AvatarFromSysML { } return b; } - private AvatarAttribute getAttributeByName(String _name, AvatarBlock _block) { + private AvatarAttribute getOriginalAttributeByName(String _name, AvatarBlock _block) { List<AvatarAttribute> l = _block.getOriginalAttributes(); int size = l.size(); for (int i = 0; i < size; i++) if(l.get(i).getName().equals(_name)) return l.get(i); return null; } + private AvatarAttribute getAttributeByName(String _name, AvatarBlock _block) { + List<AvatarAttribute> l = _block.getAttributes(); + int size = l.size(); + for (int i = 0; i < size; i++) + if(l.get(i).getName().equals(_name)) return l.get(i); + return null; + } private AvatarAttribute getTimerByName(String _name, AvatarBlock _block) { AvatarAttribute res = getAttributeByName(_name, _block); if (res != null && res.getType() == AvatarType.TIMER) return res; @@ -145,7 +152,7 @@ public class AvatarFromSysML { break; case AvatarFromSysMLSyntax.STXCOUNTSTATE : s = new AvatarQueryOnSignal(_s.getName(), getSignal(_s.getSignal()), - getAttributeByName(_s.getVariable(),_b), null, _b); + getAttributeByName(_s.getVariable().replaceAll("\\.", "__"),_b), null, _b); break; case AvatarFromSysMLSyntax.STXSTOPSTATE : case AvatarFromSysMLSyntax.STXSENDSTATE : @@ -225,19 +232,36 @@ public class AvatarFromSysML { for (int i = 0; i < size; i++) { StxAttribute a = blk.getAttribute(i); AvatarAttribute aa; + AvatarAttribute ax; if (a.getType().equals("Integer")) { aa = new AvatarAttribute(a.getName(), AvatarType.INTEGER, theBlock, null); aa.setInitialValue(a.getInit()); + ax = new AvatarAttribute(a.getName(), AvatarType.INTEGER, theBlock, null); + ax.setInitialValue(a.getInit()); + theBlock.addAttribute(ax); + ax.setAsConstant(false); } else if (a.getType().equals("Boolean")) { aa = new AvatarAttribute(a.getName(), AvatarType.BOOLEAN, theBlock, null); aa.setInitialValue(a.getInit()); + ax = new AvatarAttribute(a.getName(), AvatarType.BOOLEAN, theBlock, null); + ax.setInitialValue(a.getInit()); + theBlock.addAttribute(ax); + ax.setAsConstant(false); } else { aa = new AvatarAttribute(a.getName(), AvatarType.UNDEFINED, theBlock, null); // aa.setInitialValue(a.getInit()); AvatarDataType adt = avSpec.getDataTypeByName(a.getType()); aa.setDataType(adt); + String aaName = a.getName() + "__"; + int dtsize = adt.getFullSize(); + for (int j = 0; j < dtsize; j++) { + ax = new AvatarAttribute(aaName + adt.getFieldString(j), + adt.getFieldStringType(j), theBlock, null); + theBlock.addAttribute(ax); + ax.setAsConstant(false); + } } theBlock.addOriginalAttribute(aa); aa.setAsConstant(false); @@ -247,17 +271,26 @@ public class AvatarFromSysML { for (int i = 0; i < size; i++) { StxAttribute a = blk.getConstant(i); AvatarAttribute aa; + AvatarAttribute ax; if (a.getType().equals("Integer")) { aa = new AvatarAttribute(a.getName(), AvatarType.INTEGER, theBlock, null); aa.setInitialValue(a.getInit()); theBlock.addAttribute(aa); aa.setAsConstant(true); + ax = new AvatarAttribute(a.getName(), AvatarType.INTEGER, theBlock, null); + ax.setInitialValue(a.getInit()); + theBlock.addAttribute(ax); + ax.setAsConstant(true); } else if (a.getType().equals("Boolean")) { aa = new AvatarAttribute(a.getName(), AvatarType.BOOLEAN, theBlock, null); aa.setInitialValue(a.getInit()); theBlock.addAttribute(aa); aa.setAsConstant(true); + ax = new AvatarAttribute(a.getName(), AvatarType.INTEGER, theBlock, null); + ax.setInitialValue(a.getInit()); + theBlock.addAttribute(ax); + ax.setAsConstant(true); } else addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, @@ -269,7 +302,10 @@ public class AvatarFromSysML { AvatarAttribute aa = new AvatarAttribute(blk.getTimer(i).getName(), AvatarType.TIMER, theBlock, null); theBlock.addOriginalAttribute(aa); aa.setAsConstant(false); - } + aa = new AvatarAttribute(blk.getTimer(i).getName(), AvatarType.TIMER, theBlock, null); + theBlock.addAttribute(aa); + aa.setAsConstant(false); + } // add Methods size = blk.getNbMethods(); for (int i = 0; i < size; i++) { @@ -291,6 +327,12 @@ public class AvatarFromSysML { AvatarAttribute ret = new AvatarAttribute("return", AvatarType.UNDEFINED, theBlock, null); ret.setDataType(adt); am.addOriginalReturnParameter(ret); + int dtsize = adt.getFullSize(); + for (int j = 0; j < dtsize; j++) { + ret = new AvatarAttribute("return__" + adt.getFieldString(j), + adt.getFieldStringType(j), theBlock, null); + am.addReturnParameter(ret); + } } } // add Signals (build profile delayed) @@ -347,8 +389,11 @@ public class AvatarFromSysML { theSourceState = getState(states[i], theBlock); asm.addElement(theSourceState); if (stateType == AvatarFromSysMLSyntax.STXRANDOMSTATE) { - ((AvatarRandom) theSourceState).setValues(states[i].getMinValue(), states[i].getMaxValue()); - ((AvatarRandom) theSourceState).setVariable(states[i].getVariable()); + ((AvatarRandom) theSourceState).setOriginalValues(states[i].getMinValue(), states[i].getMaxValue()); + ((AvatarRandom) theSourceState).setValues( + states[i].getMinValue().replaceAll("\\.", "__"), + states[i].getMaxValue().replaceAll("\\.", "__")); + ((AvatarRandom) theSourceState).setVariable(states[i].getVariable().replaceAll("\\.", "__")); } else if (stateType == AvatarFromSysMLSyntax.STXSTARTSTATE) asm.setStartState((AvatarStartState) theSourceState); // add transitions @@ -371,11 +416,19 @@ public class AvatarFromSysML { transitionList.add(theTransition); asm.addElement(theTransition); theSourceState.addNext(theTransition); - theTransition.setGuard("",transition.getGuard()); + if (transition.getGuard() != null) { + theTransition.setGuard( + "[" + transition.getGuard().replaceAll("\\.", "__") + "]", + "[" + transition.getGuard() + "]"); + } String minDelay = transition.getMinDelay().trim(); String maxDelay = transition.getMaxDelay().trim(); if (minDelay.equals(maxDelay)) maxDelay = ""; - theTransition.setDelays("","", minDelay, maxDelay); + theTransition.setDelays( + minDelay.replaceAll("\\.", "__"), + maxDelay.replaceAll("\\.", "__"), + minDelay, + maxDelay); setDistributionLaw(theTransition, transition.getDelayDistributionLaw(),transition.getDelayExtra(), transition); // add actions List<StxAction> actions = transition.getActions(); // should exist only in some cases... @@ -383,18 +436,31 @@ public class AvatarFromSysML { for (int k = 0; k < asize; k++) { StxAction action = actions.get(k); if(action.getType() == AvatarFromSysMLSyntax.STXASSIGNACTION){ - String leftHandStr = action.getTarget(); + String originalLeftHandStr = action.getTarget(); + String leftHandStr = extendIdent(action.getTarget().replaceAll("\\.", "__"), blk); + String originalRightHandStr; String rightHandStr; StxTerm value = action.getValue(); - if (value instanceof StxId){ rightHandStr = ((StxId)value).getString(); } - else if (value instanceof StxExpr){ rightHandStr = ((StxExpr)value).getString(); } - else { rightHandStr = extendCall((StxCall)value,blk); } - theTransition.addAction("", leftHandStr + "=" + rightHandStr); + if (value instanceof StxId) { + originalRightHandStr = ((StxId)value).getString(); + rightHandStr = ((StxId)value).getString().replaceAll("\\.", "__"); + } + else if (value instanceof StxExpr){ + originalRightHandStr = ((StxExpr)value).getString(); + rightHandStr = ((StxExpr)value).getString().replaceAll("\\.", "__"); + } + else { + originalRightHandStr = extendOriginalCall((StxCall)value,blk); + rightHandStr = extendCall((StxCall)value,blk); + } + theTransition.addAction(leftHandStr + "=" + rightHandStr, + originalLeftHandStr + "=" + originalRightHandStr); } else { // STXMETHODACTION if (action.getValue() instanceof StxCall) { // else ERROR + String originalTermStr = extendOriginalCall((StxCall)action.getValue(),blk); String termStr = extendCall((StxCall)action.getValue(),blk); - theTransition.addAction("", termStr); + theTransition.addAction(termStr, originalTermStr); } } } @@ -474,9 +540,22 @@ public class AvatarFromSysML { int nbParam = sendPayload.size(); for(int u = 0; u < nbParam; u++) { StxTerm p = sendPayload.get(u); - if (p instanceof StxId){ state.addOriginalValue(((StxId)p).getString()); } - else if (p instanceof StxExpr){ state.addOriginalValue( ((StxExpr)p).getString() ); } - else { state.addOriginalValue( extendCall((StxCall)p,blk) ); } + if (p instanceof StxId) { + state.addOriginalValue(((StxId)p).getString()); + String[] ids = extendPath( + ((StxId)p).getString().replaceAll("\\.", "__"), + blk).split(","); + int isize = ids.length; + for(int w = 0; w < isize; w++) state.addValue(ids[w]); + } + else if (p instanceof StxExpr) { + state.addOriginalValue( ((StxExpr)p).getString() ); + state.addValue( ((StxExpr)p).getString().replaceAll("\\.", "__")); + } + else { + state.addOriginalValue(extendOriginalCall((StxCall)p,blk)); + state.addValue(extendCall((StxCall)p,blk)); + } } } } @@ -514,7 +593,11 @@ public class AvatarFromSysML { HashMap<String, String> receivePayload = transition.getReceivePayload(); int nbParams = profile.getSize(); for (int k = 0; k < nbParams; k++) { - state.addOriginalValue(receivePayload.get(profile.getFieldName(k))); + String value = receivePayload.get(profile.getFieldName(k)); + state.addOriginalValue(value); + String[] ids = extendPath(value.replaceAll("\\.", "__"), blk).split(","); + int isize = ids.length; + for(int w = 0; w < isize; w++) state.addValue(ids[w]); } } } @@ -531,12 +614,14 @@ public class AvatarFromSysML { "set-timer transition has no associated timer", transition.getRleft())); } state.setTimer(getTimerByName(transition.getTimer(), theBlock)); - if (transition.getSendPayload() == null || transition.getSendPayload().size() != 1) { + if (transition.getSendPayload() == null || transition.getSendPayload().size() != 1 + || !(transition.getSendPayload().get(0) instanceof StxExpr)) { addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getLeft(), "payload of set-timer transition is not well formed", transition.getRleft())); continue; } state.setTimerValue(((StxExpr)transition.getSendPayload().get(0)).getString().replaceAll(".","__")); + state.setTimerOriginalValue(((StxExpr)transition.getSendPayload().get(0)).getString()); } else { addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getLeft(), @@ -644,11 +729,20 @@ public class AvatarFromSysML { addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, ss.getLeft(), "message profile uses undefined datatype " + type)); } - aa = new AvatarAttribute(ss.getFieldName(i), AvatarType.UNDEFINED, b, null); + String aaName = ss.getFieldName(i); + aa = new AvatarAttribute(aaName, AvatarType.UNDEFINED, b, null); aa.setDataType(adt); am.addOriginalParameter(aa); aa.setAsConstant(false); - } + aaName = aaName + "__"; + int dtsize = adt.getFullSize(); + for (int j = 0; j < dtsize; j++) { + aa = new AvatarAttribute(aaName + adt.getFieldString(j), + adt.getFieldStringType(j), b, null); + am.addParameter(aa); + aa.setAsConstant(false); + } + } } } private String getStxAttributeType(String name, StxBlock blk){ @@ -658,7 +752,6 @@ public class AvatarFromSysML { } return null; } -/* private String getStxPathType(String s, StxBlock b) { String[] path = s.split("__"); String type = getStxAttributeType(path[0], b); @@ -681,8 +774,40 @@ public class AvatarFromSysML { } return type; } - */ + private String extendString; + private AvatarDataType extendType; + private String extendPath(String path, StxBlock b) { + extendString = getStxPathType(path, b); + if (extendString.equals("Integer") || extendString.equals("Boolean")) { + extendType = null; + return path; + } + extendType = avSpec.getDataTypeByName(extendString); + int size = extendType.getFullSize() - 1; + if (size == -1) return path; + StringBuffer res = new StringBuffer(); + int i; + for (i = 0; i < size; i++) + res.append(path + "__" + extendType.getFieldString(i) + ", "); + res.append(path + "__" + extendType.getFieldString(i)); + return res.toString(); + } + private String extendIdent (String path, StxBlock b) { + String result = extendPath(path, b); + return (result.indexOf(',') == -1 ? result : "(" + result + ")"); + } private String extendCall (StxCall call, StxBlock b) { + StringBuffer result = new StringBuffer(); + int size = call.getNbIdents(); + int i; + for (i =0 ; i < size; i++) { + result.append(call.getSegment(i)); + result.append(extendPath(call.getIdent(i), b)); + } + result.append(call.getSegment(i)); + return result.toString().replaceAll("\\.", "__"); + } + private String extendOriginalCall (StxCall call, StxBlock b) { StringBuffer result = new StringBuffer(); int size = call.getNbIdents(); int i; diff --git a/src/main/java/ui/AvatarMethod.java b/src/main/java/ui/AvatarMethod.java index 35e25bc1ed34aa2b76dbc2bacb48e73e84eb1de6..8fce54de90585a7e43f437052ce22ccb41dedf79 100644 --- a/src/main/java/ui/AvatarMethod.java +++ b/src/main/java/ui/AvatarMethod.java @@ -250,12 +250,12 @@ public class AvatarMethod { return null; } TraceManager.addDev("Checking input parameter"); - if (!isAValidId(splitted[i], false, false,false, checkTypes, extraTypes)) { + if (!isAValidId(splitted[i], false, false,false, false, extraTypes)) { TraceManager.addDev("Unvalid input type #" + i + ": " + splitted[i]); return null; } - if (!isAValidId(splitted[i + 1], true, true,true, false, extraTypes)) { + if (!isAValidId(splitted[i + 1], true, true,true, checkTypes, extraTypes)) { TraceManager.addDev("Unvalid id of parameter " + splitted[i + 1]); return null; }