diff --git a/activemq-client/src/main/java/org/apache/activemq/filter/ComparisonExpression.java b/activemq-client/src/main/java/org/apache/activemq/filter/ComparisonExpression.java index f87ed13e79..fb1284c12d 100644 --- a/activemq-client/src/main/java/org/apache/activemq/filter/ComparisonExpression.java +++ b/activemq-client/src/main/java/org/apache/activemq/filter/ComparisonExpression.java @@ -214,36 +214,66 @@ public abstract class ComparisonExpression extends BinaryExpression implements B @SuppressWarnings({ "rawtypes" }) private static BooleanExpression doCreateEqual(Expression left, Expression right) { - return new ComparisonExpression(left, right) { + return new EqualsExpression(left, right); + } - public Object evaluate(MessageEvaluationContext message) throws JMSException { - Object lv = left.evaluate(message); - Object rv = right.evaluate(message); + private static class EqualsExpression extends ComparisonExpression { + EqualsExpression(Expression left, Expression right) { + super(left, right); + } - // If one of the values is null - if (lv == null ^ rv == null) { - if (lv == null) { - return null; - } - return Boolean.FALSE; - } - if (lv == rv || lv.equals(rv)) { - return Boolean.TRUE; - } - if (lv instanceof Comparable && rv instanceof Comparable) { - return compare((Comparable)lv, (Comparable)rv); + public Object evaluate(MessageEvaluationContext message) throws JMSException { + Object lv = left.evaluate(message); + Object rv = right.evaluate(message); + + // If one of the values is null + if (lv == null ^ rv == null) { + if (lv == null) { + return null; } return Boolean.FALSE; } - - protected boolean asBoolean(int answer) { - return answer == 0; + if (lv == rv || lv.equals(rv)) { + return Boolean.TRUE; } - - public String getExpressionSymbol() { - return "="; + if (lv instanceof Comparable && rv instanceof Comparable) { + return compare((Comparable) lv, (Comparable) rv); } - }; + return Boolean.FALSE; + } + + @Override + public boolean matches(MessageEvaluationContext message) throws JMSException { + Object lv = left.evaluate(message); + Object rv = right.evaluate(message); + + // If one of the values is null + if (lv == null ^ rv == null) { + return false; + } + if (lv == rv || lv.equals(rv)) { + return true; + } + if (lv.getClass() == rv.getClass()) { + // same class, but 'equals' return false, and they are not the same object + // there is no point in doing 'compare' + // this case happens often while comparing non equals Strings + return false; + } + if (lv instanceof Comparable && rv instanceof Comparable) { + Boolean compareResult = compare((Comparable) lv, (Comparable) rv); + return compareResult != null && compareResult; + } + return false; + } + + protected boolean asBoolean(int answer) { + return answer == 0; + } + + public String getExpressionSymbol() { + return "="; + } } public static BooleanExpression createGreaterThan(final Expression left, final Expression right) { @@ -286,7 +316,6 @@ public abstract class ComparisonExpression extends BinaryExpression implements B public String getExpressionSymbol() { return "<"; } - }; } @@ -491,5 +520,4 @@ public abstract class ComparisonExpression extends BinaryExpression implements B Object object = evaluate(message); return object != null && object == Boolean.TRUE; } - } diff --git a/activemq-client/src/main/java/org/apache/activemq/filter/LogicExpression.java b/activemq-client/src/main/java/org/apache/activemq/filter/LogicExpression.java index e9145a9717..0652431cbe 100644 --- a/activemq-client/src/main/java/org/apache/activemq/filter/LogicExpression.java +++ b/activemq-client/src/main/java/org/apache/activemq/filter/LogicExpression.java @@ -141,7 +141,6 @@ public abstract class LogicExpression implements BooleanExpression { public String getExpressionSymbol() { return "OR"; } - } private static class ANDExpression extends LogicExpression { diff --git a/activemq-client/src/main/java/org/apache/activemq/filter/UnaryExpression.java b/activemq-client/src/main/java/org/apache/activemq/filter/UnaryExpression.java index c5d0606ef0..e4638406c5 100644 --- a/activemq-client/src/main/java/org/apache/activemq/filter/UnaryExpression.java +++ b/activemq-client/src/main/java/org/apache/activemq/filter/UnaryExpression.java @@ -86,7 +86,6 @@ public abstract class UnaryExpression implements Expression { } else { return Boolean.FALSE; } - } public String toString() { @@ -132,19 +131,7 @@ public abstract class UnaryExpression implements Expression { }; public static BooleanExpression createNOT(BooleanExpression left) { - return new BooleanUnaryExpression(left) { - public Object evaluate(MessageEvaluationContext message) throws JMSException { - Boolean lvalue = (Boolean)right.evaluate(message); - if (lvalue == null) { - return null; - } - return lvalue.booleanValue() ? Boolean.FALSE : Boolean.TRUE; - } - - public String getExpressionSymbol() { - return "NOT"; - } - }; + return new NotExpression(left); } public static BooleanExpression createXPath(final String xpath) { @@ -243,7 +230,6 @@ public abstract class UnaryExpression implements Expression { return false; } return toString().equals(o.toString()); - } /** @@ -254,4 +240,31 @@ public abstract class UnaryExpression implements Expression { */ public abstract String getExpressionSymbol(); + private static class NotExpression extends BooleanUnaryExpression { + public NotExpression(BooleanExpression right) { + super(right); + } + + public Object evaluate(MessageEvaluationContext message) throws JMSException { + Boolean lvalue = (Boolean) right.evaluate(message); + if (lvalue == null) { + return null; + } + return lvalue.booleanValue() ? Boolean.FALSE : Boolean.TRUE; + } + + @Override + public boolean matches(MessageEvaluationContext message) throws JMSException { + Boolean lvalue = (Boolean) right.evaluate(message); + if (lvalue == null) { + // NOT NULL returns NULL that eventually fails the selector + return false; + } + return !lvalue; + } + + public String getExpressionSymbol() { + return "NOT"; + } + } }