Skip to content
Snippets Groups Projects
FaultTreePanelTranslator.java 58.1 KiB
Newer Older
/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
 * 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.*;
import faulttrees.*;
import translator.CheckingError;
import ui.ftd.*;

import java.util.LinkedList;
import java.util.List;

/**
 * Class FaultTreePanelTranslator
 * Creation: 24/01/2018
 * @author Ludovic APVRILLE
 */
public class FaultTreePanelTranslator {

    protected FaultTree at;
    protected FaultTreePanel atp;
    protected LinkedList<CheckingError> checkingErrors, warnings;
    protected CorrespondanceTGElement listE; // usual list
    protected LinkedList<TDiagramPanel> panels;


    public FaultTreePanelTranslator(FaultTreePanel _atp) {
        atp = _atp;
        reinit();
    }

    public void reinit() {
        checkingErrors = new LinkedList<CheckingError>();
        warnings = new LinkedList<CheckingError>();
        panels = new LinkedList<TDiagramPanel>();
    }

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

    public LinkedList<CheckingError> getWarnings() {
        return warnings;
    }

    public CorrespondanceTGElement getCorrespondanceTGElement() {
        return listE;
    }

    public FaultTree translateToFaultTreeDataStructure() {

        at = new FaultTree("FaultTree", atp);


        for (TDiagramPanel panel : atp.panels) {
            if (panel instanceof FaultTreeDiagramPanel) {
                translate((FaultTreeDiagramPanel) panel);
                boolean b = at.checkSyntax();
                if (!b) {
                    UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, at.errorOfFaultyElement);
                    ce.setTGComponent((TGComponent) (at.faultyElement.getReferenceObject()));
                    ce.setTDiagramPanel(panel);
                    addCheckingError(ce);
                }
            }
        }


        //TraceManager.addDev("AT=" + at.toString());
        return at;

    }

    public void translate(FaultTreeDiagramPanel atdp) {
        List<TGComponent> allComponents = atdp.getAllComponentList();

        int nodeID = 0;
        TGComponent father;

        //Create Faults, nodes
        for (TGComponent comp : allComponents) {
                FTDFault atdatt = (FTDFault) comp;
                Fault att;
                String value = atdatt.getValue();
                father = atdatt.getFather();
                if ((father != null) && (father instanceof FTDBlock)) {
                    value = ((FTDBlock) father).getNodeName() + "__" + value;

                }
                att = new Fault(value, atdatt);
                att.setRoot(atdatt.isRootFault());
                att.setProbability(atdatt.getProbability());
                att.setEnabled(atdatt.isEnabled());
                at.addFault(att);
                listE.addCor(att, comp);
            }
            if (comp instanceof FTDConstraint) {
                FTDConstraint cons = (FTDConstraint) comp;
                nodeID++;

                //OR
                if (cons.isOR()) {
                    ORNode ornode = new ORNode("OR__" + nodeID, cons);
                    at.addNode(ornode);
                    listE.addCor(ornode, comp);

                    //AND
                } else if (cons.isAND()) {
                    ANDNode andnode = new ANDNode("AND__" + nodeID, cons);
                    at.addNode(andnode);
                    listE.addCor(andnode, comp);

                    //XOR
                } else if (cons.isXOR()) {
                    XORNode xornode = new XORNode("XOR__" + nodeID, cons);
                    at.addNode(xornode);
                    listE.addCor(xornode, comp);

                } else if (cons.isNOT()) {
                    NOTNode notnode = new NOTNode("NOT__" + nodeID, cons);
                    at.addNode(notnode);
                    listE.addCor(notnode, comp);

                    //SEQUENCE
                } else if (cons.isSequence()) {
                    SequenceNode seqnode = new SequenceNode("SEQUENCE__" + nodeID, cons);
                    at.addNode(seqnode);
                    listE.addCor(seqnode, comp);

                    //BEFORE
                } else if (cons.isBefore()) {
                    String eq = cons.getEquation();
                    int time;
                    try {
                        time = Integer.decode(eq).intValue();
                        BeforeNode befnode = new BeforeNode("BEFORE__" + nodeID, cons, time);
                        at.addNode(befnode);
                        listE.addCor(befnode, comp);
                    } catch (Exception e) {
                        UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Invalid time in before node");
                        ce.setTGComponent(comp);
                        ce.setTDiagramPanel(atdp);
                        addCheckingError(ce);
                    }

                    //AFTER
                } else if (cons.isAfter()) {
                    String eq = cons.getEquation();
                    int time;
                    try {
                        time = Integer.decode(eq).intValue();
                        AfterNode aftnode = new AfterNode("AFTER__" + nodeID, cons, time);
                        at.addNode(aftnode);
                        listE.addCor(aftnode, comp);
                    } catch (Exception e) {
                        UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Invalid time in after node");
                        ce.setTGComponent(comp);
                        ce.setTDiagramPanel(atdp);
                        addCheckingError(ce);
                    }

                } else if (cons.isVote()) {
                    VoteNode voteNode = new VoteNode("VOTE__" + nodeID, cons);
                    at.addNode(voteNode);
                    listE.addCor(voteNode, comp);

                    UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Invalid Fault node");
                    ce.setTGComponent(comp);
                    ce.setTDiagramPanel(atdp);
                    addCheckingError(ce);
                }
            }
        }

        // Making connections between nodes&Faults
        TGComponent tgc1, tgc2;
        for (TGComponent comp : allComponents) {
            if (comp instanceof FTDFaultConnector) {
                FTDFaultConnector con = (FTDFaultConnector) (comp);
                tgc1 = atdp.getComponentToWhichBelongs(con.getTGConnectingPointP1());
                tgc2 = atdp.getComponentToWhichBelongs(con.getTGConnectingPointP2());
                if (((tgc1 instanceof FTDFault) || (tgc1 instanceof FTDConstraint)) &&
                        ((tgc2 instanceof FTDFault) || (tgc2 instanceof FTDConstraint))) {
                    try {
                        // We must transpose this into Fault -> node or node -> Fault

                        // Fault -> Fault
                        if ((tgc1 instanceof FTDFault) && (tgc2 instanceof FTDFault)) {
                            // We link the two Faults with an "and" node
                            Fault at1 = (Fault) (listE.getObject(tgc1));
                            Fault at2 = (Fault) (listE.getObject(tgc2));
                            nodeID++;
                            ANDNode andnode = new ANDNode("ANDBetweenFaults__" + nodeID + "__" + at1.getName() + "__" + at2.getName(), tgc1);
                            at.addNode(andnode);
                            listE.addCor(andnode, comp);
                            at1.addDestinationNode(andnode);
                            at2.setOriginNode(andnode);
                            andnode.addInputFault(at1, new Integer("0"));
                            andnode.setResultingFault(at2);


                            // Fault -> node
                        } else if ((tgc1 instanceof FTDFault) && (tgc2 instanceof FTDConstraint)) {
                            Fault at1 = (Fault) (listE.getObject(tgc1));
                            FaultNode node1 = (FaultNode) (listE.getObject(tgc2));
                            at1.addDestinationNode(node1);
                            String val = comp.getValue().trim();
                            if (val.length() == 0) {
                                val = "0";
                            }
                            node1.addInputFault(at1, new Integer(val));

                            // Node -> Fault
                        } else if ((tgc1 instanceof FTDConstraint) && (tgc2 instanceof FTDFault)) {
                            Fault at1 = (Fault) (listE.getObject(tgc2));
                            FaultNode node1 = (FaultNode) (listE.getObject(tgc1));
                            at1.setOriginNode(node1);
                            if (node1.getResultingFault() != null) {
                                // Already a resulting Fault -> error
                                UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Too many resulting Faults");
                                ce.setTGComponent(tgc1);
                                ce.setTDiagramPanel(atdp);
                                addCheckingError(ce);
                            } else {
                                node1.setResultingFault(at1);
                            }

                            // Node -> Node
                        } else if ((tgc1 instanceof FTDConstraint) && (tgc2 instanceof FTDConstraint)) {
                            FaultNode node1 = (FaultNode) (listE.getObject(tgc1));
                            FaultNode node2 = (FaultNode) (listE.getObject(tgc2));
                            // Make fake Fault
                            Fault att = new Fault("Fault__from_" + node1.getName() + "_to_" + node2.getName(), tgc1);
                            att.setRoot(false);
                            at.addFault(att);
                            listE.addCor(att, comp);

                            att.setOriginNode(node1);
                            att.addDestinationNode(node2);

                            if (node1.getResultingFault() != null) {
                                // Already a resulting Fault -> error
                                UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Too many resulting Faults");
                                ce.setTGComponent(tgc1);
                                ce.setTDiagramPanel(atdp);
                                addCheckingError(ce);
                            } else {
                                node1.setResultingFault(att);
                            }

                            String val = comp.getValue().trim();
                            if (val.length() == 0) {
                                val = "0";
                            }
                            node2.addInputFault(att, new Integer(val));
                        }

                    } catch (Exception e) {
                        UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Badly formed connector");
                        ce.setTGComponent(comp);
                        ce.setTDiagramPanel(atdp);
                        addCheckingError(ce);
                    }
                }
            }
        }

    }


    public AvatarSpecification generateAvatarSpec() {
        AvatarSpecification as = new AvatarSpecification("spec from Fault trees", atp);
        // One block per Faultnode to receive the Fault
        // One block per Fault -> syncho
        // One mast block with all channels declared at that level
        AvatarBlock mainBlock = new AvatarBlock("MainBlock", as, null);
        AvatarStartState ass = new AvatarStartState("StartStateOfMainBlock", null);
        mainBlock.getStateMachine().setStartState(ass);
        mainBlock.getStateMachine().addElement(ass);
        as.addBlock(mainBlock);

        // Declare all Faults
        declareAllFaults(as, mainBlock);

        // Make block for Faults
        makeFaultBlocks(as, mainBlock);

        // Make blocks for nodes
        makeFaultNodeBlocks(as, mainBlock);


        return as;
    }

    private void declareAllFaults(AvatarSpecification _as, AvatarBlock _main) {
        AvatarRelation ar = new AvatarRelation("MainRelation", _main, _main, null);
        ar.setAsynchronous(false);
        ar.setPrivate(true);
        ar.setBroadcast(false);

        _as.addRelation(ar);
        for (Fault Fault : at.getFaults()) {
            avatartranslator.AvatarSignal makeFault = new avatartranslator.AvatarSignal("make__" + Fault.getName(), AvatarSignal.OUT, listE.getTG(Fault));
            _main.addSignal(makeFault);
            avatartranslator.AvatarSignal stopMakeFault = new avatartranslator.AvatarSignal("makeStop__" + Fault.getName(), AvatarSignal.IN, listE.getTG(Fault));
            _main.addSignal(stopMakeFault);
            avatartranslator.AvatarSignal acceptFault = new avatartranslator.AvatarSignal("accept__" + Fault.getName(), AvatarSignal.IN, listE.getTG(Fault));
            _main.addSignal(acceptFault);
            avatartranslator.AvatarSignal stopAcceptFault = new avatartranslator.AvatarSignal("acceptStop__" + Fault.getName(), AvatarSignal.OUT, listE.getTG(Fault));
            _main.addSignal(stopAcceptFault);
            ar.addSignals(makeFault, acceptFault);
            ar.addSignals(stopMakeFault, stopAcceptFault);

            // If Fault is not leaf: add the intermediate action to activate the intermediate leaf
            if (!Fault.isLeaf()) {
                avatartranslator.AvatarSignal nodeDone = new avatartranslator.AvatarSignal("nodeDone__" + Fault.getName(), AvatarSignal.OUT, listE.getTG(Fault));
                _main.addSignal(nodeDone);
                avatartranslator.AvatarSignal activateFault = new avatartranslator.AvatarSignal("activate__" + Fault.getName(), AvatarSignal.IN, listE.getTG(Fault));
                _main.addSignal(activateFault);
                ar.addSignals(nodeDone, activateFault);

            }

        }
    }

    private void makeFaultBlocks(AvatarSpecification _as, AvatarBlock _main) {
        for (Fault Fault : at.getFaults()) {
            if (Fault.isLeaf()) {
                // Make the block
                AvatarBlock ab = new AvatarBlock(Fault.getName(), _as, listE.getTG(Fault));
                _as.addBlock(ab);
                ab.setFather(_main);

                avatartranslator.AvatarSignal sigFault = _main.getAvatarSignalWithName("make__" + Fault.getName());
                avatartranslator.AvatarSignal stopFault = _main.getAvatarSignalWithName("makeStop__" + Fault.getName());

                if ((sigFault != null) && (stopFault != null)) {
                    makeFaultBlockSMD(ab, sigFault, stopFault, Fault.isEnabled(), listE.getTG(Fault));
                }

            } else {
                // Make the block
                AvatarBlock ab = new AvatarBlock(Fault.getName(), _as, listE.getTG(Fault));
                _as.addBlock(ab);
                ab.setFather(_main);

                avatartranslator.AvatarSignal sigFault = _main.getAvatarSignalWithName("make__" + Fault.getName());
                avatartranslator.AvatarSignal stopFault = _main.getAvatarSignalWithName("makeStop__" + Fault.getName());
                avatartranslator.AvatarSignal activateFault = _main.getAvatarSignalWithName("activate__" + Fault.getName());

                makeIntermediateFaultBlockSMD(ab, sigFault, stopFault, activateFault, Fault.isEnabled(), listE.getTG(Fault));

                // Intermediate Fault
            }
        }
    }


    private void makeFaultBlockSMD(AvatarBlock _ab, avatartranslator.AvatarSignal _sigFault, avatartranslator.AvatarSignal _sigStop, boolean isEnabled, Object _ref) {
        Object _ref1 = _ref;
        _ref = null;

        boolean isCheckable = false;
        boolean isChecked = false;

        AvatarStateMachine asm = _ab.getStateMachine();

        if (isEnabled) {

            if (_ref1 instanceof TGComponent) {
                isCheckable = ((TGComponent) (_ref1)).hasCheckableAccessibility();
            }
            if (_ref1 instanceof TGComponent) {
                isChecked = ((TGComponent) (_ref1)).hasCheckedAccessibility();
            }

            AvatarStartState start = new AvatarStartState("start", _ref);
            AvatarState mainState = new AvatarState("main", _ref, false, false);
            AvatarState performedState = new AvatarState("main", _ref1, isCheckable, isChecked);
            performedState.setAsVerifiable(true);
            AvatarState mainStop = new AvatarState("stop", _ref, false, false);
            AvatarActionOnSignal getMake = new AvatarActionOnSignal("GettingFault", _sigFault, _ref1);
            AvatarActionOnSignal getStop = new AvatarActionOnSignal("GettingStop", _sigStop, _ref);

            asm.addElement(start);
            asm.setStartState(start);
            asm.addElement(mainState);
            asm.addElement(performedState);
            asm.addElement(getMake);
            asm.addElement(getStop);


            AvatarTransition at = new AvatarTransition(_ab, "at1", _ref);
            asm.addElement(at);
            start.addNext(at);
            at.addNext(mainState);

            at = new AvatarTransition(_ab, "at2", _ref);
            asm.addElement(at);
            mainState.addNext(at);
            at.addNext(getMake);

            at = new AvatarTransition(_ab, "at3", _ref);
            asm.addElement(at);
            getMake.addNext(at);
            at.addNext(performedState);

            at = new AvatarTransition(_ab, "backToMain", _ref);
            asm.addElement(at);
            performedState.addNext(at);
            at.addNext(mainState);

            at = new AvatarTransition(_ab, "at4", _ref);
            asm.addElement(at);
            mainState.addNext(at);
            at.addNext(getStop);

            at = new AvatarTransition(_ab, "at5", _ref);
            asm.addElement(at);
            getStop.addNext(at);
            at.addNext(mainStop);

        } else {

            AvatarStartState start = new AvatarStartState("start", _ref);
            AvatarState mainState = new AvatarState("main", _ref, false, false);
            AvatarState mainStop = new AvatarState("stop", _ref, false, false);
            AvatarActionOnSignal getStop = new AvatarActionOnSignal("GettingStop", _sigStop, _ref);

            asm.addElement(start);
            asm.setStartState(start);
            asm.addElement(mainState);
            asm.addElement(getStop);


            AvatarTransition at = new AvatarTransition(_ab, "at1", _ref);
            asm.addElement(at);
            start.addNext(at);
            at.addNext(mainState);

            at = new AvatarTransition(_ab, "at4", _ref);
            asm.addElement(at);
            mainState.addNext(at);
            at.addNext(getStop);

            at = new AvatarTransition(_ab, "at5", _ref);
            asm.addElement(at);
            getStop.addNext(at);
            at.addNext(mainStop);
        }

    }

    private void makeIntermediateFaultBlockSMD(AvatarBlock _ab, avatartranslator.AvatarSignal _sigFault, avatartranslator.AvatarSignal _sigStop, avatartranslator.AvatarSignal _sigActivate, boolean isEnabled, Object _ref) {
        Object _ref1 = _ref;
        _ref = null;
        AvatarStateMachine asm = _ab.getStateMachine();
        boolean isCheckable = false;
        boolean isChecked = false;
            if (_ref1 instanceof TGComponent) {
                isCheckable = ((TGComponent) (_ref1)).hasCheckableAccessibility();
            }
            if (_ref1 instanceof TGComponent) {
                isChecked = ((TGComponent) (_ref1)).hasCheckedAccessibility();
            }
            AvatarStartState start = new AvatarStartState("start", _ref);
            AvatarState activateState = new AvatarState("activate", _ref, false, false);
            AvatarState mainState = new AvatarState("main", _ref, false, false);
            AvatarState activatedState = new AvatarState("activated", _ref1, isCheckable, isChecked);
            if (_ref1 instanceof FTDFault) {
                activatedState.setAsVerifiable(true);
            }
            AvatarState performedState = new AvatarState("performed", _ref, false, false);
            AvatarState mainStop = new AvatarState("stop", _ref, false, false);
            AvatarState stopBeforeActivate = new AvatarState("stopBeforeActivate", _ref, false, false);
            AvatarActionOnSignal getMake = new AvatarActionOnSignal("GettingFault", _sigFault, _ref1);
            AvatarActionOnSignal getStop = new AvatarActionOnSignal("GettingStop", _sigStop, _ref);
            AvatarActionOnSignal getStopInitial = new AvatarActionOnSignal("GettingInitialStop", _sigStop, _ref);
            AvatarActionOnSignal getActivate = new AvatarActionOnSignal("GettingActivate", _sigActivate, _ref1);
            AvatarActionOnSignal getActivateAfterStop = new AvatarActionOnSignal("GettingActivateAfterStop", _sigActivate, _ref1);

            asm.addElement(start);
            asm.setStartState(start);
            asm.addElement(activateState);
            asm.addElement(activatedState);
            asm.addElement(mainState);
            asm.addElement(stopBeforeActivate);
            asm.addElement(performedState);
            asm.addElement(getMake);
            asm.addElement(getStop);
            asm.addElement(getStopInitial);
            asm.addElement(getActivate);
            asm.addElement(getActivateAfterStop);


            AvatarTransition at = new AvatarTransition(_ab, "at1", _ref);
            asm.addElement(at);
            start.addNext(at);
            at.addNext(activateState);

            at = new AvatarTransition(_ab, "at1_act", _ref);
            asm.addElement(at);
            activateState.addNext(at);
            at.addNext(getActivate);

            at = new AvatarTransition(_ab, "at1_performed", _ref);
            asm.addElement(at);
            getActivate.addNext(at);
            at.addNext(activatedState);

            at = new AvatarTransition(_ab, "at2_main", _ref);
            asm.addElement(at);
            activatedState.addNext(at);
            at.addNext(mainState);
            at.setHidden(true);


            at = new AvatarTransition(_ab, "at2", _ref);
            asm.addElement(at);
            mainState.addNext(at);
            at.addNext(getMake);

            at = new AvatarTransition(_ab, "at3", _ref);
            asm.addElement(at);
            getMake.addNext(at);
            at.addNext(performedState);

            at = new AvatarTransition(_ab, "backToMain", _ref);
            asm.addElement(at);
            performedState.addNext(at);
            at.addNext(mainState);

            at = new AvatarTransition(_ab, "at4", _ref);
            asm.addElement(at);
            mainState.addNext(at);
            at.addNext(getStop);

            at = new AvatarTransition(_ab, "at5", _ref);
            asm.addElement(at);
            getStop.addNext(at);
            at.addNext(mainStop);

            // Stop before activate
            at = new AvatarTransition(_ab, "at6", _ref);
            asm.addElement(at);
            activateState.addNext(at);
            at.addNext(getStopInitial);

            at = new AvatarTransition(_ab, "at7", _ref);
            asm.addElement(at);
            getStopInitial.addNext(at);
            at.addNext(stopBeforeActivate);

            at = new AvatarTransition(_ab, "at8", _ref);
            asm.addElement(at);
            stopBeforeActivate.addNext(at);
            at.addNext(getActivateAfterStop);

            at = new AvatarTransition(_ab, "at9", _ref);
            asm.addElement(at);
            getActivateAfterStop.addNext(at);
            at.addNext(mainStop);
        } else {
            AvatarStartState start = new AvatarStartState("start", _ref);
            AvatarState activateState = new AvatarState("activate", _ref, false, false);
            AvatarState mainState = new AvatarState("main", _ref, false, false);
            AvatarState activatedState = new AvatarState("main", _ref1, isCheckable, isChecked);
            AvatarState mainStop = new AvatarState("stop", _ref, false, false);
            AvatarState stopBeforeActivate = new AvatarState("stopBeforeActivate", _ref, false, false);
            AvatarActionOnSignal getStop = new AvatarActionOnSignal("GettingStop", _sigStop, _ref);
            AvatarActionOnSignal getStopInitial = new AvatarActionOnSignal("GettingInitialStop", _sigStop, _ref);
            AvatarActionOnSignal getActivate = new AvatarActionOnSignal("GettingActivate", _sigActivate, _ref1);
            AvatarActionOnSignal getActivateAfterStop = new AvatarActionOnSignal("GettingActivateAfterStop", _sigActivate, _ref1);

            asm.addElement(start);
            asm.setStartState(start);
            asm.addElement(activateState);
            asm.addElement(activatedState);
            asm.addElement(mainState);
            asm.addElement(stopBeforeActivate);
            asm.addElement(getStop);
            asm.addElement(getStopInitial);
            asm.addElement(getActivate);
            asm.addElement(getActivateAfterStop);


            AvatarTransition at = new AvatarTransition(_ab, "at1", _ref);
            asm.addElement(at);
            start.addNext(at);
            at.addNext(activateState);

            at = new AvatarTransition(_ab, "at1_act", _ref);
            asm.addElement(at);
            activateState.addNext(at);
            at.addNext(getActivate);

            at = new AvatarTransition(_ab, "at1_performed", _ref);
            asm.addElement(at);
            getActivate.addNext(at);
            at.addNext(activatedState);

            at = new AvatarTransition(_ab, "at2_main", _ref);
            asm.addElement(at);
            activatedState.addNext(at);
            at.addNext(mainState);
            at.setHidden(true);

            at = new AvatarTransition(_ab, "at4", _ref);
            asm.addElement(at);
            mainState.addNext(at);
            at.addNext(getStop);

            at = new AvatarTransition(_ab, "at5", _ref);
            asm.addElement(at);
            getStop.addNext(at);
            at.addNext(mainStop);

            // Stop before activate
            at = new AvatarTransition(_ab, "at6", _ref);
            asm.addElement(at);
            activateState.addNext(at);
            at.addNext(getStopInitial);

            at = new AvatarTransition(_ab, "at7", _ref);
            asm.addElement(at);
            getStopInitial.addNext(at);
            at.addNext(stopBeforeActivate);

            at = new AvatarTransition(_ab, "at8", _ref);
            asm.addElement(at);
            stopBeforeActivate.addNext(at);
            at.addNext(getActivateAfterStop);

            at = new AvatarTransition(_ab, "at9", _ref);
            asm.addElement(at);
            getActivateAfterStop.addNext(at);
            at.addNext(mainStop);
        }
    }


    private void makeFaultNodeBlocks(AvatarSpecification _as, AvatarBlock _main) {
        //Fault att;

        for (FaultNode node : at.getFaultNodes()) {
            if (node.isWellFormed()) {
                // Make the block
                AvatarBlock ab = new AvatarBlock(node.getName(), _as, listE.getTG(node));
                _as.addBlock(ab);
                ab.setFather(_main);

                if (node instanceof ANDNode) {
                    makeANDNode(_as, _main, ab, (ANDNode) node, listE.getTG(node));
                    makeORNode(_as, _main, ab, (ORNode) node, listE.getTG(node));
                    makeXORNode(_as, _main, ab, (XORNode) node, listE.getTG(node));
                } else if (node instanceof SequenceNode) {
                    makeSequenceNode(_as, _main, ab, (SequenceNode) node, listE.getTG(node));
                } else if (node instanceof AfterNode) {
                    makeAfterNode(_as, _main, ab, (AfterNode) node, listE.getTG(node));
                } else if (node instanceof BeforeNode) {
                    makeBeforeNode(_as, _main, ab, (BeforeNode) node, listE.getTG(node));
                } else if (node instanceof VoteNode) {
                    makeVoteNode(_as, _main, ab, (VoteNode) node, listE.getTG(node));
                } else if (node instanceof NOTNode) {
                    makeNOTNode(_as, _main, ab, (NOTNode) node, listE.getTG(node));
                }
            }
        }
    }


    private void makeANDNode(AvatarSpecification _as, AvatarBlock _main, AvatarBlock _ab, ANDNode _node, Object _ref) {
        Object _ref1 = _ref;
        _ref = null;
        AvatarStateMachine asm = _ab.getStateMachine();

        // Basic machine
        AvatarStartState start = new AvatarStartState("start", _ref);
        AvatarState mainState = new AvatarState("main", _ref, false, false);
        AvatarState endState = new AvatarState("end", _ref, false, false);
        AvatarState overallState = new AvatarState("overall", _ref, false, false);
        asm.addElement(start);
        asm.setStartState(start);
        asm.addElement(mainState);
        asm.addElement(endState);
        asm.addElement(overallState);
        AvatarTransition atF = new AvatarTransition(_ab, "at1", _ref);
        asm.addElement(atF);
        start.addNext(atF);
        atF.addNext(mainState);
        atF.setHidden(true);
        String finalGuard = "";
        for (Fault att : _node.getInputFaults()) {
            AvatarAttribute aa = new AvatarAttribute(att.getName() + "__performed", AvatarType.BOOLEAN, _ab, _ref);
                finalGuard += "(" + att.getName() + "__performed == true)";
            } else {
                finalGuard += " && (" + att.getName() + "__performed == true)";
            }
            _ab.addAttribute(aa);
            atF.addAction(att.getName() + "__performed = false");

            avatartranslator.AvatarSignal sigAtt = _main.getAvatarSignalWithName("accept__" + att.getName());
            AvatarActionOnSignal acceptFault = new AvatarActionOnSignal("AcceptFault", sigAtt, _ref1);
            asm.addElement(acceptFault);
            AvatarTransition at = new AvatarTransition(_ab, "at_toInputFault", _ref);
            at.setProbability(att.getProbability());
            asm.addElement(at);
            mainState.addNext(at);
            at.addNext(acceptFault);
            at.setGuard(new AvatarSimpleGuardDuo(aa, AvatarConstant.FALSE, "=="));
            at = new AvatarTransition(_ab, "at_fromInputFault", _ref);
            at.addAction(att.getName() + "__performed = true");
            asm.addElement(at);
            acceptFault.addNext(at);
            at.addNext(mainState);
            at.setHidden(true);
        }

        // Adding resulting Fault
        AvatarTransition at = new AvatarTransition(_ab, "at_toEnd", _ref);
        asm.addElement(at);
        mainState.addNext(at);
        at.addNext(endState);
        at.setGuard("[" + finalGuard + "]");

        Fault resulting = _node.getResultingFault();
        avatartranslator.AvatarSignal sigFault = _main.getAvatarSignalWithName("nodeDone__" + resulting.getName());
        AvatarActionOnSignal resultingFault = new AvatarActionOnSignal("ResultingFault", sigFault, _ref1);
        asm.addElement(resultingFault);
        at = new AvatarTransition(_ab, "at_toResultingFault", _ref);
        asm.addElement(at);
        endState.addNext(at);
        at.addNext(resultingFault);
        at = new AvatarTransition(_ab, "at_Overall", _ref);
        asm.addElement(at);
        resultingFault.addNext(at);
        at.addNext(overallState);
    }

    private void makeNOTNode(AvatarSpecification _as, AvatarBlock _main, AvatarBlock _ab, NOTNode _node, Object _ref) {
        Object _ref1 = _ref;
        _ref = null;
        AvatarStateMachine asm = _ab.getStateMachine();

        // Basic machine
        AvatarStartState start = new AvatarStartState("start", _ref);
        AvatarState mainState = new AvatarState("main", _ref, false, false);
        AvatarState endState = new AvatarState("end", _ref, false, false);
        AvatarState overallState = new AvatarState("overall", _ref, false, false);
        asm.addElement(start);
        asm.setStartState(start);
        asm.addElement(mainState);
        asm.addElement(endState);
        asm.addElement(overallState);
        AvatarTransition atF = new AvatarTransition(_ab, "at1", _ref);
        asm.addElement(atF);
        start.addNext(atF);
        atF.addNext(mainState);
        atF.setHidden(true);
        String finalGuard = "";
        for (Fault att : _node.getInputFaults()) {
            AvatarAttribute aa = new AvatarAttribute(att.getName() + "__performed", AvatarType.BOOLEAN, _ab, _ref);
            if (finalGuard.length() == 0) {
                finalGuard += "(" + att.getName() + "__performed == false)";
            } else {
                finalGuard += " && (" + att.getName() + "__performed == false)";
            }
            _ab.addAttribute(aa);
            atF.addAction(att.getName() + "__performed = false");


            avatartranslator.AvatarSignal sigAtt = _main.getAvatarSignalWithName("accept__" + att.getName());
            AvatarActionOnSignal acceptFault = new AvatarActionOnSignal("AcceptFault", sigAtt, _ref1);
            asm.addElement(acceptFault);
            AvatarTransition at = new AvatarTransition(_ab, "at_toInputFault", _ref);
            asm.addElement(at);
            mainState.addNext(at);
            at.addNext(acceptFault);
            at.setGuard(new AvatarSimpleGuardDuo(aa, AvatarConstant.FALSE, "=="));
            at = new AvatarTransition(_ab, "at_fromInputFault", _ref);
            at.addAction(att.getName() + "__performed = true");
            asm.addElement(at);
            acceptFault.addNext(at);
            at.addNext(mainState);
            at.setHidden(true);
        }

        // Adding resulting Fault
        AvatarTransition at = new AvatarTransition(_ab, "at_toEnd", _ref);
        asm.addElement(at);
        mainState.addNext(at);
        at.addNext(endState);
        at.setGuard("[" + finalGuard + "]");

        Fault resulting = _node.getResultingFault();
        avatartranslator.AvatarSignal sigFault = _main.getAvatarSignalWithName("nodeDone__" + resulting.getName());
        AvatarActionOnSignal resultingFault = new AvatarActionOnSignal("ResultingFault", sigFault, _ref1);
        asm.addElement(resultingFault);
        at = new AvatarTransition(_ab, "at_toResultingFault", _ref);
        asm.addElement(at);
        endState.addNext(at);
        at.addNext(resultingFault);
        at = new AvatarTransition(_ab, "at_Overall", _ref);
        asm.addElement(at);
        resultingFault.addNext(at);
        at.addNext(overallState);
    }

    private void makeVoteNode(AvatarSpecification _as, AvatarBlock _main, AvatarBlock _ab, VoteNode _node, Object _ref) {
        Object _ref1 = _ref;
        _ref = null;
        AvatarStateMachine asm = _ab.getStateMachine();

        // Basic machine
        AvatarStartState start = new AvatarStartState("start", _ref);
        AvatarState mainState = new AvatarState("main", _ref, false, false);
        AvatarState endState = new AvatarState("end", _ref, false, false);
        AvatarState overallState = new AvatarState("overall", _ref, false, false);
        asm.addElement(start);
        asm.setStartState(start);
        asm.addElement(mainState);
        asm.addElement(endState);
        asm.addElement(overallState);
        AvatarTransition atF = new AvatarTransition(_ab, "at1", _ref);
        asm.addElement(atF);
        start.addNext(atF);
        atF.addNext(mainState);
        atF.setHidden(true);
        String finalGuard = "";

        AvatarAttribute aCount = new AvatarAttribute("__nbOfPerformed", AvatarType.INTEGER, _ab, _ref);
        _ab.addAttribute(aCount);

        double nbOfVoters = _node.getInputFaults().size() / 2.0;
        int thres = (int) (Math.ceil(nbOfVoters));
        finalGuard = "( __nbOfPerformed >= " + thres + ")";
        for (Fault att : _node.getInputFaults()) {
            AvatarAttribute aa = new AvatarAttribute(att.getName() + "__performed", AvatarType.BOOLEAN, _ab, _ref);

            /*if (finalGuard.length() == 0) {
                finalGuard += "(" + att.getName() + "__performed == true)";
            } else {
                finalGuard += " && (" + att.getName() + "__performed == true)";
            }*/
            _ab.addAttribute(aa);
            atF.addAction(att.getName() + "__performed = false");


            avatartranslator.AvatarSignal sigAtt = _main.getAvatarSignalWithName("accept__" + att.getName());
            AvatarActionOnSignal acceptFault = new AvatarActionOnSignal("AcceptFault", sigAtt, _ref1);
            asm.addElement(acceptFault);
            AvatarTransition at = new AvatarTransition(_ab, "at_toInputFault", _ref);
            asm.addElement(at);
            mainState.addNext(at);
            at.addNext(acceptFault);
            at.setGuard(new AvatarSimpleGuardDuo(aa, AvatarConstant.FALSE, "=="));
            at = new AvatarTransition(_ab, "at_fromInputFault", _ref);
            at.addAction(att.getName() + "__performed = true");
            at.addAction(aCount.getName() + " = " + aCount.getName() + " + 1" );
            asm.addElement(at);
            acceptFault.addNext(at);
            at.addNext(mainState);
            at.setHidden(true);
        }

        // Adding resulting Fault
        AvatarTransition at = new AvatarTransition(_ab, "at_toEnd", _ref);
        asm.addElement(at);
        mainState.addNext(at);
        at.addNext(endState);
        at.setGuard("[" + finalGuard + "]");

        Fault resulting = _node.getResultingFault();
        avatartranslator.AvatarSignal sigFault = _main.getAvatarSignalWithName("nodeDone__" + resulting.getName());
        AvatarActionOnSignal resultingFault = new AvatarActionOnSignal("ResultingFault", sigFault, _ref1);
        asm.addElement(resultingFault);
        at = new AvatarTransition(_ab, "at_toResultingFault", _ref);
        asm.addElement(at);
        endState.addNext(at);
        at.addNext(resultingFault);
        at = new AvatarTransition(_ab, "at_Overall", _ref);
        asm.addElement(at);
        resultingFault.addNext(at);
        at.addNext(overallState);
    }


    private void makeORNode(AvatarSpecification _as, AvatarBlock _main, AvatarBlock _ab, ORNode _node, Object _ref) {
        Object _ref1 = _ref;
        _ref = null;
        AvatarStateMachine asm = _ab.getStateMachine();

        // Basic machine
        AvatarStartState start = new AvatarStartState("start", _ref);
        AvatarState mainState = new AvatarState("main", _ref, false, false);
        AvatarState endState = new AvatarState("end", _ref, false, false);
        AvatarState overallState = new AvatarState("overall", _ref, false, false);
        asm.addElement(start);
        asm.setStartState(start);
        asm.addElement(mainState);
        asm.addElement(endState);
        asm.addElement(overallState);

        AvatarTransition atF = new AvatarTransition(_ab, "at1", _ref);
        asm.addElement(atF);
        start.addNext(atF);
        atF.addNext(mainState);
        AvatarGuard finalGuard = null;
        for (Fault att : _node.getInputFaults()) {
            AvatarAttribute aa = new AvatarAttribute(att.getName() + "__performed", AvatarType.BOOLEAN, _ab, _ref);
            if (finalGuard == null)
                finalGuard = new AvatarSimpleGuardDuo(aa, AvatarConstant.TRUE, "==");
                finalGuard = AvatarGuard.addGuard(finalGuard, new AvatarSimpleGuardDuo(aa, AvatarConstant.TRUE, "=="), "||");
            atF.addAction(new AvatarActionAssignment(aa, AvatarConstant.FALSE));

            // From Main
            avatartranslator.AvatarSignal sigAtt = _main.getAvatarSignalWithName("accept__" + att.getName());
            AvatarActionOnSignal acceptFault = new AvatarActionOnSignal("AcceptFault", sigAtt, _ref1);
            asm.addElement(acceptFault);
            AvatarTransition at = new AvatarTransition(_ab, "at_toInputFault", _ref);
            asm.addElement(at);
            mainState.addNext(at);
            at.addNext(acceptFault);
            at.setGuard(new AvatarSimpleGuardDuo(aa, AvatarConstant.FALSE, "=="));
            at = new AvatarTransition(_ab, "at_fromInputFault", _ref);
            at.addAction(new AvatarActionAssignment(aa, AvatarConstant.TRUE));
            asm.addElement(at);
            acceptFault.addNext(at);
            at.addNext(mainState);

            // Link from End
            acceptFault = new AvatarActionOnSignal("AcceptFault", sigAtt, _ref1);
            asm.addElement(acceptFault);
            at = new AvatarTransition(_ab, "at_toInputFault", _ref);
            asm.addElement(at);
            endState.addNext(at);
            at.addNext(acceptFault);
            at.setGuard(new AvatarSimpleGuardDuo(aa, AvatarConstant.FALSE, "=="));
            at = new AvatarTransition(_ab, "at_fromInputFault", _ref);
            at.addAction(new AvatarActionAssignment(aa, AvatarConstant.TRUE));
            asm.addElement(at);
            acceptFault.addNext(at);
            at.addNext(endState);

            // Link from Overall
            acceptFault = new AvatarActionOnSignal("AcceptFault", sigAtt, _ref1);
            asm.addElement(acceptFault);
            at = new AvatarTransition(_ab, "at_toInputFault", _ref);
            asm.addElement(at);