/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille, Andrea Enrici, Matteo Bertolino
 * 
 * ludovic.apvrille AT telecom-paristech.fr
 * andrea.enrici AT telecom-paristech.fr
 * matteo.bertolino AT telecom-paristech.fr
 * 
 * This software is a computer program whose purpose is to allow the
 * edition of TURTLE analysis, design and deployment diagrams, to
 * allow the generation of RT-LOTOS or Java code from this diagram,
 * and at last to allow the analysis of formal validation traces
 * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
 * from INRIA Rhone-Alpes.
 * 
 * This software is governed by the CeCILL  license under French law and
 * abiding by the rules of distribution of free software.  You can  use,
 * modify and/ or redistribute the software under the terms of the CeCILL
 * license as circulated by CEA, CNRS and INRIA at the following URL
 * "http://www.cecill.info".
 * 
 * As a counterpart to the access to the source code and  rights to copy,
 * modify and redistribute granted by the license, users are provided only
 * with a limited warranty  and the software's author,  the holder of the
 * economic rights,  and the successive licensors  have only  limited
 * liability.
 * 
 * In this respect, the user's attention is drawn to the risks associated
 * with loading,  using,  modifying and/or developing or reproducing the
 * software by the user in light of its specific status of free software,
 * that may mean  that it is complicated to manipulate,  and  that  also
 * therefore means  that it is reserved for developers  and  experienced
 * professionals having in-depth computer knowledge. Users are therefore
 * encouraged to load and test the software's suitability as regards their
 * requirements in conditions enabling the security of their systems and/or
 * data to be ensured and,  more generally, to use and operate it in the
 * same conditions as regards security.
 * 
 * The fact that you are presently reading this means that you have had
 * knowledge of the CeCILL license and that you accept its terms.
 */





package ui;

import avatartranslator.AvatarSpecification;
import myutil.Conversion;
import myutil.TraceManager;
import tmltranslator.*;
import tmltranslator.modelcompiler.ArchUnitMEC;
import tmltranslator.tmlcp.TMLCPElement;
import tmltranslator.tmlcp.TMLSDAction;
import tmltranslator.tmlcp.TMLSDEvent;
import tmltranslator.tmlcp.TMLSDMessage;
import tmltranslator.TMLCheckingError;
import translator.CheckingError;
import ui.tmlad.*;
import ui.tmlcd.TMLChannelOperator;
import ui.tmlcd.TMLEventOperator;
import ui.tmlcd.TMLRequestOperator;
import ui.tmlcd.TMLTaskOperator;
import ui.tmlcompd.TMLCPath;
import ui.tmlcompd.TMLCPrimitiveComponent;
import ui.tmlcompd.TMLCPrimitivePort;
import ui.tmlcompd.*;
import ui.tmlcompd.TMLCRecordComponent;
import ui.tmldd.*;
import ui.tmlsd.TGConnectorMessageTMLSD;
import ui.tmlsd.TMLSDControllerInstance;
import ui.tmlsd.TMLSDStorageInstance;
import ui.tmlsd.TMLSDTransferInstance;

import java.util.*;
import java.awt.Point;

/**
 * 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
 */
public class GTMLModeling  {
    private TMLDesignPanel tmldp;
    private TMLComponentDesignPanel tmlcdp;
    private TMLArchiPanel tmlap;
    private TMLModeling<TGComponent> 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<TGComponent> 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<TGComponent> translateToTMLModeling(boolean _resetID) {
        return translateToTMLModeling(false, _resetID);
    }

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

	public void processAttacker(){
		//System.out.println("processing...");
		//System.out.println(tmlm.getAttackerTasks());
		if (tmlm==null){
			return;
		}
		List<TMLTask> attackers = tmlm.getAttackerTasks();
		for (TMLTask attacker: attackers){
			//System.out.println(attacker.getName());
			TMLCPrimitiveComponent atcomp = tmlcdp.getPrimitiveComponentByName(attacker.getName().split("__")[1]);
			//System.out.println("comp " + attacker.getName().split("__")[1]);
			if (atcomp !=null){
				//Find activity diagram
				TMLActivityDiagramPanel tadp = tmlcdp.getTMLActivityDiagramPanel(attacker.getName().split("__")[1]);
				List<TGComponent> list = tadp.getComponentList();
				//System.out.println("list " + list);
				for (TGComponent tgc: list){
					if (tgc instanceof TMLADWriteChannel){
						TMLADWriteChannel wr = (TMLADWriteChannel) tgc;
						if (wr.isAttacker()){
							//System.out.println("channel " + wr.getChannelName());
							String channelToAdd = wr.getChannelName();

                            
							//Find ports to attach
							List<TMLCPrimitivePort> ports = tmlcdp.tmlctdp.getPortsByName(channelToAdd);
							//System.out.println("orts " + ports);
							if (ports.size()!=2){	
								//throw error
								//System.out.println("ERROR");
								continue;
							}

							//Remove Port Connector
							tmlcdp.tmlctdp.removeOneConnector(ports.get(0).getTGConnectingPointAtIndex(0));


							//Add write port to attacker component
							TMLCChannelOutPort originPort = new TMLCChannelOutPort(atcomp.getX(), atcomp.getY(), tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, atcomp, tmlcdp.tmlctdp);
                            originPort.commName=channelToAdd;
							tmlcdp.tmlctdp.addComponent(originPort, atcomp.getX(), atcomp.getY(),true,true);

							//Add fork/join to Component Diagram 
							TMLCJoin join = new TMLCJoin(atcomp.getX(), atcomp.getY(), tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp);
							tmlcdp.tmlctdp.addComponent(join, atcomp.getX(), atcomp.getY(),false,true);
					
							//Add 3 connectors, from each port to the join
							TMLCPortConnector conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, originPort.getTGConnectingPointAtIndex(0), join.getTGConnectingPointAtIndex(1), new Vector<Point>());
	                        tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true);
							if (!ports.get(0).isOrigin()){
								conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(0).getTGConnectingPointAtIndex(0), join.getTGConnectingPointAtIndex(0), new Vector<Point>());
								tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true);
								conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(1).getTGConnectingPointAtIndex(0), join.getTGConnectingPointAtIndex(6), new Vector<Point>());
								tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true);
							}
							else {
								conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(0).getTGConnectingPointAtIndex(0), join.getTGConnectingPointAtIndex(6), new Vector<Point>());
								tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true);
								conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(1).getTGConnectingPointAtIndex(0), join.getTGConnectingPointAtIndex(0), new Vector<Point>());
								tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true);
							}
						}
					}
					else if (tgc instanceof TMLADReadChannel){
						TMLADReadChannel rd = (TMLADReadChannel) tgc;
						if (rd.isAttacker()){
							//System.out.println("channel " + rd.getChannelName());
							String channelToAdd = rd.getChannelName();

                            
							//Find ports to attach
							List<TMLCPrimitivePort> ports = tmlcdp.tmlctdp.getPortsByName(channelToAdd);
							//System.out.println("orts " + ports);
							if (ports.size()!=2){	
								//throw error
								//System.out.println("ERROR");
								continue;
							}

							//Remove Port Connector
							tmlcdp.tmlctdp.removeOneConnector(ports.get(0).getTGConnectingPointAtIndex(0));


							//Add write port to attacker component
							TMLCChannelOutPort destPort = new TMLCChannelOutPort(atcomp.getX(), atcomp.getY(), tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, atcomp, tmlcdp.tmlctdp);
                            destPort.commName=channelToAdd;
							destPort.isOrigin=false;
							tmlcdp.tmlctdp.addComponent(destPort, atcomp.getX(), atcomp.getY(),true,true);

							//Add fork/join to Component Diagram 
							TMLCFork fork = new TMLCFork(atcomp.getX(), atcomp.getY(), tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp);
							tmlcdp.tmlctdp.addComponent(fork, atcomp.getX(), atcomp.getY(),false,true);
					
							//Add 3 connectors, from each port to the join
							TMLCPortConnector conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, destPort.getTGConnectingPointAtIndex(0), fork.getTGConnectingPointAtIndex(1), new Vector<Point>());
	                        tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true);
							if (ports.get(0).isOrigin()){
								conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(0).getTGConnectingPointAtIndex(0), fork.getTGConnectingPointAtIndex(0), new Vector<Point>());
                        		tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true);
								conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(1).getTGConnectingPointAtIndex(0), fork.getTGConnectingPointAtIndex(6), new Vector<Point>());
                        		tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true);
							}
							else {
								conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(0).getTGConnectingPointAtIndex(0), fork.getTGConnectingPointAtIndex(6), new Vector<Point>());
                        		tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true);
								conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(1).getTGConnectingPointAtIndex(0), fork.getTGConnectingPointAtIndex(0), new Vector<Point>());
                        		tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true);
							}

						}
					}
				}
			}
		}
	}

    public TMLModeling<TGComponent> 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();

            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;
                    }

                    tgc = listE.getTG(error.element);
                    if (tgc != null) {
                        UICheckingError ce = new UICheckingError(type, error.message);
                        ce.setTDiagramPanel(tgc.getTDiagramPanel());
                        ce.setTGComponent(tgc);
                        checkingErrors.add(ce);
                    } else {
                        TMLCheckingError ce = new TMLCheckingError(type, error.message);
                        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 {

                // Checking paths
                if (tmlcdp != null) {
                    if (tmlcdp.tmlctdp != null) {
                        List<TMLCPath> faultyPaths = tmlcdp.tmlctdp.updatePorts();
                        for(TMLCPath fp: faultyPaths) {
                            if (fp != null) {
                                // There is a faulty path
                                // Create an error
                                UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, fp.getErrorMessage());
                                ce.setTDiagramPanel(tmlcdp.tmlctdp);
                                ce.setTGComponent(fp.getFaultyComponent());
                                checkingErrors.add(ce);
                                //throw new MalformedTMLDesignException("Bad path:" + path.getErrorMessage());
                            }
                        }
                    }
                }

                addTMLComponents();
				//Adapt for attacker
				TraceManager.addDev("Processing attacker");
				processAttacker();
                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();

            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;
                    }
                    tgc = listE.getTG(error.element);
                    if (tgc != null) {
                        UICheckingError ce = new UICheckingError(type, error.message);
                        ce.setTDiagramPanel(tgc.getTDiagramPanel());
                        ce.setTGComponent(tgc);
                        checkingErrors.add(ce);
                    } else {
                        TMLCheckingError ce = new TMLCheckingError(type, error.message);
                        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";
                    UICheckingError ce = new UICheckingError(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?)";
                    UICheckingError ce = new UICheckingError(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";
                    UICheckingError ce = new UICheckingError(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?)";
                    UICheckingError ce = new UICheckingError(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);
				tmlt.setAttacker(tmlcpc.isAttacker());
                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";
                            UICheckingError ce = new UICheckingError(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()));
                    UICheckingError ce = new UICheckingError(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 = 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";
                            UICheckingError ce = new UICheckingError(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()));
                    UICheckingError ce = new UICheckingError(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 = 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();
                            UICheckingError ce = new UICheckingError(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();
                            UICheckingError ce = new UICheckingError(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";
                            UICheckingError ce = new UICheckingError(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";
                                    UICheckingError ce = new UICheckingError(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)";
                        UICheckingError ce = new UICheckingError(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()));
                    UICheckingError ce = new UICheckingError(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 = 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=" + ite.next().getPortName());
                        }

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

                        if (portstome.size() == 1) {
                            port2 = 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)";
                                    UICheckingError ce = new UICheckingError(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";
                                        UICheckingError ce = new UICheckingError(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();
                                UICheckingError ce = new UICheckingError(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 = 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();
                                    UICheckingError ce = new UICheckingError(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 += "__" + 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 = portstome.get(j);
                                alreadyConsidered.add(port);
                                addToTable(makeName(port, port.getFather().getValue()) + "/" + port.getPortName(), name);
                            }

                            // Channel attributes
                            port = portstome.get(0);
                            channel = new TMLChannel(name, port1);
                            channel.ports.add(port1);
                            for(j=0; j<portstome.size(); j++) {
                                TMLCPrimitivePort p = 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)";
                                UICheckingError ce = new UICheckingError(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";
                                    UICheckingError ce = new UICheckingError(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 = 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;

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

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

        while(iterator.hasNext()) {
            tgc = 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 = 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<?> 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";
                            UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, msg);
                            ce.setTDiagramPanel(tmlcdp.tmlctdp);
                            ce.setTGComponent(tgc);
                            checkingErrors.add(ce);
                            throw new MalformedTMLDesignException(msg);
                        }

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

                            // Useless loop. Loop because the algo evolves all the time ;-)
                            for (int kk=0; kk<portstome.size(); kk++) {
                                port2 = 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();
                                                    UICheckingError ce = new UICheckingError(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 = 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";
                                            UICheckingError ce = new UICheckingError(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());
                                    }
                                }
                            }
                            // 1 -> many
                            // Complex event
                        } else {
                            TraceManager.addDev("One to many event");
                            TMLCPrimitivePort port;

                            // Only one channel per port
                            if (port1.getPortName().indexOf(",") != -1) {
                                String msg = "Multiple definition of events with more than one output port is not allowed: " + port1.getPortName();
                                UICheckingError ce = new UICheckingError(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 = portstome.get(j);
                                if (port.getPortName().indexOf(",") != -1) {
                                    String msg = "Multiple definition of events with more than one output port is not allowed: " + port.getPortName();
                                    UICheckingError ce = new UICheckingError(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 += "__" + 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 = portstome.get(j);
                                alreadyConsidered.add(port);
                                addToTable(makeName(port, port.getFather().getValue()) + "/" + port.getPortName(), name);
                            }

                            // Channel attributes
                            port = portstome.get(0);
                            if (port.isFinite()) {
                                event = new TMLEvent(name, port1, port1.getMax(), port1.isBlocking());
                            } else {
                                event = new TMLEvent(name, port1, -1, port1.isBlocking());
                            }
                            event.ports.add(port1);
                            for(j=0; j<portstome.size(); j++) {
                                TMLCPrimitivePort p = portstome.get(j);
                                event.ports.add(p);
                            }
                            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();
                                            UICheckingError ce = new UICheckingError(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 = 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");
                                }
                            } // For
                            if (tmlm.hasSameEventName(event)) {
                                if (tmlm.hasAlmostSimilarEvent(event)) {
                                    String msg = " event " + name + " is declared several times differently";
                                    UICheckingError ce = new UICheckingError(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 {
                                TMLPort tmlport;
                                tt1 = tmlm.getTMLTaskByName(makeName(port1, port1.getFather().getValue()));
                                tmlport = new TMLPort(port1.getPortName(), port1);
                                tmlport.setAssociatedEvent( port1.getAssociatedEvent() );
                                event.addTaskPort(tt1, tmlport, true);
                                for(j=0; j<portstome.size(); j++) {
                                    port = 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()));
                                    event.addTaskPort(tt2, tmlport, port.isOrigin());
                                }

                                /*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 = 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 = 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";
                        UICheckingError ce = new UICheckingError(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 = portstome.get(i);
                        if (!port3.isOrigin()) {
                            String msg = "port " + port1.getPortName() + " is not correctly connected to port " + port3.getName();
                            UICheckingError ce = new UICheckingError(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 = 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();
                                    UICheckingError ce = new UICheckingError(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 = 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 = 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;
                            UICheckingError ce = new UICheckingError(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";
                            UICheckingError ce = new UICheckingError(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) {
        List<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);
                        UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Unknown record: " + ta.getTypeOther() + " of attribute " + ta.getId() + " declared in task " + tmltask.getName());
                        ce.setTDiagramPanel(tmlcdp.tmlctdp);
                        ce.setTGComponent(tgc);
                        checkingErrors.add(ce);
                    }
                } else {
                    // Classical TML design
                    // Error!
                    tt = new TMLType(TMLType.OTHER);
                    UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Unknown type in variable " + ta.getId() + " of task " + tmltask.getName());
                    ce.setTDiagramPanel(tmldp.tmltdp);
                    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.addSecurityPattern(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 = 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) {
            TMLCheckingError ce = new TMLCheckingError(CheckingError.BEHAVIOR_ERROR, "No start state in the TML activity diagram of " + tmltask.getName());
            ce.setTMLTask(tmltask);
            checkingErrors.add(ce);
            return;
        }

        if (cptStart > 1) {
            TMLCheckingError ce = new TMLCheckingError(CheckingError.BEHAVIOR_ERROR, "More than one start state in the TML activity diagram of " + tmltask.getName());
            ce.setTMLTask(tmltask);
            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 = 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_"+((TMLADEncrypt)tgc).securityContext, tgc);
                activity.addElement(tmlexecc);
                SecurityPattern sp = securityPatterns.get(((TMLADEncrypt)tgc).securityContext);
                if (sp ==null){
                    //Throw error for missing security pattern
                    UICheckingError ce = new UICheckingError(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
                    UICheckingError ce = new UICheckingError(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
				//TMLADReadChannel rd = (TMLADReadChannel) tgc;
                channel = tmlm.getChannelByName(getFromTable(tmltask, ((TMLADReadChannel)tgc).getChannelName()));
				/*if (rd.isAttacker()){
					channel = tmlm.getChannelByName(getAttackerChannel(((TMLADReadChannel)tgc).getChannelName()));
				}*/
                if (channel == null) {
                    if (Conversion.containsStringInList(removedChannels, ((TMLADReadChannel)tgc).getChannelName())) {
                        UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "A call to " + ((TMLADReadChannel)tgc).getChannelName() + " has been removed because the corresponding channel is not taken into account");
                        ce.setTDiagramPanel(tadp);
                        ce.setTGComponent(tgc);
                        warnings.add(ce);
                        ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                        activity.addElement(new TMLJunction("void junction", tgc));
                    } else {
                        UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADReadChannel)tgc).getChannelName() + " is an unknown channel");
                        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).getSecurityContext())!=null){
                        tmlreadchannel.securityPattern= securityPatterns.get(((TMLADReadChannel)tgc).getSecurityContext());
                        //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).getSecurityContext().isEmpty()){
                        //Throw error for missing security pattern
                        UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Security Pattern " + ((TMLADReadChannel)tgc).getSecurityContext() + " not found");
                        ce.setTDiagramPanel(tadp);
                        ce.setTGComponent(tgc);
                        checkingErrors.add(ce);
                    }
					if (tmltask.isAttacker()){
						tmlreadchannel.setAttacker(true);						
					}
                    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())) {
                        UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "A call to " + ((TMLADSendEvent)tgc).getEventName() + " has been removed because the corresponding event is not taken into account");
                        ce.setTDiagramPanel(tadp);
                        ce.setTGComponent(tgc);
                        warnings.add(ce);
                        activity.addElement(new TMLJunction("void junction", tgc));
                        ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                    } else {
                        UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADSendEvent)tgc).getEventName() + " is an unknown event");
                        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());
                        UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADSendEvent)tgc).getEventName() + ": wrong number of parameters");
                        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())) {
                        UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "A call to " + ((TMLADSendRequest)tgc).getRequestName() + " has been removed because the corresponding request is not taken into account");
                        ce.setTDiagramPanel(tadp);
                        ce.setTGComponent(tgc);
                        warnings.add(ce);
                        activity.addElement(new TMLJunction("void junction", tgc));
                        ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                    } else {
                        UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADSendRequest)tgc).getRequestName() + " is an unknown request");
                        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());
                        UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADSendRequest)tgc).getRequestName() + ": wrong number of parameters");
                        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) {
                    UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "This task is not requested: cannot use \"reading request arg\" operator");
                    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));
                        UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "Wrong number of parameters in \"reading request arg\" operator");
                        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())) {
                            UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "A call to " + ((TMLADNotifiedEvent)tgc).getEventName() + " has been removed because the corresponding event is not taken into account");
                            ce.setTDiagramPanel(tadp);
                            ce.setTGComponent(tgc);
                            warnings.add(ce);
                            activity.addElement(new TMLJunction("void junction", tgc));
                            ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                        } else {
                            UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADNotifiedEvent)tgc).getEventName() + " is an unknown event");
                            ce.setTDiagramPanel(tadp);
                            ce.setTGComponent(tgc);
                            checkingErrors.add(ce);
                            ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                        }
                    } else {
                        UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADNotifiedEvent)tgc).getEventName() + " is an unknown event");
                        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())) {
                            UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "A call to " + ((TMLADWaitEvent)tgc).getEventName() + " has been removed because the corresponding event is not taken into account");
                            ce.setTDiagramPanel(tadp);
                            ce.setTGComponent(tgc);
                            warnings.add(ce);
                            ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                            activity.addElement(new TMLJunction("void junction", tgc));
                        } else {
                            UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADWaitEvent)tgc).getEventName() + " is an unknown event");
                            ce.setTDiagramPanel(tadp);
                            ce.setTGComponent(tgc);
                            ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                            checkingErrors.add(ce);
                        }
                    } else {
                        UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADWaitEvent)tgc).getEventName() + " is an unknown event");
                        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());
                        UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADWaitEvent)tgc).getEventName() + ": wrong number of parameters");
                        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
				//TMLADWriteChannel wr = (TMLADWriteChannel) tgc;
                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))) {
                            UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "A call to " + ((TMLADWriteChannel)tgc).getChannelName(i) + " has been removed because the corresponding channel is not taken into account");
                            ce.setTDiagramPanel(tadp);
                            ce.setTGComponent(tgc);
                            warnings.add(ce);
                            ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                            activity.addElement(new TMLJunction("void junction", tgc));
                        } else {
                            UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, ((TMLADWriteChannel)tgc).getChannelName(i) + " is an unknown channel");
                            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);
                    }
					//if (wr.isAttacker()){
						//channel = tmlm.getChannelByName(getAttackerChannel(channels[0]));
                        //tmlwritechannel.addChannel(channel);
					//}
                    //add sec pattern
                    if (securityPatterns.get(((TMLADWriteChannel)tgc).getSecurityContext())!=null){
                        tmlwritechannel.securityPattern= securityPatterns.get(((TMLADWriteChannel)tgc).getSecurityContext());
                        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).getSecurityContext().isEmpty()){
                        //Throw error for missing security pattern
                        UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Security Pattern " + ((TMLADWriteChannel)tgc).getSecurityContext() + " not found");
                        ce.setTDiagramPanel(tadp);
                        ce.setTGComponent(tgc);
                        checkingErrors.add(ce);
                    }
					if (tmltask.isAttacker()){
						tmlwritechannel.setAttacker(true);
					}
                    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 = 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 = 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 = iterator.next();

            if ((tgc instanceof TMLADForLoop) || (tgc instanceof TMLADForStaticLoop)) {
                ae1 = activity.findReferenceElement(tgc);
                if (ae1 != null) {
                    if (ae1.getNbNext() != 2) {
                        UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formatted for loop: a loop must have an internal behavior, and an exit behavior ");
                        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)) {
                    UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formatted choice: it has both non-determinitic and stochastic guards");
                    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()) {
                        UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formatted choice: it has both non-determinitic/ stochastic and regular guards)");
                        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()) {
                    UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "Choice should have only one [else] guard");
                    ce.setTDiagramPanel(tadp);
                    ce.setTGComponent(tgc);
                    checkingErrors.add(ce);
                } else if ((index = tmlchoice.getElseGuard()) > -1){
                    index = tmlchoice.getElseGuard();
                    if (index == 0) {
                        UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "Choice should have a regular guard");
                        ce.setTDiagramPanel(tadp);
                        ce.setTGComponent(tgc);
                        checkingErrors.add(ce);
                    }
                }
                if (tmlchoice.hasMoreThanOneAfter()) {
                    UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "Choice should have only one [after] guard");
                    ce.setTDiagramPanel(tadp);
                    ce.setTGComponent(tgc);
                    checkingErrors.add(ce);
                }
            }
            if (tgc instanceof TMLADSelectEvt) {
                tmlselectevt = (TMLSelectEvt)(activity.findReferenceElement(tgc));
                if (!tmlselectevt.isARealSelectEvt()) {
                    UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "'Select events'  should be followed by only event receiving operators");
                    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<TGComponent> translateToTMLMapping() {
        tmlm = new TMLModeling<>(true);
        archi = new TMLArchitecture();  //filled by makeArchitecture
        map = new TMLMapping<>(tmlm, archi, false);
        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
		processAttackerScenario();
        map.setCorrespondanceList(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();
        if (map.firewall){
            tmlap.getMainGUI().gtm.drawFirewall(map);
        }
        return map;     // the data structure map is returned to CheckSyntaxTMLMapping in GTURTLEModeling
    }

    // public SystemCAMSPanel<TGComponent> translateToSystemCAMS() { //ajout CD 04/07 FIXME
	/*tous est a changé et a créé ici*/
        // tmlm = new TMLModeling<>(true);
        // archi = new TMLArchitecture();  //filled by makeArchitecture
        // cams = new TMLSystemCAMS<>(tmlm, archi, false);
        // cams.tmlscp = tmlscp;
        // checkingErrors = new LinkedList<CheckingError> ();
        // warnings = new LinkedList<CheckingError> ();

        // TraceManager.addDev("Making architecture");
        // makeArchitecture();     //fills archi
        // TraceManager.addDev("Making TML modeling");
        // if (!makeTMLModeling()) {
        //     return null;
        // }
        // TraceManager.addDev("Making SystemC-AMS");
        // makeMapping();  //fills cams
        // cams.listE = listE;
        // TraceManager.addDev("Making TMLSCPlib");
        // makeTMLCPLib();

        // removeActionsWithRecords();
        // cams.setTMLDesignPanel(this.tmlcdp);//a ajouter
        // if (cams.firewall){ // j'espère pas besoin de tous ca
        //     tmlscp.getMainGUI().gtm.drawFirewall(cams); 
        // }
    //  return cams;
    // }

	public void processAttackerScenario(){
		//Scan tasks and activity diagrams for attacker read/write channels
		for (TMLTask task: tmlm.getTasks()){
			if (task.isAttacker()){
				TMLActivity act=task.getActivityDiagram();
				List<TMLActivityElement> toRemove= new ArrayList<TMLActivityElement>();
				for (TMLActivityElement elem: act.getElements()){
					if (elem instanceof TMLActivityElementChannel){
						TMLActivityElementChannel elemChannel = (TMLActivityElementChannel) elem;
						if (elemChannel.isAttacker()){
							TMLChannel chan = elemChannel.getChannel(0);
							if (!map.isAttackerAccessible(chan)){
								toRemove.add(elem);
								//Remove read/writechannel
							}
						}
					}
				}
				for (TMLActivityElement elem: toRemove){
					TMLExecI exec= new TMLExecI("100",elem.getReferenceObject());
 					exec.setAction("100");
                	exec.setValue("100");
					act.replaceElement(elem, exec);
				}
				//System.out.println("activity " +  act.toXML());
			}
		}

	}

    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

        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;
                }

                tgc = listE.getTG( error.element );
                if ( tgc != null ) {
                    UICheckingError ce = new UICheckingError( type, error.message );
                    ce.setTDiagramPanel( tgc.getTDiagramPanel() );
                    ce.setTGComponent( tgc );
                    checkingErrors.add( ce );
                } else {
                    TMLCheckingError ce = new TMLCheckingError( type, error.message );
                    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
                    UICheckingError ce = new UICheckingError(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
                    UICheckingError ce = new UICheckingError(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
                    UICheckingError ce = new UICheckingError(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
                    UICheckingError ce = new UICheckingError(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
                    UICheckingError ce = new UICheckingError(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
                    UICheckingError ce = new UICheckingError(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
                    UICheckingError ce = new UICheckingError(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("Firewall node added:" + bridge.getName());
                }
            }


            if (tgc instanceof TMLArchiMemoryNode) {
                memorynode = (TMLArchiMemoryNode)tgc;
                if (nameInUse(names, memorynode.getName())) {
                    // Node with the same name
                    UICheckingError ce = new UICheckingError(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
                    UICheckingError ce = new UICheckingError(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 = 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";
            UICheckingError ce = new UICheckingError( 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 = 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 = 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 {

        List<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";
            UICheckingError ce = new UICheckingError( 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 = 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( 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 = 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 = 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 {
                                UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Task " + artifact.getTaskName() + " referenced by artifact " + artifact.getValue() + " is unknown");
                                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 {
                                UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Component " + artifact.getTaskName() + " referenced by artifact " + artifact.getValue() + " is unknown");
                                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<TGComponent> 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 = 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 = null;

        while(iterator.hasNext()) {
            tgc = iterator.next();
            //TraceManager.addDev("---------------- tgc=" + tgc);
            if (tgc instanceof TMLArchiCPNode) {
				try {
				    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);
				    }
				} catch (Exception e) {
				    TraceManager.addDev("\n\n==========> Badly formed TMLCPLib:" + cp + "\nADDING WARNING\n");
				    UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "CP " +  cp.getCompleteName() + " has been removed (invalid CP)");
		                    ce.setTDiagramPanel(tmlap.tmlap);
		                    ce.setTGComponent(cp);
		                    warnings.add(ce);		    
				}
            }
        }
    }

    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 = iterator.next();
		    //TraceManager.addDev(" is custom component?" + tgc + " class=" + tgc.getClass());
	
		    // Custom values (for plugin)
		    if (tgc instanceof TGComponentPlugin) {
				//TraceManager.addDev("custom component found:" + tgc);
				String val = ((TGComponentPlugin)(tgc)).getCustomValue();
				if (val != null) {
				    //TraceManager.addDev("Adding custom value:" +  val);
				    map.addCustomValue(val);
				}
		    }

		    // Execution nodes
            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 );
                        }
                        node.addMECToHwExecutionNode( mec );
                        map.addTaskToHwExecutionNode(task, (HwExecutionNode)node);
                    } else {
                        TraceManager.addDev("Null task. Raising an error");
                        String msg = "The task named " + artifact.getTaskName() + " was not found";
                        UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, msg);
                        ce.setTDiagramPanel(tmlap.tmlap);
                        ce.setTGComponent(tgc);
                        checkingErrors.add(ce);
                    }
                }
            }

            // 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 " + 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 getAttackerChannel(String s){
		for (String channelName: table.keySet()){
			if (channelName.split("/")[1].equals(s)){
				return table.get(channelName);
			}
		}
		return "";
	}

    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;
    }
}