com.autentia.tnt.faces.components.query.model.SimpleExpression.java Source code

Java tutorial

Introduction

Here is the source code for com.autentia.tnt.faces.components.query.model.SimpleExpression.java

Source

/**
    
 * Copyright 2014 Autentia Real Business Solutions S.L.
 * 
 * This file is part of the code that develops in Autentia.
 * 
 * This code is a free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, version 3 of the License.
 * 
 * This code is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public
 * License along with this program.  If not, see
 * <http://www.gnu.org/licenses/gpl-3.0.html>.
 */
package com.autentia.tnt.faces.components.query.model;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;

/**
 * Un {@link Criterion} que representa una expresin simple de un criterio de bsqueda. Es decir, una propiedad + un
 * operador + un valor dado por el usuario.
 */
public class SimpleExpression implements Criterion {

    /** Nombre de la propiedad a la que se refiere este criterio. */
    private String property;

    /** Operador del criterio */
    private Operator operator;

    /**
     * Valores del criterio, pueden ser 0 (ej un is-null o un is-blank) o incluso ms de 1, por ejemplo en el between.
     * El tamao inicial de la lista se fija a 2 porque por ahora el operador que ms operandos tiene es el between con
     * los dos valores entre los que hay que hacer la bsqueda.
     */
    private List<Object> values = new ArrayList<Object>(2);

    /**
     * Default constructor
     */
    public SimpleExpression() {
        // Default constructor
    }

    public SimpleExpression(String property, Operator operator, Object... initValues) {
        this.property = property;
        setOperator(operator);
        setValues(initValues);
    }

    public SimpleExpression(String property, Operator operator) {
        this.property = property;
        this.operator = operator;
    }

    /**
     * Devuelve una nueva instancia de esta clase, copia de este objeto.
     * 
     * @return una copia de este objeto.
     */
    @Override
    public Object clone() throws CloneNotSupportedException {
        final SimpleExpression clonedCriterion = new SimpleExpression();
        clonedCriterion.setSimpleExpression(this);
        return clonedCriterion;
    }

    public String getProperty() {
        return property;
    }

    /**
     * Fija la nueva propiedad para este criterio de bsqueda.
     * 
     * @param property el nombre de la nueva propiedad.
     */
    public void setProperty(String property) {
        if (!ObjectUtils.equals(this.property, property)) {
            this.property = property;
            values.clear();
        }
    }

    public Operator getOperator() {
        return operator;
    }

    /**
     * Fija el operador y recalcula el numero de operandos en funcin de este.
     * 
     * @param operator el nuevo operador.
     */
    public void setOperator(Operator operator) {
        this.operator = operator;

        // En funcin del operador es neceario recalcular el nmero de operandos
        final int newSize;
        switch (operator) {
        case IS_NULL:
        case IS_NOT_NULL:
        case IS_EMPTY:
        case IS_NOT_EMPTY:
        case IS_BLANK:
        case IS_NOT_BLANK:
            values.clear();
            return;

        case BETWEEN:
        case NOT_BETWEEN:
            newSize = 2;
            break;

        default:
            newSize = 1;
        }

        if (newSize < values.size()) {
            values.subList(newSize, values.size()).clear();
        } else {
            final int itemsToAdd = newSize - values.size();
            for (int i = 0; i < itemsToAdd; i++) {
                values.add(null);
            }
        }
    }

    public void setValues(Object... newValues) {
        for (int i = 0; i < newValues.length; i++) {
            values.set(i, newValues[i]);
        }
    }

    /**
     * Devuelve la lista de valores para este criterio. Esta debera ser una lista no modificable, pero en ese caso JSF
     * no es capaz de manipularla, as que la lista que se devuelve si es modificable.
     * <p>
     * <b>Atencin !!!</b> no se debe modificar la lista devuelta por este mtodo manualmente. Esta lista se ajusta al
     * fijar el operador del criterio con el mtodo {@link SimpleExpression#setOperator(Operator)}, o se limpia al
     * asignar una nueva propiedad con el mtodo {@link SimpleExpression#setProperty(String)}.
     * <p>
     * Si se quieren asignar valores se debe usar el mtodo {@link SimpleExpression#setValues(Object...)}.
     * 
     * @return
     */
    public List<Object> getValues() {
        return values;
    }

    /**
     * Fija las propiedades de este objeto con las propiedades del objeto que se pasa como parmetro.
     */
    public void setSimpleExpression(SimpleExpression simpleExpression) {
        // Su 'property', 'operator' y valores de la lista 'values' hacen referencia a los mismos objetos que se pasa
        // como parmetro. Esto es posible ya que si cambian los del original o los de esta copia, los atributos del
        // otro extremo no se ver afectado (slo se cambia la referencia al objeto, pero no el objeto).
        this.property = simpleExpression.property;
        this.operator = simpleExpression.operator;
        this.values = new ArrayList<Object>(simpleExpression.values);
    }

    @Override
    public int hashCode() {
        return HashCodeBuilder.reflectionHashCode(this);
    }

    @Override
    public boolean equals(Object obj) {
        return EqualsBuilder.reflectionEquals(this, obj);
    }

    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this).toString();
    }

    public void toHql(String alias, StringBuilder restrictionsHql, List<Object> paramValues) {
        if (property == null) {
            return;
        }
        getOperator().toHql(property, getValues(), alias, restrictionsHql, paramValues);
    }
}