/*
 * Expression.java
 *
 */

package com.uvigo.tMaestro.SCOCreator.tool.adaptation;


/**
 * Esta clase se utiliza para al almacenar temporalmente
 * las expresiones logicas que el crea en la generacion de las
 * reglas a traves del Assistant.
 * @author raul
 * @version 0.1
 */
public class Expression implements java.io.Serializable{
    
    /**
     * Indica si la expresion logica esta negada
     */
    private boolean bNot=false;
    
    /**
     * El parametro de la expresion (puede ser de cualquier tipo)
     * Si es complejo va separado por puntos
     */
    private String sParameter;
    
    /**
     * El operador expresado mediante su posicion en el ComboBox de operadores
     */
    private int iOperator;
    
    /**
     * El valor de la expresion expresado mediante una String
     */
    private String sValue;
    
    
    final private static String[] aOperators={"equals","lessEqualThan","moreEqualThan","lessThan","moreThan"};
    final private static String[] aOperatorsAll={"==","<=",">=","<",">"};
    
    /**
     * Crea una nueva expresion
     * @param sParameter el nombre del parametro
     * @param iOperator El indice de operador en el ComboBox del Assistant
     * @param oValue El valor 
     */
    public Expression(String sParameter,int iOperator,Object oValue) {
        this.sParameter=new String(sParameter);
        this.iOperator=iOperator;
        if (oValue instanceof String) this.sValue=(String) oValue;
        else this.sValue=oValue.toString();
            
    }
   
    
    /**
     * Devuelve la expresion completa para ser mostrada
     * en el visor de expresiones logicas
     */
    public String getExpression(){
        return sParameter+aOperatorsAll[iOperator]+sValue;
    }
    
    /**
     * Niega la expresion.
     */
    public void setNot() {
        this.bNot=!bNot;
    }
    
    /**
     * Metodo que indica si un objeto es igual a este
     */
    public boolean equals(Object oObject) {
        if (oObject instanceof Expression) {
            Expression oExpression=(Expression) oObject;
            return (this.getExpression().equals(oExpression.getExpression()) && (this.bNot==oExpression.bNot));
        } else return super.equals(oObject);
    }
    
    /**
     * Devuelve el parametro de esta expresion
     */
    public String getParameter() {
        return sParameter;
    }
    
    /**
     * Devuelve el valor de esta expresion
     */
    public String getValue() {
        return sValue;
    }
    
    /**
     * Devuelve el operador de esta expresion
     */
    public String getOperator() {
        return aOperators[iOperator];
    }
    
    
    /**
     * Devuelve si la expresion esta negada o no
     */
    public String getBoolean() {
        if (bNot) return "not";
        else return "noOp";
    }
    
    /**
     * Devuelve una copia de esta expresion
     */
    public Expression copyExpression() {
        Expression oEx = new Expression(sParameter, iOperator, sValue);
        if (bNot) oEx.setNot();
        return oEx;
    }
    
}
