/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille, Andrea Enrici * * ludovic.apvrille AT telecom-paristech.fr * andrea.enrici AT telecom-paristech.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; import myutil.FileException; import myutil.FileUtils; import myutil.TraceManager; import tmltranslator.tmlcp.*; import java.io.File; import java.util.*; /** * Class TMLTextSpecification * Import and export of TML CP textual specifications * Creation: 02/06/2014 * @version 1.0 02/06/2014 * @author Ludovic APVRILLE, Andrea ENRICI */ public class TMLCPTextSpecification { public final static String CR = "\n"; public final static String SP = " "; public final static String CR2 = "\n\n"; public final static String SC = ";"; public final static String C = ","; public final static String TAB = "\t"; public final static String TAB2 = "\t\t"; //Reserved strings for operations public final static String MAIN = "MAIN"; public final static String END = "END"; public final static String LOOP = "loop"; public final static String ENDLOOP = "endloop"; public final static String STOP = "stop state"; public final static String START = "start state"; public final static String SEQUENCE_OP = SC; public final static String PARALLELISM_OP = "*"; public final static String SELECTION_OP = "+"; // private int loopCounter = 0; // private int nbLoops = 10; //private String loopDataStructure[] = new String[nbLoops]; private String spec; private String title; // private TMLModeling tmlm; private List<TMLTXTError> errors; private List<TMLTXTError> warnings; // For reading TMLTXT specifications // private boolean inDec = true; // private boolean inTask = false; // private boolean inTaskDec = false; // private boolean inTaskBehavior = false; // private TMLTask task; // private TMLActivityElement tmlae; // private ArrayList<TMLParserSaveElt> parses; /*private static String keywords[] = {"BOOL", "INT", "NAT", "CHANNEL", "EVENT", "REQUEST", "LOSSYCHANNEL", "LOSSYEVENT", "LOSSYREQUEST", "BRBW", "NBRNBW", "BRNBW", "INF", "NIB", "NINB", "TASK", "ENDTASK", "IF", "ELSE", "ORIF", "ENDIF", "FOR", "ENDFOR", "SELECTEVT", "CASE", "ENDSELECTEVT", "ENDCASE", "WRITE", "READ", "WAIT", "NOTIFY", "NOTIFIED", "RAND", "CASERAND", "ENDRAND", "ENDCASERAND", "EXECI", "EXECC", "DELAY", "RANDOM", "RANDOMSEQ", "ENDRANDOMSEQ", "SEQ", "ENDSEQ"}; private String channeltypes[] = {"BRBW", "NBRNBW", "BRNBW"}; private String eventtypes[] = {"INF", "NIB", "NINB"}; private String beginArray[] = {"TASK", "FOR", "IF", "ELSE", "ORIF", "SELECTEVT", "CASE", "RAND", "CASERAND", "RANDOMSEQ", "SEQ"}; private String endArray[] = {"ENDTASK", "ENDFOR", "ENDIF", "ELSE", "ORIF", "ENDSELECTEVT", "ENDCASE", "ENDRAND", "ENDCASERAND", "ENDRANDOMSEQ", "ENDSEQ"}; */ private static String SEQUENCE_DIAGRAM = "SEQUENCE"; // private String nextElem; //used to produce the TML text // private String currentElem; //used to produce the TML text // private String currentJunc = "junction"; //used to produce the TML text //private ArrayList<String> junctionList = new ArrayList<String>(); //private ArrayList<Integer> indexOfConnToRemove; // private ArrayList<TMLCPConnector> listTMLCPConnectors; private StringBuffer sbFork; //private StringBuffer sbJunction; public TMLCPTextSpecification(String _title) { title = _title; // init(); } public TMLCPTextSpecification(String _title, boolean reset) { title = _title; if (reset) { DIPLOElement.resetID(); } // init(); } // private void init() { // //indexOfConnToRemove = new ArrayList<Integer>(); // //listTMLCPConnectors = new ArrayList<TMLCPConnector>(); // } public void saveFile(String path, String filename) throws FileException { File dir = new File(path); if (!dir.exists()) dir.mkdir(); TraceManager.addUser("Saving TMLCP spec file in " + path + filename); FileUtils.saveFile(path + filename, spec); } /* public TMLModeling getTMLModeling() { return tmlm; } public ArrayList<TMLTXTError> getErrors() { return errors; } public ArrayList<TMLTXTError> getWarnings() { return warnings; } public void indent() { indent(4); } */ /* public void indent(int _nbDec) { int dec = 0; int indexEnd; String output = ""; String tmp; int nbOpen = 0; int nbClose = 0; while ( (indexEnd = spec.indexOf('\n')) > -1) { tmp = spec.substring(0, indexEnd+1); try { spec = spec.substring(indexEnd+1, spec.length()); } catch (Exception e) { spec = ""; } nbOpen = nbOfOpen(tmp); nbClose = nbOfClose(tmp); dec -= nbClose * _nbDec; tmp = Conversion.addHead(tmp.trim(), ' ', dec); dec += nbOpen * _nbDec; //TraceManager.addDev("dec=" + dec); output += tmp + "\n"; } spec = output; } */ /* private int nbOfOpen(String tmp) { return nbOf(tmp, beginArray); } private int nbOfClose(String tmp) { return nbOf(tmp, endArray); } */ /* private int nbOf(String _tmp, String[] array) { String tmp; int size; for(int i=0; i<array.length; i++) { if (_tmp.startsWith(array[i])) { tmp = _tmp.substring(array[i].length(), _tmp.length()); //TraceManager.addDev("tmp=" + tmp + " _tmp" + _tmp + " array=" + array[i]); if ((tmp.length() == 0) || (tmp.charAt(0) == ' ') || (tmp.charAt(0) == '(') || (tmp.charAt(0) == '\n')) { //TraceManager.addDev("Returning 1!!"); return 1; } } } return 0; } */ public String toString() { return spec; } public String toTextFormat( TMLCP tmlcp ) { spec = makeHeader(); spec += makeTMLTextSequenceDiagrams( tmlcp ); spec += makeTMLTextActivityDiagrams( tmlcp ); return spec; } /*public String toTextFormat( TMLMapping tmap ) { tmap.sortByName(); spec = makeDeclarations( tmap ); spec += makeTasks( tmap ); indent(); return spec; return "FAKE"; }*/ private String makeHeader() { StringBuffer sb = new StringBuffer( "// TML Communication Pattern - FORMAT 0.1" + CR ); sb.append( "// Communication Pattern: " + title + CR ); sb.append( "// Generated: " + new Date().toString() + CR2 ); return sb.toString(); } private String makeTMLTextSequenceDiagrams( TMLCP tmlcp ) { StringBuffer sb = new StringBuffer(""); StringBuffer sbAttributes = new StringBuffer(""); //Generating code for Sequence Diagrams List<TMLCPSequenceDiagram> listSDs = tmlcp.getCPSequenceDiagrams(); for( TMLCPSequenceDiagram seqDiag: listSDs ) { sb.append( SEQUENCE_DIAGRAM + SP + seqDiag.getName() + CR2 ); List<tmltranslator.tmlcp.TMLSDInstance> listInstances = seqDiag.getInstances(); if( seqDiag.getAttributes().size() > 0 ) { for( TMLAttribute attribute: seqDiag.getAttributes() ) { if( !sbAttributes.toString().contains( attribute.toString() ) ) { //if attribute not already contained, then add it if( attribute.toString().charAt( attribute.toString().length() - 1) == '=' ) { //delete trailing = sbAttributes.append( seqDiag.getName() + "." + attribute.toString().substring( 0, attribute.toString().length()-1 ) + CR ); } else { sbAttributes.append( seqDiag.getName() + "." + attribute.toString() + CR ); } } } } for( tmltranslator.tmlcp.TMLSDInstance inst: listInstances ) { sb.append( TAB + inst.getType() + SP + inst.getName() + CR ); if( inst.getEvents().size() > 0 ) { ArrayList<TMLSDEvent> listEvents = inst.getEvents(); Collections.sort( listEvents ); for( TMLSDEvent event: listEvents ) { sb.append( TAB2 + event.toString() + CR ); } sb.append( CR ); } } sb.append( END + CR2 ); } if( sbAttributes.length() > 0 ) { return sbAttributes.toString() + CR2 + sb.toString(); } return sb.toString(); } private String makeTMLTextActivityDiagrams( TMLCP tmlcp ) { StringBuffer sb = new StringBuffer(); // StringBuffer sb2 = new StringBuffer(); List<TMLCPActivityDiagram> activityDiagList = tmlcp.getCPActivityDiagrams(); List<TMLCPActivityDiagram> junctionDiagList = new ArrayList<TMLCPActivityDiagram>(); List<String> diagsToRemove = new ArrayList<String>(); for( TMLCPActivityDiagram ad: activityDiagList ) { String s = ad.getName(); if( s.length() >= 9 ) { if( s.substring( 0,8 ).equals( "junction" ) ) { junctionDiagList.add( ad ); diagsToRemove.add( ad.getName() ); } } } // Remove junction diagrams from the main list Iterator<TMLCPActivityDiagram> it = activityDiagList.iterator(); while( it.hasNext() ) { TMLCPActivityDiagram temp = it.next(); if( diagsToRemove.contains( temp.getName() ) ) { it.remove(); } } TMLCPActivityDiagram mainCP = tmlcp.getMainCP(); sb.append( CR + "ACTIVITY " + mainCP.getName() + CR2 + TAB + "MAIN" ); sb.append( makeSingleActivityDiagram2( mainCP ) + CR + TAB + "END" + CR ); sb.append( CR + "END " + mainCP.getName() + CR ); for( TMLCPActivityDiagram ad: activityDiagList ) { sb.append( CR + "ACTIVITY " + ad.getName() + CR2 + TAB + "MAIN" ); sb.append( makeSingleActivityDiagram2( ad ) + CR + TAB + "END" + CR ); sb.append( CR + "END " + ad.getName() + CR ); } //return sb.toString(); ArrayList<String> junctionTMLCodeList = new ArrayList<String>(); ArrayList<String> junctionNamesList = new ArrayList<String>(); for( TMLCPActivityDiagram ad: junctionDiagList ) { String temp = new String( CR + "ACTIVITY " + ad.getName() + CR2 + TAB + "MAIN" + CR + TAB ); temp += makeSingleJunctionDiagram( ad ); temp += ( TAB + "><" + CR + TAB + "END" + CR2 + "END " + ad.getName() + CR ); sb.append( temp ); //the total text junctionTMLCodeList.add( temp ); //each entry contains the text for one single junctionAD junctionNamesList.add( getJunctionName( temp ) ); } //Merge nested junction-choice /*ArrayList<Integer> indexToRemove = new ArrayList<Integer>(); for( String s: junctionTMLCodeList ) { if( !s.equals("") ) { if( s.contains( "JUNCTION" ) ) { String[] v = s.split( "JUNCTION" ); String[] v1 = v[1].split( CR ); String junctionName = v1[0]; int index = junctionNamesList.indexOf( junctionName ); if( index != -1 ) { //junctionName not found v = s.split( "JUNCTION(.)*\\n" ); //re-split the string to eliminate JUNCTION + junctionName String completeText = v[0] + junctionName + CR + v[1] + CR + TAB + TAB + junctionTMLCodeList.get( index ); // merge the TML text code in the data structure junctionTMLCodeList.set( junctionTMLCodeList.indexOf(s), completeText ); junctionTMLCodeList.set( index, "" ); junctionNamesList.set( index, "" ); indexToRemove.add( index ); } else { String completeText = ""; } } } } for( Integer i: indexToRemove ) { junctionNamesList.remove( (int) i); junctionTMLCodeList.remove( (int) i); } for( String s: junctionNamesList ) { if( sb.toString().contains( "JUNCTION " + s ) ) { String[] v = sb.toString().split( "JUNCTION " + s ); sb = new StringBuffer( v[0] + junctionTMLCodeList.get( junctionNamesList.indexOf( s ) ) + v[1] ); } }*/ return sb.toString(); } private String getJunctionName( String temp ) { String v[] = temp.split("\\n"); for( int i = 0; i < v.length; i++ ) { if( v[i].contains( "LOOP" ) ) { String v1[] = v[i].split("LOOP "); String junctionName = v1[1]; return junctionName; } } return "ERROR"; } private String makeSingleActivityDiagram2(TMLCPActivityDiagram ad) { StringBuffer sb = new StringBuffer( TAB + CR + TAB + "<>; " ); TMLCPElement currentElement;//, nextElement; // ArrayList<TMLCPElement> nextElements; currentElement = getStartState( ad ).getNextElements().get(0); //get the first element after the start state List<TMLCPElement> met = new ArrayList<TMLCPElement>(); sb.append(parseElement2(currentElement, met)); return sb.toString() + CR + TAB + "><"; } private String parseElement2(TMLCPElement currentElement, List<TMLCPElement> met) { if (currentElement == null) { return ""; } if (met.contains(currentElement)) { return ""; } if (currentElement instanceof TMLCPJoin) { return ""; } met.add(currentElement); if (currentElement instanceof TMLCPStop) { //return ""; return( TAB + "><" ); } if (currentElement instanceof TMLCPFork) { return parseFork2((TMLCPFork)(currentElement), met); } if (currentElement instanceof TMLCPForLoop) { //TraceManager.addDev("Handling ForLoop: " + currentElement); return parseForLoop((TMLCPForLoop)(currentElement), met); } if (currentElement instanceof TMLCPChoice) { return parseChoice2((TMLCPChoice)(currentElement), met); } String ret = parseSequence(currentElement); //ret += SEQUENCE_OP; ret += parseElement2(currentElement.getNextElements().get(0), met); return ret; } private String parseChoice2(TMLCPChoice choice, List<TMLCPElement> met) { StringBuffer sb = new StringBuffer(); List<TMLCPElement> branches = choice.getNextElements(); List<String> guards = choice.getGuards(); int index = 0; for( TMLCPElement element: branches ) { sb.append( CR + TAB2 + guards.get(index) + SP); sb.append(parseElement2(element, met)); index ++; } return sb.toString(); } private String parseForLoop(TMLCPForLoop loop, List<TMLCPElement> met) { StringBuffer sb = new StringBuffer(); List<TMLCPElement> nextElements = loop.getNextElements(); sb.append( SP + "{" ); //TMLCPElement inLoop = nextElements.get(0); sb.append("(" + loop.getInit().replaceAll("\\s+","") + ";" + loop.getCondition().replaceAll("\\s+","") + ";" + loop.getIncrement().replaceAll("\\s+","") + ") "); sb.append(parseElement2(nextElements.get(0), met)); //first the for-loop body sb.append( "}" + SEQUENCE_OP ); sb.append(parseElement2(nextElements.get(1), met)); //then the diagrams that follow the for-loop termination return sb.toString(); } private String parseFork2(TMLCPFork fork, List<TMLCPElement> met) { StringBuffer sb = new StringBuffer(); List<TMLCPElement> nextElements = fork.getNextElements(); // TMLCPElement nextElement = null; sb.append( SP + "{" ); for(TMLCPElement elt: nextElements) { sb.append( SP + "{" ); sb.append(parseElement2(elt, met)); sb = removeTrailingSymbols(sb, 2); sb.append("}" + SP + PARALLELISM_OP); } sb = removeTrailingSymbol( sb ); sb.append( "}" + SEQUENCE_OP ); // Search for the join TMLCPElement myElt = nextElements.get(0); while (!(myElt instanceof TMLCPJoin)) { myElt = myElt.getNextElements().get(0); } // Start parsing after the join myElt = myElt.getNextElements().get(0); sb.append(parseElement2(myElt, met)); return sb.toString(); } // private String makeSingleActivityDiagram( TMLCPActivityDiagram ad ) { // // StringBuffer sb = new StringBuffer( TAB + CR + TAB + "<>; " ); // TMLCPElement currentElement, nextElement; // ArrayList<TMLCPElement> nextElements; // // currentElement = getStartState( ad ).getNextElements().get(0); //get the first element after the start state // while( !(currentElement instanceof TMLCPStop) ) { // nextElements = currentElement.getNextElements(); // if( nextElements.size() > 1 ) { // currentElement is a fork node // sbFork = new StringBuffer(); // currentElement = parseFork( nextElements ); // currentElement is the closing join, use attribute sbFork // sb.append( sbFork.toString() ); // sbFork.setLength(0); // } // else { // currentElement is either a refToDiag or a junction // if( isAJunction( currentElement ) ) { // String s = ( (TMLCPRefAD) currentElement ).getName(); // sb.append( s + ";" + CR ); // } // else { // sb.append( parseSequence( currentElement ) ); // } // } // currentElement = currentElement.getNextElements().get(0); // } // // return sb.toString() + TAB + "><"; // } private String parseSequence( TMLCPElement element ) { if( element instanceof TMLCPRefSD ) { String sb = ( removeHashKey( element.getName() ) + SEQUENCE_OP + SP ); return sb; } if( element instanceof TMLCPRefAD ) { String sb = ( removeHashKey( element.getName() ) + SEQUENCE_OP + SP ); return sb; } return ""; } private TMLCPElement parseFork( List<TMLCPElement> elements ) { TMLCPElement nextElement = null; sbFork.append( SP + "{" ); for( TMLCPElement currentElement: elements ) { nextElement = currentElement; sbFork.append( SP + "{" ); while( !(nextElement instanceof TMLCPJoin) ) { if( isAJunction( nextElement ) ) { sbFork.append( "" ); // should raise and error, no junction-choice in fork-join } else { sbFork.append( parseSequence( nextElement ) ); } nextElement = nextElement.getNextElements().get(0); //no nested fork and join } sbFork = removeTrailingSymbols( sbFork, 2 ); sbFork.append( "}" + SP + PARALLELISM_OP ); } sbFork = removeTrailingSymbol( sbFork ); sbFork.append( "}" + SEQUENCE_OP ); return nextElement; } private String makeSingleJunctionDiagram( TMLCPActivityDiagram ad ) { StringBuffer sb = new StringBuffer( "<>;" + SP ); TMLCPElement currentElement, nextElement; List<TMLCPElement> nextElements; //First parse the part from the junctionto the choice: either a fork or a sequence currentElement = getStartState( ad ); while( !(currentElement instanceof TMLCPChoice) ) { nextElements = currentElement.getNextElements(); if( nextElements.size() > 1 ) { // currentElement is a fork node sbFork = new StringBuffer(); nextElement = parseFork( nextElements ); // use attribute sbFork sb.append( sbFork.toString() ); sbFork.setLength(0); } else { //it is a simple sequence with no nested junctions nextElement = nextElements.get(0); sb.append( parseSequence( nextElement ) ); } currentElement = nextElement; } sb = removeTrailingSymbol( sb ); sb.append( parseChoice( currentElement, ad ) ); return sb.toString(); } private String parseChoice( TMLCPElement currentElement, TMLCPActivityDiagram ad ) { StringBuffer sb = new StringBuffer( /*CR + TAB + "LOOP" + SP + ad.getName()*/ ); //this LOOP is the keywork that is used to look for the junction diagram name, removing it, causing the generation not to work List<TMLCPElement> nextElements; int index = 0; List<TMLCPElement> branches = currentElement.getNextElements(); List<String> guards = ( (TMLCPChoice)currentElement ).getGuards(); for( TMLCPElement element: branches ) { //for each of the branches go until a stop or a junction, only possible to find seq/fork sb.append( CR + TAB2 + guards.get(index) + SP ); while( !(element instanceof TMLCPStop) ) { nextElements = element.getNextElements(); if( nextElements.size() > 1 ) { // currentElement is a fork node sbFork = new StringBuffer(); element = parseFork( nextElements ).getNextElements().get(0); // use attribute sbFork - element is the element after the join node sb.append( sbFork.toString() + ";" ); sbFork.setLength(0); } else { //it is a simple sequence with no nested junctions, use element if( isAJunction( element ) ) { String s = element.getName(); sb = removeTrailingSymbol( sb ); if( s.equals( ad.getName() ) ) { sb.append( SP + s + ";" + SP + "><" ); // it is a reference to the same junction-choice block } else { sb.append( SP + s + ";" + SP + "><" ); //it is a reference to another junction-choice block } break; } else { sb.append( parseSequence( element ) ); } element = element.getNextElements().get(0); if( element instanceof TMLCPStop ) { sb = removeTrailingSymbol( sb ); sb.append( TAB + "><" ); } } } // end of while index++; } // end of for sb.append( CR ); return sb.toString(); } private boolean isAJunction( TMLCPElement element ) { if( element instanceof TMLCPRefAD ) { String s = element.getName(); if( s.length() >= 9 ) { if( s.substring( 0,8 ).equals( "junction" ) ) { //it is a reference to a junction diagram return true; } } } return false; } // // // Retrieves the AD corresponding to a junction from the list of junction diagrams // private TMLCPActivityDiagram getJunctionDiagram( String name, ArrayList<TMLCPActivityDiagram> junctionDiagList ) { // // for( TMLCPActivityDiagram diag: junctionDiagList ) { // if( diag.getName().equals( name ) ) { // return diag; // } // } // return junctionDiagList.get(0); // } private StringBuffer removeTrailingSymbol( StringBuffer sb ) { if( sb.length() > 0 ) { sb.setLength( sb.length() - 1 ); return sb; } return sb; } private StringBuffer removeTrailingSymbols( StringBuffer sb, int n ) { if( sb.length() > 0 ) { sb.setLength( sb.length() - n ); return sb; } return sb; } private TMLCPElement getStartState( TMLCPActivityDiagram ad ) { List<TMLCPElement> elementsList = ad.getElements(); for( TMLCPElement elem: elementsList ) { if( elem instanceof TMLCPStart ) { return elem; } } return null; } private String removeHashKey( String s ) { String[] vector = s.split( "_#" ); return vector[0]; } // public String makeDeclarations( TMLCP tmlcp ) { // // ArrayList<TMLCPElement> listElements; // currentElem = ""; // nextElem = ""; // String newSb = ""; // String sb = ""; // sb += "// TML Communication Pattern - FORMAT 0.1" + CR; // sb += "// Communication Pattern: " + title + CR; // sb += "// Generated: " + new Date().toString() + CR2; // // //Generating code for the main CP // TMLCPActivityDiagram mainCP = tmlcp.getMainCP(); // sb += "COMMUNICATION_PATTERN" + SP + mainCP.getName() + CR + TAB; // listElements = mainCP.getElements(); // for( TMLCPElement elem : listElements ) { // if( elem instanceof tmltranslator.tmlcp.TMLCPRefAD ) { // tmltranslator.tmlcp.TMLCPRefAD refAD = (tmltranslator.tmlcp.TMLCPRefAD) elem; // sb += "ACTIVITY" + SP + refAD.getName() + CR + TAB; // } // if( elem instanceof tmltranslator.tmlcp.TMLCPRefSD ) { // tmltranslator.tmlcp.TMLCPRefSD refSD = (tmltranslator.tmlcp.TMLCPRefSD) elem; // sb += "SEQUENCE" + SP + refSD.getName() + CR + TAB; // } // if( elem instanceof TMLCPConnector ) { // TMLCPConnector connector = (TMLCPConnector) elem; // listTMLCPConnectors.add( connector ); // } // } // //global variables should go here, but there are none up to now // sb += CR + TAB + MAIN + CR + TAB2 + "<>" + SC + SP; // //Yet to add: nested forks, choices and junctions // currentElem = START; // boolean encounteredSequence = false; // boolean endOfGraph = false; // boolean comingFromMain = true; //flags to trace the history of the sub-routine calls // boolean comingFromChoice = false; // boolean comingFromFJ = false; // while( !endOfGraph ) { // nextElem = getNextElem(); //get the name of the next element // String token = nextElem; // if( token.length() > 3 ) { // token = token.substring(0,4); // } // switch( token ) { // case "fork": { //The firts encountered object is a fork: go until join. Return the connector that follows the join // sb += "{" + exploreForkJoin( comingFromMain, comingFromChoice, comingFromFJ ); // if( !nextElem.equals(STOP) ) { // String temp = sb.substring(0,sb.length()-3) + "}" + SEQUENCE_OP + SP + nextElem + SEQUENCE_OP; // sb = temp; // } // else { // endOfGraph = true; // String temp = sb.substring(0,sb.length()-3) + "}" + SP + "><"; // sb = temp; // } // encounteredSequence = false; // break; // } // case "junc": { //The first encountered object is a junction: count the loop // if( nextElem.length() >=8 ) { // if( nextElem.substring(0,8).equals("junction") ) { //ensure the name starts with junction // currentJunc = nextElem; // sb += CR + TAB2 + LOOP + loopCounter + CR + TAB2; // } // } //else I should trigger an error // encounteredSequence = false; // break; // } // case "choi": { //The first encountered object is a choice: exploration of the graph will be over upon return // if( nextElem.length() >= 6 ) { // if( nextElem.substring(0,6).equals("choice") ) { //ensure the name starts with choice // comingFromMain = true; // comingFromChoice = false; // comingFromFJ = false; // if( encounteredSequence ) { // sb += CR + TAB2; //When there is a sequence of diags before the choice node // } // sb += CR + TAB2 + exploreChoiceBranches( comingFromMain, comingFromChoice, comingFromFJ ); // String temp = sb.substring(0, sb.length()-1) + SP + "><"; //drop semicolon // sb = temp; // endOfGraph = true; // } // } //else I should trigger an error // encounteredSequence = false; // break; // } // default: { //The first encountered object is a diagram reference name: a sequence // sb += nextElem + SEQUENCE_OP; // encounteredSequence = true; // break; // } // } //End of switch // if( nextElem.equals( "ERROR" ) ) { // TraceManager.addDev( "ERROR WHEN GENERATING TML CODE in mainCP: " + nextElem); // endOfGraph = true; // break; // } // if( nextElem.equals(STOP) ) { // String temp = sb.substring(0,sb.length()-12) + SP + "><"; // sb = temp; // break; // } // currentElem = nextElem; //advance to next connector // } //End of while loop // sb += CR + TAB + END + CR + END + CR2; // // /***************************************************************************/ // //Generating code for the other ADs // ArrayList<TMLCPActivityDiagram> listADs = tmlcp.getCPActivityDiagrams(); // for( TMLCPActivityDiagram AD: listADs ) { // TraceManager.addDev( "GENERATING THE CODE FOR THE AD " + AD.getName() ); // sb += "START ACTIVITY" + SP + AD.getName() + CR + TAB; // listTMLCPConnectors.clear(); // listElements = AD.getElements(); // for( TMLCPElement elem : listElements ) { // if( elem instanceof tmltranslator.tmlcp.TMLCPRefAD ) { // tmltranslator.tmlcp.TMLCPRefAD refAD = (tmltranslator.tmlcp.TMLCPRefAD) elem; // sb += "ACTIVITY" + SP + refAD.getName() + CR + TAB; // } // if( elem instanceof tmltranslator.tmlcp.TMLCPRefSD ) { // tmltranslator.tmlcp.TMLCPRefSD refSD = (tmltranslator.tmlcp.TMLCPRefSD) elem; // sb += "SEQUENCE" + SP + refSD.getName() + CR + TAB; // } // if( elem instanceof TMLCPConnector ) { // TMLCPConnector connector = (TMLCPConnector) elem; // listTMLCPConnectors.add( connector ); // //TraceManager.addDev( connector.getStartName() + SP + connector.getEndName() + SP + connector.getGuard() ); // } // } // //global variables should go here, but there are none up to now // sb += CR2 + TAB + MAIN + CR + TAB2 + "<>" + SC + " "; //should I start with an open parenthesis? // //up to know I just consider sequence, activities, fork, join, choice but no nested structures to keep things simple! // currentElem = START; // endOfGraph = false; // comingFromMain = true; //flags to trace the history of the sub-routine calls // comingFromChoice = false; // comingFromFJ = false; // loopCounter = 0; // encounteredSequence = false; // while( !endOfGraph ) { // nextElem = getNextElem(); //get the name of the next element // String token = nextElem; // if( token.length() > 3 ) { // token = token.substring(0,4); // } // switch( token ) { // case "fork": { //The firts encountered object is a fork: go until join. Return the connector that follows the join // sb += "{" + exploreForkJoin( comingFromMain, comingFromChoice, comingFromFJ ); // if( !nextElem.equals(STOP) ) { // String temp = sb.substring(0,sb.length()-3) + "}" + SEQUENCE_OP + SP + nextElem + SEQUENCE_OP; // sb = temp; // } // else { // endOfGraph = true; // String temp = sb.substring(0,sb.length()-3) + "}" + SP + "><"; // sb = temp; // } // encounteredSequence = false; // break; // } // case "junc": { //The first encountered object is a junction: count the loop // if( nextElem.length() >=8 ) { // if( nextElem.substring(0,8).equals("junction") ) { //ensure the name starts with junction // currentJunc = nextElem; // junctionList.add( nextElem ); // sb += CR + TAB2 + LOOP + loopCounter + CR + TAB2; // //loopCounter += 1; // } // } //else I should trigger an error // encounteredSequence = false; // break; // } // case "choi": { //The first encountered object is a choice: exploration of the graph will be over upon return // if( nextElem.length() >= 6 ) { // if( nextElem.substring(0,6).equals("choice") ) { //ensure the name starts with choice // comingFromMain = true; // comingFromChoice = false; // comingFromFJ = false; // if( encounteredSequence ) { // sb += CR + TAB2; // } // sb += exploreChoiceBranches( comingFromMain, comingFromChoice, comingFromFJ ); // String temp = sb.substring(0, sb.length()-1) + SP + "><"; //drop semicolon // sb = temp; // currentJunc = ""; // endOfGraph = true; // } // } //else I should trigger an error // encounteredSequence = false; // break; // } // default: { //The first encountered object is a diagram reference name: a sequence // sb += nextElem + SEQUENCE_OP; // encounteredSequence = true; // break; // } // } //End of switch // if( nextElem.equals( "ERROR" ) ) { // TraceManager.addDev( "ERROR WHEN GENERATING TML CODE in otherADs: " + nextElem ); // break; // } // currentElem = nextElem; //advance to next connector // } //End of while loop // if( comingFromFJ ) { // newSb = sb.substring( 0, sb.length()-2 ); // drop last PARALLELISM_OP // } // sb += CR + TAB + END + CR + END + CR2; // // } //End of Activity Diagram analysis // // /***************************************************************************/ // //Generating code for Sequence Diagrams // ArrayList<TMLCPSequenceDiagram> listSDs = tmlcp.getCPSequenceDiagrams(); // for( int i = 0; i < listSDs.size(); i++ ) { // TMLCPSequenceDiagram SD = listSDs.get(i); // sb += "SEQUENCE " + SD.getName() + CR + TAB; // ArrayList<tmltranslator.tmlcp.TMLSDInstance> listInstances = SD.getInstances(); // ArrayList<TMLSDMessage> listMessages = SD.getMessages(); // ArrayList<TMLSDAction> listActions = SD.getActions(); // ArrayList<TMLAttribute> listAttributes = SD.getAttributeList(); // for( tmltranslator.tmlcp.TMLSDInstance inst: listInstances ) { // sb += inst.getType() + " " + inst.getName() + CR + TAB; // } // for( TMLAttribute attr: listAttributes ) { // sb += attr.getType().toString().toUpperCase() + " " + attr.getInstanceName() + "." + attr.getName() + CR + TAB; // } // for( TMLAttribute attr: listAttributes ) { // if( attr.isBool() ) { // sb += attr.getInstanceName() + "." + attr.getName() + " = " + attr.getInitialValue().toUpperCase() + CR + TAB; // } // else { // sb += attr.getInstanceName() + "." + attr.getName() + " = " + attr.getInitialValue() + CR + TAB; // } // } // String temp = "";//sb.substring( 0, sb.length()-3 ); //Remove trailing CR + TAB + TAB // sb += CR + TAB + MAIN + CR + TAB + TAB; // ArrayList<TMLSDEvent> listEvents = SD.getEvents(); // Collections.sort( listEvents ); //actions and messages must be ordered and printed according to Y before being written! // /*TraceManager.addDev( "PRINTING SORTED ITEMS" ); // for( TMLSDEvent item: listEvents ) { //print the items // TraceManager.addDev( item.toString() ); // }*/ // for( TMLSDEvent item: listEvents ) { // if( item.getInstanceName().length() > 0 ) { //the item is an action (attribute) // sb += item.getInstanceName() + "." + item.getName(); // sb += CR + TAB + TAB; // } // else { //The item is a message // ArrayList<TMLSDAttribute> listAttr = item.getAttributeList(); // if( listAttr.size() == 0 ) { //message with no parameters // sb += item.getSenderName() + "." + item.getName() + "(" + item.getReceiverName() + ")"; // } // else { //message with at least one parameter // sb += item.getSenderName() + "." + item.getName() + "(" + item.getReceiverName() + ","; // for( int p = 0; p < listAttr.size(); p++ ) { // if( p == (listAttr.size() - 1) ) { // sb += listAttr.get(p).getName() + ")"; // } // else { // sb += listAttr.get(p).getName() + ","; // } // } // } // sb += CR + TAB + TAB; // } // } // temp = sb.substring( 0, sb.length()-1 ); //Remove trailing TAB // sb = temp + END + CR + END + CR2; // } // return sb; // } // // //Does not work if there are nested fork-joins // private String exploreForkJoin( boolean comingFromMain, boolean comingFromChoice, boolean comingFromFJ ) { // // String token, branchSb, globalSb = ""; // boolean exit; // boolean encounteredSequence = false; // boolean fromMain = comingFromMain; // boolean fromChoice = comingFromChoice; // boolean fromFJ = comingFromFJ; // ArrayList<TMLCPConnector> connToFork = new ArrayList<TMLCPConnector>(); // TMLCPConnector conn; // int i; // ArrayList<String> diagsToJoin = new ArrayList<String>(); // // //Retrieve all connectors starting from the fork node of nextElem // for( i = 0; i < listTMLCPConnectors.size(); i++ ) { // conn = listTMLCPConnectors.get(i); // if( conn.getStartName().equals( nextElem ) ) { // connToFork.add( conn ); // } // } // for( int j = 0; j < connToFork.size(); j++ ) { //For each output connector of the start fork node // currentElem = connToFork.get(j).getEndName(); // nextElem = currentElem; // branchSb = "{"; // exit = false; // encounteredSequence = false; // while( !exit ) { // token = nextElem; // if( token.length() > 3 ) { // token = token.substring(0,4); // } // switch( token ) { // case "fork": { //ERROR: no nested forks // TraceManager.addDev( "ERROR: ENCOUNTERED NESTED FORK!" ); // break; // } // case "join": { //End of branch, regardless if coming from main or choice exploration // if( encounteredSequence ) { // String temp = branchSb.substring(0,branchSb.length()-2); // branchSb = temp; // } // encounteredSequence = false; // exit = true; // break; // } // case "junc": { //register the junction and go on // if( nextElem.length() >=8 ) { // if( nextElem.substring(0,8).equals("junction") ) { //ensure the name starts with junction // if( fromChoice ) { //ERROR: no nested choices // TraceManager.addDev( "ERROR: ENCOUNTERED JUNCTION IN FORK WHILE COMING FROM CHOICE!" ); // exit = true; // } // else { // branchSb += CR + TAB2 + LOOP + loopCounter + CR + TAB2; // } // } // } //else I should trigger an error // encounteredSequence = false; // break; // } // case "choi": { //Encountered a choice within a fork-join // if( nextElem.length() >= 6 ) { // if( nextElem.substring(0,6).equals("choice") ) { //ensure the name starts with choice // if( fromChoice ) { // TraceManager.addDev( "ERROR: ENCOUNTERED NESTED FORK!" ); // exit = true; // } // else { // fromMain = false; // fromChoice = false; // fromFJ = true; // branchSb += exploreChoiceBranches( fromMain, fromChoice, fromFJ ); //The exploration will return when encountering a join node // loopCounter += 1; // exit = true; // } // } // } // encounteredSequence = false; // break; // } // case "stop": { //ERROR: fork must always terminate with a join // TraceManager.addDev( "ERROR: ENCOUNTERED STOP BEFORE JOIN!" ); // exit = true; // break; // } // default: { //Found a sequence/activity diagram, continue to explore // //TraceManager.addDev("IN THE DEFAULT BRANCH WITH " + currentElem); // branchSb += nextElem + SEQUENCE_OP + SP; // encounteredSequence = true; // break; // } // } //End of switch // if( nextElem.equals( "ERROR" ) ) { // TraceManager.addDev( "ERROR WHEN GENERATING TML CODE in exploreForkJoin: " + nextElem ); // exit = true; // break; // } // currentElem = nextElem; // advance to next connector // nextElem = getNextElem(); // } //End of while // if( branchSb.charAt(branchSb.length()-1) == ';' ) { //Remove trailing semi-colons // String temp = branchSb.substring( 0, branchSb.length()-1); // branchSb = temp; // } // globalSb += branchSb + "}" + SP + PARALLELISM_OP + SP; // } //End of for, end of exploration of all branches // if( fromChoice ) { //Remove trailing semi-colons // String temp = globalSb.substring( 0, globalSb.length() - 3 ); // globalSb = temp; // } // return globalSb; // } // // private String exploreChoiceBranches( boolean comingFromMain, boolean comingFromChoice, boolean comingFromFJ ) { // // boolean fromMain = comingFromMain; // boolean fromChoice = comingFromChoice; // boolean fromFJ = comingFromFJ; // boolean exit = false; // int i; // String token, branchSb, currentElemToPass = "", nextElemToPass = "", globalSb = ""; // ArrayList<TMLCPConnector> connToChoice = new ArrayList<TMLCPConnector>(); // ArrayList<String> diagsToJoin = new ArrayList<String>(); // TMLCPConnector conn; // // //Retrieve all connectors starting from the choice node of nextElem // for( i = 0; i < listTMLCPConnectors.size(); i++ ) { // conn = listTMLCPConnectors.get(i); // if( conn.getStartName().equals( nextElem ) ) { // connToChoice.add( conn ); // } // } // for( int j = 0; j < connToChoice.size(); j++ ) { // currentElem = connToChoice.get(j).getEndName(); // nextElem = currentElem; // branchSb = TAB + connToChoice.get(j).getGuard() + "{"; // exit = false; // while( !exit ) { // token = nextElem; // if( token.length() > 3 ) { // token = token.substring(0,4); // } // switch( token ) { // case "fork": { //Encountered a fork on a choice branch // fromMain = false; // fromFJ = false; // fromChoice = true; // branchSb += exploreForkJoin( fromMain, fromChoice, fromFJ ); //Explore until the closing join node // break; // } // case "join": { //Condition for exiting the branch // if( fromMain ) { // TraceManager.addDev( "ERROR: ENCOUNTERED JOIN IN CHOICE WHILE COMING FROM MAIN!" ); // exit = true; // } // else if( fromFJ ) { // currentElemToPass = currentElem; // nextElemToPass = nextElem; // String temp = branchSb.substring( 0, branchSb.length() - 2 ); //Remove trailing semicolon // branchSb = temp + "}" + SC + SP + ENDLOOP + loopCounter + CR + TAB; // exit = true; // } // break; // } // case "choi": { //not possible up to now to have nested choices // if( nextElem.length() >= 6 ) { // if( nextElem.substring(0,6).equals("choice") ) { //ensure the name starts with choice // TraceManager.addDev( "ENCOUNTERED NESTED CHOICE WHILE COMING FROM CHOICE!" ); // exit = true; // } // } // break; // } // case "junc": { //Terminate branch exploration // if( nextElem.length() >=8 ) { // if( nextElem.substring(0,8).equals("junction") ) { //ensure the name starts with junction // String temp = branchSb.substring( 0, branchSb.length() - 2 ); //Remove trailing semicolon // branchSb = temp + "}" + SC + SP + LOOP + loopCounter + CR + TAB2; // exit = true; // } // } // break; // } // case "stop": { //Condition for exiting the branch // if( fromFJ ) { // TraceManager.addDev( "ERROR: ENCOUNTERED NESTED CHOICE WHILE COMING FROM FJ!" ); // exit = true; // } // else if( fromMain ) { // String temp = branchSb.substring( 0, branchSb.length() - 2 ); //Remove trailing semicolon // branchSb = temp + "}" + SC + SP + ENDLOOP + loopCounter + CR + TAB2; // exit = true; // } // break; // } // default: { //Found a reference to a sequence/activity diagram: sequence operator // branchSb += nextElem + SEQUENCE_OP + SP; // break; // } // } //End of switch // if( nextElem.equals( "ERROR" ) ) { // TraceManager.addDev( "ERROR WHEN GENERATING TML CODE in exploreChoiceBranches: " + nextElem ); // exit = true; // } // currentElem = nextElem; //advance to next connector // nextElem = getNextElem(); // } //End of while // globalSb += branchSb; // } //End of for, end of exploration of all branches // if( fromFJ ) { //Restore correct elements when called from a fork-join // currentElem = currentElemToPass; // nextElem = nextElemToPass; // } // return globalSb + ENDLOOP + loopCounter + SP; // } //Look for a connector that starts from currentElem and get the endName // private String getNextElem() { // // TMLCPConnector conn; // String endName = ""; // int i; // for( i = 0; i < listTMLCPConnectors.size(); i++ ) { // conn = listTMLCPConnectors.get(i); // if( conn.getStartName().equals( currentElem ) ) { // endName = conn.getEndName(); // break; // } // } // return endName; // } /* public String makeTasks(TMLModeling tmlm) { String sb = ""; for(TMLTask task: tmlm.getTasks()) { sb += "TASK" + SP + task.getName() + CR; sb += makeActivity(task); sb += "ENDTASK" + CR2; } return sb; } public String makeActivity(TMLTask task) { String sb = ""; sb += "//Local variables" + CR; for(TMLAttribute attr: task.getAttributeList()) { sb += TMLType.getStringType(attr.getType().getType()) + SP + attr.getName(); if ((attr.getInitialValue() != null) && (attr.getInitialValue().length() > 0)){ sb += " = " + attr.getInitialValue(); } sb += CR; } sb += CR; sb += "//Behavior" + CR; sb += makeBehavior(task, task.getActivityDiagram().getFirst()); return sb; } public String makeBehavior(TMLTask task, TMLActivityElement elt) { String code, code1, code2; TMLForLoop tmlfl; TMLActivityElementChannel tmlch; TMLActivityElementEvent tmlevt; TMLSendRequest tmlreq; TMLEvent evt; TMLRandom random; int i; String tmp1, tmp2; if (elt instanceof TMLStartState) { return makeBehavior(task, elt.getNextElement(0)); } else if (elt instanceof TMLStopState) { return ""; } else if (elt instanceof TMLExecI) { code = "EXECI" + SP + modifyString(((TMLExecI)elt).getAction()) + CR; return code + makeBehavior(task, elt.getNextElement(0)); } else if (elt instanceof TMLExecIInterval) { code = "EXECI" + SP + modifyString(((TMLExecIInterval)elt).getMinDelay()) + SP + modifyString(((TMLExecIInterval)elt).getMaxDelay()) + CR; return code + makeBehavior(task, elt.getNextElement(0)); } else if (elt instanceof TMLExecC) { code = "EXECC" + SP + modifyString(((TMLExecC)elt).getAction()) + CR; return code + makeBehavior(task, elt.getNextElement(0)); } else if (elt instanceof TMLExecCInterval) { code = "EXECC" + SP + modifyString(((TMLExecCInterval)elt).getMinDelay()) + SP + modifyString(((TMLExecCInterval)elt).getMaxDelay()) + CR; return code + makeBehavior(task, elt.getNextElement(0)); } else if (elt instanceof TMLDelay) { tmp1 = ((TMLDelay)elt).getMinDelay(); tmp2 = ((TMLDelay)elt).getMaxDelay(); if (tmp1.compareTo(tmp2) == 0) { code = "DELAY" + SP + modifyString(((TMLDelay)elt).getMinDelay()) + SP + modifyString(((TMLDelay)elt).getUnit()) + CR; } else { code = "DELAY" + SP + modifyString(((TMLDelay)elt).getMinDelay()) + SP + modifyString(((TMLDelay)elt).getMaxDelay()) + SP + modifyString(((TMLDelay)elt).getUnit()) + CR; } return code + makeBehavior(task, elt.getNextElement(0)); } else if (elt instanceof TMLForLoop) { tmlfl = (TMLForLoop)elt; code = "FOR(" + tmlfl.getInit() + SC + SP; code += tmlfl.getCondition() + SC + SP; code += tmlfl.getIncrement() + ")" + CR; code += makeBehavior(task, elt.getNextElement(0)); return code + "ENDFOR" + CR + makeBehavior(task, elt.getNextElement(1)); } else if (elt instanceof TMLRandom) { random = (TMLRandom)elt; code = "RANDOM" + SP + modifyString(""+random.getFunctionId()) + SP; code += modifyString(random.getVariable()) + SP; code += modifyString(random.getMinValue()) + SP; code += modifyString(random.getMaxValue()) + CR; return code + makeBehavior(task, elt.getNextElement(0)); } else if (elt instanceof TMLActionState) { code = modifyString(((TMLActivityElementWithAction)elt).getAction()) + CR; return code + makeBehavior(task, elt.getNextElement(0)); } else if (elt instanceof TMLWriteChannel) { tmlch = (TMLActivityElementChannel)elt; code = "WRITE "; for(int k=0; k<tmlch.getNbOfChannels(); k++) { code = code + tmlch.getChannel(k).getName() + SP; } code = code + modifyString(tmlch.getNbOfSamples()) + CR; return code + makeBehavior(task, elt.getNextElement(0)); } else if (elt instanceof TMLReadChannel) { tmlch = (TMLActivityElementChannel)elt; code = "READ " + tmlch.getChannel(0).getName() + SP + modifyString(tmlch.getNbOfSamples()) + CR; return code + makeBehavior(task, elt.getNextElement(0)); } else if (elt instanceof TMLSendEvent) { tmlevt = (TMLActivityElementEvent)elt; code = "NOTIFY " + tmlevt.getEvent().getName() + " " + tmlevt.getAllParams(" ") + CR; return code + makeBehavior(task, elt.getNextElement(0)); } else if (elt instanceof TMLWaitEvent) { tmlevt = (TMLActivityElementEvent)elt; code = "WAIT " + tmlevt.getEvent().getName() + " " + tmlevt.getAllParams(" ") + CR; return code + makeBehavior(task, elt.getNextElement(0)); } else if (elt instanceof TMLNotifiedEvent) { tmlevt = (TMLActivityElementEvent)elt; code = "NOTIFIED " + tmlevt.getEvent().getName() + " " + tmlevt.getVariable() + CR; return code + makeBehavior(task, elt.getNextElement(0)); } else if (elt instanceof TMLSendRequest) { tmlreq = (TMLSendRequest)elt; code = "REQUEST " + tmlreq.getRequest().getName() + " " + tmlreq.getAllParams(" ") + CR; return code + makeBehavior(task, elt.getNextElement(0)); } else if (elt instanceof TMLSequence) { code = ""; for(i=0; i<elt.getNbNext(); i++) { code += makeBehavior(task, elt.getNextElement(i)); } return code; } else if (elt instanceof TMLChoice) { TMLChoice choice = (TMLChoice)elt; code = ""; if (choice.getNbGuard() !=0 ) { code1 = ""; int index1 = choice.getElseGuard(), index2 = choice.getAfterGuard(); int nb = Math.max(choice.nbOfNonDeterministicGuard(), choice.nbOfStochasticGuard()); if (nb > 0) { // Assumed to be a non deterministic choice code += "RAND" + CR; } nb = 0; for(i=0; i<choice.getNbGuard(); i++) { if (i != index2) { if (choice.isNonDeterministicGuard(i)) { code2 = "" + (int)(Math.floor(100/choice.getNbGuard())); nb ++; } else if (choice.isStochasticGuard(i)){ code2 = prepareString(choice.getStochasticGuard(i)); nb ++; } else { code2 = modifyString(choice.getGuard(i)); code2 = Conversion.replaceAllChar(code2, '[', "("); code2 = Conversion.replaceAllChar(code2, ']', ")"); } //TraceManager.addDev("guard = " + code1 + " i=" + i); if (nb != 0) { //if (choice.isNonDeterministicGuard(i)) { // code = "CASERAND 50"; //} else { // code = "CASERAND " + prepareString(choice.getStochasticGuard(i)); // //} //nb ++; if (i != index1) { code += "CASERAND " + code2 + CR; code += makeBehavior(task, elt.getNextElement(i)); code += "ENDCASERAND" + CR; } } else { if (i==0) { code += "IF " + code2; } else { if (i != index1) { code += "ORIF " + code2; } else { code += "ELSE"; } } code += CR + makeBehavior(task, elt.getNextElement(i)); } } } if (nb > 0) { // Assumed to be a non deterministic choice code += "ENDRAND" + CR; } else { code += "ENDIF" + CR; } if (index2 != -1) { code += makeBehavior(task, elt.getNextElement(index2)); } } return code; } else if (elt instanceof TMLSelectEvt) { code = "SELECTEVT" + CR; for(i=0; i<elt.getNbNext(); i++) { try { tmlevt = (TMLActivityElementEvent)(elt.getNextElement(i)); code += "CASE "; code += tmlevt.getEvent().getName() + " " + tmlevt.getAllParams(" ") + CR; code += makeBehavior(task, elt.getNextElement(i).getNextElement(0)); code += "ENDCASE" + CR; } catch (Exception e) { TraceManager.addError("Non-event receiving following a select event operator"); } } code += "ENDSELECTEVT" + CR; return code; } else if (elt instanceof TMLRandomSequence) { code = "RANDOMSEQ" + CR; for(i=0; i<elt.getNbNext(); i++) { code += "SEQ" + CR; code += makeBehavior(task, elt.getNextElement(i)); code += "ENDSEQ" + CR; } code += "ENDRANDOMSEQ" + CR; return code; } else { if (elt == null) { return ""; } TraceManager.addDev("Unrecognized element: " + elt); return makeBehavior(task, elt.getNextElement(0)); } } public boolean makeTMLModeling(String _spec) { spec = _spec; tmlm = new TMLModeling(); errors = new ArrayList<TMLTXTError>(); warnings = new ArrayList<TMLTXTError>(); spec = Conversion.removeComments(spec); //TraceManager.addDev(spec); browseCode(); return (errors.size() == 0); } */ public String printErrors() { String ret = ""; for(TMLTXTError error: errors) { ret += "ERROR at line " + error.lineNb + ": " + error.message + CR; try { ret += "->" + spec.split("\n")[error.lineNb] + CR2; } catch (Exception e) { ret += "(Code line not accessible)" + CR; } } return ret; } public String printWarnings() { String ret = ""; for(TMLTXTError error: warnings) { ret += "WARNING at line " + error.lineNb + CR; ret += error.message + CR; } return ret; } public String printSummary() { String ret = ""; if (errors.size() == 0) { ret += printWarnings(); ret += "Compilation successful" + CR; ret += "No error, " + warnings.size() + " warning(s)" + CR; } else { ret += printErrors() + CR + printWarnings() + CR; ret += "Compilation failed" + CR; ret += errors.size() + " error(s), "+ warnings.size() + " warning(s)" + CR; } return ret; } // public void browseCode() { // // Browse lines of code one after the other // // Build accordinlgy the TMLModeling and updates errors and warnings // // In case of fatal error, immedialty quit code bowsing // // StringReader sr = new StringReader(spec); // BufferedReader br = new BufferedReader(sr); // String s; // String s1; // String [] split; // int lineNb = 0; // // inDec = true; // inTask = false; // inTaskDec = false; // inTaskBehavior = false; // // // String instruction; // // parses = new ArrayList<TMLParserSaveElt>(); // // try { // while((s = br.readLine()) != null) { // if (s != null) { // s = s.trim(); // //TraceManager.addDev("s=" + s); // s = removeUndesiredWhiteSpaces(s, lineNb); // s1 = Conversion.replaceAllString(s, "\t", " "); // s1 = Conversion.replaceRecursiveAllString(s1, " ", " "); // //TraceManager.addDev("s1=" + s1); // if (s1 != null) { // split = s1.split("\\s"); // if (split.length > 0) { // //TraceManager.addDev("analyse"); // analyseInstruction(s, lineNb, split); // //TraceManager.addDev("end analyse"); // } // } // // lineNb++; // } // } // } catch (Exception e) { // TraceManager.addError("Exception when reading specification: " + e.getMessage()); // addError(0, lineNb, 0, "Exception when reading specification"); // } // } // // public void addError(int _type, int _lineNb, int _charNb, String _msg) { // TMLTXTError error = new TMLTXTError(_type); // error.lineNb = _lineNb; // error.charNb = _charNb; // error.message = _msg; // errors.add(error); // } // // public int analyseInstruction(String _line, int _lineNb, String[] _split) { // String error; // String params; // String id; // TMLChannel ch; // TMLEvent evt; // TMLRequest request; // TMLTask t1, t2; // TMLAttribute attribute; // TMLType type; // TMLStopState stop; // TMLRandom random; // int tmp, tmp0, tmp1, i; // int dec = 0; // boolean blocking; // TMLParserSaveElt parseElt; // // //TraceManager.addDev("Analyzing instruction:" + _line); // // if (parses.size() > 0) { // parseElt = parses.get(0); // if ((parseElt.type == TMLParserSaveElt.SELECTEVT) && ((!isInstruction("CASE", _split[0]) && (!isInstruction("ENDSELECTEVT", _split[0]))))) { // error = "CASE or ENDSELECTEVT instruction expected"; // addError(0, _lineNb, 0, error); // return -1; // } // if ((parseElt.type == TMLParserSaveElt.RAND) && ((!isInstruction("CASERAND", _split[0]) && (!isInstruction("ENDRAND", _split[0]))))) { // error = "CASERAND or ENDRAND instruction expected"; // addError(0, _lineNb, 0, error); // return -1; // } // } // // // CHANNEL // if(isInstruction("CHANNEL", _split[0])) { // if (!inDec) { // error = "A channel may not be declared in a non-declaration part of a TML specification"; // addError(0, _lineNb, 0, error); // return -1; // } // // if (!((_split.length > 5) && (_split.length < 8))) { // error = "A channel must be declared with only 5 or 6 parameters, and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // if (_split.length == 7) { // dec = 1; // } else { // dec = 0; // } // // if (!checkParameter("CHANNEL", _split, 1, 0, _lineNb)) { // return -1; // } // // if (!checkParameter("CHANNEL", _split, 2, 2, _lineNb)) { // return -1; // } // // if (!checkParameter("CHANNEL", _split, 3, 1, _lineNb)) { // return -1; // } // // if (_split.length == 7) { // if (!checkParameter("CHANNEL", _split, 4, 1, _lineNb)) { // return -1; // } // } // // // if (!checkParameter("CHANNEL", _split, 4 + dec, 0, _lineNb)) { // return -1; // } // // if (!checkParameter("CHANNEL", _split, 5 + dec, 0, _lineNb)) { // return -1; // } // // if (tmlm.getChannelByName(_split[1]) != null) { // error = "Duplicate definition of channel " + _split[1]; // addError(0, _lineNb, 0, error); // return -1; // } // // if (_split[2].toUpperCase().compareTo("NIB") == 0) { // // } // // ch = new TMLChannel(_split[1], null); // ch.setTypeByName(_split[2]); // try { // tmp = Integer.decode(_split[3]).intValue(); // } catch (Exception e) {tmp = 4;} // ch.setSize(tmp); // // if (_split.length == 7) { // try { // tmp = Integer.decode(_split[4]).intValue(); // } catch (Exception e) {tmp = 8;} // //TraceManager.addDev("Setting max to" + tmp); // ch.setMax(tmp); // } // // t1 = tmlm.getTMLTaskByName(_split[4+dec]); // if (t1 == null) { // t1 = new TMLTask(_split[4+dec], null, null); // //TraceManager.addDev("New task:" + _split[4+dec]); // tmlm.addTask(t1); // } // t2 = tmlm.getTMLTaskByName(_split[5+dec]); // if (t2 == null) { // t2 = new TMLTask(_split[5+dec], null, null); // //TraceManager.addDev("New task:" + _split[5+dec]); // tmlm.addTask(t2); // } // ch.setTasks(t1, t2); // tmlm.addChannel(ch); // } // CHANNEL // // // // LOSSYCHANNEL // if(isInstruction("LOSSYCHANNEL", _split[0])) { // if (!inDec) { // error = "A lossychannel may not be declared in a non-declaration part of a TML specification"; // addError(0, _lineNb, 0, error); // return -1; // } // // if (!((_split.length > 3) && (_split.length < 5))) { // error = "A lossychannel must be declared with exactly 3 parameters, and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // // if (!checkParameter("LOSSYCHANNEL", _split, 1, 0, _lineNb)) { // return -1; // } // // if (!checkParameter("LOSSYCHANNEL", _split, 2, 1, _lineNb)) { // return -1; // } // // if (!checkParameter("LOSSYCHANNEL", _split, 3, 9, _lineNb)) { // return -1; // } // // // ch = tmlm.getChannelByName(_split[1]); // if (ch == null) { // error = "lossy channel not previsouly declared as a regular channel " + _split[1]; // addError(0, _lineNb, 0, error); // return -1; // } // // try { // tmp0 = Integer.decode(_split[2]).intValue(); // } catch (Exception e) {tmp0 = 5;} // try { // tmp1 = Integer.decode(_split[3]).intValue(); // } catch (Exception e) {tmp1 = -1;} // // ch.setLossy(true, tmp0, tmp1); // } // LOSSYCHANNEL // // // EVENT // if(isInstruction("EVENT", _split[0])) { // if (!inDec) { // error = "An event may not be declared in a non-declaration part of a TML specification"; // addError(0, _lineNb, 0, error); // return -1; // } // // if (!((_split.length > 4) && (_split.length < 7))) { // error = "An event must be declared with only 4 or 5 parameters, and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // if (_split.length == 6) { // dec = 1; // } else { // dec = 0; // } // // id = getEvtId(_split[1]); // params = getParams(_split[1]); // // //TraceManager.addDev("Evt id=" + id + "params=" + params); // // if (!checkParameter("EVENT", _split, 1, 4, _lineNb)) { // return -1; // } // // if (!checkParameter("EVENT", _split, 2, 3, _lineNb)) { // return -1; // } // // if (_split.length == 6) { // if (!checkParameter("EVENT", _split, 3, 1, _lineNb)) { // return -1; // } // } // // if (!checkParameter("EVENT", _split, 3 + dec, 0, _lineNb)) { // return -1; // } // // if (!checkParameter("EVENT", _split, 4 + dec, 0, _lineNb)) { // return -1; // } // // if (tmlm.getEventByName(id) != null) { // error = "Duplicate definition of event " + id; // addError(0, _lineNb, 0, error); // return -1; // } // // if (_split[2].toUpperCase().compareTo("NIB") == 0) { // blocking = true; // } else { // blocking = false; // } // // if (_split[2].toUpperCase().compareTo("INF") == 0) { // tmp = -1; // } else { // try { // tmp = Integer.decode(_split[3]).intValue(); // } catch (Exception e) { // error = "Unvalid parameter #3: should be a numeric value"; // addError(0, _lineNb, 0, error); // return -1; // } // } // // evt = new TMLEvent(id, null, tmp, blocking); // evt.addParam(params); // // t1 = tmlm.getTMLTaskByName(_split[3+dec]); // if (t1 == null) { // t1 = new TMLTask(_split[3+dec], null, null); // //TraceManager.addDev("New task:" + _split[3+dec]); // tmlm.addTask(t1); // } // t2 = tmlm.getTMLTaskByName(_split[4+dec]); // if (t2 == null) { // t2 = new TMLTask(_split[4+dec], null, null); // //TraceManager.addDev("New task:" + _split[4+dec]); // tmlm.addTask(t2); // } // evt.setTasks(t1, t2); // tmlm.addEvent(evt); // // // } // EVENT // // // LOSSYEVENT // if(isInstruction("LOSSYEVENT", _split[0])) { // if (!inDec) { // error = "A lossyevent may not be declared in a non-declaration part of a TML specification"; // addError(0, _lineNb, 0, error); // return -1; // } // // if (!((_split.length > 3) && (_split.length < 5))) { // error = "A lossyevent must be declared with exactly 3 parameters, and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // // if (!checkParameter("LOSSYEVENT", _split, 1, 0, _lineNb)) { // return -1; // } // // if (!checkParameter("LOSSYEVENT", _split, 2, 1, _lineNb)) { // return -1; // } // // if (!checkParameter("LOSSYEVENT", _split, 3, 9, _lineNb)) { // return -1; // } // // // evt = tmlm.getEventByName(_split[1]); // if (evt == null) { // error = "lossyevent not previsouly declared as a regular event " + _split[1]; // addError(0, _lineNb, 0, error); // return -1; // } // // try { // tmp0 = Integer.decode(_split[2]).intValue(); // } catch (Exception e) {tmp0 = 5;} // try { // tmp1 = Integer.decode(_split[3]).intValue(); // } catch (Exception e) {tmp1 = -1;} // // evt.setLossy(true, tmp0, tmp1); // } // LOSSYEVENT // // // REQUEST // if((isInstruction("REQUEST", _split[0])) && (inDec)) { // if (!inDec) { // error = "A request may not be declared in a non-declaration part of a TML specification"; // addError(0, _lineNb, 0, error); // return -1; // } // // if (_split.length < 4) { // error = "A request must be declared with at least 4 paremeters, and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // // id = getEvtId(_split[1]); // params = getParams(_split[1]); // // //TraceManager.addDev("Evt id=" + id + "params=" + params); // // if (!checkParameter("REQUEST", _split, 1, 4, _lineNb)) { // return -1; // } // // for(i=2; i<_split.length; i++) { // if (!checkParameter("REQUEST", _split, i, 0, _lineNb)) { // return -1; // } // } // // if (tmlm.getRequestByName(id) != null) { // error = "Duplicate definition of request " + id; // addError(0, _lineNb, 0, error); // return -1; // } // // request = new TMLRequest(id, null); // request.addParam(params); // // for(i=2; i<_split.length; i++) { // t1 = tmlm.getTMLTaskByName(_split[i]); // if (t1 == null) { // t1 = new TMLTask(_split[i], null, null); // //TraceManager.addDev("New task:" + _split[i]); // tmlm.addTask(t1); // } // if ((i+1) == _split.length) { // request.setDestinationTask(t1); // t1.setRequested(true); // t1.setRequest(request); // } else { // request.addOriginTask(t1); // } // } // // tmlm.addRequest(request); // } // REQUEST // // // LOSSYREQUEST // if(isInstruction("LOSSYREQUEST", _split[0])) { // if (!inDec) { // error = "A lossyrequest may not be declared in a non-declaration part of a TML specification"; // addError(0, _lineNb, 0, error); // return -1; // } // // if (!((_split.length > 3) && (_split.length < 5))) { // error = "A lossyrequest must be declared with exactly 3 parameters, and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // // if (!checkParameter("LOSSYREQUEST", _split, 1, 0, _lineNb)) { // return -1; // } // // if (!checkParameter("LOSSYREQUEST", _split, 2, 1, _lineNb)) { // return -1; // } // // if (!checkParameter("LOSSYREQUEST", _split, 3, 9, _lineNb)) { // return -1; // } // // // request = tmlm.getRequestByName(_split[1]); // if (request == null) { // error = "lossyrequest not previsouly declared as a regular event " + _split[1]; // addError(0, _lineNb, 0, error); // return -1; // } // // try { // tmp0 = Integer.decode(_split[2]).intValue(); // } catch (Exception e) {tmp0 = 5;} // try { // tmp1 = Integer.decode(_split[3]).intValue(); // } catch (Exception e) {tmp1 = -1;} // // request.setLossy(true, tmp0, tmp1); // } // LOSSYREQUEST // // // TASK // if((isInstruction("TASK", _split[0]))) { // // //TraceManager.addDev("In task"); // if (inTask) { // error = "A task may not be declared in the body of another task"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = true; // inTaskBehavior = false; // // if (_split.length != 2) { // error = "A request must be declared with exactly 2 parameters, and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // if (!checkParameter("TASK", _split, 1, 0, _lineNb)) { // return -1; // } // // //TraceManager.addDev("In task: 12"); // task = tmlm.getTMLTaskByName(_split[1]); // if ((task != null) && (task.getActivityDiagram() != null)) { // if (task.getActivityDiagram().getFirst() != null) { // error = "Duplicate definition for task "+ (_split[1]); // addError(0, _lineNb, 0, error); // return -1; // } // } // //TraceManager.addDev("In task: 13"); // if (task == null) { // task = new TMLTask(_split[1], null, null); // tmlm.addTask(task); // //TraceManager.addDev("New task:" + _split[1]); // } // // TMLStartState start = new TMLStartState("start", null); // task.getActivityDiagram().setFirst(start); // tmlae = start; // // // } // TASK // // // // ENDTASK // if((isInstruction("ENDTASK", _split[0]))) { // if (!inTask) { // error = "A endtask may not be used outside the body of a task"; // addError(0, _lineNb, 0, error); // return -1; // } // inDec = true; // inTask = false; // inTaskDec = false; // inTaskBehavior = false; // // stop = new TMLStopState("stop", null); // task.getActivityDiagram().addElement(stop); // tmlae.addNext(stop); // // task = null; // } // ENDTASK // // // // Attribute declaration // if ((isInstruction("INT", _split[0])) || (isInstruction("NAT", _split[0])) || (isInstruction("BOOL", _split[0]))){ // if (!inTaskDec) { // error = "An attribute declaration must be done in a task right after its declaration, and before its bahavior"; // addError(0, _lineNb, 0, error); // return -1; // } // // String inst = _split[0].toUpperCase(); // // if (!((_split.length == 2) || (_split.length == 4))) { // error = "An attribute declaration must be done with either 1 or 3 parameters, and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // if (!checkParameter(inst, _split, 1, 0, _lineNb)) { // return -1; // } // // if (_split.length > 2) { // if (!checkParameter(inst, _split, 2, 5, _lineNb)) { // return -1; // } // if (!checkParameter(inst, _split, 3, 6, _lineNb)) { // return -1; // } // } // // //TraceManager.addDev("Adding attribute " + _split[0] + " " + _split[1]); // // TMLAttribute ta = new TMLAttribute(_split[1], new TMLType(TMLType.getType(_split[0]))); // if (_split.length > 2) { // ta.initialValue = _split[3]; // } else { // ta.initialValue = ta.getDefaultInitialValue(); // } // task.addAttribute(ta); // } // Attribute declaration // // // RANDOM // if((isInstruction("RANDOM", _split[0]))) { // // if (!inTask) { // error = "A RANDOM operation may only be performed in a task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // if (_split.length != 5) { // error = "A RANDOM operation must be declared with exactly 4 parameters, and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // if (!checkParameter("RANDOM", _split, 1, 1, _lineNb)) { // return -1; // } // // if (!checkParameter("RANDOM", _split, 2, 0, _lineNb)) { // return -1; // } // // random = new TMLRandom("random", null); // try { // random.setFunctionId(Integer.decode(_split[1]).intValue()); // } catch (Exception e) { // } // // random.setVariable(_split[2]); // random.setMinValue(_split[3]); // random.setMaxValue(_split[4]); // // TraceManager.addDev("RANDOM min=" + random.getMinValue() + " max=" + random.getMaxValue()); // // task.getActivityDiagram().addElement(random); // tmlae.addNext(random); // tmlae = random; // // } // RANDOM // // // READ // if((isInstruction("READ", _split[0]))) { // // if (!inTask) { // error = "A READ operation may only be performed in a task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // if (_split.length != 3) { // error = "A READ operation must be declared with exactly 3 parameters, and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // if (!checkParameter("READ", _split, 1, 0, _lineNb)) { // return -1; // } // // /*if (!checkParameter("READ", _split, 2, 7, _lineNb)) { // return -1; // }*/ // // ch = tmlm.getChannelByName(_split[1]); // if (ch == null ){ // error = "Undeclared channel: " + _split[1]; // addError(0, _lineNb, 0, error); // return -1; // } // if (ch.getDestinationTask() != task ){ // error = "READ operations must be done only in destination task. Should be in task: " + ch.getDestinationTask().getName(); // addError(0, _lineNb, 0, error); // return -1; // } // // // TMLReadChannel tmlrch = new TMLReadChannel(_split[1], null); // tmlrch.addChannel(ch); // tmlrch.setNbOfSamples(_split[2]); // task.getActivityDiagram().addElement(tmlrch); // tmlae.addNext(tmlrch); // tmlae = tmlrch; // // } // READ // // // WRITE // if((isInstruction("WRITE", _split[0]))) { // // if (!inTask) { // error = "A WRITE operation may only be performed in a task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // if (_split.length < 3) { // error = "A WRITE operation must be declared with at most 3 parameters, and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // if (!checkParameter("WRITE", _split, 1, 0, _lineNb)) { // return -1; // } // // TMLWriteChannel tmlwch = new TMLWriteChannel(_split[1], null); // for(int k=0; k<_split.length-2; k++) { // ch = tmlm.getChannelByName(_split[1+k]); // if (ch == null ){ // error = "Undeclared channel: " + _split[1+k]; // addError(0, _lineNb, 0, error); // return -1; // } // if (ch.getOriginTask() != task ){ // error = "WRITE operations must be done only in origin task. Should be in task: " + ch.getOriginTask().getName(); // addError(0, _lineNb, 0, error); // return -1; // } // // tmlwch.addChannel(ch); // } // // tmlwch.setNbOfSamples(_split[2]); // task.getActivityDiagram().addElement(tmlwch); // tmlae.addNext(tmlwch); // tmlae = tmlwch; // // } // WRITE // // // NOTIFY // if((isInstruction("NOTIFY", _split[0]))) { // // if (!inTask) { // error = "A NOTIFY operation may only be performed in a task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // if (_split.length < 2) { // error = "A NOTIFY operation must be declared with at least 2 parameters, and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // evt = tmlm.getEventByName(_split[1]); // if (evt == null) { // error = "Unknown event: " + _split[1] ; // addError(0, _lineNb, 0, error); // return -1; // } // // dec = evt.getNbOfParams(); // // if (_split.length != 2 + dec) { // error = "A NOTIFY operation on evt " + evt.getName() + " must be declared with exactly " + (1 + dec) + " parameters and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // TMLSendEvent sevt = new TMLSendEvent(evt.getName(), null); // sevt.setEvent(evt); // for(i=2; i<2 + dec; i++) { // sevt.addParam(_split[i]); // } // // task.getActivityDiagram().addElement(sevt); // tmlae.addNext(sevt); // tmlae = sevt; // } // NOTIFY // // // WAIT // if((isInstruction("WAIT", _split[0]))) { // // if (!inTask) { // error = "A WAIT operation may only be performed in a task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // if (_split.length < 2) { // error = "A WAIT operation must be declared with at least 2 parameters, and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // evt = tmlm.getEventByName(_split[1]); // if (evt == null) { // error = "Unknown event: " + _split[1] ; // addError(0, _lineNb, 0, error); // return -1; // } // // dec = evt.getNbOfParams(); // // if (_split.length != 2 + dec) { // error = "A WAIT operation on evt " + evt.getName() + " must be declared with exactly " + (1 + dec) + " parameters and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // // Each param must be a declared attribute of the right type // for(i=2; i<2 + dec; i++) { // attribute = task.getAttributeByName(_split[i]); // if (attribute == null) { // error = "Attribute: " + _split[i] + " is undeclared"; // addError(0, _lineNb, 0, error); // return -1; // } // if (attribute.type.getType() != evt.getType(i-2).getType()) { // error = "Attribute: " + _split[i] + " is not of the right type"; // addError(0, _lineNb, 0, error); // return -1; // } // } // // // TMLWaitEvent wevt = new TMLWaitEvent(evt.getName(), null); // wevt.setEvent(evt); // for(i=2; i<2 + dec; i++) { // wevt.addParam(_split[i]); // } // // task.getActivityDiagram().addElement(wevt); // tmlae.addNext(wevt); // tmlae = wevt; // } // WAIT // // // NOTIFIED // if((isInstruction("NOTIFIED", _split[0]))) { // // if (!inTask) { // error = "A NOTIFIED operation may only be performed in a task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // if (_split.length != 3) { // error = "A NOTIFIED operation must be declared with exactly 2 parameters, and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // evt = tmlm.getEventByName(_split[1]); // if (evt == null) { // error = "Unknown event: " + _split[1] ; // addError(0, _lineNb, 0, error); // return -1; // } // // attribute = task.getAttributeByName(_split[2]); // if (attribute == null) { // error = "Attribute: " + _split[2] + " is undeclared"; // addError(0, _lineNb, 0, error); // return -1; // } // if (attribute.type.getType() != TMLType.NATURAL) { // error = "Attribute: " + _split[2] + " should be of natural type"; // addError(0, _lineNb, 0, error); // return -1; // } // // TMLNotifiedEvent nevt = new TMLNotifiedEvent(evt.getName(), null); // nevt.setEvent(evt); // nevt.setVariable(_split[2]); // // task.getActivityDiagram().addElement(nevt); // tmlae.addNext(nevt); // tmlae = nevt; // } // NOTIFIED // // // Send REQUEST // if((isInstruction("REQUEST", _split[0])) && (inTask)) { // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // if (_split.length < 2) { // error = "A REQUEST operation must be declared with at least 1 parameter (request name), and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // request = tmlm.getRequestByName(_split[1]); // if (request == null) { // error = "Unknown request: " + _split[1] ; // addError(0, _lineNb, 0, error); // return -1; // } // // dec = request.getNbOfParams(); // // if (_split.length != 2 + dec) { // error = "A REQUEST operation on request " + request.getName() + " must be declared with exactly " + (1 + dec) + " parameters and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // TMLSendRequest sreq = new TMLSendRequest(request.getName(), null); // sreq.setRequest(request); // for(i=2; i<2 + dec; i++) { // sreq.addParam(_split[i]); // } // // task.getActivityDiagram().addElement(sreq); // tmlae.addNext(sreq); // tmlae = sreq; // } // Send REQUEST // // // FOR // if((isInstruction("FOR", _split[0])) && (inTask)) { // //TraceManager.addDev("FOR encountered"); // if (_split.length < 2) { // error = "FOR operation: missing parameters"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // // Extract the three elements of FOR // String forp = _split[1]; // String forps[]; // tmp0 = forp.indexOf('('); // tmp1 = forp.lastIndexOf(')'); // if ((tmp0 == -1) || (tmp1 == -1)) { // error = "FOR operation: badly formed parameters"; // addError(0, _lineNb, 0, error); // return -1; // } // forp = forp.substring(tmp0+1, tmp1); // forps = forp.split(";"); // if (forps.length != 3) { // error = "FOR operation: badly formed parameters"; // addError(0, _lineNb, 0, error); // return -1; // } // // // All is ok: constructing the FOR // parseElt = new TMLParserSaveElt(); // parseElt.type = TMLParserSaveElt.FOR; // parses.add(0, parseElt); // TMLForLoop loop = new TMLForLoop("loop", null); // loop.setInit(forps[0].trim()); // loop.setCondition(forps[1].trim()); // loop.setIncrement(forps[2].trim()); // task.getActivityDiagram().addElement(loop); // parseElt.tmlae = loop; // tmlae.addNext(loop); // tmlae = loop; // // } // FOR // // // ENDFOR // if(isInstruction("ENDFOR", _split[0])) { // if (!inTask) { // error = "ENDFOR: must be used in a Task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // // Extract the first element of the stack // if (parses.size() == 0) { // error = "ENDFOR: badly placed instruction."; // addError(0, _lineNb, 0, error); // return -1; // } // parseElt = parses.get(0); // if (parseElt.type != TMLParserSaveElt.FOR) { // error = "ENDFOR: badly placed instruction. Was expecting: " + parseElt.getExpectedInstruction(); // addError(0, _lineNb, 0, error); // return -1; // } // // // All is ok: constructing the FOR // parses.remove(0); // stop = new TMLStopState("stop loop", null); // task.getActivityDiagram().addElement(stop); // tmlae.addNext(stop); // tmlae = parseElt.tmlae; // } // ENDFOR // // // SELECTEVT // if((isInstruction("SELECTEVT", _split[0]))) { // if (!inTask) { // error = "SELECTEVT: must be used in a Task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // if(_split.length > 1) { // error = "A SELECTEVT cannot have any parameters"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // parseElt = new TMLParserSaveElt(); // parseElt.type = TMLParserSaveElt.SELECTEVT; // parses.add(0, parseElt); // TMLSequence seq = new TMLSequence("sequence", null); // parseElt.top = seq; // tmlae.addNext(seq); // TMLSelectEvt sel = new TMLSelectEvt("select evt", null); // parseElt.tmlae = sel; // seq.addNext(sel); // task.getActivityDiagram().addElement(seq); // task.getActivityDiagram().addElement(sel); // tmlae = sel; // } // SELECTEVT // // // ENDSELECTEVT // if((isInstruction("ENDSELECTEVT", _split[0]))) { // if (!inTask) { // error = "ENDSELECTEVT: must be used in a Task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // // Extract the first element of the stack // if (parses.size() == 0) { // error = "ENDSELECTEVT: badly placed instruction."; // addError(0, _lineNb, 0, error); // return -1; // } // parseElt = parses.get(0); // if (parseElt.type != TMLParserSaveElt.SELECTEVT) { // error = "ENDSELECTEVT: badly placed instruction. Was expecting: " + parseElt.getExpectedInstruction(); // addError(0, _lineNb, 0, error); // return -1; // } // // parses.remove(0); // tmlae = parseElt.top; // } // ENDSELECTEVT // // // CASE // if((isInstruction("CASE", _split[0]))) { // if (!inTask) { // error = "CASE: must be used in a Task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // if (parses.size() == 0) { // error = "CASE: corresponding SELECTEVT not found"; // addError(0, _lineNb, 0, error); // return -1; // } else { // parseElt = parses.get(0); // if (parseElt.type != TMLParserSaveElt.SELECTEVT) { // error = "CASE: corresponding SELECTEVT not found"; // addError(0, _lineNb, 0, error); // return -1; // } // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // if(_split.length < 2) { // error = "A CASE must have at least two parameters"; // addError(0, _lineNb, 0, error); // return -1; // } // // evt = tmlm.getEventByName(_split[1]); // if (evt == null) { // error = "Unknown event: " + _split[1] ; // addError(0, _lineNb, 0, error); // return -1; // } // // dec = evt.getNbOfParams(); // // if (_split.length != 2 + dec) { // error = "A CASE operation on evt " + evt.getName() + " must be declared with exactly " + (1 + dec) + " parameters and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // TMLWaitEvent wevt = new TMLWaitEvent(evt.getName(), null); // wevt.setEvent(evt); // for(i=2; i<2 + dec; i++) { // wevt.addParam(_split[i]); // } // // task.getActivityDiagram().addElement(wevt); // tmlae.addNext(wevt); // // parseElt = new TMLParserSaveElt(); // parseElt.type = TMLParserSaveElt.CASE; // parseElt.tmlae = wevt; // parseElt.top = tmlae; // parses.add(0, parseElt); // // tmlae = wevt; // } // CASE // // // // ENDCASE // if((isInstruction("ENDCASE", _split[0]))) { // if (!inTask) { // error = "ENDCASE: must be used in a Task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // // Extract the first element of the stack // if (parses.size() == 0) { // error = "ENDCASE: badly placed instruction."; // addError(0, _lineNb, 0, error); // return -1; // } // parseElt = parses.get(0); // if (parseElt.type != TMLParserSaveElt.CASE) { // error = "ENDCASE: badly placed instruction. Was expecting: " + parseElt.getExpectedInstruction(); // addError(0, _lineNb, 0, error); // return -1; // } // parses.remove(0); // stop = new TMLStopState("stop case", null); // task.getActivityDiagram().addElement(stop); // tmlae.addNext(stop); // tmlae = parseElt.top; // } // ENDCASE // // // RANDOMSEQ // if((isInstruction("RANDOMSEQ", _split[0]))) { // if (!inTask) { // error = "RANDOMSEQ: must be used in a Task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // if(_split.length > 1) { // error = "A RANDOMSEQ cannot have any parameters"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // parseElt = new TMLParserSaveElt(); // parseElt.type = TMLParserSaveElt.RANDOMSEQ; // parses.add(0, parseElt); // TMLSequence seq = new TMLSequence("sequence", null); // parseElt.top = seq; // tmlae.addNext(seq); // TMLRandomSequence rseq = new TMLRandomSequence("random sequence", null); // parseElt.tmlae = rseq; // seq.addNext(rseq); // task.getActivityDiagram().addElement(seq); // task.getActivityDiagram().addElement(rseq); // tmlae = rseq; // } // RANDOMSEQ // // // ENDRANDOMSEQ // if((isInstruction("ENDRANDOMSEQ", _split[0]))) { // if (!inTask) { // error = "ENDRANDOMSEQ: must be used in a Task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // // Extract the first element of the stack // if (parses.size() == 0) { // error = "ENDRANDOMSEQ: badly placed instruction."; // addError(0, _lineNb, 0, error); // return -1; // } // parseElt = parses.get(0); // if (parseElt.type != TMLParserSaveElt.RANDOMSEQ) { // error = "ENDRANDOMSEQ: badly placed instruction. Was expecting: " + parseElt.getExpectedInstruction(); // addError(0, _lineNb, 0, error); // return -1; // } // // parses.remove(0); // tmlae = parseElt.top; // } // ENDRANDOMSEQ // // // // SEQ // if((isInstruction("SEQ", _split[0]))) { // if (!inTask) { // error = "SEQ: must be used in a Task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // if (parses.size() == 0) { // error = "SEQ: corresponding RANDOMSEQ not found"; // addError(0, _lineNb, 0, error); // return -1; // } else { // parseElt = parses.get(0); // if (parseElt.type != TMLParserSaveElt.RANDOMSEQ) { // error = "SEQ: corresponding RANDOMSEQ not found"; // addError(0, _lineNb, 0, error); // return -1; // } // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // if(_split.length >1 ) { // error = "A SEQ has no parameter"; // addError(0, _lineNb, 0, error); // return -1; // } // // if (!(parseElt.tmlae instanceof TMLRandomSequence)) { // error = "Malformed specification: unexpected SEQ"; // addError(0, _lineNb, 0, error); // return -1; // } // // TMLRandomSequence rseq = (TMLRandomSequence)parseElt.tmlae; // TMLSequence seq = new TMLSequence("sequence", null); // rseq.addNext(seq); // // task.getActivityDiagram().addElement(seq); // // parseElt = new TMLParserSaveElt(); // parseElt.type = TMLParserSaveElt.SEQ; // parseElt.tmlae = seq; // parseElt.top = rseq; // parses.add(0, parseElt); // // tmlae = seq; // } // SEQ // // // ENDSEQ // if((isInstruction("ENDSEQ", _split[0]))) { // if (!inTask) { // error = "ENDSEQ: must be used in a Task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // // Extract the first element of the stack // if (parses.size() == 0) { // error = "ENDSEQ: badly placed instruction."; // addError(0, _lineNb, 0, error); // return -1; // } // parseElt = parses.get(0); // if (parseElt.type != TMLParserSaveElt.SEQ) { // error = "ENDSEQ: badly placed instruction. Was expecting: " + parseElt.getExpectedInstruction(); // addError(0, _lineNb, 0, error); // return -1; // } // parses.remove(0); // stop = new TMLStopState("stop case", null); // task.getActivityDiagram().addElement(stop); // tmlae.addNext(stop); // tmlae = parseElt.top; // } // ENDSEQ // // // RAND // if((isInstruction("RAND", _split[0]))) { // if (!inTask) { // error = "RAND: must be used in a Task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // if(_split.length > 1) { // error = "A RAND cannot have any parameters"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // parseElt = new TMLParserSaveElt(); // parseElt.type = TMLParserSaveElt.RAND; // parses.add(0, parseElt); // TMLSequence seq = new TMLSequence("sequence", null); // parseElt.top = seq; // tmlae.addNext(seq); // TMLChoice choice = new TMLChoice("choice evt", null); // parseElt.tmlae = choice; // seq.addNext(choice); // task.getActivityDiagram().addElement(seq); // task.getActivityDiagram().addElement(choice); // tmlae = choice; // } // RAND // // // ENDRAND // if((isInstruction("ENDRAND", _split[0]))) { // if (!inTask) { // error = "ENDRAND: must be used in a Task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // // Extract the first element of the stack // if (parses.size() == 0) { // error = "ENDRAND: badly placed instruction."; // addError(0, _lineNb, 0, error); // return -1; // } // parseElt = parses.get(0); // if (parseElt.type != TMLParserSaveElt.RAND) { // error = "ENDRAND: badly placed instruction. Was expecting: " + parseElt.getExpectedInstruction(); // addError(0, _lineNb, 0, error); // return -1; // } // // parses.remove(0); // tmlae = parseElt.top; // } // ENDRAND // // // CASERAND // if((isInstruction("CASERAND", _split[0]))) { // if (!inTask) { // error = "CASERAND: must be used in a Task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // if (parses.size() == 0) { // error = "CASERAND: corresponding RAND not found"; // addError(0, _lineNb, 0, error); // return -1; // } else { // parseElt = parses.get(0); // if (parseElt.type != TMLParserSaveElt.RAND) { // error = "CASERAND: corresponding RAND not found"; // addError(0, _lineNb, 0, error); // return -1; // } // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // if(_split.length != 2) { // error = "A CASERAND should have one parameter"; // addError(0, _lineNb, 0, error); // return -1; // } // // if (!(parseElt.tmlae instanceof TMLChoice)) { // error = "Malformed specification"; // addError(0, _lineNb, 0, error); // return -1; // } // // TMLChoice choice = (TMLChoice)parseElt.tmlae; // TMLSequence seq = new TMLSequence("sequence", null); // choice.addGuard("[" + _split[1] + "%]"); // choice.addNext(seq); // // task.getActivityDiagram().addElement(seq); // // parseElt = new TMLParserSaveElt(); // parseElt.type = TMLParserSaveElt.CASERAND; // parseElt.tmlae = seq; // parseElt.top = choice; // parses.add(0, parseElt); // // tmlae = seq; // // } // CASERAND // // // // ENDCASERAND // if((isInstruction("ENDCASERAND", _split[0]))) { // if (!inTask) { // error = "ENDCASERAND: must be used in a Task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // // Extract the first element of the stack // if (parses.size() == 0) { // error = "ENDCASERAND: badly placed instruction."; // addError(0, _lineNb, 0, error); // return -1; // } // parseElt = parses.get(0); // if (parseElt.type != TMLParserSaveElt.CASERAND) { // error = "ENDCASERAND: badly placed instruction. Was expecting: " + parseElt.getExpectedInstruction(); // addError(0, _lineNb, 0, error); // return -1; // } // parses.remove(0); // stop = new TMLStopState("stop case", null); // task.getActivityDiagram().addElement(stop); // tmlae.addNext(stop); // tmlae = parseElt.top; // } // ENDCASERAND // // // IF // if((isInstruction("IF", _split[0]))) { // if (!inTask) { // error = "IF: must be used in a Task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // if(_split.length != 2) { // error = "IF should be followed by one condition"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // String cond = _split[1].trim(); // tmp0 = cond.indexOf('('); // tmp1 = cond.lastIndexOf(')'); // if ((tmp0 == -1) || (tmp1 == -1)) { // error = "IF operation: badly formed condition"; // addError(0, _lineNb, 0, error); // return -1; // } // cond = cond.substring(tmp0+1, tmp1); // // parseElt = new TMLParserSaveElt(); // parseElt.type = TMLParserSaveElt.IF; // parses.add(0, parseElt); // TMLSequence seq = new TMLSequence("sequence", null); // parseElt.top = seq; // tmlae.addNext(seq); // TMLChoice choice = new TMLChoice("if", null); // parseElt.tmlae = choice; // seq.addNext(choice); // task.getActivityDiagram().addElement(seq); // task.getActivityDiagram().addElement(choice); // // seq = new TMLSequence("sequence", null); // task.getActivityDiagram().addElement(seq); // choice.addNext(seq); // choice.addGuard("[" + cond + "]"); // // tmlae = seq; // } // IF // // // ORIF // if((isInstruction("ORIF", _split[0]))) { // if (!inTask) { // error = "ORIF: must be used in a Task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // if(_split.length != 2) { // error = "ORIF should be followed by one condition"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // // String cond = _split[1].trim(); // //TraceManager.addDev("cond1=" + cond); // tmp0 = cond.indexOf('('); // tmp1 = cond.lastIndexOf(')'); // if ((tmp0 == -1) || (tmp1 == -1)) { // error = "ORIF operation: badly formed condition"; // addError(0, _lineNb, 0, error); // return -1; // } // cond = cond.substring(tmp0+1, tmp1); // //TraceManager.addDev("cond2=" + cond); // // if (parses.size() == 0) { // error = "ORIF: badly placed instruction."; // addError(0, _lineNb, 0, error); // return -1; // } // parseElt = parses.get(0); // if (parseElt.type != TMLParserSaveElt.IF) { // error = "ORIF: badly placed instruction. Was expecting: " + parseElt.getExpectedInstruction(); // addError(0, _lineNb, 0, error); // return -1; // } // // if (parseElt.nbElse > 0) { // error = "ORIF: should not followed a else instruction"; // addError(0, _lineNb, 0, error); // return -1; // } // // stop = new TMLStopState("stop", null); // task.getActivityDiagram().addElement(stop); // tmlae.addNext(stop); // // TMLSequence seq = new TMLSequence("sequence", null); // TMLChoice choice = (TMLChoice)parseElt.tmlae; // task.getActivityDiagram().addElement(seq); // // choice.addNext(seq); // choice.addGuard("[" + cond + "]"); // // tmlae = seq; // } // ORIF // // // ELSE // if((isInstruction("ELSE", _split[0]))) { // if (!inTask) { // error = "ELSE: must be used in a Task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // if(_split.length != 1) { // error = "ELSE should have no parameter"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // if (parses.size() == 0) { // error = "ELSE: badly placed instruction."; // addError(0, _lineNb, 0, error); // return -1; // } // parseElt = parses.get(0); // if (parseElt.type != TMLParserSaveElt.IF) { // error = "ELSE: badly placed instruction. Was expecting: " + parseElt.getExpectedInstruction(); // addError(0, _lineNb, 0, error); // return -1; // } // // stop = new TMLStopState("stop", null); // task.getActivityDiagram().addElement(stop); // tmlae.addNext(stop); // // parseElt.nbElse ++; // // TMLSequence seq = new TMLSequence("sequence", null); // TMLChoice choice = (TMLChoice)parseElt.tmlae; // task.getActivityDiagram().addElement(seq); // // choice.addNext(seq); // choice.addGuard("[else]"); // // tmlae = seq; // } // ELSE // // // ENDIF // if((isInstruction("ENDIF", _split[0]))) { // if (!inTask) { // error = "ENDIF: must be used in a Task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // // Extract the first element of the stack // if (parses.size() == 0) { // error = "ENDIF: badly placed instruction."; // addError(0, _lineNb, 0, error); // return -1; // } // parseElt = parses.get(0); // if (parseElt.type != TMLParserSaveElt.IF) { // error = "ENDIF: badly placed instruction. Was expecting: " + parseElt.getExpectedInstruction(); // addError(0, _lineNb, 0, error); // return -1; // } // // stop = new TMLStopState("stop", null); // task.getActivityDiagram().addElement(stop); // tmlae.addNext(stop); // // parses.remove(0); // tmlae = parseElt.top; // } // ENDIF // // // EXECI // if((isInstruction("EXECI", _split[0]))) { // // if (!inTask) { // error = "An EXECI operation may only be performed in a task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // if ((_split.length < 2) ||(_split.length > 4)) { // error = "An EXECI operation must be declared with 1 or 2 parameters, and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // if (_split.length == 2) { // TMLExecI execi = new TMLExecI("execi", null); // execi.setAction(_split[1]); // tmlae.addNext(execi); // task.getActivityDiagram().addElement(execi); // tmlae = execi; // } else { // TMLExecIInterval execi = new TMLExecIInterval("execi", null); // execi.setMinDelay(_split[1]); // execi.setMaxDelay(_split[2]); // tmlae.addNext(execi); // task.getActivityDiagram().addElement(execi); // tmlae = execi; // } // } // EXECI // // // EXECC // if((isInstruction("EXECC", _split[0]))) { // // if (!inTask) { // error = "An EXECC operation may only be performed in a task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // if ((_split.length < 2) ||(_split.length > 4)) { // error = "An EXECC operation must be declared with 1 or 2 parameters, and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // if (_split.length == 2) { // TMLExecC execc = new TMLExecC("execc", null); // execc.setAction(_split[1]); // tmlae.addNext(execc); // task.getActivityDiagram().addElement(execc); // tmlae = execc; // } else { // TMLExecCInterval execci = new TMLExecCInterval("execci", null); // execci.setMinDelay(_split[1]); // execci.setMaxDelay(_split[2]); // tmlae.addNext(execci); // task.getActivityDiagram().addElement(execci); // tmlae = execci; // } // } // EXECC // // // DELAY // if((isInstruction("DELAY", _split[0]))) { // // if (!inTask) { // error = "A DELAY operation may only be performed in a task body"; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // if ((_split.length < 3) ||(_split.length > 5)) { // error = "A DELAY operation must be declared with 2 or 3 parameters, and not " + (_split.length - 1) ; // addError(0, _lineNb, 0, error); // return -1; // } // // if (_split.length == 3) { // if (!checkParameter("DELAY", _split, 2, 0, _lineNb)) { // error = "A DELAY operation must be specified with a valid time unit (ns, us, ms, s))" ; // addError(0, _lineNb, 0, error); // return -1; // } // } // // if (_split.length == 4) { // if (!checkParameter("DELAY", _split, 3, 0, _lineNb)) { // error = "A DELAY operation must be specified with a valid time unit (ns, us, ms, s))" ; // addError(0, _lineNb, 0, error); // return -1; // } // } // // TMLDelay delay = new TMLDelay("delay", null); // delay.setMinDelay(_split[1]); // if (_split.length == 3) { // delay.setMaxDelay(_split[1]); // delay.setUnit(_split[2]); // } else { // delay.setMaxDelay(_split[2]); // delay.setUnit(_split[3]); // } // // // tmlae.addNext(delay); // task.getActivityDiagram().addElement(delay); // tmlae = delay; // // } // EXECC // // // Other command // if((_split[0].length() > 0) && (!(isInstruction(_split[0])))) { // if (!inTask) { // error = "Syntax error in TML modeling: unrecognized instruction:" + _split[0]; // addError(0, _lineNb, 0, error); // return -1; // } // // inDec = false; // inTask = true; // inTaskDec = false; // inTaskBehavior = true; // // TMLActionState action = new TMLActionState(_split[0], null); // action.setAction(_line); // tmlae.addNext(action); // task.getActivityDiagram().addElement(action); // tmlae = action; // // } // Other command // // return 0; // } // // // Type 0: id // // Type 1: numeral // // Type 2: channel type // // Type 3: event type // // Type 4: event name // // Type 5: '=' // // Type 6: attribute value // // Type 7: id or numeral // // Type 8:unit // ///* public boolean checkParameter(String _inst, String[] _split, int _parameter, int _type, int _lineNb) { // boolean err = false; // String error; // // if(_parameter < _split.length) { // switch(_type) { // case 0: // if (!isAValidId(_split[_parameter])) { // err = true; // } // break; // case 1: // if (!isANumeral(_split[_parameter])) { // err = true; // } // break; // case 2: // if (!isIncluded(_split[_parameter], channeltypes)) { // err = true; // } // break; // case 3: // if (!isIncluded(_split[_parameter], eventtypes)) { // err = true; // } // break; // case 4: // if (!isAValidId(getEvtId(_split[_parameter]))) { // err = true; // //TraceManager.addDev("Unvalid id"); // } else if (!TMLEvent.isAValidListOfParams(getParams(_split[_parameter]))) { // //TraceManager.addDev("Unvalid param"); // err = true; // } // break; // case 5: // if (!(_split[_parameter].equals("="))) { // TraceManager.addDev("Error of ="); // err = true; // } // break; // case 6: // if (_inst.equals("BOOL")) { // String tmp = _split[_parameter].toUpperCase(); // if (!(tmp.equals("TRUE") || tmp.equals("FALSE"))) { // err = true; // } // } else { // if (!isANumeral(_split[_parameter])) { // err = true; // } // } // break; // case 7: // if (!isAValidId(_split[_parameter]) && !isANumeral(_split[_parameter])) { // err = true; // } // break; // case 8: // if (!isAValidUnit(_split[_parameter])) { // err = true; // } // break; // case 9: // if (!isANegativeOrPositiveNumeral(_split[_parameter])) { // err = true; // } // break; // } // } else { // err = true; // } // if (err) { // error = "Unvalid parameter #" + _parameter + "-> $" + _split[_parameter] + "$ <- in " + _inst + " instruction"; // addError(0, _lineNb, 0, error); // return false; // } // return true; // } //*/ // // public boolean isInstruction(String instcode, String inst) { // return (inst.toUpperCase().compareTo(instcode) == 0); // } // // public boolean isInstruction(String instcode) { // return (!checkKeywords(instcode)); // } // // public static boolean isAValidId(String _id) { // if ((_id == null) || (_id.length() == 0)) { // return false; // } // // boolean b1 = (_id.substring(0,1)).matches("[a-zA-Z]"); // boolean b2 = _id.matches("\\w*"); // boolean b3 = checkKeywords(_id); // // return (b1 && b2 && b3); // } // // public boolean isANumeral(String _num) { // return _num.matches("\\d*"); // } // // public boolean isANegativeOrPositiveNumeral(String _num) { // if (_num.startsWith("-")) { // return isANumeral(_num.substring(1, _num.length())); // } // return isANumeral(_num); // } // // public boolean isAValidUnit(String s) { // if (s.compareTo("ns") == 0) { // return true; // } else if (s.compareTo("us") == 0) { // return true; // } else if (s.compareTo("ms") == 0) { // return true; // } else if (s.compareTo("s") == 0) { // return true; // } // // return false; // } // // public static boolean checkKeywords(String _id) { // String id = _id.toUpperCase(); // for(int i=0; i<keywords.length; i++) { // if (id.compareTo(keywords[i]) == 0) { // return false; // } // } // return true; // } // // public boolean isIncluded(String _id, String[] _list) { // String id = _id.toUpperCase(); // for(int i=0; i<_list.length; i++) { // if (id.compareTo(_list[i]) == 0) { // return true; // } // } // return false; // } // // public String removeUndesiredWhiteSpaces(String _input, int _lineNb) { // String error, tmp; // int index0, index1, index2; // // if (_input.startsWith("EVENT ")) { // index0 = _input.indexOf('('); // index1 = _input.indexOf(')'); // if ((index0 == -1) || (index1 == -1)) { // error = "Syntax Error: should be of the form EVENT evtname(<list of max three types>) + other parameters"; // addError(0, _lineNb, 0, error); // return null; // } // return Conversion.replaceBetweenIndex(_input, index0, index1, " ", ""); // } // // if (_input.startsWith("REQUEST ") && (inDec)) { // index0 = _input.indexOf('('); // index1 = _input.indexOf(')'); // if ((index0 == -1) || (index1 == -1)) { // error = "Syntax Error: should be of the form REQUEST requestname(<list of max three types>) + other parameters"; // addError(0, _lineNb, 0, error); // return null; // } // return Conversion.replaceBetweenIndex(_input, index0, index1, " ", ""); // } // // if (_input.startsWith("FOR(")) { // _input = "FOR (" + _input.substring(4, _input.length()); // } // // if (_input.startsWith("FOR (")) { // tmp = _input.substring(5, _input.length()); // tmp = Conversion.replaceAllString(tmp, " ", ""); // return "FOR (" + tmp; // } // // if (_input.startsWith("IF(")) { // _input = "IF (" + _input.substring(3, _input.length()); // } // // if (_input.startsWith("IF (")) { // tmp = _input.substring(4, _input.length()); // tmp = Conversion.replaceAllString(tmp, " ", ""); // return "IF (" + tmp; // } // // if (_input.startsWith("ORIF(")) { // _input = "ORIF (" + _input.substring(5, _input.length()); // } // // if (_input.startsWith("ORIF (")) { // tmp = _input.substring(6, _input.length()); // tmp = Conversion.replaceAllString(tmp, " ", ""); // return "ORIF (" + tmp; // } // // return _input; // } // // private String getEvtId(String _input) { // int index = _input.indexOf('('); // if (index == -1) { // return _input; // } // return _input.substring(0, index); // } // // private String getParams(String _input) { // //TraceManager.addDev("input=" + _input); // int index0 = _input.indexOf('('); // int index1 = _input.indexOf(')'); // if ((index0 == -1) || (index1 == -1)) { // return _input; // } // return _input.substring(index0 + 1, index1); // } // // private static String prepareString(String s) { // return s.replaceAll("\\s", ""); // } // // public static String modifyString(String s) { // return prepareString(s); // } }