org.fosstrak.llrp.commander.util.LLRPRangeConstraint.java Source code

Java tutorial

Introduction

Here is the source code for org.fosstrak.llrp.commander.util.LLRPRangeConstraint.java

Source

/*
 *  
 *  Fosstrak LLRP Commander (www.fosstrak.org)
 * 
 *  Copyright (C) 2008 ETH Zurich
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program 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 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/> 
 *
 */

package org.fosstrak.llrp.commander.util;

import org.apache.commons.lang.ArrayUtils;

/**
 * This class represents an LLRP range constraint. It specifies that a certain numeric field value
 * must lie within some ranges.
 * 
 * @author Ulrich Etter, ETHZ
 *
 */
public class LLRPRangeConstraint {

    private String messageOrParameterName;
    private String fieldName;
    private Range[] ranges;

    private String preconditionedEnumerationName;
    private String preconditionedEnumerationValue;

    /**
     * Creates a new range constraint. 
     * <br/><br/>
     * <b>Example:</b> <br/>
     * To create a constraint that specifies that the field <code>DurationPeriod</code> of the 
     * parameter <code>RFSurveySpecStopTrigger</code> must be greater than 0 if the enumeration
     * <code>StopTriggerType</code> has value <code>Duration</code>, use the following code: <br/>
     * <code>
     *    new LLRPRangeConstraint(
     *      "RFSurveySpecStopTrigger",
     *      "DurationPeriod",
     *      new Range[] {
     *         new Range(1, Integer.MAX_VALUE) 
     *      },
     *      "StopTriggerType",
     *      "Duration");
     * </code>
     * 
     * @param messageOrParameterName the name of the message/parameter this constraint is defined for
     * @param fieldName the name of the field this constraint is defined for
     * @param ranges an array of ranges; for a value to satisfy a constraint it must lie in
     * one of this ranges
     * @param preconditionedEnumerationName the name of the enumeration on which this constraint 
     * is dependent; use <code>null</code> if this constraint does not depend on any enumeration
     * @param preconditionedEnumerationValue the value of the enumeration on which this constraint 
     * is dependent; use <code>null</code> if this constraint does not depend on any enumeration
     */
    public LLRPRangeConstraint(String messageOrParameterName, String fieldName, Range[] ranges,
            String preconditionedEnumerationName, String preconditionedEnumerationValue) {
        this.messageOrParameterName = messageOrParameterName;
        this.fieldName = fieldName;
        this.ranges = (Range[]) ArrayUtils.clone(ranges);
        this.preconditionedEnumerationName = preconditionedEnumerationName;
        this.preconditionedEnumerationValue = preconditionedEnumerationValue;
    }

    /**
     * Checks whether this constraint is satisfied by the given field value.
     * 
     * @param fieldValue the field value to validate
     * @return <code>true</code> if the constraint is satisfied, and <code>false</code> otherwise
     */
    public boolean isSatisfied(int fieldValue) {
        boolean result = false;
        for (int i = 0; i < ranges.length; i++) {
            result = result || (ranges[i].getLowerBound() <= fieldValue && fieldValue <= ranges[i].getUpperBound());
        }
        return result;
    }

    /**
     * @return the error message associated with this constraint
     */
    public String getErrorMessage() {
        String result = fieldName + " must be ";
        for (int i = 0; i < ranges.length; i++) {
            if (ranges[i].getLowerBound() == Integer.MIN_VALUE) {
                result = result + "smaller than " + (ranges[i].getUpperBound() + 1);
            } else if (ranges[i].getUpperBound() == Integer.MAX_VALUE) {
                result = result + "greater than " + (ranges[i].getLowerBound() - 1);
            } else if (ranges[i].getLowerBound() == ranges[i].getUpperBound()) {
                result = result + ranges[i].getLowerBound();
            } else {
                result = result + "between " + ranges[i].getLowerBound() + " and " + ranges[i].getUpperBound();
            }

            if (i < (ranges.length - 1)) {
                result = result + " or ";
            }
        }
        if (preconditionedEnumerationName != null) {
            result = result + " when " + preconditionedEnumerationName + " = " + preconditionedEnumerationValue;
        }
        result = result + ".";
        return result;
    }

    public String getMessageOrParameterName() {
        return messageOrParameterName;
    }

    public String getFieldName() {
        return fieldName;
    }

    public String getPreconditionedEnumerationName() {
        return preconditionedEnumerationName;
    }

    public String getPreconditionedEnumerationValue() {
        return preconditionedEnumerationValue;
    }

    /**
     * @return a default value for the field this constraint is specified for
     */
    public int getDefaultValue() {
        return ranges[0].getLowerBound();
    }
}