org.grouchotools.jsrules.Operator.java Source code

Java tutorial

Introduction

Here is the source code for org.grouchotools.jsrules.Operator.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package org.grouchotools.jsrules;

import org.grouchotools.jsrules.exception.InvalidParameterException;
import org.joda.time.DateTime;

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

/**
 * @author Paul
 */
public enum Operator {
    GT {
        @Override
        public Boolean compare(Object left, Object right) throws InvalidParameterException {
            Number leftNumber = getNumber(left);
            Number rightNumber = getNumber(right);
            return leftNumber.doubleValue() > rightNumber.doubleValue();
        }
    },
    LT {
        @Override
        public Boolean compare(Object left, Object right) throws InvalidParameterException {
            return GT.compare(right, left);
        }
    },
    GTE {
        @Override
        public Boolean compare(Object left, Object right) throws InvalidParameterException {
            Number leftNumber = getNumber(left);
            Number rightNumber = getNumber(right);
            return leftNumber.doubleValue() >= rightNumber.doubleValue();
        }
    },
    LTE {
        @Override
        public Boolean compare(Object left, Object right) throws InvalidParameterException {
            return GTE.compare(right, left);
        }
    },
    EQ {
        @Override
        public Boolean compare(Object left, Object right) throws InvalidParameterException {
            left = getDoubleValue(left);
            right = getDoubleValue(right);
            return left.equals(right);
        }
    },
    NE {
        @Override
        public Boolean compare(Object left, Object right) throws InvalidParameterException {
            return !EQ.compare(left, right);
        }
    },
    IN {
        @Override
        @SuppressWarnings("unchecked")
        public Boolean compare(Object left, Object right) throws InvalidParameterException {
            Set set = getSet(right);
            Number leftNumber = getNumber(left);
            boolean valueMatched = false;
            for (Object setValueObject : set) {
                Number setValue = getNumber(setValueObject);
                if (setValue.doubleValue() == leftNumber.doubleValue()) {
                    valueMatched = true;
                    return valueMatched;
                }
            }
            return valueMatched;
        }
    },
    NOT_IN {
        @Override
        public Boolean compare(Object left, Object right) throws InvalidParameterException {
            return !IN.compare(left, right);
        }
    },
    BETWEEN {
        @Override
        public Boolean compare(Object left, Object right) throws InvalidParameterException {
            Set set = getSet(right);

            if (set.size() != 2) {
                throw new InvalidParameterException("Right parameter must be a set of 2");
            }

            List<Double> doubleList = new ArrayList<>();

            for (Object obj : set) {
                doubleList.add(getNumber(obj).doubleValue());
            }

            Double[] doubleArray = new Double[2];
            doubleArray = doubleList.toArray(doubleArray);

            Double leftDouble = getNumber(left).doubleValue();

            boolean between;

            if (doubleArray[0] < doubleArray[1]) {
                between = (leftDouble >= doubleArray[0] && leftDouble <= doubleArray[1]);
            } else {
                between = (leftDouble >= doubleArray[1] && leftDouble <= doubleArray[0]); // no code coverage
            }

            return between;
        }
    },
    NOT_BETWEEN {
        @Override
        public Boolean compare(Object left, Object right) throws InvalidParameterException {
            return !BETWEEN.compare(left, right);
        }
    };

    public abstract Boolean compare(Object left, Object right) throws InvalidParameterException;

    protected Number getNumber(Object obj) throws InvalidParameterException {
        Number number;
        if (obj instanceof Number) {
            number = (Number) obj;
        } else {
            // lets see if it's a DateTime instead
            try {
                DateTime dateTime = DateTime.parse(obj.toString());
                number = dateTime.getMillis();
            } catch (IllegalArgumentException ex) {
                throw new InvalidParameterException(obj.toString() + " is not a number or date. Unable to compare",
                        ex);
            }
        }
        return number;
    }

    protected Object getDoubleValue(Object obj) {
        if (obj instanceof Number) {
            Number number = (Number) obj;
            obj = number.doubleValue();
        }
        return obj;
    }

    protected Set getSet(Object param) throws InvalidParameterException {
        Set set;
        if (param instanceof Set) {
            set = (Set) param;
        } else {
            throw new InvalidParameterException("Parameter must be a Set");
        }
        return set;
    }
}