Package net.mindengine.galen.specs

Source Code of net.mindengine.galen.specs.Range

/*******************************************************************************
* Copyright 2014 Ivan Shubin http://mindengine.net
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*   http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package net.mindengine.galen.specs;

import static java.lang.String.format;

import java.text.DecimalFormat;

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

public class Range {

    public Range(Double from, Double to) {
        this.from = from;
        this.to = to;
    }
   
    private Double from;
    private Double to;
    private String percentageOfValue;
    private RangeType rangeType = RangeType.BETWEEN;
   
    public enum RangeType {
        BETWEEN, EXACT, GREATER_THAN, LESS_THAN
    }
   
    public Double getFrom() {
        return from;
    }
    public Double getTo() {
        return to;
    }
    public static Range exact(double number) {
        return new Range(number, number).withType(RangeType.EXACT);
    }
    public Range withType(RangeType rangeType) {
        setRangeType(rangeType);
        return this;
    }
    public static Range between(double from, double to) {
        return new Range(Math.min(from, to), Math.max(from, to)).withType(RangeType.BETWEEN);
    }
   
    @Override
    public int hashCode() {
        return new HashCodeBuilder(13, 19)
            .append(from)
            .append(to)
            .append(percentageOfValue)
            .append(rangeType)
            .toHashCode();
    }
   
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (obj == this) {
            return true;
        }
        if (!(obj instanceof Range)) {
            return false;
        }
        Range rhs = (Range)obj;
        return new EqualsBuilder()
            .append(from, rhs.from)
            .append(to, rhs.to)
            .append(percentageOfValue, rhs.percentageOfValue)
            .append(rangeType, rhs.rangeType)
            .isEquals();
    }
   
    @Override
    public String toString() {
        String withPercentage = "";
        if (percentageOfValue != null) {
            withPercentage = " % of " + percentageOfValue;
        }
        return format("Range{%s%s}", prettyString(), withPercentage);
    }
    public boolean isExact() {
        return rangeType == RangeType.EXACT;
    }
    public boolean holds(double offset) {
      if (isGreaterThan()) {
        return offset > from;
      }
      else if (isLessThan()) {
        return offset < to;
      }
      else return offset >= from && offset <= to;
    }
    public static String doubleToString(Double value) {
        if (value != null) {
            return new DecimalFormat("#.##").format(value);
        }
        else return "null";
    }
    public String prettyString() {
        return prettyString("px");
    }
   
    private String prettyString(String dimension) {
        if (isExact()) {
            return String.format("%s%s", doubleToString(from), dimension);
        }
        else if (isGreaterThan()) {
            return String.format("> %s%s", doubleToString(from), dimension);
        }
        else if (isLessThan()) {
            return String.format("< %s%s", doubleToString(to), dimension);
        }
        else return String.format("%s to %s%s", doubleToString(from), doubleToString(to), dimension);
    }
   
    private boolean isLessThan() {
    return rangeType == RangeType.LESS_THAN;
  }
  private boolean isGreaterThan() {
      return rangeType == RangeType.GREATER_THAN;
  }
   
  public Range withPercentOf(String percentageOfValue) {
        this.setPercentageOfValue(percentageOfValue);
        return this;
    }
    public String getPercentageOfValue() {
        return percentageOfValue;
    }
    public void setPercentageOfValue(String percentageOfValue) {
        this.percentageOfValue = percentageOfValue;
    }
    public boolean isPercentage() {
        return percentageOfValue != null && !percentageOfValue.isEmpty();
    }
  public static Range greaterThan(Double value) {
    return new Range(value, null).withType(RangeType.GREATER_THAN);
  }
  public static Range lessThan(Double value) {
    return new Range(null, value).withType(RangeType.LESS_THAN);
  }
    public RangeType getRangeType() {
        return rangeType;
    }
    public void setRangeType(RangeType rangeType) {
        this.rangeType = rangeType;
    }
   
    public String getErrorMessageSuffix() {
        return getErrorMessageSuffix("px");
    }
    public String getErrorMessageSuffix(String dimension) {
        if (rangeType == RangeType.EXACT) {
            return String.format("instead of %s", prettyString(dimension));
        }
        else if (rangeType == RangeType.BETWEEN) {
            return String.format("which is not in range of %s", prettyString(dimension));
        }
        else if (rangeType == RangeType.GREATER_THAN) {
            return String.format("but it should be greater than %s%s", doubleToString(from), dimension);
        }
        else if (rangeType == RangeType.LESS_THAN) {
            return String.format("but it should be less than %s%s", doubleToString(to), dimension);
        }
        else return "but the expected range is unknown";
    }
   
}
TOP

Related Classes of net.mindengine.galen.specs.Range

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.