Skip to content
Snippets Groups Projects
AvatarSignal.java 6.99 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 myutil.Conversion;
import myutil.TraceManager;

   * Class AvatarSignal
   * Signals in Avatar ...
   * Creation: 08/04/2010
   * @version 1.0 08/04/2010
   * @author Ludovic APVRILLE
public class AvatarSignal extends AvatarMethod {

    // Signa type
    public final static int IN = 0;
    public final static int OUT = 1;

    private int inout;

    public boolean attachedToARelation;


    public AvatarSignal(int _inout, String _id, String _types[], String _typeIds[]) {
        super(_id, _types, _typeIds);
        inout = _inout;
    }

    public static AvatarSignal isAValidSignal(String _content) {
        String tmp = _content.trim();
        if (!((_content.startsWith("in ")) || (_content.startsWith("out ")))) {
            return null;
        }

        int tmpinout;
        if (_content.startsWith("in ")) {
            tmpinout = IN;
        } else {
            tmpinout = OUT;
        }

        return isAValidSignal(tmpinout, tmp.substring(3, tmp.length()).trim());
    }

    public static AvatarSignal isAValidSignal(int _inout, String _content) {
        if (!((_inout == IN) || (_inout == OUT))) {
            return null;
        }

        AvatarMethod am = isAValidMethod(_content, null, false);
        if (am == null) {
            TraceManager.addDev("invalid signal: " + _content);
            return null;
        }
        AvatarSignal as = new AvatarSignal(_inout, am.getId(), am.getTypes(), am.getTypeIds());

        return as;
    }

    public static boolean isAValidUseSignal(String _content) {
        if (_content.indexOf("()") == -1) {
            _content = Conversion.replaceAllString(_content, "(", "#int ");
            _content = Conversion.replaceAllString(_content, "#", "(");
            _content = Conversion.replaceAllString(_content, ",", "#int ");
            _content = Conversion.replaceAllString(_content, "#", ",");
            _content = Conversion.replaceAllString(_content, ".", "");
        }
        TraceManager.addDev("content:" + _content);
        return (isAValidMethod(_content, null, false) != null);
    }

    public int getInOut() {
        return inout;
    }

    public static String getStringInOut(int _inout) {
        switch(_inout) {
        case IN:
            return "in";
        case OUT:
        default:
            return "out";
        }
    }

    public String toBasicString() {
        return super.toString();
    }

    public String toString() {
        int cpt = 0;

        String signal = getStringInOut(inout) + " ";
        signal += super.toString();
        return signal;
    }



    // Comparison on id only
    public boolean equals(Object o) {
        if (!(o instanceof AvatarSignal)) {
            return false;
        }

        AvatarSignal as = (AvatarSignal)o;
        return getId().equals(as.getId());

    }

    // Comparison on all fields
    /*public int compareTo(Object o){
      if (!(o instanceof AvatarMethod)) {
      return 1;
      }

      AvatarMethod am = (AvatarMethod)o;
      if (!(getId().equals(am.getId()))) {
      return 1;
      }


      return 0;

      }*/

    public AvatarSignal makeClone() {
        return isAValidSignal(inout, super.toString());
    }

    public boolean hasSamePrototype (AvatarSignal _as) {
        String[] astypes = _as.getTypes();

        if (astypes.length != types.length) {
            return false;
        }

        for(int i=0; i<types.length; i++) {
            if (!(types[i].compareTo(astypes[i]) == 0)) {
                return false;
            }
        }

        return true;
    }

    public boolean isCompatibleWith(AvatarSignal _as) {
        if (_as.getInOut() == getInOut()) {
            return false;
        }

        return this.hasSamePrototype (_as);
    }

    public static String getSignalNameFromFullSignalString(String _signal) {
        String signal = _signal.trim();
        int index0 = signal.indexOf(" ");
        if (index0 != -1) {
            signal = signal.substring(index0+1, signal.length()).trim();
        }

        index0 = signal.indexOf("(");
        if (index0 != -1) {
            signal = signal.substring(0, index0).trim();
        }

        return signal;
    }

    public static int getNbOfValues(String _value) {
        int index = _value.indexOf('(');
        if (index == -1) {
            return -1;
        }

        int index0 = _value.indexOf(')');
        if (index0 == -1) {
            return -1;
        }

        String val = _value.substring(index+1, index0).trim();

        if (val.length() == 0) {
            return 0;
        }

        int nbChar = Conversion.nbChar(_value, ',');
        return nbChar+1;
    }

    public static String getValue(String _value, int _index) {
        int nbOfValues = getNbOfValues(_value);
        if (nbOfValues < 1) {
            return null;
        }

        if (_index >= nbOfValues) {
            return null;
        }

        int index0 = _value.indexOf('(');
        int index1 = _value.indexOf(')');

        String val = _value.substring(index0+1, index1).trim();

        String [] vals = val.split(",");
        return vals[_index].trim();

    }
}