Skip to content
Snippets Groups Projects
AnalysisPanelTranslator.java 39.5 KiB
Newer Older
/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
 * 
 * ludovic.apvrille AT enst.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 java.io.*;
//import java.awt.*;
//import javax.swing.*;

import myutil.TraceManager;
import sddescription.*;
import translator.CheckingError;
import ui.iod.*;
import ui.sd.*;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;

//import myutil.*;
//import ui.ucd.*;
//import ui.tree.*;
//import ui.window.*;
//import ddtranslator.*;
//import sdtranslator.*;

 * Class AnalysisPanelTranslator
 * Creation: 16/08/2006
 * @author Ludovic APVRILLE
public class AnalysisPanelTranslator {
    AnalysisPanel ap;
    MainGUI mgui;
    LinkedList<CheckingError> checkingErrors;
    CorrespondanceTGElement listE;
    
    public AnalysisPanelTranslator(AnalysisPanel _ap, MainGUI _mgui) {
        ap = _ap;
        mgui = _mgui;
        reinit();
    }
    
    public void reinit() {
        checkingErrors = new LinkedList<CheckingError> ();
        listE = new CorrespondanceTGElement();
    }
    
    public LinkedList<CheckingError> getErrors() {
        return checkingErrors;
    }
    
    public LinkedList<CheckingError> getWarnings() {
        return null;
    }
    
    public CorrespondanceTGElement getCorrespondanceTGElement() {
        return listE;
    }
    
    public HMSC translateHMSC() throws AnalysisSyntaxException {
        int i, j;
        TDiagramPanel thmsc, thmsctmp;
        int nodeCounter = 0;
        HMSCNode node, node1;//, node2;
        List<TGComponent> list;
        TGComponent tgc;
        MSC msc;
        int startCounter = 0;
        HMSCNode start = null;
        Iterator<TGComponent> iterator;
        String action;
        boolean test = false;
        
        // For each IOD, we create a node
        Vector<InteractionOverviewDiagramPanel> iodsPanels = new Vector<InteractionOverviewDiagramPanel>();
        Vector<HMSCNode> iodsNodes = new Vector<HMSCNode>() ;
        
        for(i=0; i<ap.panels.size(); i++) {
            thmsc = ap.panels.elementAt(i);
            if (thmsc instanceof InteractionOverviewDiagramPanel) {
                TraceManager.addDev("Dealing with " + thmsc.getName());
                iodsPanels.add( (InteractionOverviewDiagramPanel) thmsc);
                node = new HMSCNode("n"+nodeCounter + "choice_refiod", HMSCNode.CHOICE);
                iodsNodes.add(node);
            }
        }
        
        // For each element -> we create a node
        // Get the first
        
        
        for(i=0; i<ap.panels.size(); i++) {
            thmsc = ap.panels.elementAt(i);
            listE = new CorrespondanceTGElement();
            if (thmsc instanceof InteractionOverviewDiagramPanel) {
                TraceManager.addDev("Managing " + thmsc.getName());
                list = thmsc.getComponentList();
                iterator = list.listIterator();
                while(iterator.hasNext()) {
                    tgc = iterator.next();
                    node = null;
                    if (tgc instanceof IODChoice) {
                        node = new HMSCNode("n"+nodeCounter + "choice", HMSCNode.CHOICE);
                    } else if (tgc instanceof IODJunction) {
                        node = new HMSCNode("n"+nodeCounter + "choice_junction", HMSCNode.CHOICE);
                    } else if (tgc instanceof IODParallel) {
                        node = new HMSCNode("n"+nodeCounter + "parallel", HMSCNode.PARALLEL);
                    } else if (tgc instanceof IODPreemption) {
                        node = new HMSCNode("n"+nodeCounter + "preempt", HMSCNode.PREEMPT);
                        //TraceManager.addDev(" --------------> Preempt");
                    } else if (tgc instanceof IODSequence) {
                        node = new HMSCNode("n"+nodeCounter + "sequence", HMSCNode.SEQUENCE);
                        //TraceManager.addDev(" --------------> Sequence");
                    } else if (tgc instanceof IODRefIOD) {
                        action = (((IODRefIOD)tgc).getAction());
                        thmsctmp = mgui.getIODiagramPanel(ap, action);
                        test = false;
                        if (thmsctmp != null) {
                            j = iodsPanels.indexOf(thmsctmp);
                            if (j != -1) {
                                node = new HMSCNode("n"+nodeCounter + "sequence", HMSCNode.SEQUENCE);
                                node1 = iodsNodes.elementAt(j);
                                node.addNextNode(node1);
								//node2 = new HMSCNode("n"+nodeCounter + "choice", HMSCNode.CHOICE);
                            } else {
                                test = true;
                            }
                        } else {
                            test = true;
                        }
                        
                        if (test) {
                            UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Reference to an unknown IOD named " + action);
                            addCheckingError(ce);
                            ce.setTDiagramPanel(thmsc);
                            ce.setTGComponent(tgc);
                            throw new AnalysisSyntaxException("Reference to an unknown IOD named " + action);
                        }
                    } else if (tgc instanceof IODRefSD) {
                        msc = new MSC(((IODRefSD)tgc).getAction());
                        listE.addCor(msc, tgc);
                    } else if (tgc instanceof IODStartState) {
                        if (i == 0) {
                            node = new HMSCNode("n"+nodeCounter + "start", HMSCNode.START);
                            startCounter ++;
                            if (startCounter > 1) {
                                UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Too many start nodes on Interaction Overview Diagram");
                                addCheckingError(ce);
                                ce.setTDiagramPanel(thmsc);
                                ce.setTGComponent(tgc);
                                throw new AnalysisSyntaxException("Too many start nodes on Interaction Overview Diagram");
                            }
                            start = node;
                        }
                        test = false;
                        j = iodsPanels.indexOf(thmsc);
                        if (j != -1) {
                            //TraceManager.addDev("Node = sequence instead of start");
                            node = iodsNodes.elementAt(j);
                        } else {
                            test = true;
                        }
                        if (test) {
                            UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Badly formatted IOD");
                            addCheckingError(ce);
                            ce.setTDiagramPanel(thmsc);
                            ce.setTGComponent(tgc);
                            throw new AnalysisSyntaxException("Badly formatted IOD");
                        }
                        
                        
                    } else if (tgc instanceof IODStopState) {
                        node = new HMSCNode("n"+nodeCounter+"stop", HMSCNode.STOP);
                    }
                    
                    if (node != null) {
                        listE.addCor(node, tgc);
                        nodeCounter ++;
                    }
                }
                
                // we look through each element of the listE list
                //
                TGConnectingPoint p;
                TGConnector tgco;
                TGComponent tgc2, tgc3;
                int ii, k;
                HMSCElement elt1, elt2;
                HMSCNode nodeTmp;
                
                for(ii=0; ii<listE.getSize(); ii++) {
                    tgc = listE.getTGAt(ii);
                    for(j=0; j<tgc.getNbConnectingPoint(); j++) {
                        p = tgc.tgconnectingPointAtIndex(j);
                        tgco = thmsc.findTGConnectorStartingAt(p);
                        if (tgco != null) {
                            // Identification of connected component
                            //TraceManager.addDev("tgc=" + tgc.getName() + ": " + j);
                            tgc2 = null;
                            for(k=0; k<list.size(); k++) {
                                tgc3 = list.get(k);
                                if (tgc3.belongsToMe(tgco.getTGConnectingPointP2())) {
                                    tgc2 = tgc3;
                                }
                            }
                            
                            if (tgc2 != null) {
                                //Object o1, o2;
                                elt1 = listE.getHMSCElement(tgc);
                                elt2 = listE.getHMSCElement(tgc2);
                                
                                if ((elt1 != null) && (elt2 != null)) {
                                    //TraceManager.addDev("Adding a link");
                                    if ((elt1 instanceof MSC) && (elt2 instanceof MSC)) {
                                        // must include a choice node between
                                        node = new HMSCNode("n"+nodeCounter, HMSCNode.CHOICE);
                                        nodeCounter ++;
                                        ((MSC)elt1).setNextNode(node);
                                        node.addNextMSC((MSC)elt2);
                                        node.addMSCGuard("[]");
                                    }
                                    
                                    if ((elt1 instanceof MSC) && (elt2 instanceof HMSCNode)) {
                                        ((MSC)elt1).setNextNode((HMSCNode)elt2);
                                    }
                                    
                                    if ((elt1 instanceof HMSCNode) && (elt2 instanceof MSC)) {
                                        //((HMSCNode)elt1).addNextMSC((MSC)elt2);
                                        nodeTmp = new HMSCNode("n"+nodeCounter, HMSCNode.CHOICE);
                                        nodeCounter++;
                                        ((HMSCNode)elt1).addNextNode(nodeTmp);
                                        nodeTmp.addNextMSC((MSC)elt2);
                                        //TraceManager.addDev("Adding link to MSC " + ((MSC)elt2).getName());
                                    }
                                    
                                    if ((elt1 instanceof HMSCNode) && (elt2 instanceof HMSCNode)) {
                                        ((HMSCNode)elt1).addNextNode((HMSCNode)elt2);
                                        //TraceManager.addDev("Adding link to Node " + ((HMSCNode)elt2).getName());
                                        //TraceManager.addDev("*** IODCHOICE ***");
                                        
                                        if (((IODChoice)tgc).hasUnvalidGuards()) {
                                            String s = ((IODChoice)tgc).getUnvalidGuards();
                                            UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Choice has a badly formed guard: " + s + " -> should be of the form \"[<instance name> / <guard>]\"");
                                            addCheckingError(ce);
                                            ce.setTDiagramPanel(thmsc);
                                            ce.setTGComponent(tgc);
                                            throw new AnalysisSyntaxException("Choice has a badly formed guard: " + s + " -> should be of the form \"[<instance name> / <guard>]\"");
                                        }
                                        
                                        node = listE.getNodeAt(ii);
                                /*if (elt2 instanceof MSC){
                                    TraceManager.addDev("Adding a MSC guard #" + (j-1) + " g=" + ((IODChoice)tgc).getGuard(j-1) + " on node " + node.getName());
                                    node.addMSCGuard(((IODChoice)tgc).getGuard(j-1));
                                } else {*/
                                        //TraceManager.addDev("Adding a Node guard #" + (j-1) + " g=" + ((IODChoice)tgc).getGuard(j-1) + " on node " + node.getName());
                                        node.addNodeGuard(((IODChoice)tgc).getGuard(j-1));
                                /*}*/
                                    }
                                }
                            }
                        }
                    }
                }
                
            }
        }
        
        if (start != null) {
            // Make a link between the start and the first choice
            start.addNextNode(iodsNodes.elementAt(0));
            
            // Create HMSC
            HMSC hmsc = new HMSC("myHMSC", start);
            return hmsc;
        }
        
        UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "No start node on Interaction Overview Diagram");
        addCheckingError(ce);
        ce.setTDiagramPanel(ap.panels.elementAt(0));
        throw new AnalysisSyntaxException("No start node on Interaction Overview Diagram");
    }
    
    
    
    public void translateMSCs(HMSC hmsc) throws AnalysisSyntaxException {
        // For each msc -> we look for the corresponding panel
        // then, the msc is built accordingly if not yet built
        MSC msc;
        SequenceDiagramPanel sdp;
        
        //List ll = hmsc.getMSCs();
        Iterator<MSC> iterator = hmsc.getMSCs().listIterator();
        
        while(iterator.hasNext()) {
            msc = iterator.next();
            sdp = mgui.getSequenceDiagramPanel(ap, msc.getName());
            if (sdp == null) {
                throw new AnalysisSyntaxException("No Sequence Diagram named " + msc.getName());
            }
            translateMSCFromPanel(hmsc, msc, sdp);
        }
    }
    
    private void translateMSCFromPanel(HMSC hmsc, MSC msc, SequenceDiagramPanel sdp) throws AnalysisSyntaxException {
        CorrespondanceTGElement correspondance = new CorrespondanceTGElement(); // evt <-> tgcomponent
        
        //TraceManager.addDev("Necessary instances for msc " + msc.getName());
        //TraceManager.addDev("Evts of " + msc.getName());
        createEvt(hmsc, msc, sdp, correspondance);
        
        //TraceManager.addDev("Time constraints of " + msc.getName());
        createTimeConstraints(hmsc, msc, sdp, correspondance);
        
        //TraceManager.addDev("Order events for " + msc.getName());
        createEvtsOrder(hmsc, msc, sdp, correspondance);
        
    }
    
    private void createAllNecessaryInstances(HMSC hmsc, SequenceDiagramPanel sdp) throws AnalysisSyntaxException {
        List<TGComponent> list = sdp.getComponentList();
        Iterator<TGComponent> iterator = list.listIterator();
        TGComponent tgc;
        
        while(iterator.hasNext()) {
            tgc = iterator.next();
            
            if (tgc instanceof SDInstance) {
                hmsc.getCreateInstanceIfNecessary(((SDInstance)tgc).getInstanceName());
            }
        }
    }
    
    private void createEvt(HMSC hmsc, MSC msc, SequenceDiagramPanel sdp, CorrespondanceTGElement correspondance) throws AnalysisSyntaxException {
        // regular evt i.e. not message sending / receiving
        List<TGComponent> list = sdp.getComponentList();
        Iterator<TGComponent> iterator = list.listIterator();
        TGComponent tgc, tgc1, tgc2, tgc3;
        TGComponent internal;
        TGConnectingPoint p1, p2;
        TGConnector tgco;
        
        SDInstance sdi, sdi1, sdi2;
        int j;
        Instance ins, ins1, ins2;
        Evt evt, evt1, evt2;
        LinkEvts le;
        
        String s;
        
        
        
        // internal component of instances
        while(iterator.hasNext()) {
            tgc = iterator.next();
            
            if (tgc instanceof SDInstance) {
                sdi = (SDInstance)tgc;
                ins = hmsc.getInstance(sdi.getInstanceName());
                if (ins == null) {
                    throw new AnalysisSyntaxException("No instance named " + sdi.getInstanceName() + "in sequence diagram " + sdp.getName());
                }
                
                for(j=0; j<tgc.getNbInternalTGComponent(); j++) {
                    internal = tgc.getInternalTGComponent(j);
                    
                    if (internal instanceof SDTimerExpiration) {
                        evt = new Evt(Evt.TIMER_EXP, ((SDTimerExpiration)(internal)).getTimer(), ins);
                        correspondance.addCor(evt, internal);
                        msc.addEvt(evt);
                        evt.y = ((SDTimerExpiration)internal).getYOrder();
                    } else if (internal instanceof SDTimerCancellation) {
                        evt = new Evt(Evt.TIMER_RESET, ((SDTimerCancellation)(internal)).getTimer(), ins);
                        correspondance.addCor(evt, internal);
                        msc.addEvt(evt);
                        evt.y = ((SDTimerCancellation)internal).getYOrder();
                    } else if (internal instanceof SDTimerSetting) {
                        evt = new Evt(Evt.TIMER_SET, ((SDTimerSetting)(internal)).getTimer() + ";" + ((SDTimerSetting)(internal)).getDuration(), ins);
                        correspondance.addCor(evt, internal);
                        msc.addEvt(evt);
                        evt.y = ((SDTimerSetting)internal).getYOrder();
                    } else if (internal instanceof SDActionState) {
                        s = ((SDActionState)internal).getAction();
                        if (s.indexOf("=") > -1) {
                            // variable
                            evt = new Evt(Evt.VARIABLE_SET, s, ins);
                            correspondance.addCor(evt, internal);
                            msc.addEvt(evt);
                            evt.y = internal.getY();
                        } else {
                            //internal action
                            evt = new Evt(Evt.INTERNAL_ACTION, s, ins);
                            correspondance.addCor(evt, internal);
                            msc.addEvt(evt);
                            evt.y = internal.getY();
                        }
                    } else if (internal instanceof SDGuard) {
                        s = ((SDGuard)internal).getGuard().trim();
                        TraceManager.addDev("New guard evt: " + s);
						if (s.compareTo("else") == 0) {
							evt = new Evt(Evt.ELSE_GUARD, s, ins);
						} else if (s.compareTo("end") == 0) {
							evt = new Evt(Evt.END_GUARD, s, ins);
						} else {
							evt = new Evt(Evt.GUARD, s, ins);
						}
                        correspondance.addCor(evt, internal);
                        msc.addEvt(evt);
                        evt.y = internal.getY();
                    }else if (internal instanceof SDTimeInterval) {
                        s = ((SDTimeInterval)internal).getMinDelay() + "," + ((SDTimeInterval)internal).getMaxDelay();
                        // Time interval
                        evt = new Evt(Evt.TIME_INTERVAL, s, ins);
                        correspondance.addCor(evt, internal);
                        msc.addEvt(evt);
                        evt.y = internal.getY();
                    }
                    
                }
                // Messages
            } else if (tgc instanceof TGConnectorMessageSD) {
                // Identification of connected components
                tgco = (TGConnectorMessageSD)tgc;
                p1 = tgco.getTGConnectingPointP1();
                p2 = tgco.getTGConnectingPointP2();
                
                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;
                    }
                }
                
                if ((tgc1 instanceof SDInstance) && (tgc2 instanceof SDInstance)) {
                    sdi1 = (SDInstance)tgc1;
                    ins1 = hmsc.getInstance(sdi1.getInstanceName());
                    if (ins1 == null) {
                        throw new AnalysisSyntaxException("No instance named " + sdi1.getInstanceName() + " in sequence diagram " + sdp.getName());
                    }
                    
                    sdi2 = (SDInstance)tgc2;
                    ins2 = hmsc.getInstance(sdi2.getInstanceName());
                    if (ins2 == null) {
                        throw new AnalysisSyntaxException("No instance named " + sdi2.getInstanceName() + " in sequence diagram " + sdp.getName());
                    }
                    
                    if (tgc instanceof TGConnectorMessageAsyncSD) {
						if (!((TGConnectorMessageAsyncSD)(tgc)).isMessageWellFormed()) {
							throw new AnalysisSyntaxException("Badly formatted asynchronous exchange:" + ((TGConnectorMessageAsyncSD)(tgc)).getMessage() +" in instance "+ sdi1.getInstanceName() + " in sequence diagram " + sdp.getName());
						}
						
                        evt1 = new Evt(Evt.SEND_MSG, ((TGConnectorMessageAsyncSD)(tgc)).getFirstPartMessage() + "__" + ins1.getName() + "_to_" + ins2.getName() + ((TGConnectorMessageAsyncSD)(tgc)).getSecondPartMessage(), ins1);
                        correspondance.addCor(evt1, tgc);
                        msc.addEvt(evt1);
                        evt1.y = p1.getY();
                        
                        evt2 = new Evt(Evt.RECV_MSG, ((TGConnectorMessageAsyncSD)(tgc)).getFirstPartMessage() + "__" + ins1.getName() + "_to_" + ins2.getName() + ((TGConnectorMessageAsyncSD)(tgc)).getSecondPartMessage(), ins2);
                        correspondance.addCor(evt2, tgc);
                        msc.addEvt(evt2);
                        evt2.y = p2.getY();
                        
                        le = new LinkEvts(evt1, evt2);
                        msc.addLinkEvts(le);
                        
                    } else if (tgc instanceof TGConnectorMessageSyncSD) {
                        //TraceManager.addDev("**************** Synchronous message ************************");
						if (!((TGConnectorMessageSyncSD)(tgc)).isMessageWellFormed()) {
							throw new AnalysisSyntaxException("Badly formatted synchronous exchange:" + ((TGConnectorMessageSyncSD)(tgc)).getMessage() +" in instance "+ sdi1.getInstanceName() + " in sequence diagram " + sdp.getName());
						}
                        evt1 = new Evt(Evt.SEND_SYNC, ((TGConnectorMessageSyncSD)(tgc)).getFirstPartMessage() + "__" + ins1.getName() + "_to_" + ins2.getName() + ((TGConnectorMessageSyncSD)(tgc)).getSecondPartMessage(), ins1);
                        correspondance.addCor(evt1, tgc);
                        msc.addEvt(evt1);
                        evt1.y = p1.getY();
                        
                        evt2 = new Evt(Evt.RECV_SYNC, ((TGConnectorMessageSyncSD)(tgc)).getFirstPartMessage() + "__" + ins1.getName() + "_to_" + ins2.getName()+((TGConnectorMessageSyncSD)(tgc)).getSecondPartMessage(), ins2);
                        correspondance.addCor(evt2, tgc);
                        msc.addEvt(evt2);
                        evt2.y = p2.getY();
                        
                        le = new LinkEvts(evt1, evt2);
                        msc.addLinkEvts(le);
                        
                    }
                }
            }
        }
    }
    
    private void createTimeConstraints(HMSC hmsc, MSC msc, SequenceDiagramPanel sdp, CorrespondanceTGElement correspondance) throws AnalysisSyntaxException {
        // regular evt i.e. not message sending / receiving
        Iterator<TGComponent> iterator = sdp.getComponentList().listIterator();
        TGComponent tgc, tgc1, tgc4;
        TGComponent internal;
        //TGConnectingPoint p1, p2;
        //TGConnector tgco;
        //GConnectorRelativeTimeSD tgcortc;
        
        SDInstance sdi1, sdi2;
        int j;
        Instance ins;
        Evt evt1;
        TimeConstraint tc;
        int min_tc, max_tc;
        Evt [] evts;
        
        
        
        // internal component of instances
        while(iterator.hasNext()) {
            tgc = iterator.next();
            //TraceManager.addDev("i=" + i);
            
            if (tgc instanceof SDInstance) {
                sdi1 = (SDInstance)tgc;
                ins = hmsc.getInstance(sdi1.getInstanceName());
                if (ins == null) {
                    throw new AnalysisSyntaxException("No instance named " + sdi1.getInstanceName() + " in sequence diagram " + sdp.getName());
                }
                
                for(j=0; j<tgc.getNbInternalTGComponent(); j++) {
                    internal = tgc.getInternalTGComponent(j);
                    //TraceManager.addDev("j=" + j);
                    
                    if (internal instanceof SDAbsoluteTimeConstraint) {
                        tgc1 = sdi1.getTGComponentActionCloserTo(internal);
                        if (tgc1 == null) {
                            throw new AnalysisSyntaxException("Absolute timing constraint " + internal.getValue() + " has no associated action in sequence diagram" + sdp.getName());
                        }
                        
                        evt1 = getEvtAbsolute((SDAbsoluteTimeConstraint)internal, tgc1, sdp, sdi1, correspondance);
                        
                        if (evt1 == null) {
                            throw new AnalysisSyntaxException("Translation algorithms error #1");
                        }
                        
                        try {
                            min_tc = Integer.decode(((SDAbsoluteTimeConstraint)internal).getMinConstraint()).intValue();
                            
                        } catch (Exception e) {
                            throw new AnalysisSyntaxException("Absolute timing constraint " + internal.getValue() + " has an invalid minimal value" + sdp.getName());
                        }
                        
                        try {
                            max_tc = Integer.decode(((SDAbsoluteTimeConstraint)internal).getMaxConstraint()).intValue();
                            
                        } catch (Exception e) {
                            throw new AnalysisSyntaxException("Absolute timing constraint " + internal.getValue() + " has an invalid maximal value" + sdp.getName());
                        }
                        
                        tc = new TimeConstraint(evt1, min_tc, max_tc);
                        msc.addTimeConstraint(tc);
                        
                    } else if (internal instanceof SDRelativeTimeConstraint) {
                        //TraceManager.addDev("Relative time constraint");
                        TGConnectorRelativeTimeSD tgcort = sdp.firstAndConnectedSDRelativeTimeConstraint(internal);
                        //TraceManager.addDev("tgcort=" + tgcort);
                        
                        if (tgcort != null){
                            TGComponent internal2 = sdp.getSecondTGComponent(tgcort);
                            //TraceManager.addDev("internal2=" + internal2);
                            
                            if (internal2 instanceof SDRelativeTimeConstraint) {
                                tgc4 = internal2.getTopFather();
                                if (!(tgc4 instanceof SDInstance)) {
                                    throw new AnalysisSyntaxException("Relative timing constraint " + tgcort.getValue() + ": invalid graphical component" );
                                }
                                sdi2 = (SDInstance)tgc4;
                                evts = getEvts((SDRelativeTimeConstraint)internal, (SDRelativeTimeConstraint)internal2, sdp, sdi1, sdi2, correspondance);
                                
                                //TraceManager.addDev("evt1=" + evts[0] + "evt2=" + evts[1]);
                                
                                if (evts != null) {
                                    try {
                                        min_tc = Integer.decode(tgcort.getMinConstraint()).intValue();
                                        
                                    } catch (Exception e) {
                                        throw new AnalysisSyntaxException("Relative timing constraint " + tgcort.getValue() + " has an invalid minimal value on" + sdp.getName());
                                    }
                                    
                                    try {
                                        max_tc = Integer.decode(tgcort.getMaxConstraint()).intValue();
                                        
                                    } catch (Exception e) {
                                        throw new AnalysisSyntaxException("Relative timing constraint " + tgcort.getValue() + " has an invalid maximal value on" + sdp.getName());
                                    }
                                    
                                    tc = new TimeConstraint(evts[0], evts[1], min_tc, max_tc);
                                    msc.addTimeConstraint(tc);
                                    //TraceManager.addDev("new relative tc = " + tc);
                                    
                                } else {
                                    throw new AnalysisSyntaxException("Relative timing constraint " + tgcort.getValue() + ": null events" );
                                }
                                
                            }
                        }
                    }
                }
            }
        }
    }
    
    // Assumes that internal is effectively connected
    public Evt[] getEvts(SDRelativeTimeConstraint tc1, SDRelativeTimeConstraint tc2, SequenceDiagramPanel sdp, SDInstance sdi1, SDInstance sdi2, CorrespondanceTGElement correspondance) {
        //TraceManager.addDev("get1");
        Evt evt1 = getEvt(tc1, sdp, sdi1, correspondance);
        //TraceManager.addDev("get2");
        Evt evt2 = getEvt(tc2, sdp, sdi2, correspondance);
        //TraceManager.addDev("get3");
        if ((evt1 != null) && (evt2 != null)) {
            Evt [] evts = new Evt[2];
            evts[0] = evt1;
            evts[1] = evt2;
            return evts;
        }
        return null;
    }
    
    public Evt getEvt(SDRelativeTimeConstraint tc1, SequenceDiagramPanel sdp, SDInstance sdi, CorrespondanceTGElement correspondance) {
        TGConnector tgco;
        TGConnectingPoint p;
        //Evt evt;
        TGComponent tgc;
        
        //TraceManager.addDev("GetEvt 1");
        // is-it connected to a message action ?
        tgco = sdp.messageActionCloserTo(tc1, sdi);
        if (tgco instanceof TGConnectorMessageSD) {
            p = sdp.TGConnectingPointActionCloserTo(tc1, tgco, sdi);
            //TraceManager.addDev("GetEvt 2");
            //TraceManager.addDev("GetEvt 3");
            if (p==tgco.getTGConnectingPointP1()) {
                // sending message event
                //TraceManager.addDev("GetEvt 4");
                return correspondance.getSendingMsgEvt(tgco);
            } else {
                //TraceManager.addDev("GetEvt 5");
                return correspondance.getReceivingMsgEvt(tgco);
            }
            
        }
        
        // other action? -> not yet implemented
        //TraceManager.addDev("Others relative");
        tgc = sdp.getActionCloserTo(tc1.getY(), sdi);
        
        if (tgc instanceof SDActionState) {
            return correspondance.getEvt(tgc);
        }
        
        return null;
    }
    
    public Evt getEvtAbsolute(SDAbsoluteTimeConstraint sdatc, TGComponent tgc, SequenceDiagramPanel sdp, SDInstance sdi, CorrespondanceTGElement correspondance) {
        TGConnector tgco;
        TGConnectingPoint p;
        //Evt evt;
        
        //TraceManager.addDev("GetEvt 1");
        // is-it connected to a message action ?
        
        if (tgc instanceof TGConnectorMessageSD) {
            tgco = (TGConnector)tgc;
            p = sdp.TGConnectingPointActionCloserTo(sdatc, tgco, sdi);
            //TraceManager.addDev("GetEvt 2");
            //TraceManager.addDev("GetEvt 3");
            if (p==tgco.getTGConnectingPointP1()) {
                // sending message event
                //TraceManager.addDev("GetEvt 4");
                return correspondance.getSendingMsgEvt(tgco);
            } else {
                //TraceManager.addDev("GetEvt 5");
                return correspondance.getReceivingMsgEvt(tgco);
            }
            
        }
        
        // other action? -> not yet implemented
        // get closer actions -> internal actions or variable increment
        //TraceManager.addDev("Others absolute");
        tgc = sdp.getActionCloserTo(sdatc.getY(), sdi);
        
        if (tgc instanceof SDActionState) {
            return correspondance.getEvt(tgc);
        }
        
        return null;
    }
    
    private void createEvtsOrder(HMSC hmsc, MSC msc, SequenceDiagramPanel sdp, CorrespondanceTGElement correspondance) throws AnalysisSyntaxException {
        List<Instance> ll = hmsc.getInstances();
        Iterator<Instance> iterator = ll.listIterator();
        Instance ins;
        
        while(iterator.hasNext()) {
            ins = iterator.next();
            createEvtsOrderForInstance(msc, ins, sdp, correspondance);
        }
    }
    
    private void  createEvtsOrderForInstance(MSC msc, Instance ins, SequenceDiagramPanel sdp, CorrespondanceTGElement correspondance) throws AnalysisSyntaxException {
        
        Evt evt, evt1, nextEvt, lastEvt;
        List<Evt> ll = msc.getEvts();
        Iterator<Evt> iterator = ll.listIterator();
        List<Evt> orderedy = new LinkedList<Evt>();
        List<List<Evt>> grouped = new LinkedList<List<Evt>>();
        
        SDInstance sdi = sdp.getSDInstance(ins.getName());
        
        if (sdi == null) {
            return;
        }
        
        
        //Iterator it1;
        int y;
        
        if (ll.size() == 0) {
            return;
        }
        
        boolean go = true;
        // we build a list of events ordered according to their y
        while(go == true) {
            nextEvt = null;
            iterator = ll.listIterator();
            y = Integer.MAX_VALUE;
            while(iterator.hasNext()) {
                evt = iterator.next();
                if ((evt.y <= y) && (!orderedy.contains(evt)) && (evt.getInstance() == ins)) {
                    nextEvt = evt;
                    y = evt.y;
                }
            }
            
            if (nextEvt != null) {
                orderedy.add(nextEvt);
            } else {
                go = false;
            }
        }
        
        if (orderedy.size() ==0) {
            return;
        }
        iterator = orderedy.listIterator();
        
        //TraceManager.addDev("Order on " + msc.getName() + " and on instance " + sdi.getValue());
        while(iterator.hasNext()) {
            evt = iterator.next();
            //TraceManager.addDev("Evt=" + evt.getActionId());
        }
        //events in the same coregion are regrouped:
        
        iterator = orderedy.listIterator();
        // first evt -> special algorithm
        if (iterator.hasNext()) {
            evt = iterator.next();
            ll = new LinkedList<Evt>();
            ll.add(evt);
            grouped.add(ll);
            lastEvt = evt;
        } else {
            return;
        }
        
        // other evts
        while(iterator.hasNext()) {
            evt = iterator.next();
            // in same coregion
            if ((lastEvt.y == evt.y) || (sdi.isInSameCoregion(lastEvt.y, evt.y))) {
                //TraceManager.addDev("evt evt=" + evt.getActionId() + " and lastEvt=" + lastEvt.getActionId() + " are in the same coregion / y");
                //TraceManager.addDev("evt evty=" + evt.y + " and lastEvt=" + lastEvt.y);
                ll.add(evt);
                lastEvt = evt;
            } else {
                ll = new LinkedList<Evt>();
                ll.add(evt);
                grouped.add(ll);
                lastEvt = evt;
            }
        }
        
        if (grouped.size() < 1) {
            return;
        }
        
        // Orders are created!
        //Iterator iterator1, iterator2, iterator3;
        Iterator<List<Evt>> iterator1 = grouped.listIterator();
        List<Evt> previous, current;
        Order order;
        
        // first groups has no previous evts
        previous = iterator1.next();
        
        while(iterator1.hasNext()) {
            current = iterator1.next();
            Iterator<Evt> iterator2 = current.listIterator();
            while(iterator2.hasNext()) {
                evt = iterator2.next();
                Iterator<Evt> iterator3 = previous.listIterator();
                while(iterator3.hasNext()) {
                    evt1 = iterator3.next();
                    order = new Order(evt1, evt);
                    //TraceManager.addDev("New order between " + evt1.getActionId() + " and " + evt.getActionId());
                    msc.addOrder(order);
                }
            }
            previous = current;
        }
    }
    
    private void addCheckingError(CheckingError ce) {
        if (checkingErrors == null) {
            checkingErrors = new LinkedList<CheckingError> ();
        }
        checkingErrors.add (ce);
    }
}