All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.invation.code.toval.constraint.NumberOperator Maven / Gradle / Ivy

package de.invation.code.toval.constraint;

import de.invation.code.toval.validate.ParameterException;
import de.invation.code.toval.validate.Validate;
import de.invation.code.toval.validate.ParameterException.ErrorCode;


public enum NumberOperator implements Operator{
	
	SMALLER(		OperatorFormats.SMALLER, 		String.format(OperatorFormats.COMPARISON_FORMAT, OperatorFormats.SMALLER)), 
	SMALLER_EQUAL(	OperatorFormats.SMALLER_EQUAL, 	String.format(OperatorFormats.COMPARISON_FORMAT, OperatorFormats.SMALLER_EQUAL)), 
	EQUAL(			OperatorFormats.EQUAL, 			String.format(OperatorFormats.COMPARISON_FORMAT, OperatorFormats.EQUAL)), 
	NOT_EQUAL(		OperatorFormats.NOT_EQUAL, 		String.format(OperatorFormats.COMPARISON_FORMAT, OperatorFormats.NOT_EQUAL)),
	LARGER(			OperatorFormats.LARGER, 		String.format(OperatorFormats.COMPARISON_FORMAT, OperatorFormats.LARGER)), 
	LARGER_EQUAL(	OperatorFormats.LARGER_EQUAL, 	String.format(OperatorFormats.COMPARISON_FORMAT, OperatorFormats.LARGER_EQUAL)),
	IN_INTERVAL(	new String[] {"Attribute", "Interval start", "Interval end"}, OperatorFormats.IN_INTERVAL, 		OperatorFormats.IN_INTERVAL_FORMAT), 
	NOT_IN_INTERVAL(new String[] {"Attribute", "Interval start", "Interval end"}, OperatorFormats.NOT_IN_INTERVAL, 	OperatorFormats.NOT_IN_INTERVAL_FORMAT);
	
	private String[] argumentNames = new String[] {"Attribute", "Comparator"};
	private String sign = null;
	private String toStringFormat = null;
	
	private NumberOperator(String sign, String toStringFormat){
		this.sign = sign;
		this.toStringFormat = toStringFormat;
	}
	
	private NumberOperator(String[] arguments, String sign, String toStringFormat){
		this(sign, toStringFormat);
		this.argumentNames = arguments;
	}
	
	@Override
	public int getRequiredArguments(){
		return argumentNames.length;
	}
	
	@Override
	public String[] getArgumentNames(){
		return argumentNames;
	}
	
	protected void validateValueType(Object value) throws ParameterException{
		if(!Number.class.isAssignableFrom(value.getClass()))
			throw new ParameterException(ErrorCode.TYPE, "Wrong type of validation value, expected type: " + Number.class);
	}
	
	@Override
	public boolean validate(Object value, Number... parameters) throws ParameterException {
		Validate.notNull(value);
		validateValueType(value);
		Validate.notNull(parameters);
		Validate.noNullElements(parameters);
		Validate.isFalse(parameters.length + 1 != getRequiredArguments());
		
		double numberValue = ((Number) value).doubleValue();
		
		switch(this){
		case SMALLER: 		return numberValue < parameters[0].doubleValue();
		case SMALLER_EQUAL: return numberValue <= parameters[0].doubleValue();
		case EQUAL:			return numberValue == parameters[0].doubleValue();
		case NOT_EQUAL:		return numberValue != parameters[0].doubleValue();
		case LARGER:		return numberValue > parameters[0].doubleValue();
		case LARGER_EQUAL:	return numberValue >= parameters[0].doubleValue();
		case IN_INTERVAL:	return numberValue >= parameters[0].doubleValue() && numberValue <= parameters[1].doubleValue();
		case NOT_IN_INTERVAL: return numberValue < parameters[0].doubleValue() || numberValue > parameters[1].doubleValue();
		default: return false;
		}
	}

	
	@Override
	public String getStringFormat(){
		return toStringFormat;
	}
	
	@Override
	public String toString(){
		return sign;
	}
	
	public static NumberOperator parse(String operatorString){
		if(operatorString.equals("<"))
			return NumberOperator.SMALLER;
		if(operatorString.equals("<="))
			return NumberOperator.SMALLER_EQUAL;
		if(operatorString.equals(">"))
			return NumberOperator.LARGER;
		if(operatorString.equals(">="))
			return NumberOperator.LARGER_EQUAL;
		if(operatorString.equals("=="))
			return NumberOperator.EQUAL;
		if(operatorString.equals("!="))
			return NumberOperator.NOT_EQUAL;
		return null;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy