diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/eval/ExpressionEvaluator.java b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/eval/ExpressionEvaluator.java index 36bf57c8..6c4e9eea 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/eval/ExpressionEvaluator.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/eval/ExpressionEvaluator.java @@ -14,82 +14,143 @@ */ package com.jayway.jsonpath.internal.filter.eval; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + /** * @author Kalle Stenflo */ public class ExpressionEvaluator { + + + public enum Operator { + equal("=="), not_equal("!="), less_or_greater_than("<>"),greater_than(">"), greater_than_or_equal(">="), less_than("<"), less_than_or_equal("<="); + + private final String representation; + + private Operator(String representation) { + this.representation = representation; + } + + public String getRepresentation() { + return representation; + } + } + + private static Map operatorsByRepresentation; + + static { + Map map = new HashMap(); + for (Operator op : Operator.values()){ + map.put(op.getRepresentation(), op); + } + ExpressionEvaluator.operatorsByRepresentation = Collections.unmodifiableMap(map); + } - public static boolean eval(T actual, String comparator, String expected) { + public static boolean eval(T actual, String comparator, String expected) { + + Operator operator = operatorsByRepresentation.get(comparator); + if (operator == null){ + throw new IllegalArgumentException("Unsupported operator " + comparator); + } + if (actual instanceof Long) { Long a = (Long) actual; Long e = Long.parseLong(expected.trim()); - - if ("==".equals(comparator)) { + switch (operator){ + case equal: return a.longValue() == e.longValue(); - } else if ("!=".equals(comparator) || "<>".equals(comparator)) { + case not_equal: + case less_or_greater_than: return a.longValue() != e.longValue(); - } else if (">".equals(comparator)) { + case greater_than: return a > e; - } else if (">=".equals(comparator)) { + case greater_than_or_equal: return a >= e; - } else if ("<".equals(comparator)) { + case less_than: return a < e; - } else if ("<=".equals(comparator)) { + case less_than_or_equal: return a <= e; + default: + throw new UnsupportedOperationException("Cannot handle operator " + operator); } + + } else if (actual instanceof Integer) { Integer a = (Integer) actual; Integer e = Integer.parseInt(expected.trim()); - if ("==".equals(comparator)) { + switch (operator){ + case equal: return a.intValue() == e.intValue(); - } else if ("!=".equals(comparator) || "<>".equals(comparator)) { + case not_equal: + case less_or_greater_than: return a.intValue() != e.intValue(); - } else if (">".equals(comparator)) { + case greater_than: return a > e; - } else if (">=".equals(comparator)) { + case greater_than_or_equal: return a >= e; - } else if ("<".equals(comparator)) { + case less_than: return a < e; - } else if ("<=".equals(comparator)) { + case less_than_or_equal: return a <= e; + default: + throw new UnsupportedOperationException("Cannot handle operator " + operator); } } else if (actual instanceof Double) { Double a = (Double) actual; Double e = Double.parseDouble(expected.trim()); - if ("==".equals(comparator)) { + switch (operator){ + case equal: return a.doubleValue() == e.doubleValue(); - } else if ("!=".equals(comparator) || "<>".equals(comparator)) { + case not_equal: + case less_or_greater_than: return a.doubleValue() != e.doubleValue(); - } else if (">".equals(comparator)) { + case greater_than: return a > e; - } else if (">=".equals(comparator)) { + case greater_than_or_equal: return a >= e; - } else if ("<".equals(comparator)) { + case less_than: return a < e; - } else if ("<=".equals(comparator)) { + case less_than_or_equal: return a <= e; + default: + throw new UnsupportedOperationException("Cannot handle operator " + operator); } } else if (actual instanceof String) { - String a = (String)actual; - expected = expected.trim(); - if(expected.startsWith("'")) { - expected = expected.substring(1); - } - if(expected.endsWith("'")){ - expected = expected.substring(0, expected.length()-1); - } + switch (operator){ + case greater_than: + case greater_than_or_equal: + case less_than: + case less_than_or_equal: + // we might want to throw an exception here + return false; + case equal: + case not_equal: + case less_or_greater_than: + String a = (String)actual; + String expectedTrimmed = expected.trim(); + if(expectedTrimmed.startsWith("'")) { + expectedTrimmed = expectedTrimmed.substring(1); + } + if(expectedTrimmed.endsWith("'")){ + expectedTrimmed = expectedTrimmed.substring(0, expected.length()-1); + } - if ("==".equals(comparator)) { - return a.equals(expected); - } else if ("!=".equals(comparator) || "<>".equals(comparator)) { - return !a.equals(expected); - } + if (operator == Operator.equal) { + return a.equals(expectedTrimmed); + } else if (operator == Operator.not_equal || operator == Operator.less_or_greater_than) { + return !a.equals(expectedTrimmed); + } + default: + throw new UnsupportedOperationException("Cannot handle operator " + operator); + } } return false;