Skip to content
Snippets Groups Projects
GTMLModeling.java 174.13 KiB
/**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.
 *
 * /**
 * Class GTMLModeling
 * Use to translate graphical TML modeling to  "tmlmodeling"
 * Creation: 23/11/2005
 * @version 1.1 30/05/2014
 * @author Ludovic APVRILLE, Andrea ENRICI
 * @see
 */


package ui;

import java.util.*;

import ui.tmlad.*;
import ui.tmlcd.*;
import ui.tmlcompd.*;
import ui.tmldd.*;
import ui.tmlsd.*;
import tmltranslator.*;
import tmltranslator.tmlcp.*;
import myutil.*;
import tmltranslator.modelcompiler.*;
import avatartranslator.*;


public class GTMLModeling  {
    private TMLDesignPanel tmldp;
    private TMLComponentDesignPanel tmlcdp;
    private TMLArchiPanel tmlap;
    private TMLModeling tmlm;
    private List<CheckingError> checkingErrors, warnings;
    private List<? extends TGComponent> tasksToTakeIntoAccount;
    private List<? extends TGComponent> componentsToTakeIntoAccount;
    private List<? extends TGComponent> components;
    private List<String> removedChannels, removedRequests, removedEvents;
    private static CorrespondanceTGElement listE;
    private Map<String, String> table;
    public AvatarSpecification avspec;
    //private ArrayList<HwNode> nodesToTakeIntoAccount;
    private List<TGComponent> nodesToTakeIntoAccount;

    private TMLMapping map;
    private TMLArchitecture archi;

    //Attributes specific to Communication Patterns
    private TMLCP tmlcp;
    private TMLCommunicationPatternPanel tmlcpp;
 //   private Vector<TDiagramPanel> diagramPanelsToTakeIntoAccount;
//    private Vector<TDiagramPanel> panels;

    private Map<String, SecurityPattern> securityPatterns = new HashMap<String, SecurityPattern>();

    private boolean putPrefixName = false;

    public GTMLModeling(TMLDesignPanel _tmldp, boolean resetList) {
        tmldp = _tmldp;
        table = new Hashtable<String, String>();
        if (resetList) {
            listE = new CorrespondanceTGElement();
        }
    }

    public GTMLModeling(TMLComponentDesignPanel _tmlcdp, boolean resetList) {
        tmlcdp = _tmlcdp;
        table = new Hashtable<String, String>();
        if (resetList) {
            listE = new CorrespondanceTGElement();
        }
    }

    public GTMLModeling(TMLArchiPanel _tmlap, boolean resetList) {
        tmlap = _tmlap;
	//System.out.println(tmlap.getMainGUI());
	//TURTLEPanel tup = (TURTLEPanel)(tmlap.getMainGUI().getTURTLEPanel(namePanel));
	//if (tup instanceof TMLDesignPanel) {
	//tmldp = tmlap.getMainGUI().
        table = new Hashtable<String, String>();
        if (resetList) {
            listE = new CorrespondanceTGElement();
        }
    }

    public GTMLModeling( TMLCommunicationPatternPanel _tmlcpp, boolean resetList ) {
        tmlcpp = _tmlcpp;
        table = new Hashtable<String, String>();
        if (resetList) {
            listE = new CorrespondanceTGElement();
        }
    }

    public TMLModeling translateToTMLModeling(boolean _resetID) {
        return translateToTMLModeling(false, _resetID);
    }

    public void putPrefixName(boolean _b) {
        putPrefixName = _b;
    }

    public TMLModeling translateToTMLModeling(boolean onlyTakenIntoAccount, boolean _resetID) {
        tmlm = new TMLModeling(_resetID);
        checkingErrors = new LinkedList<CheckingError> ();
        warnings = new LinkedList<CheckingError> ();

        //boolean b;

        if (tmldp != null) {
            components = tmldp.tmltdp.getComponentList();
            if (tasksToTakeIntoAccount == null) {
                tasksToTakeIntoAccount = components;
            }
            removedChannels = new LinkedList<String>();
            removedRequests = new LinkedList<String>();
            removedEvents = new LinkedList<String>();

            try {
                addTMLTasks();
                addTMLChannels();
                addTMLEvents();
                addTMLRequests();
		//addTMLPragmas();
                TraceManager.addDev("At line 151");
                generateTasksActivityDiagrams();
                removeActionsWithDollars();
                removeActionsWithRecords();
            } catch (MalformedTMLDesignException mtmlde) {
                TraceManager.addDev("Modeling error:" + mtmlde.getMessage());
            }

            /*TMLTextSpecification spec = new TMLTextSpecification();
              spec.toTextFormat(tmlm);
              TraceManager.addDev("TMLModeling=\n" + spec.toString());*/

            // Cheking syntax
            TMLSyntaxChecking syntax = new TMLSyntaxChecking(tmlm);
            syntax.checkSyntax();

            CheckingError ce;
            int type;
            TGComponent tgc;

            if (syntax.hasErrors() >0) {
                for(TMLError error: syntax.getErrors()) {
                    //TraceManager.addDev("Adding checking error");
                    if (error.type == TMLError.ERROR_STRUCTURE) {
                        type = CheckingError.STRUCTURE_ERROR;
                    } else {
                        type = CheckingError.BEHAVIOR_ERROR;
                    }
                    ce = new CheckingError(type, error.message);
                    tgc = listE.getTG(error.element);
                    if (tgc != null) {
                        ce.setTDiagramPanel(tgc.getTDiagramPanel());
                        ce.setTGComponent(tgc);
                    }
                    ce.setTMLTask(error.task);
                    checkingErrors.add(ce);

                }
            }
        } else if (tmlcdp != null) {
            if (onlyTakenIntoAccount) {
                components = componentsToTakeIntoAccount;
            } else {
                components = tmlcdp.tmlctdp.getPrimitiveComponentList();
                if (componentsToTakeIntoAccount == null) {
                    componentsToTakeIntoAccount = components;
                }
            }

            removedChannels = new LinkedList<String>();
            removedRequests = new LinkedList<String>();
            removedEvents = new LinkedList<String>();

            try {
                addTMLComponents();
                TraceManager.addDev("Adding channels");
                addTMLCChannels();
                TraceManager.addDev("Adding events");
                addTMLCEvents();
                TraceManager.addDev("Adding requests");
                addTMLCRequests();
		//addTMLPragmas();
                TraceManager.addDev("At line 211");
                generateTasksActivityDiagrams();
                removeActionsWithDollars();
                removeActionsWithRecords();
            } catch (MalformedTMLDesignException mtmlde) {
                TraceManager.addDev("Modeling error:" + mtmlde.getMessage());
            }
	    
            TMLSyntaxChecking syntax = new TMLSyntaxChecking(tmlm);
            syntax.checkSyntax();

            CheckingError ce;
            int type;
            TGComponent tgc;

            if (syntax.hasErrors() >0) {
                for(TMLError error: syntax.getErrors()) {
                    //TraceManager.addDev("Adding checking error");
                    if (error.type == TMLError.ERROR_STRUCTURE) {
                        type = CheckingError.STRUCTURE_ERROR;
                    } else {
                        type = CheckingError.BEHAVIOR_ERROR;
                    }
                    ce = new CheckingError(type, error.message);
                    tgc = listE.getTG(error.element);
                    if (tgc != null) {
                        ce.setTDiagramPanel(tgc.getTDiagramPanel());
                        ce.setTGComponent(tgc);
                    }
                    ce.setTMLTask(error.task);
                    checkingErrors.add(ce);

                }
            }
        }

        return tmlm;
    }

    public TMLDesignPanel getTMLDesignPanel()  {
        return tmldp;
    }

    public CorrespondanceTGElement getCorrespondanceTable() {
        return listE;
    }

    public void setTasks(Vector<? extends TGComponent> tasks) {
        tasksToTakeIntoAccount = new LinkedList<TGComponent>(tasks);
    }

    public void setComponents(Vector<? extends TGComponent> components) {
        componentsToTakeIntoAccount = new LinkedList<TGComponent>(components);
    }

    public void setNodes(Vector<TGComponent> nodes) {
        nodesToTakeIntoAccount = new LinkedList<TGComponent>(nodes);
    }
//    public void setDiagramPanels( Vector<TDiagramPanel> panels ) {
//        diagramPanelsToTakeIntoAccount = new Vector<TDiagramPanel>( panels );
//    }

    public List<CheckingError> getCheckingErrors() {
        return checkingErrors;
    }

    public List<CheckingError> getCheckingWarnings() {
        return warnings;
    }
//    
//    private void addTMLPragmas(){
//	TGComponent tgc;
//	components = tmlap.tmlap.getComponentList();
//	ListIterator iterator = components.listIterator();
//	while(iterator.hasNext()) {
//	    tgc = (TGComponent)(iterator.next());
//	    if (tgc instanceof TGCNote){
//	        TGCNote note = (TGCNote) tgc;
//	        String[] vals = note.getValues();
//	        for (String s: vals){
//		    TraceManager.addDev("Val " + s);
//		    if (s.contains("#") && s.contains(" ")){
//  		        map.addPragma(s.split(" "));
//	    	    }
//	        }
//	    }
//        }
//    }
    private void addTMLTasks() throws MalformedTMLDesignException {
        TGComponent tgc;
        TMLTask tmlt;
        TMLTaskOperator tmlto;
        TMLActivityDiagramPanel tmladp;

        Iterator<? extends TGComponent> iterator = tasksToTakeIntoAccount.listIterator();
        while(iterator.hasNext()) {
            tgc = iterator.next();
            if (tgc instanceof TMLTaskOperator) {
                tmlto = (TMLTaskOperator)tgc;
                tmladp = tmldp.getTMLActivityDiagramPanel(tmlto.getValue());
                if (tmladp == null) {
                    String msg = tmlto.getValue() + " has no activity diagram";
                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                    ce.setTDiagramPanel(tmldp.tmltdp);
                    ce.setTGComponent(tgc);
                    checkingErrors.add(ce);
                    throw new MalformedTMLDesignException(tmlto.getValue() + " msg");
                }

                if (tmlm.getTMLTaskByName(tmlto.getValue()) != null) {
                    String msg = "Two tasks have the same name: " + tmlto.getValue() + " (mapping problem?)";
                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                    ce.setTDiagramPanel(tmldp.tmltdp);
                    ce.setTGComponent(tgc);
                    checkingErrors.add(ce);
                    throw new MalformedTMLDesignException(tmlto.getValue() + " msg");
                }

                tmlt = new TMLTask(makeName(tgc, tmlto.getValue()), tmlto, tmladp);
                listE.addCor(tmlt, tgc);
                tmlm.addTask(tmlt);
                tmlt.setExit(tmlto.isExit());
                addAttributesTo(tmlt, tmlto);
            }
        }
    }

    private void addTMLComponents() throws MalformedTMLDesignException {
        TGComponent tgc;
        TMLCPrimitiveComponent tmlcpc;
        TMLActivityDiagramPanel tmladp;
        TMLTask tmlt;
        TMLComponentDesignPanel tmlcdptmp;

        Iterator<? extends TGComponent> iterator = componentsToTakeIntoAccount.listIterator();
        while(iterator.hasNext()) {
            tgc = iterator.next();
            if (tgc instanceof TMLCPrimitiveComponent) {
                tmlcpc = (TMLCPrimitiveComponent)tgc;
                tmlcdptmp = (TMLComponentDesignPanel)(tmlcpc.getTDiagramPanel().getMGUI().getTURTLEPanelOfTDiagramPanel(tmlcpc.getTDiagramPanel()));
                tmladp = tmlcdptmp.getReferencedTMLActivityDiagramPanel(tmlcpc.getTDiagramPanel(), tmlcpc.getValue());
                if (tmladp == null) {
                    String msg = " has no activity diagram";
                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                    ce.setTDiagramPanel(tmlcdp.tmlctdp);
                    ce.setTGComponent(tgc);
                    checkingErrors.add(ce);
                    throw new MalformedTMLDesignException(tmlcpc.getValue() + " msg");
                }
                if (tmlm.getTMLTaskByName(tmlcpc.getValue()) != null) {
                    String msg = "Two components have the same name: " + tmlcpc.getValue() + " (mapping problem?)";
                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                    ce.setTDiagramPanel(tmlcdp.tmlctdp);
                    ce.setTGComponent(tgc);
                    checkingErrors.add(ce);
                    throw new MalformedTMLDesignException(tmlcpc.getValue() + " msg");
                }
                tmlt = new TMLTask(makeName(tgc, tmlcpc.getValue()), tmlcpc, tmladp);
                TraceManager.addDev("Task added:" + tmlt.getName() + " with tadp=" + tmladp + " major=" + tmladp.getMGUI().getMajorTitle(tmladp));
                listE.addCor(tmlt, tgc);
                tmlm.addTask(tmlt);
                tmlt.setExit(false);
                //tmlt.setExit(tmlcpc.isExit());
                addAttributesTo(tmlt, tmlcpc);
            }
        }
    }

    private void addTMLChannels() throws MalformedTMLDesignException {
        TGComponent tgc;
        TMLChannelOperator tmlco;
        Iterator<? extends TGComponent> iterator = components.listIterator();
        TMLTaskInterface t1, t2;
        TMLChannel channel;
        TMLTask tt1, tt2;
        String name;

        while(iterator.hasNext()) {
            tgc = iterator.next();
            if (tgc instanceof TMLChannelOperator) {
                tmlco = (TMLChannelOperator)tgc;
                //TraceManager.addDev("Found channel: " + tmlco.getChannelName());
                t1 = tmldp.tmltdp.getTask1ToWhichIamConnected(tmlco);
                t2 = tmldp.tmltdp.getTask2ToWhichIamConnected(tmlco);
                if ((t1 != null) && (t2 != null) && (tasksToTakeIntoAccount.contains(t1)) && (tasksToTakeIntoAccount.contains(t2)) ) {
                    name = makeName(tgc, tmlco.getChannelName());
                    channel = new TMLChannel(name, tmlco);
                    TraceManager.addDev("name=" + name + " makeName1 =" + makeName(tgc, t1.getTaskName())  + " chname=" + tmlco.getChannelName());
                    addToTable(makeName(tgc, t1.getTaskName()) + "/" + tmlco.getChannelName(), name);
                    addToTable(makeName(tgc, t2.getTaskName()) + "/" + tmlco.getChannelName(), name);
                    channel.setSize(tmlco.getChannelSize());
                    channel.setType(tmlco.getChannelType());
                    channel.setMax(tmlco.getChannelMax());
                    if (tmlm.hasSameChannelName(channel)) {
                        if (tmlm.hasAlmostSimilarChannel(channel)) {
                            String msg = " channel " + tmlco.getChannelName() + " is declared several times differently";
                            CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                            ce.setTDiagramPanel(tmldp.tmltdp);
                            ce.setTGComponent(tgc);
                            checkingErrors.add(ce);
                            throw new MalformedTMLDesignException(tmlco.getChannelName() + " msg");
                        }
                    } else {
                        tt1 = tmlm.getTMLTaskByName(makeName((TGComponent)t1, t1.getTaskName()));
                        tt2 = tmlm.getTMLTaskByName(makeName((TGComponent)t2, t2.getTaskName()));
                        channel.setTasks(tt1, tt2);
                        tmlm.addChannel(channel);
                        listE.addCor(channel, tgc);
                        //TraceManager.addDev("Adding channel " + channel.getName());
                    }
                } else {
                    removedChannels.add(new String(tmlco.getChannelName()));
                    CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Channel " +  tmlco.getChannelName() + " has been removed");
                    ce.setTDiagramPanel(tmldp.tmltdp);
                    ce.setTGComponent(tmlco);
                    warnings.add(ce);
                }
            }
        }
    }

    private void addTMLEvents() throws MalformedTMLDesignException {
        TGComponent tgc;
        TMLEventOperator tmleo;
        Iterator<? extends TGComponent> iterator = components.listIterator();
        TMLTaskInterface t1, t2;
        TMLEvent event;
        TType tt;
        TMLType tmlt;
        TMLTask tt1, tt2;
        String name;

        while(iterator.hasNext()) {
            tgc = (TGComponent)(iterator.next());
            if (tgc instanceof TMLEventOperator) {
                tmleo = (TMLEventOperator)tgc;
                //TraceManager.addDev("Found event: " + tmleo.getEventName());
                t1 = tmldp.tmltdp.getTask1ToWhichIamConnected(tmleo);
                t2 = tmldp.tmltdp.getTask2ToWhichIamConnected(tmleo);
                if ((t1 != null) && (t2 != null) && (tasksToTakeIntoAccount.contains(t1)) && (tasksToTakeIntoAccount.contains(t2)) ) {
                    name = makeName(tgc, tmleo.getEventName());
                    event = new TMLEvent(name, tmleo, tmleo.getMaxSamples(), tmleo.isBlocking());
                    addToTable(makeName(tgc, t1.getTaskName()) + "/" + tmleo.getEventName(), name);
                    addToTable(makeName(tgc, t2.getTaskName()) + "/" + tmleo.getEventName(), name);
                    for(int i=0; i<tmleo.getEventMaxParam(); i++) {
                        tt = tmleo.getParamAt(i);
                        if ((tt != null) && (tt.getType() != TType.NONE)) {
                            tmlt = new TMLType(tt.getType());
                            event.addParam(tmlt);
                            //TraceManager.addDev("Event " + event.getName() + " add param");
                        }
                    }
                    if (tmlm.hasSameEventName(event)) {
                        if (tmlm.hasAlmostSimilarEvent(event)) {
                            String msg = " event " + tmleo.getEventName() + " is declared several times differently";
                            CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                            ce.setTDiagramPanel(tmldp.tmltdp);
                            ce.setTGComponent(tgc);
                            checkingErrors.add(ce);
                            throw new MalformedTMLDesignException(tmleo.getEventName() + " msg");
                        }
                    } else {
                        tt1 = tmlm.getTMLTaskByName(makeName((TGComponent)t1, t1.getTaskName()));
                        tt2 = tmlm.getTMLTaskByName(makeName((TGComponent)t2, t2.getTaskName()));
                        event.setTasks(tt1, tt2);
                        tmlm.addEvent(event);
                        listE.addCor(event, tgc);
                        //TraceManager.addDev("Adding event " + event.getName());
                    }
                } else {
                    TraceManager.addDev( "Removing event "+ new String(tmleo.getEventName()) );
                    removedEvents.add(new String(tmleo.getEventName()));
                    CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Event " +  tmleo.getEventName() + " has been removed");
                    ce.setTDiagramPanel(tmldp.tmltdp);
                    ce.setTGComponent(tmleo);
                    warnings.add(ce);
                }
            }
        }
    }

    private void addTMLRequests() throws MalformedTMLDesignException {
        TGComponent tgc;
        TMLRequestOperator tmlro;
        Iterator<? extends TGComponent> iterator = components.listIterator();
        TMLTaskInterface t1, t2;
        TMLRequest request;
        TType tt;
        TMLType tmlt;
        TMLTask task;
        TMLAttribute tmlattr;
        TMLType tmltt;
        String name;

        while(iterator.hasNext()) {
            tgc = (TGComponent)(iterator.next());
            if (tgc instanceof TMLRequestOperator) {
                tmlro = (TMLRequestOperator)tgc;
                //TraceManager.addDev("Found request: " + tmlro.getRequestName());
                t1 = tmldp.tmltdp.getTask1ToWhichIamConnected(tmlro);
                t2 = tmldp.tmltdp.getTask2ToWhichIamConnected(tmlro);
                if ((t1 != null) && (t2 != null) && (tasksToTakeIntoAccount.contains(t1)) && (tasksToTakeIntoAccount.contains(t2)) ) {
                    name = makeName(tgc, tmlro.getRequestName());
                    addToTable(makeName(tgc, t1.getTaskName()) + "/" + tmlro.getRequestName(), name);
                    addToTable(makeName(tgc, t2.getTaskName()) + "/" + tmlro.getRequestName(), name);
                    // Check whether there is another request having a different name but with the same destination task
                    request = tmlm.getRequestByDestinationTask(tmlm.getTMLTaskByName(makeName((TGComponent)t2, t2.getTaskName())));

                    if (request != null) {
                        if (request.getName().compareTo(name) != 0) {
                            String msg = "Two requests declared with different names have the same destination task: " + tmlro.getRequestName();
                            CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                            ce.setTDiagramPanel(tmldp.tmltdp);
                            ce.setTGComponent(tgc);
                            checkingErrors.add(ce);
                            throw new MalformedTMLDesignException(tmlro.getRequestName() + " msg");
                        }
                    }

                    request = tmlm.getRequestNamed(name);
                    if (request == null) {
                        request = new TMLRequest(name, tmlro);

                        request.setDestinationTask(tmlm.getTMLTaskByName(makeName((TGComponent)t2, t2.getTaskName())));
                        tmlm.addRequest(request);
                        for(int i=0; i<tmlro.getRequestMaxParam(); i++) {
                            tt = tmlro.getParamAt(i);
                            if ((tt != null) && (tt.getType() != TType.NONE)) {
                                tmlt = new TMLType(tt.getType());
                                request.addParam(tmlt);
                            }
                        }
                    } else {
                        // Must check whether the destination task is the same
                        if (request.getDestinationTask() != tmlm.getTMLTaskByName(makeName((TGComponent)t2, t2.getTaskName()))) {
                            String msg = "Two requests are declared with the same name but with two different destination tasks: " + tmlro.getRequestName();
                            CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                            ce.setTDiagramPanel(tmldp.tmltdp);
                            ce.setTGComponent(tgc);
                            checkingErrors.add(ce);
                            throw new MalformedTMLDesignException(tmlro.getRequestName() + " msg");
                        }

                        // Must check whether the two requests are compatible (parameters)
                        int nbOfParamsCurrent = 0;
                        for(int i=0; i<tmlro.getRequestMaxParam(); i++) {
                            tt = tmlro.getParamAt(i);
                            if ((tt != null) && (tt.getType() != TType.NONE)) {
                                nbOfParamsCurrent ++;
                            }
                        }
                        if (request.getNbOfParams() != nbOfParamsCurrent) {
                            String msg = "request " + tmlro.getRequestName() + " is declared several times with different parameters";
                            CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                            ce.setTDiagramPanel(tmldp.tmltdp);
                            ce.setTGComponent(tgc);
                            checkingErrors.add(ce);
                            throw new MalformedTMLDesignException(tmlro.getRequestName() + " msg");
                        }

                        // Must check param types as well
                        int cpti = 0;
                        for(int i=0; i<tmlro.getRequestMaxParam(); i++) {
                            tt = tmlro.getParamAt(i);
                            if ((tt != null) && (tt.getType() != TType.NONE)) {
                                tmlt = new TMLType(tt.getType());
                                if (request.getType(cpti).getType() != tmlt.getType()) {
                                    String msg = "request " + tmlro.getRequestName() + " is declared several times with different types in parameters";
                                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                                    ce.setTDiagramPanel(tmldp.tmltdp);
                                    ce.setTGComponent(tgc);
                                    checkingErrors.add(ce);
                                    throw new MalformedTMLDesignException(tmlro.getRequestName() + " msg");
                                }
                                cpti ++;
                            }
                        }
                    }

                    // More: test the compatibility of the request!
                    if (request.getDestinationTask() != tmlm.getTMLTaskByName(makeName((TGComponent)t2, t2.getTaskName()))) {
                        String msg = "request " + tmlro.getRequestName() + " is declared several times differently (compatibility issue)";
                        CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                        ce.setTDiagramPanel(tmldp.tmltdp);
                        ce.setTGComponent(tgc);
                        checkingErrors.add(ce);
                        throw new MalformedTMLDesignException(tmlro.getRequestName() + " msg");
                    }
                    request.addOriginTask(tmlm.getTMLTaskByName(makeName((TGComponent)t1, t1.getTaskName())));

                    task = tmlm.getTMLTaskByName(makeName((TGComponent)t2, t2.getTaskName()));
                    task.setRequested(true);
                    task.setRequest(request);

                    // Request attributes
                    //TraceManager.addDev("Requests attributes");
                    String attname;
                    for(int j=0; j<request.getNbOfParams(); j++) {
                        attname = "arg" + (j + 1) + "__req";
                        if (task.getAttributeByName(attname) == null) {
                            tmltt = new TMLType(request.getType(j).getType());
                            tmlattr = new TMLAttribute(attname, tmltt);
                            tmlattr.initialValue = tmlattr.getDefaultInitialValue();
                            TraceManager.addDev("Adding " + tmlattr.getName() + " to " + task.getName() + "with value =" + tmlattr.initialValue);
                            task.addAttribute(tmlattr);
                        }
                    }

                } else {
                    removedRequests.add(new String(tmlro.getRequestName()));
                    CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Request " +  tmlro.getRequestName() + " has been removed");
                    ce.setTDiagramPanel(tmldp.tmltdp);
                    ce.setTGComponent(tmlro);
                    warnings.add(ce);
                }
            }
        }
    }

    private void addTMLCChannels() throws MalformedTMLDesignException {



        TGComponent tgc;
        TMLCPrimitiveComponent tmlc;
        Iterator<? extends TGComponent> iterator = components.listIterator();
        Iterator<TMLCPrimitivePort> li;//, li2;
        List<TMLCPrimitivePort> ports, portstome;
        String name, name1, name2;
        TMLCPrimitivePort port1, port2;

        int j;

        //TMLTaskInterface t1, t2;
        TMLChannel channel;
        TMLTask tt1, tt2;

        List<TGComponent> alreadyConsidered = new ArrayList<TGComponent>();

        TraceManager.addDev("*** Adding channels ***");

        while(iterator.hasNext()) {
            tgc = iterator.next();
            if (tgc instanceof TMLCPrimitiveComponent) {
                tmlc = (TMLCPrimitiveComponent)tgc;
                //TraceManager.addDev("Component:" + tmlc.getValue());
                ports = tmlc.getAllChannelsOriginPorts();
                //TraceManager.addDev("Ports size:" + ports.size());
                li = ports.listIterator();
                while(li.hasNext()) {
                    port1 = (TMLCPrimitivePort)(li.next());
                    if (!(alreadyConsidered.contains(port1))) {
                        portstome = tmlcdp.tmlctdp.getPortsConnectedTo(port1, componentsToTakeIntoAccount);
                        TraceManager.addDev("******** Considering port1 = " +port1.getPortName() + " size of connecting ports:" + portstome.size());

                        Iterator<TMLCPrimitivePort> ite = portstome.listIterator();
                        while(ite.hasNext()) {
                            TraceManager.addDev("port=" + ((TMLCPrimitivePort)(ite.next())).getPortName());
                        }

                        if (portstome.size() < 1) {
                            String msg = "port " + port1.getPortName() + " is not correctly connected";
                            CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                            ce.setTDiagramPanel(tmlcdp.tmlctdp);
                            ce.setTGComponent(tgc);
                            checkingErrors.add(ce);
                            throw new MalformedTMLDesignException(msg);
                        }

                        if (portstome.size() == 1) {
                            port2 = (TMLCPrimitivePort)(portstome.get(0));
                            alreadyConsidered.add(port1);
                            alreadyConsidered.add(port2);

                            String []text1 = port1.getPortName().split(",");
                            String []text2 = port2.getPortName().split(",");
                            for (j=0; j<Math.min(text1.length, text2.length); j++) {
                                name1 = text1[j].trim();
                                name2 = text2[j].trim();

                                /*if (name1.equals(name2)) {
                                  name = makeName(tgc, name1);
                                  } else {
                                  name = makeName(tgc, name1 + "__" + name2);
                                  }*/

                                name = makeName(port1, name1) + "__" + makeName(port2, name2);

                                if (makeName(port1, name1).compareTo(makeName(port2, name2)) == 0) {
                                    name = makeName(port1, name1);
                                }

                                //TraceManager.addDev("Adding to table : " + makeName(port1, port1.getFather().getValue()) + "/" + name1);
                                addToTable(makeName(port1, port1.getFather().getValue()) + "/" + name1, name);
                                //TraceManager.addDev("Adding to table : " + makeName(port2, port2.getFather().getValue()) + "/" + name2);
                                addToTable(makeName(port2, port2.getFather().getValue()) + "/" + name2, name);

                                channel = new TMLChannel(name, port1);
                                channel.setSize(port1.getSize());
                                channel.setMax(port1.getMax());
				channel.ports.add(port1);
				channel.ports.add(port2);
                                if (port1.isBlocking() && port2.isBlocking()) {
                                    channel.setType(TMLChannel.BRBW);
                                } else if (!port1.isBlocking() && port2.isBlocking()) {
                                    channel.setType(TMLChannel.BRNBW);
                                } else if (!port1.isBlocking() && !port2.isBlocking()) {
                                    channel.setType(TMLChannel.NBRNBW);
                                } else {
                                    String msg = "Ports " + name1 + " and " + name2 + " are not compatible (NBRBW)";
                                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                                    ce.setTDiagramPanel(tmlcdp.tmlctdp);
                                    ce.setTGComponent(port1);
                                    checkingErrors.add(ce);
                                    throw new MalformedTMLDesignException(msg);
                                }

                                if (tmlm.hasSameChannelName(channel)) {
                                    if (tmlm.hasAlmostSimilarChannel(channel)) {
                                        String msg = " channel " + name + " is declared several times differently";
                                        CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                                        ce.setTDiagramPanel(tmlcdp.tmlctdp);
                                        ce.setTGComponent(tgc);
                                        checkingErrors.add(ce);
                                        throw new MalformedTMLDesignException(msg);
                                    }
                                } else {
                                    tt1 = tmlm.getTMLTaskByName(makeName(port1, port1.getFather().getValue()));
                                    tt2 = tmlm.getTMLTaskByName(makeName(port2, port2.getFather().getValue()));
                                    channel.setTasks(tt1, tt2);

                                    if (port1.isLossy()) {
                                        channel.setLossy(true, port1.getLossPercentage(), port1.getMaxNbOfLoss());
                                    }

                                    //complex channels are used only for transformation towards the simulator
                                    TMLPort tmlport1, tmlport2;
                                    tmlport1 = new TMLPort( port1.getPortName(), port1 );
                                    tmlport1.setPrex( port1.isPrex() );
                                    tmlport1.setPostex( port1.isPostex() );
                                    tmlport1.setAssociatedEvent( port1.getAssociatedEvent() );
                                    tmlport2 = new TMLPort( port2.getPortName(), port2 );
                                    tmlport2.setPrex( port2.isPrex() );
                                    tmlport2.setPostex( port2.isPostex() );
                                    tmlport2.setAssociatedEvent( port2.getAssociatedEvent() );
                                    channel.setPorts( tmlport1, tmlport2 );
                                    tmlm.addChannel(channel);
                                    listE.addCor(channel, tgc);
                                    TraceManager.addDev("Adding channel " + channel.getName());
                                }
                            }
                        } else {
                            // Complex channel "1 -> many"
                            TMLCPrimitivePort port;


                            // Only one channel per port
                            if (port1.getPortName().indexOf(",") != -1) {
                                String msg = "Multiple definition of channels with more than one output port is not allowed: " + port1.getPortName();
                                CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                                ce.setTDiagramPanel(tmlcdp.tmlctdp);
                                ce.setTGComponent(port1);
                                checkingErrors.add(ce);
                                throw new MalformedTMLDesignException(msg);
                            }
                            for(j=0; j<portstome.size(); j++) {
                                port = (TMLCPrimitivePort)(portstome.get(j));
                                if (port.getPortName().indexOf(",") != -1) {
                                    String msg = "Multiple definition of channels with more than one output port is not allowed: " + port.getPortName();
                                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                                    ce.setTDiagramPanel(tmlcdp.tmlctdp);
                                    ce.setTGComponent(port);
                                    checkingErrors.add(ce);
                                    throw new MalformedTMLDesignException(msg);
                                }
                            }

                            // Name of port
                            name = makeName(port1, port1.getPortName());
                            for(j=0; j<portstome.size(); j++) {
                                name += "__" + ((TMLCPrimitivePort)(portstome.get(j))).getPortName();
                            }

                            // Correspondance table
                            alreadyConsidered.add(port1);
                            addToTable(makeName(port1, port1.getFather().getValue()) + "/" + port1.getPortName(), name);
                            for(j=0; j<portstome.size(); j++) {
                                port = (TMLCPrimitivePort)(portstome.get(j));
                                alreadyConsidered.add(port);
                                addToTable(makeName(port, port.getFather().getValue()) + "/" + port.getPortName(), name);
                            }

                            // Channel attributes
                            port = (TMLCPrimitivePort)(portstome.get(0));
                            channel = new TMLChannel(name, port1);
			    channel.ports.add(port1);
			    for(j=0; j<portstome.size(); j++) {
                                TMLCPrimitivePort p = (TMLCPrimitivePort)(portstome.get(j));
				channel.ports.add(p);
			    }
                            channel.setSize(port1.getSize());
                            channel.setMax(port1.getMax());
                            if (port1.isBlocking() && port.isBlocking()) {
                                channel.setType(TMLChannel.BRBW);
                            } else if (!port1.isBlocking() && port.isBlocking()) {
                                channel.setType(TMLChannel.BRNBW);
                            } else if (!port1.isBlocking() && !port.isBlocking()) {
                                channel.setType(TMLChannel.NBRNBW);
                            } else {
                                String msg = "Ports " + port1.getPortName() + " and " + port.getPortName() + " are not compatible (NBRBW)";
                                CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                                ce.setTDiagramPanel(tmlcdp.tmlctdp);
                                ce.setTGComponent(port1);
                                checkingErrors.add(ce);
                                throw new MalformedTMLDesignException(msg);
                            }
                            if (port1.isLossy()) {
                                channel.setLossy(true, port1.getLossPercentage(), port1.getMaxNbOfLoss());
                            }

                            if (tmlm.hasSameChannelName(channel)) {
                                if (tmlm.hasAlmostSimilarChannel(channel)) {
                                    String msg = " channel " + name + " is declared several times differently";
                                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                                    ce.setTDiagramPanel(tmlcdp.tmlctdp);
                                    ce.setTGComponent(tgc);
                                    checkingErrors.add(ce);
                                    throw new MalformedTMLDesignException(msg);
                                }
                            } else {
                                TMLPort tmlport;
                                tt1 = tmlm.getTMLTaskByName(makeName(port1, port1.getFather().getValue()));
                                tmlport = new TMLPort(port1.getPortName(), port1);
                                tmlport.setAssociatedEvent( port1.getAssociatedEvent() );
                                channel.addTaskPort(tt1, tmlport, true);
                                for(j=0; j<portstome.size(); j++) {
                                    port = (TMLCPrimitivePort)(portstome.get(j));
                                    tmlport = new TMLPort(port.getPortName(), port);
                                    tmlport.setPrex( port.isPrex() );
                                    tmlport.setPostex( port.isPostex() );
                                    tmlport.setAssociatedEvent( port.getAssociatedEvent() );
                                    tt2 = tmlm.getTMLTaskByName(makeName(port, port.getFather().getValue()));
                                    channel.addTaskPort(tt2, tmlport, port.isOrigin());
                                }

                                tmlm.addChannel(channel);
                                listE.addCor(channel, tgc);
                                TraceManager.addDev("Adding channel " + channel.getName());
                            }
                        }
                    }
                }
            }
        }
    }

    private void addTMLCEvents() throws MalformedTMLDesignException {
        TGComponent tgc;
        TMLCPrimitiveComponent tmlc;
        Iterator<? extends TGComponent> iterator = components.listIterator();
        Iterator<TMLCPrimitivePort> li;//, li2;
        List<TMLCPrimitivePort> ports, portstome;
        String name;
        TMLCPrimitivePort port1, port2;

        int i, j;
        String name1, name2;

        //TMLTaskInterface t1, t2;
        TMLEvent event;
        TMLTask tt1, tt2;
        TType tt;
        TMLType tmlt;
        TMLCRecordComponent record;
        TAttribute ta;

        TraceManager.addDev("*** Adding Events ***");

        while(iterator.hasNext()) {
            tgc = (TGComponent)(iterator.next());
            if (tgc instanceof TMLCPrimitiveComponent) {
                tmlc = (TMLCPrimitiveComponent)tgc;
                TraceManager.addDev("Component:" + tmlc.getValue());
                ports = tmlc.getAllEventsOriginPorts();
                TraceManager.addDev("Ports size:" + ports.size());
                li = ports.listIterator();
                while(li.hasNext()) {
                    port1 = (TMLCPrimitivePort)(li.next());
                    portstome = tmlcdp.tmlctdp.getPortsConnectedTo(port1, componentsToTakeIntoAccount);
                    TraceManager.addDev("Considering port1 = " +port1.getPortName() + " size of connecting ports:" + portstome.size());

                    Iterator<?> ite = portstome.listIterator();
                    while(ite.hasNext()) {
                        TraceManager.addDev("port=" + ((TMLCPrimitivePort)(ite.next())).getPortName());
                    }

                    if (portstome.size() < 1) {
                        String msg = "port " + port1.getPortName() + " is not correctly connected";
                        CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                        ce.setTDiagramPanel(tmlcdp.tmlctdp);
                        ce.setTGComponent(tgc);
                        checkingErrors.add(ce);
                        throw new MalformedTMLDesignException(msg);
                    }

                    for (int kk=0; kk<portstome.size(); kk++) {
                        port2 = (TMLCPrimitivePort)(portstome.get(kk));

                        String []text1 = port1.getPortName().split(",");
                        String []text2 = port2.getPortName().split(",");

                        /*for (i=0; i<text1.length; i++) {
                          TraceManager.addDev("text1[" + i + "] = " + text1[i]);
                          }

                          for (i=0; i<text2.length; i++) {
                          TraceManager.addDev("text2[" + i + "] = " + text2[i]);
                          }*/

                        for (j=0; j<Math.min(text1.length, text2.length); j++) {
                            name1 = text1[j].trim();
                            name2 = text2[j].trim();
                            //TraceManager.addDev("name1=" + name1 + " name2=" + name2);
                            if (kk == 0) {
                                name = makeName(port1, name1) + "__" + makeName(port2, name2);
                            } else {
                                name = makeName(port1, name1) + "__" + makeName(port2, name2) + "__FORK" + kk;
                            }

                            TraceManager.addDev("Adding to table : " + makeName(port1, port1.getFather().getValue()) + "/" + name1);
                            addToTable(makeName(port1, port1.getFather().getValue()) + "/" + name1, name);
                            TraceManager.addDev("Adding to table : " + makeName(port2, port2.getFather().getValue()) + "/" + name2);
                            addToTable(makeName(port2, port2.getFather().getValue()) + "/" + name2, name);

                            if (port1.isFinite()) {
                                event = new TMLEvent(name, port1, port1.getMax(), port1.isBlocking());
                            } else {
                                event = new TMLEvent(name, port1, -1, port1.isBlocking());
                            }
			    event.port=port1;
			    event.port2= port2;
                            for(i=0; i<port1.getNbMaxAttribute(); i++) {
                                tt = port1.getParamAt(i);
                                if ((tt != null) && (tt.getType() != TType.NONE)) {
                                    if (tt.getType() == TType.OTHER) {
                                        // Record
                                        // Search for the record
                                        record = tmlc.getRecordNamed(tt.getTypeOther());
                                        if (record == null) {
                                            String msg = " event " + name + " is declared as using an unknown type: " + tt.getTypeOther();
                                            CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                                            ce.setTDiagramPanel(tmlcdp.tmlctdp);
                                            ce.setTGComponent(tgc);
                                            checkingErrors.add(ce);
                                            throw new MalformedTMLDesignException(msg);
                                        } else {
                                            for(int k=0; k<record.getAttributes().size(); k++) {
                                                ta = (TAttribute)(record.getAttributes().get(k));
                                                if (ta.getType() == TAttribute.NATURAL) {
                                                    tmlt = new TMLType(TMLType.NATURAL);
                                                } else if (ta.getType() == TAttribute.BOOLEAN) {
                                                    tmlt = new TMLType(TMLType.BOOLEAN);
                                                } else {
                                                    tmlt = new TMLType(TMLType.OTHER);
                                                }
                                                event.addParam(tmlt);
                                            }
                                        }
                                    } else {
                                        tmlt = new TMLType(tt.getType());
                                        event.addParam(tmlt);
                                    }
                                    //TraceManager.addDev("Event " + event.getName() + " add param");
                                }
                            }

                            if (tmlm.hasSameEventName(event)) {
                                if (tmlm.hasAlmostSimilarEvent(event)) {
                                    String msg = " event " + name + " is declared several times differently";
                                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                                    ce.setTDiagramPanel(tmlcdp.tmlctdp);
                                    ce.setTGComponent(tgc);
                                    checkingErrors.add(ce);
                                    throw new MalformedTMLDesignException(msg);
                                } else {
                                    TraceManager.addDev("Same evt : not added");
                                }
                            } else {
                                tt1 = tmlm.getTMLTaskByName(makeName(port1, port1.getFather().getValue()));
                                tt2 = tmlm.getTMLTaskByName(makeName(port2, port2.getFather().getValue()));
                                TraceManager.addDev("Tasks of event: t1=" + tt1.getName() + " t2=" + tt2.getName());
                                event.setTasks(tt1, tt2);

                                if (port1.isLossy()) {
                                    event.setLossy(true, port1.getLossPercentage(), port1.getMaxNbOfLoss());
                                }
                                tmlm.addEvent(event);
                                listE.addCor(event, tgc);
                                TraceManager.addDev("Adding event " + event.getName());
                            }
                        }
                    }
                }
            }
        }
    }


    private void addTMLCRequests() throws MalformedTMLDesignException {
        TGComponent tgc;
        TMLCPrimitiveComponent tmlc;
        Iterator<? extends TGComponent> iterator = components.listIterator();
        Iterator<TMLCPrimitivePort> li;//, li2;
        List<TMLCPrimitivePort> ports, portstome;
        String name;
        TMLCPrimitivePort port1, port2, port3;

        //TMLTaskInterface t1, t2;
        TMLRequest request;
        TMLTask tt1, tt2;
        TType tt;
        TMLType tmlt;

        TMLAttribute tmlattr;
        TMLType tmltt;
        TMLCRecordComponent record;
        TAttribute ta;
        int i;

        TraceManager.addDev("*** Adding requests ***");

        while(iterator.hasNext()) {
            tgc = (TGComponent)(iterator.next());
            if (tgc instanceof TMLCPrimitiveComponent) {
                tmlc = (TMLCPrimitiveComponent)tgc;
                //TraceManager.addDev("Component:" + tmlc.getValue());
                ports = tmlc.getAllRequestsDestinationPorts();
                //TraceManager.addDev("Ports size:" + ports.size());
                li = ports.listIterator();
                while(li.hasNext()) {
                    port1 = (TMLCPrimitivePort)(li.next());
                    portstome = tmlcdp.tmlctdp.getPortsConnectedTo(port1, componentsToTakeIntoAccount);
                    //TraceManager.addDev("Considering port1 = " +port1.getPortName() + " size of connecting ports:" + portstome.size());

 //                   ListIterator ite = portstome.listIterator();
                    //while(ite.hasNext()) {
                    //TraceManager.addDev("port=" + ((TMLCPrimitivePort)(ite.next())).getPortName());
                    //}

                    if (portstome.size() == 0) {
                        String msg = "port " + port1.getPortName() + " is not correctly connected";
                        CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                        ce.setTDiagramPanel(tmlcdp.tmlctdp);
                        ce.setTGComponent(port1);
                        checkingErrors.add(ce);
                        throw new MalformedTMLDesignException(msg);
                    }

                    for(i=0; i<portstome.size(); i++) {
                        port3 = (TMLCPrimitivePort)(portstome.get(i));
                        if (!port3.isOrigin()) {
                            String msg = "port " + port1.getPortName() + " is not correctly connected to port " + port3.getName();
                            CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                            ce.setTDiagramPanel(tmlcdp.tmlctdp);
                            ce.setTGComponent(port1);
                            checkingErrors.add(ce);
                            throw new MalformedTMLDesignException(msg);
                        }
                    }

                    String name1 = port1.getPortName();
                    name = makeName(port1, name1);
                    addToTable(makeName(port1, port1.getFather().getValue()) + "/" + name1, name);

		    request = new TMLRequest(name, port1);
		    request.ports.add(port1);
                    for(i=0; i<portstome.size(); i++) {
                        port2 = (TMLCPrimitivePort)(portstome.get(i));
			request.ports.add(port2);
                        TraceManager.addDev("Add add add to table request : " + makeName(port2, port2.getFather().getValue()) + "/" + port2.getName() + " name =" + name);
                        addToTable(makeName(port2, port2.getFather().getValue()) + "/" + port2.getPortName(), name);
                    }

                    
                    for(i=0; i<port1.getNbMaxAttribute(); i++) {
                        tt = port1.getParamAt(i);
                        if ((tt != null) && (tt.getType() != TType.NONE)) {
                            if (tt.getType() == TType.OTHER) {
                                // Record
                                // Search for the record
                                record = tmlc.getRecordNamed(tt.getTypeOther());
                                if (record == null) {
                                    String msg = " request " + name + " is declared as using an unknown type: " + tt.getTypeOther();
                                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                                    ce.setTDiagramPanel(tmlcdp.tmlctdp);
                                    ce.setTGComponent(tgc);
                                    checkingErrors.add(ce);
                                    throw new MalformedTMLDesignException(msg);
                                } else {
                                    for(int k=0; k<record.getAttributes().size(); k++) {
                                        ta = (TAttribute)(record.getAttributes().get(k));
                                        if (ta.getType() == TAttribute.NATURAL) {
                                            tmlt = new TMLType(TMLType.NATURAL);
                                        } else if (ta.getType() == TAttribute.BOOLEAN) {
                                            tmlt = new TMLType(TMLType.BOOLEAN);
                                        } else {
                                            tmlt = new TMLType(TMLType.OTHER);
                                        }
                                        request.addParam(tmlt);
                                    }
                                }
                            } else {
                                tmlt = new TMLType(tt.getType());
                                request.addParam(tmlt);
                            }
                            //TraceManager.addDev("Event " + event.getName() + " add param");
                        }
                    }

                    tt1 = tmlm.getTMLTaskByName(makeName(port1, port1.getFather().getValue()));
                    tt1.setRequested(true);
                    tt1.setRequest(request);
                    request.setDestinationTask(tt1);

                    // Request attributes
                    //TraceManager.addDev("Requests attributes");
                    String attname;
                    for(int j=0; j<request.getNbOfParams(); j++) {
                        attname = "arg" + (j + 1) + "__req";
                        if (tt1.getAttributeByName(attname) == null) {
                            tmltt = new TMLType(request.getType(j).getType());
                            tmlattr = new TMLAttribute(attname, tmltt);
                            tmlattr.initialValue = tmlattr.getDefaultInitialValue();
                            //TraceManager.addDev("Adding " + tmlattr.getName() + " to " + tt1.getName() + "with value =" + tmlattr.initialValue);
                            tt1.addAttribute(tmlattr);
                        }
                    }

                    for(i=0; i<portstome.size(); i++) {
                        port2 = (TMLCPrimitivePort)(portstome.get(i));
                        tt2 = tmlm.getTMLTaskByName(makeName(port2, port2.getFather().getValue()));
                        if (tt2 == null) {
                            TraceManager.addDev(" NO NO NO NO Destination taskin request!");
                        }
                        request.addOriginTask(tt2);
                        //TraceManager.addDev("LOSS?");
                        if (port2.isLossy()) {
                            TraceManager.addDev("LOSS***** Lossy request port" + port2.getLossPercentage() + " maxLoss=" + port2.getMaxNbOfLoss());
                            request.setLossy(true, port2.getLossPercentage(), port2.getMaxNbOfLoss());
                        }
                    }

                    // Check whether there is another request having a different name but with the same destination task
                    TMLRequest request1 = tmlm.getRequestByDestinationTask(request.getDestinationTask());
                    if (request1 != null) {
                        if (request1.getName().compareTo(name) != 0) {
                            String msg = "Two requests port declared on the same destination task have different names: " + name;
                            CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                            ce.setTDiagramPanel(tmlcdp.tmlctdp);
                            ce.setTGComponent(tgc);
                            checkingErrors.add(ce);
                            throw new MalformedTMLDesignException(msg);
                        }
                    }

                    if (tmlm.hasSameRequestName(request)) {
                        TMLRequest otherReq = tmlm.hasSimilarRequest(request);
                        if (otherReq == null) {
                            String msg = " request " + name + " is declared several times differently";
                            CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
                            ce.setTDiagramPanel(tmlcdp.tmlctdp);
                            ce.setTGComponent(port1);
                            checkingErrors.add(ce);
                            throw new MalformedTMLDesignException(msg);
                        }
                        for(i=0; i<request.getOriginTasks().size(); i++) {
                            otherReq.addOriginTask(request.getOriginTasks().get(i));
                        }
                    } else {

                        tmlm.addRequest(request);
                        listE.addCor(request, tgc);
                        //TraceManager.addDev("Adding request " + request.getName());
                    }
                }
            }
        }
    }

    private void addAttributesTo(TMLTask tmltask, TMLTaskOperator tmlto) {
        LinkedList<TAttribute> attributes = tmlto.getAttributes();
        addAttributesTo(tmlto, tmltask, attributes);
    }

    private void addAttributesTo(TMLTask tmltask, TMLCPrimitiveComponent tmlcpc) {
        List<TAttribute> attributes = tmlcpc.getAttributes();
        addAttributesTo(tmlcpc, tmltask, attributes);
    }

    private void addAttributesTo(TGComponent tgc, TMLTask tmltask, List<TAttribute> attributes) {
        TMLType tt;
      //  String name;
        TMLAttribute tmlt;
      //  TMLRequest req;
        TMLCRecordComponent rc;

        for (TAttribute ta: attributes) {
            rc = null; tt = null;
            if (ta.getType() == TAttribute.NATURAL) {
                tt = new TMLType(TMLType.NATURAL);
            } else if (ta.getType() == TAttribute.BOOLEAN) {
                tt = new TMLType(TMLType.BOOLEAN);
            } else {
                // Must be a record
                if (tgc instanceof TMLCPrimitiveComponent) {
                    TraceManager.addDev("Searching for record named: " + ta.getTypeOther());
                    rc = ((TMLCPrimitiveComponent)tgc).getRecordNamed(ta.getTypeOther());
                    if (rc == null) {
                        tt = new TMLType(TMLType.OTHER);
                        CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Unknown record: " + ta.getTypeOther() + " of attribute " + ta.getId() + " declared in task " + tmltask.getName());
                        ce.setTDiagramPanel(tmlcdp.tmlctdp);
                        ce.setTMLTask(tmltask);
                        ce.setTGComponent(tgc);
                        checkingErrors.add(ce);
                    }
                } else {
                    // Classical TML design
                    // Error!
                    tt = new TMLType(TMLType.OTHER);
                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Unknown type in variable " + ta.getId() + " of task " + tmltask.getName());
                    ce.setTDiagramPanel(tmldp.tmltdp);
                    ce.setTMLTask(tmltask);
                    ce.setTGComponent(tgc);
                    checkingErrors.add(ce);
                }

            }
            if (rc == null) {
                tmlt = new TMLAttribute(ta.getId(), tt);
                tmlt.initialValue = ta.getInitialValue();
                //TraceManager.addDev("ta =" + ta.getId() + " value=" + ta.getInitialValue());
                tmltask.addAttribute(tmlt);

            } else {
                // Adding all elements of record
                TraceManager.addDev("Found a record named: " + rc.getValue());
                LinkedList<TAttribute> attr = rc.getAttributes();
                for (TAttribute tat: attr) {
                    if (tat.getType() == TAttribute.NATURAL) {
                        tt = new TMLType(TMLType.NATURAL);
                    } else if (tat.getType() == TAttribute.BOOLEAN) {
                        tt = new TMLType(TMLType.BOOLEAN);
                    } else {
                        tt = new TMLType(TMLType.OTHER);
                    }
                    tmlt = new TMLAttribute(ta.getId() + "__" + tat.getId(), tt);
                    tmlt.initialValue = tat.getInitialValue();
                    TraceManager.addDev("record variable ta =" + tmlt.getName() + " value=" + tmlt.getInitialValue());
                    tmltask.addAttribute(tmlt);

                }
            }
        }
    }
    
    private void createSecurityPatterns(TMLTask tmltask){
		TMLActivity activity = tmltask.getActivityDiagram();
        TMLActivityDiagramPanel tadp = (TMLActivityDiagramPanel)(activity.getReferenceObject());
		TGComponent tgc;
        TraceManager.addDev("Generating activity diagram of:" + tmltask.getName());

        // search for start state
        List<TGComponent> list = tadp.getComponentList();
        Iterator<TGComponent> iterator = list.listIterator();
		while(iterator.hasNext()){
	    	tgc = iterator.next();

	    	if (tgc instanceof TMLADEncrypt) {
				if (!((TMLADEncrypt)tgc).securityContext.isEmpty()){
					SecurityPattern securityPattern = new SecurityPattern(((TMLADEncrypt)tgc).securityContext, ((TMLADEncrypt)tgc).type, ((TMLADEncrypt)tgc).message_overhead, ((TMLADEncrypt)tgc).size, ((TMLADEncrypt)tgc).encTime, ((TMLADEncrypt)tgc).decTime, ((TMLADEncrypt)tgc).nonce, ((TMLADEncrypt)tgc).formula, ((TMLADEncrypt)tgc).key);
					securityPatterns.put(securityPattern.name, securityPattern);
					tmlm.addSec(securityPattern);
					ArrayList<TMLTask> l = new ArrayList<TMLTask>();
					tmlm.securityTaskMap.put(securityPattern, l);
					TraceManager.addDev("Adding Security Pattern " + securityPattern.name);
		   		}
			}
		}
    }

    private void generateTasksActivityDiagrams() throws MalformedTMLDesignException {
        TMLTask tmltask;

        //First generate security patterns over all tasks
        Iterator<TMLTask> iterator = tmlm.getTasks().listIterator();

        while(iterator.hasNext()) {
            tmltask = iterator.next();
            createSecurityPatterns(tmltask);
        }	

        iterator = tmlm.getTasks().listIterator();

        while(iterator.hasNext()) {
            tmltask = (TMLTask)(iterator.next());
            generateTaskActivityDiagrams(tmltask);
        }
        TraceManager.addDev( "errors: " + checkingErrors.size() );
        if (checkingErrors.size() > 0) {
            throw new MalformedTMLDesignException("Error(s) found in activity diagrams");
        }
    }

    private String modifyActionString(String _input) {
        int index = _input.indexOf("++");
        boolean b1, b2;
        String tmp;

        if(index > -1) {
            tmp = _input.substring(0, index).trim();

            b1 = (tmp.substring(0,1)).matches("[a-zA-Z]");
            b2 = tmp.matches("\\w*");
            if (b1 && b2) {
                return tmp + " = " + tmp + " + 1";
            }
        }

        index = _input.indexOf("--");
        if(index > -1) {
            tmp = _input.substring(0, index).trim();

            b1 = (tmp.substring(0,1)).matches("[a-zA-Z]");
            b2 = tmp.matches("\\w*");
            if (b1 && b2) {
                return tmp + " = " + tmp + " - 1";
            }
        }

        return modifyString(_input);
    }

    private String modifyString(String _input) {
        return Conversion.replaceAllChar(_input, '.', "__");
    }



    private void generateTaskActivityDiagrams(TMLTask tmltask) throws MalformedTMLDesignException {
        TMLActivity activity = tmltask.getActivityDiagram();
        TMLActivityDiagramPanel tadp = (TMLActivityDiagramPanel)(activity.getReferenceObject());

        TraceManager.addDev("Generating activity diagram of:" + tmltask.getName());

        // search for start state
        List<TGComponent> list = tadp.getComponentList();
        Iterator<TGComponent> iterator = list.listIterator();
        TGComponent tgc;
        TMLADStartState tss = null;
        int cptStart = 0;
    //    boolean rndAdded = false;

        while(iterator.hasNext()) {
            tgc = iterator.next();
            
            if (tgc instanceof TMLADStartState) {
                tss = (TMLADStartState) tgc;
                cptStart ++;
            }
        }

        if (tss == null) {
            CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "No start state in the TML activity diagram of " + tmltask.getName());
            ce.setTMLTask(tmltask);
            ce.setTDiagramPanel(tadp);
            checkingErrors.add(ce);
            return;
        }

        if (cptStart > 1) {
            CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "More than one start state in the TML activity diagram of " + tmltask.getName());
            ce.setTMLTask(tmltask);
            ce.setTDiagramPanel(tadp);
            checkingErrors.add(ce);
            return;
        }

        // Adding start state
        TMLStartState tmlss = new TMLStartState("start", tss);
        listE.addCor(tmlss, tss);
        activity.setFirst(tmlss);

        // Creation of other elements
        TMLChannel channel;
        String [] channels;
        TMLEvent event;
        TMLRequest request;

        TMLADRandom tmladrandom;
        TMLRandom tmlrandom;
        TMLActionState tmlaction;
        TMLChoice tmlchoice;
        TMLExecI tmlexeci;
        TMLExecIInterval tmlexecii;
        TMLExecC tmlexecc;
        TMLExecCInterval tmlexecci;
        TMLForLoop tmlforloop;
        TMLReadChannel tmlreadchannel;
        TMLSendEvent tmlsendevent;
        TMLSendRequest tmlsendrequest;
        TMLStopState tmlstopstate;
        TMLWaitEvent tmlwaitevent;
        TMLNotifiedEvent tmlnotifiedevent;
        TMLWriteChannel tmlwritechannel;
        TMLSequence tmlsequence;
        TMLRandomSequence tmlrsequence;
        TMLSelectEvt tmlselectevt;
        TMLDelay tmldelay;
        int staticLoopIndex = 0;
        String sl = "", tmp;
        TMLType tt;
        TMLAttribute tmlt;

        iterator = list.listIterator();
        while(iterator.hasNext()) {
            tgc = (TGComponent)(iterator.next());
			if (tgc.getCheckLatency()){
				String name = tmltask.getName() + ":" +  tgc.getName();
				name = name.replaceAll(" ","");
				TraceManager.addDev("To check " + name);
				
				tmlm.addCheckedActivity(tgc, name+":" + tgc.getValue().split("\\(")[0]);
			}
            if (tgc instanceof TMLADActionState) {
                tmlaction = new TMLActionState("action", tgc);
                tmp = ((TMLADActionState)(tgc)).getAction();
                tmp = modifyActionString(tmp);
                tmlaction.setAction(tmp);
                activity.addElement(tmlaction);
                ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                listE.addCor(tmlaction, tgc);

            } else if (tgc instanceof TMLADRandom) {
                tmladrandom = (TMLADRandom)tgc;
                tmlrandom = new TMLRandom("random" + tmladrandom.getValue(), tgc);
                tmp = tmladrandom.getVariable();
                tmp = modifyActionString(tmp);
                tmlrandom.setVariable(tmp);
                tmp = tmladrandom.getMinValue();
                tmp = modifyActionString(tmp);
                tmlrandom.setMinValue(tmp);
                tmp = tmladrandom.getMaxValue();
                tmp = modifyActionString(tmp);
                tmlrandom.setMaxValue(tmp);
                tmlrandom.setFunctionId(tmladrandom.getFunctionId());
                activity.addElement(tmlrandom);
                ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                listE.addCor(tmlrandom, tgc);

            } else if (tgc instanceof TMLADChoice) {
                tmlchoice = new TMLChoice("choice", tgc);
                // Guards are added at the same time as next activities
                activity.addElement(tmlchoice);
                ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                listE.addCor(tmlchoice, tgc);

            } else if (tgc instanceof TMLADSelectEvt) {
                tmlselectevt = new TMLSelectEvt("select", tgc);
                activity.addElement(tmlselectevt);
                ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                listE.addCor(tmlselectevt, tgc);

            } else if (tgc instanceof TMLADExecI) {
                tmlexeci = new TMLExecI("execi", tgc);
                tmlexeci.setAction(modifyString(((TMLADExecI)tgc).getDelayValue()));
		tmlexeci.setValue(((TMLADExecI)tgc).getDelayValue());
                activity.addElement(tmlexeci);
                ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                listE.addCor(tmlexeci, tgc);

            } else if (tgc instanceof TMLADExecIInterval) {
                tmlexecii = new TMLExecIInterval("execi", tgc);
		tmlexecii.setValue(tgc.getValue());
                tmlexecii.setMinDelay(modifyString(((TMLADExecIInterval)tgc).getMinDelayValue()));
                tmlexecii.setMaxDelay(modifyString(((TMLADExecIInterval)tgc).getMaxDelayValue()));
                activity.addElement(tmlexecii);
                ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                listE.addCor(tmlexecii, tgc);

            } else if (tgc instanceof TMLADEncrypt) {
                tmlexecc = new TMLExecC("encrypt", tgc);
                activity.addElement(tmlexecc);
				SecurityPattern sp = securityPatterns.get(((TMLADEncrypt)tgc).securityContext);
				if (sp ==null){
		    		//Throw error for missing security pattern
                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Security Pattern " + ((TMLADEncrypt)tgc).securityContext + " not found");
                    ce.setTDiagramPanel(tadp);
                    ce.setTGComponent(tgc);
                    checkingErrors.add(ce);
				}
				else {
					tmlexecc.securityPattern = sp;
                	tmlexecc.setAction(Integer.toString(sp.encTime));
                	((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
					tmlm.securityTaskMap.get(sp).add(tmltask);
                	listE.addCor(tmlexecc, tgc);
				}
            } else if (tgc instanceof TMLADDecrypt) {
                tmlexecc = new TMLExecC("decrypt_"+((TMLADDecrypt)tgc).securityContext, tgc);
                activity.addElement(tmlexecc);
				SecurityPattern sp = securityPatterns.get(((TMLADDecrypt)tgc).securityContext);
				if (sp ==null){
		    		//Throw error for missing security pattern
                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Security Pattern " + ((TMLADDecrypt)tgc).securityContext + " not found");
                    ce.setTDiagramPanel(tadp);
                    ce.setTGComponent(tgc);
                    checkingErrors.add(ce);
				}
				else {
					tmlexecc.securityPattern = sp;
                	tmlexecc.setAction(Integer.toString(sp.decTime));
                	((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                	listE.addCor(tmlexecc, tgc);
					tmlm.securityTaskMap.get(sp).add(tmltask);
				}

            } else if (tgc instanceof TMLADExecC) {
                tmlexecc = new TMLExecC("execc", tgc);
		tmlexecc.setValue(((TMLADExecC)tgc).getDelayValue());
                tmlexecc.setAction(modifyString(((TMLADExecC)tgc).getDelayValue()));
                activity.addElement(tmlexecc);
                ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                listE.addCor(tmlexecc, tgc);

            } else if (tgc instanceof TMLADExecCInterval) {
                tmlexecci = new TMLExecCInterval("execci", tgc);
                tmlexecci.setMinDelay(modifyString(((TMLADExecCInterval)tgc).getMinDelayValue()));
                tmlexecci.setMaxDelay(modifyString(((TMLADExecCInterval)tgc).getMaxDelayValue()));
                activity.addElement(tmlexecci);
                ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                listE.addCor(tmlexecci, tgc);

            } else if (tgc instanceof TMLADDelay) {
                tmldelay = new TMLDelay("d-delay", tgc);
                tmldelay.setMinDelay(modifyString(((TMLADDelay)tgc).getDelayValue()));
                tmldelay.setMaxDelay(modifyString(((TMLADDelay)tgc).getDelayValue()));
                tmldelay.setUnit(((TMLADDelay)tgc).getUnit());
                activity.addElement(tmldelay);
                ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                listE.addCor(tmldelay, tgc);

            } else if (tgc instanceof TMLADDelayInterval) {
                tmldelay = new TMLDelay("nd-delay", tgc);
                tmldelay.setMinDelay(modifyString(((TMLADDelayInterval)tgc).getMinDelayValue()));
                tmldelay.setMaxDelay(modifyString(((TMLADDelayInterval)tgc).getMaxDelayValue()));
                tmldelay.setUnit(((TMLADDelayInterval)tgc).getUnit());
                activity.addElement(tmldelay);
                ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                listE.addCor(tmldelay, tgc);

            } else if (tgc instanceof TMLADForLoop) {
                tmlforloop = new TMLForLoop("loop", tgc);
                tmlforloop.setInit(modifyString(((TMLADForLoop)tgc).getInit()));
                tmp = ((TMLADForLoop)tgc).getCondition();
                /*if (tmp.trim().length() == 0) {
                  tmp = "true";
                  }*/
                tmlforloop.setCondition(modifyString(tmp));
                tmlforloop.setIncrement(modifyActionString(((TMLADForLoop)tgc).getIncrement()));

                activity.addElement(tmlforloop);
                ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                listE.addCor(tmlforloop, tgc);

            } else if (tgc instanceof TMLADForStaticLoop) {
                sl = "loop__" + staticLoopIndex;
                tt = new TMLType(TMLType.NATURAL);
                tmlt = new TMLAttribute(sl, tt);
                tmlt.initialValue = "0";
                tmltask.addAttribute(tmlt);
                tmlforloop = new TMLForLoop(sl, tgc);
                tmlforloop.setInit(sl + " = 0");
                tmlforloop.setCondition(sl + "<" + modifyString(tgc.getValue()));
                tmlforloop.setIncrement(sl + " = " + sl + " + 1");
                activity.addElement(tmlforloop);
                ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                listE.addCor(tmlforloop, tgc);
                staticLoopIndex++;

            } else if (tgc instanceof TMLADForEverLoop) {
                /*sl = "loop__" + staticLoopIndex;
                  tt = new TMLType(TMLType.NATURAL);
                  tmlt = new TMLAttribute(sl, tt);
                  tmlt.initialValue = "0";
                  tmltask.addAttribute(tmlt);*/
                tmlforloop = new TMLForLoop("infiniteloop", tgc);
                tmlforloop.setInit("");
                tmlforloop.setCondition("");
                tmlforloop.setIncrement("");
		tmlforloop.setInfinite(true);
                activity.addElement(tmlforloop);
                ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                listE.addCor(tmlforloop, tgc);
                staticLoopIndex++;

                tmlstopstate = new TMLStopState("Stop after infinite loop", null);
                activity.addElement(tmlstopstate);
                tmlforloop.addNext(tmlstopstate);

            } else if (tgc instanceof TMLADSequence) {
                tmlsequence = new TMLSequence("seq", tgc);
                activity.addElement(tmlsequence);
                listE.addCor(tmlsequence, tgc);

            } else if (tgc instanceof TMLADUnorderedSequence) {
                tmlrsequence = new TMLRandomSequence("rseq", tgc);
                activity.addElement(tmlrsequence);
                listE.addCor(tmlrsequence, tgc);

            } else if (tgc instanceof TMLADReadChannel) {
                // Get the channel
                channel = tmlm.getChannelByName(getFromTable(tmltask, ((TMLADReadChannel)tgc).getChannelName()));
                if (channel == null) {
                    if (Conversion.containsStringInList(removedChannels, ((TMLADReadChannel)tgc).getChannelName())) {
                        CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "A call to " + ((TMLADReadChannel)tgc).getChannelName() + " has been removed because the corresponding channel is not taken into account");
                        ce.setTMLTask(tmltask);
                        ce.setTDiagramPanel(tadp);
                        ce.setTGComponent(tgc);
                        warnings.add(ce);
                        ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                        activity.addElement(new TMLJunction("void junction", tgc));
                    } else {
                        CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADReadChannel)tgc).getChannelName() + " is an unknown channel");
                        ce.setTMLTask(tmltask);
                        ce.setTDiagramPanel(tadp);
                        ce.setTGComponent(tgc);
                        ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                        checkingErrors.add(ce);
                    }
                } else {
                    tmlreadchannel = new TMLReadChannel("read channel", tgc);
                    tmlreadchannel.setNbOfSamples(modifyString(((TMLADReadChannel)tgc).getSamplesValue()));
                    tmlreadchannel.addChannel(channel);
					//security pattern
		    		if (securityPatterns.get(((TMLADReadChannel)tgc).securityContext)!=null){
						tmlreadchannel.securityPattern= securityPatterns.get(((TMLADReadChannel)tgc).securityContext);
		    			//NbOfSamples will increase due to extra overhead from MAC
						int cur=1;
						try {
			    			cur = Integer.valueOf(modifyString(((TMLADReadChannel)tgc).getSamplesValue()));
						} catch(NumberFormatException e) { 
   						} catch(NullPointerException e) {
    					}
		    			int add = Integer.valueOf(tmlreadchannel.securityPattern.overhead);
						if (!tmlreadchannel.securityPattern.nonce.equals("")){
						    SecurityPattern nonce = securityPatterns.get(tmlreadchannel.securityPattern.nonce);
						    if (nonce!=null){
						        add = Integer.valueOf(nonce.overhead);
					    	}
						}
						cur = cur+ add;
		    			tmlreadchannel.setNbOfSamples(Integer.toString(cur));
		    		}
		   			else if (!((TMLADReadChannel)tgc).securityContext.isEmpty()){
						//Throw error for missing security pattern
						CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Security Pattern " + ((TMLADReadChannel)tgc).securityContext + " not found");
        	    	   	ce.setTDiagramPanel(tadp);
        	    	  	ce.setTGComponent(tgc);
        	    	    checkingErrors.add(ce);
			    	}
        	        activity.addElement(tmlreadchannel);
        	        ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
        	        listE.addCor(tmlreadchannel, tgc);
        	    }
            } else if (tgc instanceof TMLADSendEvent) {
                event = tmlm.getEventByName(getFromTable(tmltask, ((TMLADSendEvent)tgc).getEventName()));
                if (event == null) {
                    if (Conversion.containsStringInList(removedEvents, ((TMLADSendEvent)tgc).getEventName())) {
                        CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "A call to " + ((TMLADSendEvent)tgc).getEventName() + " has been removed because the corresponding event is not taken into account");
                        ce.setTMLTask(tmltask);
                        ce.setTDiagramPanel(tadp);
                        ce.setTGComponent(tgc);
                        warnings.add(ce);
                        activity.addElement(new TMLJunction("void junction", tgc));
                        ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                    } else {
                        CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADSendEvent)tgc).getEventName() + " is an unknown event");
                        ce.setTMLTask(tmltask);
                        ce.setTDiagramPanel(tadp);
                        ce.setTGComponent(tgc);
                        checkingErrors.add(ce);
                        ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                    }
                } else {
                    tmlsendevent = new TMLSendEvent("send event", tgc);
                    tmlsendevent.setEvent(event);

                    for(int i=0; i<((TMLADSendEvent)tgc).realNbOfParams(); i++) {
                        tmp = modifyString(((TMLADSendEvent)tgc).getRealParamValue(i));
                        Vector<String> allVariables = tmltask.getAllAttributesStartingWith(tmp + "__");
                        if (allVariables.size() > 0) {
                            for(int k=0; k<allVariables.size(); k++) {
                                //TraceManager.addDev("Adding record: " + allVariables.get(k));
                                tmlsendevent.addParam(allVariables.get(k));
                            }
                        } else {
                            //TraceManager.addDev("Adding param: " + tmp);
                            tmlsendevent.addParam(tmp);
                        }
                    }
                    if (event.getNbOfParams() != tmlsendevent.getNbOfParams()) {
                        TraceManager.addDev("ERROR : event#:" + event.getNbOfParams() + " sendevent#:" + tmlsendevent.getNbOfParams());
                        CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADSendEvent)tgc).getEventName() + ": wrong number of parameters");
                        ce.setTMLTask(tmltask);
                        ce.setTDiagramPanel(tadp);
                        ce.setTGComponent(tgc);
                        checkingErrors.add(ce);
                        ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                    } else {
                        activity.addElement(tmlsendevent);
                        listE.addCor(tmlsendevent, tgc);
                        ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                    }
                }

            } else if (tgc instanceof TMLADSendRequest) {
                request = tmlm.getRequestByName(getFromTable(tmltask, ((TMLADSendRequest)tgc).getRequestName()));
                if (request == null) {
                    if (Conversion.containsStringInList(removedRequests, ((TMLADSendRequest)tgc).getRequestName())) {
                        CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "A call to " + ((TMLADSendRequest)tgc).getRequestName() + " has been removed because the corresponding request is not taken into account");
                        ce.setTMLTask(tmltask);
                        ce.setTDiagramPanel(tadp);
                        ce.setTGComponent(tgc);
                        warnings.add(ce);
                        activity.addElement(new TMLJunction("void junction", tgc));
                        ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                    } else {
                        CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADSendRequest)tgc).getRequestName() + " is an unknown request");
                        ce.setTMLTask(tmltask);
                        ce.setTDiagramPanel(tadp);
                        ce.setTGComponent(tgc);
                        checkingErrors.add(ce);
                        ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                    }
                } else {
                    tmlsendrequest = new TMLSendRequest("send request", tgc);
                    tmlsendrequest.setRequest(request);
                    for(int i=0; i<((TMLADSendRequest)tgc).realNbOfParams(); i++) {
                        tmp = modifyString(((TMLADSendRequest)tgc).getRealParamValue(i));
                        Vector<String> allVariables = tmltask.getAllAttributesStartingWith(tmp + "__");
                        if (allVariables.size() > 0) {
                            for(int k=0; k<allVariables.size(); k++) {
                                //TraceManager.addDev("Adding record: " + allVariables.get(k));
                                tmlsendrequest.addParam(allVariables.get(k));
				request.addParamName(allVariables.get(k));
                            }
                        } else {
                            //TraceManager.addDev("Adding param: " + tmp);
                            tmlsendrequest.addParam(tmp);
			    request.addParamName(tmp);
                        }
                    }
                    if (request.getNbOfParams() != tmlsendrequest.getNbOfParams()) {
                        TraceManager.addDev("ERROR : request#:" + request.getNbOfParams() + " sendrequest#:" + tmlsendrequest.getNbOfParams());
                        CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADSendRequest)tgc).getRequestName() + ": wrong number of parameters");
                        ce.setTMLTask(tmltask);
                        ce.setTDiagramPanel(tadp);
                        ce.setTGComponent(tgc);
                        checkingErrors.add(ce);
                        ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                    } else {
                        activity.addElement(tmlsendrequest);
                        listE.addCor(tmlsendrequest, tgc);
                        ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                    }
                }

            } else if (tgc instanceof TMLADReadRequestArg) {
                request = tmlm.getRequestToMe(tmltask);
                if (request == null) {
                    CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "This task is not requested: cannot use \"reading request arg\" operator");
                    ce.setTMLTask(tmltask);
                    ce.setTDiagramPanel(tadp);
                    ce.setTGComponent(tgc);
                    checkingErrors.add(ce);
                    ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                } else {
                    tmlaction = new TMLActionState("action reading args", tgc);
                    String act = "";
                    int cpt = 1;
                    for(int i=0; i<((TMLADReadRequestArg)tgc).realNbOfParams(); i++) {
                        tmp = modifyString(((TMLADReadRequestArg)tgc).getRealParamValue(i));
                        Vector<String> allVariables = tmltask.getAllAttributesStartingWith(tmp + "__");
                        if (allVariables.size() > 0) {
                            for(int k=0; k<allVariables.size(); k++) {
                                //TraceManager.addDev("Adding record: " + allVariables.get(k));
                                if (cpt != 1) {
                                    act += "$";
                                }
                                act += allVariables.get(k) + " = arg" + cpt + "__req";
                                cpt ++;
                            }
                        } else {
                            //TraceManager.addDev("Adding param: " + tmp);
                            if (cpt != 1) {
                                act += "$";
                            }
                            act += tmp + " = arg" + cpt + "__req";
                            cpt ++;
                        }
                    }
                    if (request.getNbOfParams() != (cpt-1)) {
                        TraceManager.addDev("ERROR : request#:" + request.getNbOfParams() + " read request arg#:" + (cpt-1));
                        CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Wrong number of parameters in \"reading request arg\" operator");
                        ce.setTMLTask(tmltask);
                        ce.setTDiagramPanel(tadp);
                        ce.setTGComponent(tgc);
                        checkingErrors.add(ce);
                        ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                    } else {
                        //TraceManager.addDev("Adding action = " + act);
                        tmlaction.setAction(act);
                        activity.addElement(tmlaction);
                        ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                        listE.addCor(tmlaction, tgc);
                    }


                }

            } else if (tgc instanceof TMLADStopState) {
                tmlstopstate = new TMLStopState("stop state", tgc);
                activity.addElement(tmlstopstate);
                listE.addCor(tmlstopstate, tgc);

            } else if (tgc instanceof TMLADNotifiedEvent) {
                event = tmlm.getEventByName(getFromTable(tmltask, ((TMLADNotifiedEvent)tgc).getEventName()));
                if (event == null) {
                    if( removedEvents.size() > 0 )      {
                        if (Conversion.containsStringInList(removedEvents, ((TMLADNotifiedEvent)tgc).getEventName())) {
                            CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "A call to " + ((TMLADNotifiedEvent)tgc).getEventName() + " has been removed because the corresponding event is not taken into account");
                            ce.setTMLTask(tmltask);
                            ce.setTDiagramPanel(tadp);
                            ce.setTGComponent(tgc);
                            warnings.add(ce);
                            activity.addElement(new TMLJunction("void junction", tgc));
                            ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                        } else {
                            CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADNotifiedEvent)tgc).getEventName() + " is an unknown event");
                            ce.setTMLTask(tmltask);
                            ce.setTDiagramPanel(tadp);
                            ce.setTGComponent(tgc);
                            checkingErrors.add(ce);
                            ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                        }
                    } else {
                        CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADNotifiedEvent)tgc).getEventName() + " is an unknown event");
                        ce.setTMLTask(tmltask);
                        ce.setTDiagramPanel(tadp);
                        ce.setTGComponent(tgc);
                        checkingErrors.add(ce);
                        ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                    }
                } else {
                    event.setNotified(true);
                    tmlnotifiedevent = new TMLNotifiedEvent("notified event", tgc);
                    tmlnotifiedevent.setEvent(event);
                    tmlnotifiedevent.setVariable(modifyString(((TMLADNotifiedEvent)tgc).getVariable()));
                    activity.addElement(tmlnotifiedevent);
                    ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                    listE.addCor(tmlnotifiedevent, tgc);
                }

            } else if (tgc instanceof TMLADWaitEvent) {
                event = tmlm.getEventByName(getFromTable(tmltask, ((TMLADWaitEvent)tgc).getEventName()));
                if (event == null) {
                    if( removedEvents.size() > 0 )      {
                        if (Conversion.containsStringInList(removedEvents, ((TMLADWaitEvent)tgc).getEventName())) {
                            CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "A call to " + ((TMLADWaitEvent)tgc).getEventName() + " has been removed because the corresponding event is not taken into account");
                            ce.setTMLTask(tmltask);
                            ce.setTDiagramPanel(tadp);
                            ce.setTGComponent(tgc);
                            warnings.add(ce);
                            ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                            activity.addElement(new TMLJunction("void junction", tgc));
                        } else {
                            CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADWaitEvent)tgc).getEventName() + " is an unknown event");
                            ce.setTMLTask(tmltask);
                            ce.setTDiagramPanel(tadp);
                            ce.setTGComponent(tgc);
                            ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                            checkingErrors.add(ce);
                        }
                    } else {
                        CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADWaitEvent)tgc).getEventName() + " is an unknown event");
                        ce.setTMLTask(tmltask);
                        ce.setTDiagramPanel(tadp);
                        ce.setTGComponent(tgc);
                        ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                        checkingErrors.add(ce);
                    }
                } else {
                    //TraceManager.addDev("Nb of param of event:" + event.getNbOfParams());
                    tmlwaitevent = new TMLWaitEvent("wait event", tgc);
                    tmlwaitevent.setEvent(event);
                    for(int i=0; i<((TMLADWaitEvent)tgc).realNbOfParams(); i++) {
                        tmp = modifyString(((TMLADWaitEvent)tgc).getRealParamValue(i));
                        Vector<String> allVariables = tmltask.getAllAttributesStartingWith(tmp + "__");
                        if (allVariables.size() > 0) {
                            for(int k=0; k<allVariables.size(); k++) {
                                //TraceManager.addDev("Adding record: " + allVariables.get(k));
                                tmlwaitevent.addParam(allVariables.get(k));
                            }
                        } else {
                            //TraceManager.addDev("Adding param: " + tmp);
                            tmlwaitevent.addParam(tmp);
                        }
                    }
                    if (event.getNbOfParams() != tmlwaitevent.getNbOfParams()) {
                        TraceManager.addDev("ERROR : event#:" + event.getNbOfParams() + " waitevent#:" + tmlwaitevent.getNbOfParams());
                        CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADWaitEvent)tgc).getEventName() + ": wrong number of parameters");
                        ce.setTMLTask(tmltask);
                        ce.setTDiagramPanel(tadp);
                        ce.setTGComponent(tgc);
                        checkingErrors.add(ce);
                        ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                    } else {
                        activity.addElement(tmlwaitevent);
                        listE.addCor(tmlwaitevent, tgc);
                        ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                    }

                }

            } else if (tgc instanceof TMLADWriteChannel) {
                // Get channels
                channels = ((TMLADWriteChannel)tgc).getChannelsByName();
                boolean error = false;
                for(int i=0; i<channels.length; i++) {
                    //TraceManager.addDev("Getting from table " + tmltask.getName() + "/" +channels[i]);
                    channel = tmlm.getChannelByName(getFromTable(tmltask, channels[i]));
                    if (channel == null) {
                        if (Conversion.containsStringInList(removedChannels, ((TMLADWriteChannel)tgc).getChannelName(i))) {
                            CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "A call to " + ((TMLADWriteChannel)tgc).getChannelName(i) + " has been removed because the corresponding channel is not taken into account");
                            ce.setTMLTask(tmltask);
                            ce.setTDiagramPanel(tadp);
                            ce.setTGComponent(tgc);
                            warnings.add(ce);
                            ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                            activity.addElement(new TMLJunction("void junction", tgc));
                        } else {
                            CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADWriteChannel)tgc).getChannelName(i) + " is an unknown channel");
                            ce.setTMLTask(tmltask);
                            ce.setTDiagramPanel(tadp);
                            ce.setTGComponent(tgc);
                            ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                            checkingErrors.add(ce);
                        }
                        error = true;
                    }
                }
                if (!error) {
                    tmlwritechannel = new TMLWriteChannel("write channel", tgc);
                    tmlwritechannel.setNbOfSamples(modifyString(((TMLADWriteChannel)tgc).getSamplesValue()));
                    for(int i=0; i<channels.length; i++) {
                        channel = tmlm.getChannelByName(getFromTable(tmltask, channels[i]));
                        tmlwritechannel.addChannel(channel);
                    }
		    //add sec pattern
		    if (securityPatterns.get(((TMLADWriteChannel)tgc).securityContext)!=null){
			tmlwritechannel.securityPattern= securityPatterns.get(((TMLADWriteChannel)tgc).securityContext);
		 	int cur = Integer.valueOf(modifyString(((TMLADWriteChannel)tgc).getSamplesValue()));
		    	int add = Integer.valueOf(tmlwritechannel.securityPattern.overhead);
			if (!tmlwritechannel.securityPattern.nonce.equals("")){
			    SecurityPattern nonce = securityPatterns.get(tmlwritechannel.securityPattern.nonce);
			    if (nonce!=null){
			        add = Integer.valueOf(nonce.overhead);
			    }
			}
			cur = cur+ add;
		    	tmlwritechannel.setNbOfSamples(Integer.toString(cur));
		    }
		    else if (!((TMLADWriteChannel)tgc).securityContext.isEmpty()){
			//Throw error for missing security pattern
			CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Security Pattern " + ((TMLADWriteChannel)tgc).securityContext + " not found");
                	ce.setTDiagramPanel(tadp);
                	ce.setTGComponent(tgc);
               		checkingErrors.add(ce);
		    }
                    activity.addElement(tmlwritechannel);
                    ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                    listE.addCor(tmlwritechannel, tgc);
                }
            }
        }

        // Interconnection between elements
        TGConnectorTMLAD tgco;
        TGConnectingPoint p1, p2;
        TMLActivityElement ae1, ae2;
        TGComponent tgc1, tgc2, tgc3;
        int j, index;
        iterator = list.listIterator();
        while(iterator.hasNext()) {
            tgc = (TGComponent)(iterator.next());
            if (tgc instanceof TGConnectorTMLAD) {
                tgco = (TGConnectorTMLAD)tgc;
                p1 = tgco.getTGConnectingPointP1();
                p2 = tgco.getTGConnectingPointP2();

                // Identification of connected components
                tgc1 = null; tgc2 = null;
                for(j=0; j<list.size(); j++) {
                    tgc3 =      (TGComponent)(list.get(j));
                    if (tgc3.belongsToMe(p1)) {
                        tgc1 = tgc3;
                    }
                    if (tgc3.belongsToMe(p2)) {
                        tgc2 = tgc3;
                    }
                }

                // Connecting tml modeling components
                if ((tgc1 != null) && (tgc2 != null)) {
                    //ADComponent ad1, ad2;
                    ae1 = activity.findReferenceElement(tgc1);
                    ae2 = activity.findReferenceElement(tgc2);

                    if ((ae1 != null ) && (ae2 != null)) {
                        //Special case if "for loop" or if "choice"

                        if (ae1 instanceof TMLForLoop) {
                            index = tgc1.indexOf(p1) - 1;
                            if (index == 0) {
                                ae1.addNext(0, ae2);
                            } else {
                                ae1.addNext(ae2);
                            }

                        } else if (ae1 instanceof TMLChoice) {
                            index = tgc1.indexOf(p1) - 1;
                            //TraceManager.addDev("Adding next:" + ae2);
                            ae1.addNext(ae2);
                            //TraceManager.addDev("Adding guard:" + ((TMLADChoice)tgc1).getGuard(index));
                            ((TMLChoice)ae1).addGuard(modifyString(((TMLADChoice)tgc1).getGuard(index)));

                        } else if (ae1 instanceof TMLSequence) {
                            index = tgc1.indexOf(p1) - 1;
                            ((TMLSequence)ae1).addIndex(index);
                            ae1.addNext(ae2);
                            //TraceManager.addDev("Adding " + ae2 + " at index " + index);

                        } else if (ae1 instanceof TMLRandomSequence) {
                            index = tgc1.indexOf(p1) - 1;
                            ((TMLRandomSequence)ae1).addIndex(index);
                            ae1.addNext(ae2);
                            //TraceManager.addDev("Adding " + ae2 + " at index " + index);

                        } else {
                            ae1.addNext(ae2);
                        }
                    }
                }
            }
        }

	

        // Check that each "for" has two nexts
        // Check that TMLChoice have compatible guards
        // Check TML select evts
        iterator = list.listIterator();
        while(iterator.hasNext()) {
            tgc = (TGComponent)(iterator.next());

	    if ((tgc instanceof TMLADForLoop) || (tgc instanceof TMLADForStaticLoop)) {
		ae1 = activity.findReferenceElement(tgc);
		if (ae1 != null) {
		    if (ae1.getNbNext() != 2) {
			CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formatted for loop: a loop must have an internal behavior, and an exit behavior ");
			ce.setTMLTask(tmltask);
			ce.setTDiagramPanel(tadp);
			ce.setTGComponent(tgc);
			checkingErrors.add(ce);
		    }
		}
	    } else if (tgc instanceof TMLADChoice) {
                tmlchoice = (TMLChoice)(activity.findReferenceElement(tgc));
                tmlchoice.orderGuards();

                int nbNonDeter = tmlchoice.nbOfNonDeterministicGuard();
                int nbStocha = tmlchoice.nbOfStochasticGuard();
                if ((nbNonDeter > 0) && (nbStocha > 0)) {
                    CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formatted choice: it has both non-determinitic and stochastic guards");
                    ce.setTMLTask(tmltask);
                    ce.setTDiagramPanel(tadp);
                    ce.setTGComponent(tgc);
                    checkingErrors.add(ce);
                }
                int nb = Math.max(nbNonDeter, nbStocha);
                if (nb > 0) {
                    nb = nb + tmlchoice.nbOfElseAndAfterGuards();
                    if (nb != tmlchoice.getNbGuard()) {
                        CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formatted choice: it has both non-determinitic/ stochastic and regular guards)");
                        ce.setTMLTask(tmltask);
                        ce.setTDiagramPanel(tadp);
                        ce.setTGComponent(tgc);
                        checkingErrors.add(ce);
                    }
                }

                if (tmlchoice.nbOfNonDeterministicGuard() > 0) {
                    /*if (!rndAdded) {
                      TMLAttribute tmlt = new TMLAttribute("rnd__0", new TMLType(TMLType.NATURAL));
                      tmlt.initialValue = "";
                      tmltask.addAttribute(tmlt);
                      rndAdded = true;
                      }*/
                }
                if (tmlchoice.hasMoreThanOneElse()) {
                    CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Choice should have only one [else] guard");
                    ce.setTMLTask(tmltask);
                    ce.setTDiagramPanel(tadp);
                    ce.setTGComponent(tgc);
                    checkingErrors.add(ce);
                } else if ((index = tmlchoice.getElseGuard()) > -1){
                    index = tmlchoice.getElseGuard();
                    if (index == 0) {
                        CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Choice should have a regular guard");
                        ce.setTMLTask(tmltask);
                        ce.setTDiagramPanel(tadp);
                        ce.setTGComponent(tgc);
                        checkingErrors.add(ce);
                    }
                }
                if (tmlchoice.hasMoreThanOneAfter()) {
                    CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Choice should have only one [after] guard");
                    ce.setTMLTask(tmltask);
                    ce.setTDiagramPanel(tadp);
                    ce.setTGComponent(tgc);
                    checkingErrors.add(ce);
                }
            }
            if (tgc instanceof TMLADSelectEvt) {
                tmlselectevt = (TMLSelectEvt)(activity.findReferenceElement(tgc));
                if (!tmlselectevt.isARealSelectEvt()) {
                    CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "'Select events'  should be followed by only event receiving operators");
                    ce.setTMLTask(tmltask);
                    ce.setTDiagramPanel(tadp);
                    ce.setTGComponent(tgc);
                    checkingErrors.add(ce);
                }
            }

        }

        // Sorting nexts elements of Sequence
        for(j=0; j<activity.nElements(); j++) {
            ae1 = activity.get(j);
            if (ae1 instanceof TMLSequence) {
                ((TMLSequence)ae1).sortNexts();
            }
            if (ae1 instanceof TMLRandomSequence) {
                ((TMLRandomSequence)ae1).sortNexts();
            }
        }
    }

    public TMLMapping translateToTMLMapping() {

        tmlm = new TMLModeling(true);
        archi = new TMLArchitecture();  //filled by makeArchitecture
        map = new TMLMapping(tmlm, archi, false);
	map.tmlap = tmlap;
        checkingErrors = new LinkedList<CheckingError> ();
        warnings = new LinkedList<CheckingError> ();
        //listE = new CorrespondanceTGElement();

        TraceManager.addDev("Making architecture");
        makeArchitecture();     //fills archi
        TraceManager.addDev("Making TML modeling");
        if (!makeTMLModeling()) {
            return null;
        }
        TraceManager.addDev("Making mapping");
        makeMapping();  //fills map
		map.listE = listE;
//	map.securityPatterns.addAll(securityPatterns.keySet());
        TraceManager.addDev("Making TMLCPLib");
        makeTMLCPLib();

        //TraceManager.addDev("<--- TML modeling:");
        //TraceManager.addDev("TML: " + tmlm.toString());
        //TraceManager.addDev("End of TML modeling --->");
	/*if (!tmlcdp.getMainGUI().getTitleAt(tmlap).contains("_enc")){
	    autoSecure();
	}
	autoMapKeys();*/
        removeActionsWithRecords();
	map.setTMLDesignPanel(this.tmlcdp);
		if (map.firewall){
		tmlap.getMainGUI().gtm.drawFirewall(map);
		}
        return map;     // the data structure map is returned to CheckSyntaxTMLMapping in GTURTLEModeling
    }


    public TMLCP translateToTMLCPDataStructure( String _cpName )        {

        tmlcp = new TMLCP( _cpName );
        checkingErrors = new LinkedList<CheckingError> ();
        warnings = new LinkedList<CheckingError> ();
        //listE = new CorrespondanceTGElement();

        if( tmlcpp != null )    {
            try {
                //TraceManager.addDev( "Making Communication Pattern data structure to check the syntax" );
                makeCPDataStructure();  //fill the data structure tmlcp
            }
            catch( MalformedTMLDesignException mtmlde ) {
                TraceManager.addDev( "Modeling error: " + mtmlde.getMessage() );
            }
        }

        //TraceManager.addDev( "About to check the syntax of CPs" );
        TMLCPSyntaxChecking syntax = new TMLCPSyntaxChecking( tmlcp );
        syntax.checkSyntax();
        //Takes the data structure tmlcp passed to the constructor and checks the syntax of the components of a cp. If there are errors (these
        //are filled inside the class syntax), then CheckingErrors are filled according to the errors in class syntax

        CheckingError ce;
        int type;
        TGComponent tgc;

        if( syntax.hasErrors() > 0 ) {
            for( TMLCPError error: syntax.getErrors() ) {
                if( error.type == TMLCPError.ERROR_STRUCTURE ) {
                    type = CheckingError.STRUCTURE_ERROR;
                }
                else {
                    type = CheckingError.BEHAVIOR_ERROR;
                }
                ce = new CheckingError( type, error.message );
                tgc = listE.getTG( error.element );
                if ( tgc != null ) {
                    ce.setTDiagramPanel( tgc.getTDiagramPanel() );
                    ce.setTGComponent( tgc );
                }
                ce.setTMLTask( error.task );
                checkingErrors.add( ce );
            }
        }

        /*makeCPDataStructure();
          if (!makeTMLModeling()) {
          return null;
          }
          TraceManager.addDev("Making mapping");
          makeCPMapping();      //Inspect the architecture Deployment Diagram to retrieve mapping information, that is now located in one
          //place only: the architecture DD

          // Syntax has been checked -> splitting ads
          // The splitting works only if there is no other operations than sequences and references to ADs/SDs
          // between forks and joins
          tmlcp.splitADs();

          TraceManager.addDev("<--- TMLCP modeling:");
          TraceManager.addDev("TMLCP: " + tmlcp.toString());
          TraceManager.addDev("End of TMLCP modeling --->");

          removeActionsWithRecords();*/

        return tmlcp;
    }

    private boolean nameInUse( List<String> _names, String _name) {
        for(String s: _names) {
            if (s.equals(_name)) {
                return true;
            }
        }
        return false;
    }

    private void makeArchitecture() {
        archi.setMasterClockFrequency(tmlap.tmlap.getMasterClockFrequency());

        if (nodesToTakeIntoAccount == null) {
            components = tmlap.tmlap.getComponentList();
        } else {
        	// DB: TODO this is a bug. Stuff in nodesToTakeIntoAccount are not components
            components = nodesToTakeIntoAccount;
        }
        Iterator<? extends TGComponent> iterator = components.listIterator();
        TGComponent tgc;

        TMLArchiCPUNode node;
        TMLArchiHWANode hwanode;
        TMLArchiBUSNode busnode;
		TMLArchiVGMNNode vgmnnode;
		TMLArchiCrossbarNode crossbarnode;
        TMLArchiBridgeNode bridgenode;
        TMLArchiMemoryNode memorynode;
        TMLArchiDMANode dmanode;
		TMLArchiFirewallNode firewallnode;
        HwCPU cpu;
        HwA hwa;	
		HwBus bus;
        HwVGMN vgmn;
		HwCrossbar crossbar;
        HwBridge bridge;
        HwMemory memory;
        HwDMA dma;

        List<String> names = new ArrayList<String>();

        while(iterator.hasNext()) {
            tgc = iterator.next();
            
            if (tgc instanceof TMLArchiCPUNode) {
                node = (TMLArchiCPUNode)tgc;
                if (nameInUse(names, node.getName())) {
                    // Node with the same name
                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Two nodes have the same name: " + node.getName());
                    ce.setTDiagramPanel(tmlap.tmlap);
                    ce.setTGComponent(node);
                    checkingErrors.add(ce);
                } else {
                    names.add(node.getName());
                    cpu = new HwCPU(node.getName());
                    cpu.nbOfCores = node.getNbOfCores();
                    cpu.byteDataSize = node.getByteDataSize();
                    cpu.pipelineSize = node.getPipelineSize();
                    cpu.goIdleTime = node.getGoIdleTime();
                    cpu.maxConsecutiveIdleCycles = node.getMaxConsecutiveIdleCycles();
                    cpu.taskSwitchingTime = node.getTaskSwitchingTime();
                    cpu.branchingPredictionPenalty = node.getBranchingPredictionPenalty();
                    cpu.cacheMiss = node.getCacheMiss();
                    cpu.schedulingPolicy = node.getSchedulingPolicy();
                    cpu.sliceTime = node.getSliceTime();
                    cpu.execiTime = node.getExeciTime();
                    cpu.execcTime = node.getExeccTime();
                    cpu.clockRatio = node.getClockRatio();
                    cpu.MEC = node.getMECType();
		    cpu.encryption = node.getEncryption();
                    listE.addCor(cpu, node);
                    archi.addHwNode(cpu);
                    TraceManager.addDev("CPU node added: " + cpu.getName());
                }
            }

            if (tgc instanceof TMLArchiHWANode) {
                hwanode = (TMLArchiHWANode)tgc;
                if (nameInUse(names, hwanode.getName())) {
                    // Node with the same name
                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Two nodes have the same name: " + hwanode.getName());
                    ce.setTDiagramPanel(tmlap.tmlap);
                    ce.setTGComponent(hwanode);
                    checkingErrors.add(ce);
                } else {
                    names.add(hwanode.getName());
                    hwa = new HwA(hwanode.getName());
                    hwa.byteDataSize = hwanode.getByteDataSize();
                    hwa.execiTime = hwanode.getExeciTime();
                    hwa.clockRatio = hwanode.getClockRatio();
                    listE.addCor(hwa, hwanode);
                    archi.addHwNode(hwa);
                    TraceManager.addDev("HWA node added: " + hwa.getName());
                }
            }

            if (tgc instanceof TMLArchiBUSNode) {
                busnode = (TMLArchiBUSNode)tgc;
                if (nameInUse(names, busnode.getName())) {
                    // Node with the same name
                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Two nodes have the same name: " + busnode.getName());
                    ce.setTDiagramPanel(tmlap.tmlap);
                    ce.setTGComponent(busnode);
                    checkingErrors.add(ce);
                } else {
                    names.add(busnode.getName());
                    bus = new HwBus(busnode.getName());
                    bus.byteDataSize = busnode.getByteDataSize();
                    bus.pipelineSize = busnode.getPipelineSize();
                    bus.arbitration = busnode.getArbitrationPolicy();
                    bus.clockRatio = busnode.getClockRatio();
                    bus.sliceTime = busnode.getSliceTime();
		    bus.privacy = busnode.getPrivacy();
                    listE.addCor(bus, busnode);
                    archi.addHwNode(bus);
                    TraceManager.addDev("BUS node added:" + bus.getName());
                }
            }

	    if (tgc instanceof TMLArchiVGMNNode) {
                vgmnnode = (TMLArchiVGMNNode)tgc;
                if (nameInUse(names, vgmnnode.getName())) {
                    // Node with the same name
                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Two nodes have the same name: " + vgmnnode.getName());
                    ce.setTDiagramPanel(tmlap.tmlap);
                    ce.setTGComponent(vgmnnode);
                    checkingErrors.add(ce);
                } else {
                    names.add(vgmnnode.getName());
                    vgmn = new HwVGMN(vgmnnode.getName());
                    vgmn.byteDataSize = vgmnnode.getByteDataSize();
		    /*   vgmn.pipelineSize = vgmnnode.getPipelineSize();
                    vgmn.arbitration = vgmnnode.getArbitrationPolicy();
                    vgmn.clockRatio = vgmnnode.getClockRatio();
                    vgmn.sliceTime = vgmnnode.getSliceTime();
		    vgmn.privacy = vgmnnode.getPrivacy();*/
                    listE.addCor(vgmn, vgmnnode);
                    archi.addHwNode(vgmn);
                    TraceManager.addDev("VGMN node added:" + vgmn.getName());
                }
            }

if (tgc instanceof TMLArchiCrossbarNode) {
                crossbarnode = (TMLArchiCrossbarNode)tgc;
                if (nameInUse(names, crossbarnode.getName())) {
                    // Node with the same name
                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Two nodes have the same name: " + crossbarnode.getName());
                    ce.setTDiagramPanel(tmlap.tmlap);
                    ce.setTGComponent(crossbarnode);
                    checkingErrors.add(ce);
                } else {
                    names.add(crossbarnode.getName());
                    crossbar = new HwCrossbar(crossbarnode.getName());
                    crossbar.byteDataSize = crossbarnode.getByteDataSize();
                    /*crossbar.pipelineSize = crossbarnode.getPipelineSize();
                    crossbar.arbitration = crossbarnode.getArbitrationPolicy();
                    crossbar.clockRatio = crossbarnode.getClockRatio();
                    crossbar.sliceTime = crossbarnode.getSliceTime();
		    crossbar.privacy = crossbarnode.getPrivacy();*/
                    listE.addCor(crossbar, crossbarnode);
                    archi.addHwNode(crossbar);
                    TraceManager.addDev("Crossbar node added:" + crossbar.getName());
                }
            }

            if (tgc instanceof TMLArchiBridgeNode) {
                bridgenode = (TMLArchiBridgeNode)tgc;
                if (nameInUse(names, bridgenode.getName())) {
                    // Node with the same name
                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Two nodes have the same name: " + bridgenode.getName());
                    ce.setTDiagramPanel(tmlap.tmlap);
                    ce.setTGComponent(bridgenode);
                    checkingErrors.add(ce);
                } else {
                    names.add(bridgenode.getName());

                    bridge = new HwBridge(bridgenode.getName());
                    bridge.bufferByteSize = bridgenode.getBufferByteDataSize();
                    bridge.clockRatio = bridgenode.getClockRatio();
                    listE.addCor(bridge, bridgenode);
                    archi.addHwNode(bridge);
                    TraceManager.addDev("Bridge node added:" + bridge.getName());
                }
            }

            if (tgc instanceof TMLArchiFirewallNode) {
                firewallnode = (TMLArchiFirewallNode)tgc;
                if (nameInUse(names, firewallnode.getName())) {
                    // Node with the same name
                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Two nodes have the same name: " + firewallnode.getName());
                    ce.setTDiagramPanel(tmlap.tmlap);
                    ce.setTGComponent(firewallnode);
                    checkingErrors.add(ce);
                } else {
                    names.add("CPU__"+firewallnode.getName());
                    bridge = new HwBridge("CPU__"+firewallnode.getName());
		    		bridge.isFirewall=true;
		    		bridge.firewallRules = ((TMLArchiFirewallNode) tgc).getRules();
					bridge.latency = ((TMLArchiFirewallNode) tgc).getLatency();
                    bridge.bufferByteSize = 1;
                    bridge.clockRatio = 1;
                    listE.addCor(bridge, firewallnode);
                    archi.addHwNode(bridge);
                    TraceManager.addDev("Bridge node added:" + bridge.getName());
                }
            }


            if (tgc instanceof TMLArchiMemoryNode) {
                memorynode = (TMLArchiMemoryNode)tgc;
                if (nameInUse(names, memorynode.getName())) {
                    // Node with the same name
                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Two nodes have the same name: " + memorynode.getName());
                    ce.setTDiagramPanel(tmlap.tmlap);
                    ce.setTGComponent(memorynode);
                    checkingErrors.add(ce);
                } else {
                    names.add(memorynode.getName());
                    memory = new HwMemory(memorynode.getName());
                    memory.byteDataSize = memorynode.getByteDataSize();
                    memory.clockRatio = memorynode.getClockRatio();
                    memory.BufferType = memorynode.getBufferType();
                    listE.addCor(memory, memorynode);
                    archi.addHwNode(memory);
                    TraceManager.addDev("Memory node added:" + memory.getName());
                }
            }

            if (tgc instanceof TMLArchiDMANode) {
                dmanode = (TMLArchiDMANode)tgc;
                if (nameInUse(names, dmanode.getName())) {
                    // Node with the same name
                    CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Two nodes have the same name: " + dmanode.getName());
                    ce.setTDiagramPanel(tmlap.tmlap);
                    ce.setTGComponent(dmanode);
                    checkingErrors.add(ce);
                } else {
                    names.add(dmanode.getName());
                    dma = new HwDMA(dmanode.getName());
                    dma.byteDataSize = dmanode.getByteDataSize();
                    dma.nbOfChannels = dmanode.getNbOfChannels();
                    dma.clockRatio = dmanode.getClockRatio();
                    listE.addCor(dma, dmanode);
                    archi.addHwNode(dma);
                    TraceManager.addDev("************************************ DMA node added:" + dma.getName());
                }
            }
        }

        // Links between nodes
        TGComponent tgc1, tgc2;
        TGConnectingPoint p1, p2;
        TMLArchiConnectorNode connector;
        HwLink hwlink;
        HwNode originNode;

        iterator = tmlap.tmlap.getComponentList().listIterator();
        while(iterator.hasNext()) {
            tgc = (TGComponent)(iterator.next());
            if (tgc instanceof TMLArchiConnectorNode) {
                connector = (TMLArchiConnectorNode)tgc;
                tgc1 = null; tgc2 = null;
                p1 = connector.getTGConnectingPointP1();
                p2 = connector.getTGConnectingPointP2();
                tgc1 = tgc.getTDiagramPanel().getComponentToWhichBelongs(p1);
                tgc2 = tgc.getTDiagramPanel().getComponentToWhichBelongs(p2);
                if ((tgc1 != null) && (tgc2 != null)) {
                    //TraceManager.addDev("Not null");
                    if (components.contains(tgc1) && components.contains(tgc2)) {
                        //TraceManager.addDev("Getting closer");

			  if (tgc2 instanceof TMLArchiBUSNode) {
                            originNode = listE.getHwNode(tgc1);
                            bus  = (HwBus)(listE.getHwNode(tgc2));
                            if ((originNode != null) && (bus != null)) {
                                hwlink = new HwLink("link_" +originNode.getName() + "_to_" + bus.getName());
                                hwlink.setPriority(connector.getPriority());
                                hwlink.bus = bus;
                                hwlink.hwnode = originNode;
                                listE.addCor(hwlink, connector);
                                archi.addHwLink(hwlink);
                                //TraceManager.addDev("Link added");
                            }
			    }

			// DG added VGMN and crossbar
                        if (tgc2 instanceof TMLArchiVGMNNode) {
                            originNode = listE.getHwNode(tgc1);
                            vgmn  = (HwVGMN)(listE.getHwNode(tgc2));
                            if ((originNode != null) && (vgmn != null)) {
                                hwlink = new HwLink("link_" +originNode.getName() + "_to_" + vgmn.getName());
                                hwlink.setPriority(connector.getPriority());
                                hwlink.vgmn = vgmn;
                                hwlink.hwnode = originNode;
                                listE.addCor(hwlink, connector);
                                archi.addHwLink(hwlink);
                                //TraceManager.addDev("Link added");
                            }
                        }

                        if (tgc2 instanceof TMLArchiCrossbarNode) {
                            originNode = listE.getHwNode(tgc1);
                            crossbar  = (HwCrossbar)(listE.getHwNode(tgc2));
                            if ((originNode != null) && (crossbar != null)) {
                                hwlink = new HwLink("link_" +originNode.getName() + "_to_" + crossbar.getName());
                                hwlink.setPriority(connector.getPriority());
                                hwlink.crossbar = crossbar;
                                hwlink.hwnode = originNode;
                                listE.addCor(hwlink, connector);
                                archi.addHwLink(hwlink);
                                //TraceManager.addDev("Link added");
                            }
                        }


                    }
                }
            }
        }
    }

    private void makeCPDataStructure() throws MalformedTMLDesignException {

       // TGComponent tgc;
      //  ui.tmlsd.TMLSDPanel SDpanel;
     //   ui.tmlcp.TMLCPPanel ADpanel;
        List<String> names = new ArrayList<String>();
     //   TMLCPSequenceDiagram SD;
      //  TMLCPActivityDiagram AD;

        Vector<TDiagramPanel> panelList = tmlcpp.getPanels();

        tmlcp.setMainCP( createActivityDiagramDataStructure( (ui.tmlcp.TMLCPPanel) panelList.get(0), names ) ); //Special case for main CP

        for( int panelCounter = 1; panelCounter < panelList.size(); panelCounter++ )    {
            if( panelList.get( panelCounter) instanceof ui.tmlsd.TMLSDPanel )   {
                tmlcp.addCPSequenceDiagram( createSequenceDiagramDataStructure( (ui.tmlsd.TMLSDPanel) panelList.get( panelCounter ), names ) );
            }
            else if( panelList.get( panelCounter ) instanceof ui.tmlcp.TMLCPPanel )     {
                tmlcp.addCPActivityDiagram( createActivityDiagramDataStructure( (ui.tmlcp.TMLCPPanel) panelList.get( panelCounter ), names ) );
            }
            //TraceManager.addDev( "PANEL number: " + panelCounter + " " + panelList.get( panelCounter ) );
        }

        tmlcp.correctReferences(); //Update references to the right activity and sequence diagrams
        //tmlcp.generateNexts(); // Add nexts elements to CPElements
        //tmlcp.removeADConnectors(); // Remove connectors since nexts have been filled
        tmlcp.splitADs(); // Splitting ADs so as to remove junctions -> new ADs are introduced for each junction inside an AD

        /*for( TMLCPSequenceDiagram seqDiag: tmlcp.getCPSequenceDiagrams() )      {
          TraceManager.addDev( "**********" );
          TraceManager.addDev( "DIAGRAM " + seqDiag.getName() );
          for( tmltranslator.tmlcp.TMLSDInstance instance: seqDiag.getInstances() )   {
          TraceManager.addDev( "INSTANCE: " + instance.getName() + "\n" + instance.getAttributes() );
          }
          }*/
    }   //End of method


    private tmltranslator.tmlcp.TMLCPActivityDiagram createActivityDiagramDataStructure( ui.tmlcp.TMLCPPanel panel,
                                                                                         List<String> names )
    throws MalformedTMLDesignException {
        tmltranslator.tmlcp.TMLCPStart start;
        tmltranslator.tmlcp.TMLCPStop stop;
        tmltranslator.tmlcp.TMLCPJunction junction;
        tmltranslator.tmlcp.TMLCPJoin join;
        tmltranslator.tmlcp.TMLCPFork fork;
        tmltranslator.tmlcp.TMLCPChoice choice;
       // tmltranslator.tmlcp.TMLCPConnector TMLCPconnector;
        tmltranslator.tmlcp.TMLCPRefAD refAD;
        tmltranslator.tmlcp.TMLCPRefSD refSD;
        tmltranslator.tmlcp.TMLCPForLoop loop;

        /*if (tmladp == null) {
          String msg = tmlto.getValue() + " has no activity diagram";
          CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, msg);
          ce.setTDiagramPanel(tmldp.tmltdp);
          ce.setTGComponent(tgc);
          checkingErrors.add(ce);
          throw new MalformedTMLDesignException(tmlto.getValue() + " msg");
          }*/

        List<TGComponent> components = panel.getComponentList();
        
        if( nameInUse( names, panel.getName() ) ) {
            String msg = panel.getName() + " already exists";
            CheckingError ce = new CheckingError( CheckingError.STRUCTURE_ERROR, "Two diagrams have the same name: " + panel.getName() );
            ce.setTDiagramPanel( tmlcpp.tmlcpp );
            //ce.setTGComponent( components );
            checkingErrors.add( ce );
            throw new MalformedTMLDesignException( msg );
            /*TraceManager.addDev( "ERROR: two diagrams have the same name!" );
              return new tmltranslator.tmlcp.TMLCPActivityDiagram( "ERROR", panel );*/
        }
        else {
            names.add( panel.getName() );
            //TraceManager.addDev("Lenght of elements: " + components.size() );
            tmltranslator.tmlcp.TMLCPActivityDiagram AD  = new tmltranslator.tmlcp.TMLCPActivityDiagram( panel.getName(), panel );
            int k;
            TGComponent component;
            String compID;

            for( k = 0; k < components.size(); k++ )        {
                component = (TGComponent) components.get(k);
                compID = component.getName() + "_#" + AD.getSize();
                if( component instanceof ui.tmlcp.TMLCPStartState )     {
                    //TraceManager.addDev( k + " " + component.getName() + "\t" + component.getValue() );
                    start = new tmltranslator.tmlcp.TMLCPStart( compID, component );
                    AD.setStartElement( start );
                    AD.addTMLCPElement( start );        //CAREFUL: the elements are not added in the same order as they appear in the GUI
                }
                if( component instanceof ui.tmlcp.TMLCPStopState )      {
                    //TraceManager.addDev( k + " " + component.getName() + "\t" + component.getValue() + "\t" + component.getY() );
                    stop = new tmltranslator.tmlcp.TMLCPStop( compID, component );
                    AD.addTMLCPElement(stop);
                }
                if( component instanceof ui.tmlcp.TMLCPRefSD )  {
                    //TraceManager.addDev( k + " " + component.getName() + "\t" + component.getValue() + "\t" + component.getY() );
                    refSD = new tmltranslator.tmlcp.TMLCPRefSD( compID, component );
                    AD.addTMLCPElement( refSD );
                }
                if( component instanceof ui.tmlcp.TMLCPRefAD )  {
                    //TraceManager.addDev( k + " " + component.getName() + "\t" + component.getValue() + "\t" + component.getY() );
                    refAD = new tmltranslator.tmlcp.TMLCPRefAD( compID, component );
                    AD.addTMLCPElement( refAD );
                }
                if( component instanceof ui.tmlcp.TMLCPJunction )       {
                    //TraceManager.addDev( k + " " + component.getName() + "\t" + component.getValue() + "\t" + component.getY() );
                    junction = new tmltranslator.tmlcp.TMLCPJunction( compID, component );
                    AD.addTMLCPElement( junction );
                }
                if( component instanceof ui.tmlcp.TMLCPJoin )   {
                    //TraceManager.addDev( k + " " + component.getName() + "\t" + component.getValue() + "\t" + component.getY() );
                    join = new tmltranslator.tmlcp.TMLCPJoin( compID, component );
                    AD.addTMLCPElement( join );
                }
                if( component instanceof ui.tmlcp.TMLCPFork )   {
                    //TraceManager.addDev( k + " " + component.getName() + "\t" + component.getValue() + "\t" + component.getY() );
                    fork = new tmltranslator.tmlcp.TMLCPFork( compID, component );
                    AD.addTMLCPElement( fork );
                }
                if( component instanceof ui.tmlcp.TMLCPForLoop )   {
                    //TraceManager.addDev( k + " " + component.getName() + "\t" + component.getValue() + "\t" + component.getY() );
                    loop = new tmltranslator.tmlcp.TMLCPForLoop( compID, component );
                    AD.addTMLCPElement( loop );
                    loop.setInit(((ui.tmlcp.TMLCPForLoop)(component)).getInit());
                    loop.setCondition(((ui.tmlcp.TMLCPForLoop)(component)).getCondition());
                    loop.setIncrement(((ui.tmlcp.TMLCPForLoop)(component)).getIncrement());

                }
                if( component instanceof ui.tmlcp.TMLCPChoice ) {
                    //TraceManager.addDev( k + component.getName() + "\t" + component.getValue() + "\t" + component.getY());
                    // old way: adding guards choice = new tmltranslator.tmlcp.TMLCPChoice( component.getName(), ((ui.tmlcp.TMLCPChoice) component).getGuards(), component );
                    choice = new tmltranslator.tmlcp.TMLCPChoice( compID, null, component );
                    AD.addTMLCPElement( choice );
                }
                /*if( component instanceof ui.tmlcp.TGConnectorTMLCP)     {
                //TraceManager.addDev( k + " " + ((ui.TGConnector)component).getTGConnectingPointP1().getFather().getName() + "\t" +
                //                                                                          ((ui.TGConnector)component).getTGConnectingPointP2().getFather().getName() + "\t" + component.getY() );
                TMLCPconnector = new tmltranslator.tmlcp.TMLCPConnector(
                ((ui.tmlcp.TGConnectorTMLCP)component).getTGConnectingPointP1().getFather().getName(),
                ((ui.tmlcp.TGConnectorTMLCP)component).getTGConnectingPointP2().getFather().getName(), ((ui.tmlcp.TGConnectorTMLCP)component).getGuard(),
                ((ui.tmlcp.TGConnectorTMLCP)component).getY(), component );
                AD.addTMLCPElement( TMLCPconnector );
                }*/
            }   //End of for loop over components

            // Handling connectors
            for( k = 0; k < components.size(); k++ )        {
                component = (TGComponent) components.get(k);
                //compID = component.getName() + "__" + elements.size();
                if( component instanceof ui.tmlcp.TGConnectorTMLCP)     {
                    //TraceManager.addDev( k + " " + ((ui.TGConnector)component).getTGConnectingPointP1().getFather().getName() + "\t" +
                    //                                                                          ((ui.TGConnector)component).getTGConnectingPointP2().getFather().getName() + "\t" + component.getY() );
                    //Gathering start and end names;
                    //String st, en;
                    TGComponent stc, enc;
                    TMLCPElement source, dest;

                    stc = (TGComponent)(((ui.tmlcp.TGConnectorTMLCP)component).getTGConnectingPointP1().getFather());
                    enc = (TGComponent)(((ui.tmlcp.TGConnectorTMLCP)component).getTGConnectingPointP2().getFather());
                    source = AD.getElementByReference(stc);
                    dest = AD.getElementByReference(enc);

                    if ((source != null) && (dest != null)) {
                        source.addNextElement(dest);
                        if (source instanceof tmltranslator.tmlcp.TMLCPChoice) {
                            ((tmltranslator.tmlcp.TMLCPChoice)source).addGuard(((ui.tmlcp.TGConnectorTMLCP)component).getGuard());
                        }
                    }

                    /*TMLCPconnector = new tmltranslator.tmlcp.TMLCPConnector(
                      ((ui.tmlcp.TGConnectorTMLCP)component).getTGConnectingPointP1().getFather().getName(),
                      ((ui.tmlcp.TGConnectorTMLCP)component).getTGConnectingPointP2().getFather().getName(), ((ui.tmlcp.TGConnectorTMLCP)component).getGuard(),
                      ((ui.tmlcp.TGConnectorTMLCP)component).getY(), component );
                      AD.addTMLCPElement( TMLCPconnector );*/
                }
            }


            return AD;
        }       //End of else name does not exist yet
    }   //End of method createActivityDiagramDataStructure


    private tmltranslator.tmlcp.TMLCPSequenceDiagram createSequenceDiagramDataStructure( ui.tmlsd.TMLSDPanel panel,
                                                                                         List<String> names )      throws MalformedTMLDesignException {

        LinkedList<TAttribute> attributes;
        int index1;
        int index2;
        TGComponent[] components;
        TMLType type;
      //  String toParse;
        TAttribute attribute;
        TGConnectorMessageTMLSD connector;
        TMLSDMessage message;
        tmltranslator.tmlcp.TMLSDInstance instance;
    //    String[] tokens;                                                        //used to get the tokens of the string for a SD attribute
  //      String delims = "[ +=:;]+";             //the delimiter chars used to parse attributes of SD instance

        //TraceManager.addDev( "ADDING TO DATA STRUCTURE THE DIAGRAM " + panel.getName() );
        if( nameInUse( names, panel.getName() ) ) {
            String msg = panel.getName() + " already exists";
            CheckingError ce = new CheckingError( CheckingError.STRUCTURE_ERROR, "Two diagrams have the same name: " + panel.getName() );
            ce.setTDiagramPanel( tmlcpp.tmlcpp );
            //ce.setTGComponent( components );
            checkingErrors.add( ce );
            throw new MalformedTMLDesignException( msg );
            /*TraceManager.addDev( "ERROR: two diagrams have the same name!" );
              return new tmltranslator.tmlcp.TMLCPSequenceDiagram( "ERROR", panel );*/
        }
        else {
            names.add( panel.getName() );
            tmltranslator.tmlcp.TMLCPSequenceDiagram SD = new tmltranslator.tmlcp.TMLCPSequenceDiagram( panel.getName(), panel );
            List<TGComponent> elemList = panel.getComponentList();
            //TraceManager.addDev("Adding to the data structure the elements of: " + panel.getName() );
            //order messages according to the inverse of Y coordinate
            int j;
            TGComponent elem;
            for(j = 0; j < elemList.size(); j++ )  {
                elem = (TGComponent) elemList.get(j);
                //include the package name of the class to avoid confusion with the graphical TMLSDInstance
                if( elem instanceof TMLSDStorageInstance )      {
                    instance = new tmltranslator.tmlcp.TMLSDInstance( ((TMLSDStorageInstance)elem).getName(), elem, "STORAGE" );
                    TMLSDStorageInstance storage = (TMLSDStorageInstance) elemList.get(j);
                    attributes = storage.getAttributes();
                    for( index1 = 0; index1 < attributes.size(); index1++ )     {       // an attribute is a variable declaration
                        attribute = attributes.get( index1 );
                        if( attribute.getType() == TAttribute.NATURAL )       {
                            type = new TMLType( TMLType.NATURAL );
                        }
                        else {
                            if( attribute.getType() == TAttribute.BOOLEAN )   {
                                type = new TMLType( TMLType.BOOLEAN );
                            }
                            else        {
                                type = new TMLType( TMLType.ADDRESS );
                            }
                        }
                        instance.addAttribute( new TMLAttribute( attribute.getId(), storage.getName(), type, attribute.getInitialValue() ) );
                    }
                    if( storage.getNumberInternalComponents() > 0 )     {       // action states are stored as internal components of an instance
                        components = storage.getInternalComponents();
                        for( index2 = 0; index2 < storage.getNumberInternalComponents(); index2++ )     {
                            instance.addAction( new TMLSDAction( components[index2].getValue(), storage.getName(), components[index2], components[index2].getY() ) );
                        }
                    }
                    SD.addInstance( instance );
                }
                if( elem instanceof TMLSDControllerInstance )   {
                    TMLSDControllerInstance controller = (TMLSDControllerInstance) elemList.get(j);
                    instance = new tmltranslator.tmlcp.TMLSDInstance( controller.getName(), elem, "CONTROLLER" );
                    attributes = controller.getAttributes();
                    for( index1 = 0; index1 < attributes.size(); index1++ )     {       // an attribute is a variable declaration
                        attribute = attributes.get( index1 );
                        if( attribute.getType() == TAttribute.NATURAL )       {
                            type = new TMLType( TMLType.NATURAL );
                        }
                        else {
                            if( attribute.getType() == TAttribute.BOOLEAN )   {
                                type = new TMLType( TMLType.BOOLEAN );
                            }
                            else        {
                                type = new TMLType( TMLType.ADDRESS );
                            }
                        }
                        instance.addAttribute( new TMLAttribute( attribute.getId(), controller.getName(), type, attribute.getInitialValue() ) );
                    }
                    if( controller.getNumberInternalComponents() > 0 )  {       //Action states are stored as internal components of an instance
                        components = controller.getInternalComponents();
                        for( index2 = 0; index2 < controller.getNumberInternalComponents(); index2++ )  {       //get action states
                            instance.addAction( new TMLSDAction( components[index2].getValue(), controller.getName(), components[index2], components[index2].getY() ) );
                        }
                    }
                    SD.addInstance( instance );
                }
                if( elem instanceof TMLSDTransferInstance )     {
                    TMLSDTransferInstance transfer = (TMLSDTransferInstance) elemList.get(j);
                    instance = new tmltranslator.tmlcp.TMLSDInstance( transfer.getName(), elem, "TRANSFER" );
                    attributes = transfer.getAttributes();
                    for( index1 = 0; index1 < attributes.size(); index1++ )     {       // an attribute is a variable declaration
                        attribute = attributes.get( index1 );
                        if( attribute.getType() == TAttribute.NATURAL )       {
                            type = new TMLType( TMLType.NATURAL );
                        }
                        else {
                            if( attribute.getType() == TAttribute.BOOLEAN )   {
                                type = new TMLType( TMLType.BOOLEAN );
                            }
                            else        {
                                type = new TMLType( TMLType.ADDRESS );
                            }
                        }
                        instance.addAttribute( new TMLAttribute( attribute.getId(), transfer.getName(), type, attribute.getInitialValue() ) );
                    }
                    if( transfer.getNumberInternalComponents() > 0 )    {       //Action states are stored as internal components of an instance
                        components = transfer.getInternalComponents();
                        for( index2 = 0; index2 < transfer.getNumberInternalComponents(); index2++ )    {       //get action states
                            instance.addAction( new TMLSDAction( components[index2].getValue(), transfer.getName(), components[index2], components[index2].getY() ) );
                        }
                    }
                    SD.addInstance( instance );
                }

            }   //End of for over internal elements
            for(j = 0; j < elemList.size(); j++ )  {
                elem = (TGComponent) elemList.get(j);
                if( elem instanceof TGConnectorMessageTMLSD )   {
                    //TraceManager.addDev("Analyzing message:" + elem);
                    connector = (TGConnectorMessageTMLSD) elemList.get(j);
                    String sender = connector.getTGConnectingPointP1().getFather().getName();
                    String receiver = connector.getTGConnectingPointP2().getFather().getName();
                    //Should check that instances do not have multiple names
                    message = new TMLSDMessage( connector.getName(), sender, receiver, connector.getY(), connector, connector.getParams() );
                    for( tmltranslator.tmlcp.TMLSDInstance tempInstance: SD.getInstances() )    {
                        if( tempInstance.getName().equals( sender ) )   {
                            //TraceManager.addDev( "Adding message " + message.toString() + " to instance " + tempInstance.toString() );
                            tempInstance.addMessage( message, TMLSDEvent.SEND_MESSAGE_EVENT );
                            //break;
                        }
                        if( tempInstance.getName().equals( receiver ) )   {
                            //TraceManager.addDev( "Adding message " + message.toString() + " to instance " + tempInstance.toString() );
                            tempInstance.addMessage( message, TMLSDEvent.RECEIVE_MESSAGE_EVENT );
                            //break;
                        }
                    }
                }

            }
            return SD;
        }//End else name does not exist yet
    }   //End of method createSequenceDiagramDataStructure

    private boolean makeTMLModeling() {
        // Determine all TML Design to be used -> TMLDesignPanels
        List<TMLDesignPanel> panels = new ArrayList<TMLDesignPanel>();
        List<TMLComponentDesignPanel> cpanels = new ArrayList<TMLComponentDesignPanel>();
        Vector<Vector<TGComponent>> taskss = new Vector<Vector<TGComponent>>();
        Vector<TMLCPrimitiveComponent> allcomp = new Vector<TMLCPrimitiveComponent>();
        int index;

        if (nodesToTakeIntoAccount == null) {
            components = tmlap.tmlap.getComponentList();
        } else {
            components = nodesToTakeIntoAccount;
        }
        
        Iterator<? extends TGComponent> iterator = components.listIterator();

        TGComponent tgc;//, tgctask;
      //  TMLArchiNode node;
        List<TMLArchiArtifact> artifacts;
        String namePanel;
        TMLDesignPanel tmldp;
        TURTLEPanel tup;
        TMLComponentDesignPanel tmlcdp;
        TMLTaskOperator task;
        TMLCPrimitiveComponent pc;

        while(iterator.hasNext()) {
            tgc = iterator.next();
            
            if (tgc instanceof TMLArchiNode) {
                Vector<TGComponent> tmp;

                artifacts = ((TMLArchiNode)(tgc)).getAllTMLArchiArtifacts();
                for( TMLArchiArtifact artifact:artifacts) {
                    namePanel = artifact.getReferenceTaskName();
                    
                    try {
                        tup = (TURTLEPanel)(tmlap.getMainGUI().getTURTLEPanel(namePanel));

                        // Regular design panel
                        if (tup instanceof TMLDesignPanel) {
                            tmldp = (TMLDesignPanel)tup;
                            if (panels.contains(tmldp)) {
                                index = panels.indexOf(tmldp);
                                tmp = taskss.get(index);
                            } else {
                                panels.add(tmldp);
                                this.tmldp = tmldp;
                                tmp = new Vector<TGComponent>();
                                taskss.add(tmp);
                            }
                            // Search for the corresponding TMLTask
                            task = tmldp.getTaskByName(artifact.getTaskName());
                            
                            if (task != null) {
                                tmp.add(task);
                            } 
                            else {
                                CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Task " + artifact.getTaskName() + " referenced by artifact " + artifact.getValue() + " is unknown");
                                //ce.setTMLTask(tmltask);
                                ce.setTDiagramPanel(tmlap.tmlap);
                                ce.setTGComponent(tgc);
                                checkingErrors.add(ce);
                            }

                            // Component design panel
                        } else if (tup instanceof TMLComponentDesignPanel) {
                            tmlcdp = (TMLComponentDesignPanel)(tup);
                            if (cpanels.contains(tmlcdp)) {
                                index = cpanels.indexOf(tmlcdp);
                                tmp = taskss.get(index);
                            } else {
                                cpanels.add(tmlcdp);
                                tmp = new Vector<TGComponent>();
                                taskss.add(tmp);

                            }

                            // Search for the corresponding TMLTask
                            pc = tmlcdp.getPrimitiveComponentByName(artifact.getTaskName());
                            if (pc != null) {
                                tmp.add(pc);
                                allcomp.add(pc);
                            } else {
                                CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Component " + artifact.getTaskName() + " referenced by artifact " + artifact.getValue() + " is unknown");
                                //ce.setTMLTask(tmltask);
                                ce.setTDiagramPanel(tmlap.tmlap);
                                ce.setTGComponent(tgc);
                                checkingErrors.add(ce);
                            }
                        }
                    } catch (Exception e) {
                        // Just in case the mentionned panel is not a TML design Panel
                    }
                }
            }
        }

        TraceManager.addDev("Nb of panels regular:" + panels.size() + " components" + cpanels.size());
	
        // For each panel, construct a TMLModeling
        TMLModeling tmpm;
        GTMLModeling gtml;
        String s;
        index = 0;
        for(TMLDesignPanel panel: panels) {
            gtml =  new GTMLModeling(panel, false);
            gtml.putPrefixName(true);
            gtml.setTasks( taskss.get(index) );
            index ++;
            tmpm = gtml.translateToTMLModeling(false);
            warnings.addAll(gtml.getCheckingWarnings());
            if (gtml.getCheckingErrors().size() >0) {
                checkingErrors.addAll(gtml.getCheckingErrors());
                return false;
            }
            //s = tmlap.getMainGUI().getTitleAt(panel);
            //s = s.replaceAll("\\s", "");
            //tmpm.prefixAllNamesWith(s + "__");
            //TraceManager.addDev("Intermediate TMLModeling: ");
            tmlm.advancedMergeWith(tmpm);
        }

        if (cpanels.size() > 0) {
            for(TMLComponentDesignPanel panel: cpanels) {
            	this.tmlcdp = panel;
                gtml =  new GTMLModeling(panel, false);
                gtml.setComponents(allcomp);
                gtml.putPrefixName(true);
                tmpm = gtml.translateToTMLModeling(true, false);
                warnings.addAll(gtml.getCheckingWarnings());
                if (gtml.getCheckingErrors().size() >0) {
                    checkingErrors.addAll(gtml.getCheckingErrors());
                    return false;
                }
                //s = tmlap.getMainGUI().getTitleAt(panel);
                //s = s.replaceAll("\\s", "");
                //tmpm.prefixAllNamesWith(s + "__");
                TraceManager.addDev("-> -> Intermediate TMLModeling: " + tmpm);
                tmlm.advancedMergeWith(tmpm);
            }
            TraceManager.addDev("-> -> Final TMLModeling: " + tmlm);
            /*TMLComponentDesignPanel panel = cpanels.get(cpanels.size()-1);
              gtml =  new GTMLModeling(panel, false);
              gtml.setComponents(allcomp);
              tmpm = gtml.translateToTMLModeling(true, false);
              warnings.addAll(gtml.getCheckingWarnings());
              if (gtml.getCheckingErrors().size() >0) {
              checkingErrors.addAll(gtml.getCheckingErrors());
              return false;
              }
              s = tmlap.getMainGUI().getTitleAt(panel);
              s = s.replaceAll("\\s", "");
              tmpm.prefixAllNamesWith(s + "__");
              //TraceManager.addDev("Intermediate TMLModeling: " + tmpm);
              tmlm.mergeWith(tmpm);*/
        }

        TraceManager.addDev("TMLModeling tasks: " + tmlm.tasksToString());

        /*for(TMLComponentDesignPanel panel: cpanels) {
          gtml =  new GTMLModeling(panel);
          gtml.setComponents((Vector)(taskss.get(index)));
          index ++;
          tmpm = gtml.translateToTMLModeling(true);
          warnings.addAll(gtml.getCheckingWarnings());
          if (gtml.getCheckingErrors().size() >0) {
          checkingErrors.addAll(gtml.getCheckingErrors());
          return false;
          }
          s = tmlap.getMainGUI().getTitleAt(panel);
          s = s.replaceAll("\\s", "");
          tmpm.prefixAllNamesWith(s + "__");
          //TraceManager.addDev("Intermediate TMLModeling: " + tmpm);
          tmlm.mergeWith(tmpm);
          }*/

        // Properties of artifacts
        iterator = components.listIterator();
        TMLTask ttask;
        while(iterator.hasNext()) {
            //TraceManager.addDev("next");
            tgc = (TGComponent)(iterator.next());
            if (tgc instanceof TMLArchiNode) {
                artifacts = ((TMLArchiNode)(tgc)).getAllTMLArchiArtifacts();
                for(TMLArchiArtifact artifact:artifacts) {
                    s = artifact.getReferenceTaskName() + "__" + artifact.getTaskName();
                    TraceManager.addDev( "Exploring " + s );
                    s = s.replaceAll("\\s", "");
                    ttask = tmlm.getTMLTaskByName(s);
                    if (ttask != null) {
                        ttask.setPriority(artifact.getPriority());
                    }
                }
            }
        }


        TraceManager.addDev("TMLModeling: " + tmlm);

        return true;
    }

    //Inspect the architecture diagrams and retrieve mapping of channels onto CPs
//    private void makeCPMapping()        {
//
//        //Why this code?
//        //if( nodesToTakeIntoAccount == null ) {
//
//        //take the architecture panel if it exists, otherwise return
//        Vector<TDiagramPanel> panelList = tmlap.getPanels();
//        for( TDiagramPanel panel: panelList )   {
//            TraceManager.addDev( "Name of Panel: " + panel.getName() );
//        }
//        //}
//        //else  {
//        //      components = nodesToTakeIntoAccount;
//        //}
//        ListIterator iterator = components.listIterator();
//
//        TGComponent tgc;
//        ArrayList<TMLArchiArtifact> artifacts;
//        ArrayList<TMLArchiCommunicationArtifact> artifactscomm;
//        ArrayList<TMLArchiEventArtifact> artifactsEvt;
//        HwNode node;
//        TMLTask task;
//        TMLElement elt;
//        String s;
//
//        while( iterator.hasNext() ) {
//            TraceManager.addDev( "makeCPMapping 1" );
//            tgc = (TGComponent)( iterator.next() );
//            if( tgc instanceof TMLArchiCPNode ) {
//                TraceManager.addDev( "makeCPMapping 2" );
//                node = archi.getHwNodeByName( tgc.getName() );
//                if ( ( node != null ) && ( node instanceof HwCommunicationNode ) ) {
//                    TraceManager.addDev( "makeCPMapping 3" );
//                    artifactscomm = ( (TMLArchiCommunicationNode)(tgc) ).getChannelArtifactList();
//                    for( TMLArchiCommunicationArtifact artifact: artifactscomm )        {
//                        TraceManager.addDev("Exploring artifact " + artifact.getValue());
//                        s = artifact.getReferenceCommunicationName();
//                        s = s.replaceAll("\\s", "");
//                        s = s + "__" + artifact.getCommunicationName();
//                        TraceManager.addDev("Searching for:" + s);
//                        elt = tmlm.getCommunicationElementByName(s);
//                        TraceManager.addDev("comm elts:" + tmlm.getStringListCommunicationElements());
//                        if( elt instanceof TMLChannel ) {
//                            //TraceManager.addDev("Setting priority");
//                            ( (TMLChannel)(elt) ).setPriority( artifact.getPriority() );
//                        }
//                        if (elt != null) {
//                            map.addCommToHwCommNode( elt, (HwCommunicationNode)node );
//                        } else {
//                            TraceManager.addDev("Null mapping: no element named: " + artifact.getCommunicationName());
//                        }
//                    }
//
//		    
//                }
//            }
//        }
//    }   //End of method

    private void makeTMLCPLib() {
        if (nodesToTakeIntoAccount == null) {
            components = tmlap.tmlap.getComponentList();
        } else {
            components = nodesToTakeIntoAccount;
        }
        Iterator<? extends TGComponent> iterator = components.listIterator();

        TGComponent tgc;
//        ArrayList<TMLArchiArtifact> artifacts;
//        ArrayList<TMLArchiCommunicationArtifact> artifactscomm;
//        ArrayList<TMLArchiEventArtifact> artifactsEvt;
   //     HwNode node;
    //    TMLTask task;
    //    TMLElement elt;
   //     String s;
        TMLArchiCPNode cp;

        while(iterator.hasNext()) {
            tgc = (TGComponent)(iterator.next());
            //TraceManager.addDev("---------------- tgc=" + tgc);
            if (tgc instanceof TMLArchiCPNode) {
                cp = (TMLArchiCPNode)tgc;
                TMLCPLib tmlcplib = new TMLCPLib( cp.getCompleteName(), cp.getReference(), tgc, cp.getCPMEC() );
                map.addTMLCPLib(tmlcplib);
                tmlcplib.setMappedUnits(cp.getMappedUnits());
                tmlcplib.setAssignedAttributes( cp.getAssignedAttributes() );
                tmlcplib.setTransferTypes( cp.getTransferTypes() );

                // Handling mapped artifacts
                for (TMLArchiPortArtifact artifact: cp.getPortArtifactList()) {
                    TMLCPLibArtifact arti = new TMLCPLibArtifact(artifact.getName(), artifact, artifact.getValue(), artifact.getPortName(), artifact.getMappedMemory(), artifact.getPriority(), artifact.getBufferParameters() );
                    tmlcplib.addArtifact(arti);
                    //TraceManager.addDev("Adding CP artifact:" + arti);
                }
            }
        }
    }

    private void makeMapping() {
        if (nodesToTakeIntoAccount == null) {
            components = tmlap.tmlap.getComponentList();

        } else {
            components = nodesToTakeIntoAccount;
        }
        
        Iterator<? extends TGComponent> iterator = components.listIterator();

        TGComponent tgc;
        List<TMLArchiArtifact> artifacts;
        List<TMLArchiCommunicationArtifact> artifactscomm;
        List<TMLArchiEventArtifact> artifactsEvt;
        HwNode node;
        TMLTask task;
        TMLElement elt;
        String s;

        while(iterator.hasNext()) {
            tgc = (TGComponent)(iterator.next());
            //if( tgc instanceof TMLArchiCPNode )       {
			
            node = archi.getHwNodeByName( tgc.getName() );
            if( ( node != null ) && ( node instanceof HwExecutionNode ) ) {     //why checking this instanceof?
                artifacts = ( (TMLArchiNode)(tgc) ).getAllTMLArchiArtifacts();
                for( TMLArchiArtifact artifact:artifacts ) {
                    //TraceManager.addDev("Exploring artifact " + artifact.getValue());
                    s = artifact.getReferenceTaskName();
                    ArchUnitMEC mec = artifact.getArchUnitMEC();
                    int operationType = artifact.getOperationType();
                    TraceManager.addDev("1) Trying to get task named:" + s);
                    s = s.replaceAll("\\s", "");
                    TraceManager.addDev("2) Trying to get task named:" + s);
                    s = s + "__" + artifact.getTaskName();
                    TraceManager.addDev("3) Trying to get task named:" + s);
                    task = tmlm.getTMLTaskByName(s);
                    if (task != null) {
                        if( operationType != -1 )       {
                            task.addOperationType( operationType );
                        }
                        ((HwExecutionNode)node).addMECToHwExecutionNode( mec );
                        map.addTaskToHwExecutionNode(task, (HwExecutionNode)node);
                    } else {
                        TraceManager.addDev("Null task");
                    }
                }
            }

            // Other nodes (memory, bridge, bus, VGMN, crossbar)
            //}
            if ((tgc instanceof TMLArchiBUSNode) ||(tgc instanceof TMLArchiVGMNNode) || (tgc instanceof TMLArchiCrossbarNode) ||(tgc instanceof TMLArchiBridgeNode) || (tgc instanceof TMLArchiMemoryNode)|| (tgc instanceof TMLArchiDMANode) || (tgc instanceof TMLArchiFirewallNode)) {
                node = archi.getHwNodeByName(tgc.getName());
                if ((node != null) && (node instanceof HwCommunicationNode)) {
		    if (tgc instanceof TMLArchiFirewallNode){
			map.firewall=true;
		    }
                    artifactscomm = ((TMLArchiCommunicationNode)(tgc)).getChannelArtifactList();
                    for( TMLArchiCommunicationArtifact artifact:artifactscomm ) {
                        TraceManager.addDev("Exploring artifact " + artifact.getValue());
                        s = artifact.getReferenceCommunicationName();
                        s = s.replaceAll("\\s", "");
                        s = s + "__" + artifact.getCommunicationName();
                        TraceManager.addDev( "s: " + s );
                        String[] vectChNames = artifact.getCommunicationName().split("__");
                        if( vectChNames.length > 1 )    {
                            s = artifact.getReferenceCommunicationName() + "__" + vectChNames[0] + "__" + artifact.getReferenceCommunicationName()
                                + "__" + vectChNames[1];
                        }
                        else    {
                            s = artifact.getReferenceCommunicationName() + "__" + vectChNames[0];
                        }
                        s = s.replaceAll("\\s", "");
                        TraceManager.addDev("Searching for " + s + " in " );
                        elt = tmlm.getCommunicationElementByName(s);
                        TraceManager.addDev("comm elts: " + tmlm.getStringListCommunicationElements());
                        if (elt instanceof TMLChannel) {
                            //TraceManager.addDev("Setting priority of " + elt + " to " + artifact.getPriority() );
                            ((TMLChannel)(elt)).setPriority(artifact.getPriority());
                        }
                        if(elt != null) {
                            TraceManager.addDev( "Adding communication " + s + " to Hardware Communication Node " + ((HwCommunicationNode)node).getName() );
                            map.addCommToHwCommNode(elt, (HwCommunicationNode)node);
                        } else {
                            TraceManager.addDev("Null mapping: no element named: " + s );
                        }
                    }
                    artifactsEvt = ( (TMLArchiCommunicationNode)(tgc) ).getEventArtifactList();
                    for( TMLArchiEventArtifact artifact:artifactsEvt ) {
                        TraceManager.addDev("Exploring artifact " + artifact.getValue());
                        s = artifact.getReferenceEventName();
                        s = s.replaceAll( "\\s", "" );
                        s = s + "__" + artifact.getEventArtifactName();
                        TraceManager.addDev( "Searching for:" + s );
                        elt = tmlm.getCommunicationElementByName(s);
                        TraceManager.addDev( "evt elts:" + tmlm.getStringListCommunicationElements() );

                        if( elt instanceof TMLChannel ) {
                            //TraceManager.addDev("Setting priority");
                            ( (TMLChannel)(elt) ).setPriority( artifact.getPriority() );
                        }
                        if ( elt != null )      {
                            map.addCommToHwCommNode( elt, (HwCommunicationNode)node );
                        } else {
                            TraceManager.addDev( "Null mapping: no element named: " + artifact.getEventArtifactName() );
                        }
                    }
		 //Map keys
		    ArrayList<TMLArchiKey> keys = ( (TMLArchiCommunicationNode)(tgc) ).getKeyList();
		    for (TMLArchiKey key:keys){
			TraceManager.addDev("Exploring key " + key.getValue());
			SecurityPattern sp = tmlm.getSecurityPattern(key.getValue());
			if (sp!=null && node instanceof HwMemory){
			    if (map.mappedSecurity.containsKey(sp)){
			    	map.mappedSecurity.get(sp).add((HwMemory)node);
			    }
			    else{
				ArrayList<HwMemory> mems = new ArrayList<HwMemory>();
				mems.add((HwMemory) node);
			    	map.mappedSecurity.put(sp, mems);
			    	TraceManager.addDev("Added key of " + key.getValue());
			    }
			}
			else {
			    System.out.println("Can't map key " + key.getValue());
			}			
		    }
                }
            }

        }
    }


    
    public void addToTable(String s1, String s2) {
        //TraceManager.addDev("Adding to Table s1= "+ s1 + " s2=" + s2);
        table.put(s1, s2);
    }

    public String getFromTable(TMLTask task, String s) {
        //TraceManager.addDev("TABLE GET: Getting from task=" + task.getName() + " element=" + s);

        if (table == null) {
            return s;
        }

        String ret = table.get(task.getName() + "/" + s);
        //TraceManager.addDev("Returning=" + ret);

        if (ret == null) {
            return s;
        }

        return ret;
    }

    public void removeActionsWithRecords() {
        //TraceManager.addDev("Reworking actions with records");
        tmlm.splitActionStatesWithUnderscoreVariables();
    }

    public void removeActionsWithDollars() {
        //TraceManager.addDev("Reworking actions with records");
        tmlm.splitActionStatesWithDollars();
    }

    public String makeName(TGComponent tgc, String _name) {
        if (!putPrefixName) {
            return _name;
        }
        //TraceManager.addDev("Making name of " + tgc + " from name = " + _name);
        String s = tgc.getTDiagramPanel().getMGUI().getTitleOf( tgc.getTDiagramPanel());
        s = s.replaceAll("\\s", "");
        s = s + "__" + _name;
        //TraceManager.addDev("Making name=" + s);
        return s;
    }
  
	    
}