Repository: camel
Updated Branches:
  refs/heads/master 864bb35d7 -> a13ff4a4d


CAMEL-8832: Added equalis ignore case operation to value builder and simple 
language


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/a13ff4a4
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/a13ff4a4
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/a13ff4a4

Branch: refs/heads/master
Commit: a13ff4a4de40f7d7c51ec1588be9bd3f25f0a20b
Parents: 864bb35
Author: Claus Ibsen <[email protected]>
Authored: Wed Jul 1 18:08:18 2015 +0200
Committer: Claus Ibsen <[email protected]>
Committed: Wed Jul 1 20:30:35 2015 +0200

----------------------------------------------------------------------
 .../apache/camel/builder/PredicateBuilder.java  | 21 +++++++++++++++
 .../org/apache/camel/builder/ValueBuilder.java  |  5 ++++
 .../camel/language/simple/SimpleTokenizer.java  |  1 +
 .../language/simple/ast/BinaryExpression.java   |  2 ++
 .../simple/types/BinaryOperatorType.java        |  8 +++++-
 .../org/apache/camel/util/ObjectHelper.java     | 28 +++++++++++++++++---
 .../apache/camel/builder/ValueBuilderTest.java  |  2 ++
 .../language/simple/SimpleOperatorTest.java     | 16 +++++++++++
 8 files changed, 79 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/a13ff4a4/camel-core/src/main/java/org/apache/camel/builder/PredicateBuilder.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/builder/PredicateBuilder.java 
b/camel-core/src/main/java/org/apache/camel/builder/PredicateBuilder.java
index c2eb5c9..ec4c0db 100644
--- a/camel-core/src/main/java/org/apache/camel/builder/PredicateBuilder.java
+++ b/camel-core/src/main/java/org/apache/camel/builder/PredicateBuilder.java
@@ -185,6 +185,27 @@ public final class PredicateBuilder {
         };
     }
 
+    public static Predicate isEqualToIgnoreCase(final Expression left, final 
Expression right) {
+        return new BinaryPredicateSupport(left, right) {
+
+            protected boolean matches(Exchange exchange, Object leftValue, 
Object rightValue) {
+                if (leftValue == null && rightValue == null) {
+                    // they are equal
+                    return true;
+                } else if (leftValue == null || rightValue == null) {
+                    // only one of them is null so they are not equal
+                    return false;
+                }
+
+                return 
ObjectHelper.typeCoerceEquals(exchange.getContext().getTypeConverter(), 
leftValue, rightValue, true);
+            }
+
+            protected String getOperationText() {
+                return "~=";
+            }
+        };
+    }
+
     public static Predicate isNotEqualTo(final Expression left, final 
Expression right) {
         return new BinaryPredicateSupport(left, right) {
 

http://git-wip-us.apache.org/repos/asf/camel/blob/a13ff4a4/camel-core/src/main/java/org/apache/camel/builder/ValueBuilder.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/builder/ValueBuilder.java 
b/camel-core/src/main/java/org/apache/camel/builder/ValueBuilder.java
index 60782c3..a8faf61 100644
--- a/camel-core/src/main/java/org/apache/camel/builder/ValueBuilder.java
+++ b/camel-core/src/main/java/org/apache/camel/builder/ValueBuilder.java
@@ -80,6 +80,11 @@ public class ValueBuilder implements Expression, Predicate {
         return onNewPredicate(PredicateBuilder.isEqualTo(expression, right));
     }
 
+    public Predicate isEqualToIgnoreCase(Object value) {
+        Expression right = asExpression(value);
+        return onNewPredicate(PredicateBuilder.isEqualToIgnoreCase(expression, 
right));
+    }
+
     public Predicate isLessThan(Object value) {
         Expression right = asExpression(value);
         return onNewPredicate(PredicateBuilder.isLessThan(expression, right));

http://git-wip-us.apache.org/repos/asf/camel/blob/a13ff4a4/camel-core/src/main/java/org/apache/camel/language/simple/SimpleTokenizer.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/language/simple/SimpleTokenizer.java
 
b/camel-core/src/main/java/org/apache/camel/language/simple/SimpleTokenizer.java
index cd38aea..3977260 100644
--- 
a/camel-core/src/main/java/org/apache/camel/language/simple/SimpleTokenizer.java
+++ 
b/camel-core/src/main/java/org/apache/camel/language/simple/SimpleTokenizer.java
@@ -50,6 +50,7 @@ public final class SimpleTokenizer {
 
         // binary operators
         KNOWN_TOKENS.add(new SimpleTokenType(TokenType.binaryOperator, "=="));
+        KNOWN_TOKENS.add(new SimpleTokenType(TokenType.binaryOperator, "=~"));
         KNOWN_TOKENS.add(new SimpleTokenType(TokenType.binaryOperator, ">="));
         KNOWN_TOKENS.add(new SimpleTokenType(TokenType.binaryOperator, "<="));
         KNOWN_TOKENS.add(new SimpleTokenType(TokenType.binaryOperator, ">"));

http://git-wip-us.apache.org/repos/asf/camel/blob/a13ff4a4/camel-core/src/main/java/org/apache/camel/language/simple/ast/BinaryExpression.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/language/simple/ast/BinaryExpression.java
 
b/camel-core/src/main/java/org/apache/camel/language/simple/ast/BinaryExpression.java
index ab1ddc4..6d0e779 100644
--- 
a/camel-core/src/main/java/org/apache/camel/language/simple/ast/BinaryExpression.java
+++ 
b/camel-core/src/main/java/org/apache/camel/language/simple/ast/BinaryExpression.java
@@ -80,6 +80,8 @@ public class BinaryExpression extends BaseSimpleNode {
 
         if (operator == BinaryOperatorType.EQ) {
             return createExpression(leftExp, rightExp, 
PredicateBuilder.isEqualTo(leftExp, rightExp));
+        } else if (operator == BinaryOperatorType.EQ_IGNORE) {
+            return createExpression(leftExp, rightExp, 
PredicateBuilder.isEqualToIgnoreCase(leftExp, rightExp));
         } else if (operator == BinaryOperatorType.GT) {
             return createExpression(leftExp, rightExp, 
PredicateBuilder.isGreaterThan(leftExp, rightExp));
         } else if (operator == BinaryOperatorType.GTE) {

http://git-wip-us.apache.org/repos/asf/camel/blob/a13ff4a4/camel-core/src/main/java/org/apache/camel/language/simple/types/BinaryOperatorType.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/language/simple/types/BinaryOperatorType.java
 
b/camel-core/src/main/java/org/apache/camel/language/simple/types/BinaryOperatorType.java
index c25f033..2156c30 100644
--- 
a/camel-core/src/main/java/org/apache/camel/language/simple/types/BinaryOperatorType.java
+++ 
b/camel-core/src/main/java/org/apache/camel/language/simple/types/BinaryOperatorType.java
@@ -21,12 +21,14 @@ package org.apache.camel.language.simple.types;
  */
 public enum BinaryOperatorType {
 
-    EQ, GT, GTE, LT, LTE, NOT_EQ, CONTAINS, NOT_CONTAINS, REGEX, NOT_REGEX,
+    EQ, EQ_IGNORE, GT, GTE, LT, LTE, NOT_EQ, CONTAINS, NOT_CONTAINS, REGEX, 
NOT_REGEX,
     IN, NOT_IN, IS, NOT_IS, RANGE, NOT_RANGE;
 
     public static BinaryOperatorType asOperator(String text) {
         if ("==".equals(text)) {
             return EQ;
+        } else if ("=~".equals(text)) {
+            return EQ_IGNORE;
         } else if (">".equals(text)) {
             return GT;
         } else if (">=".equals(text)) {
@@ -64,6 +66,8 @@ public enum BinaryOperatorType {
     public static String getOperatorText(BinaryOperatorType operator) {
         if (operator == EQ) {
             return "==";
+        } else if (operator == EQ_IGNORE) {
+            return "=~";
         } else if (operator == GT) {
             return ">";
         } else if (operator == GTE) {
@@ -146,6 +150,8 @@ public enum BinaryOperatorType {
     public static ParameterType[] supportedParameterTypes(BinaryOperatorType 
operator) {
         if (operator == EQ) {
             return null;
+        } else if (operator == EQ_IGNORE) {
+            return null;
         } else if (operator == GT) {
             return null;
         } else if (operator == GTE) {

http://git-wip-us.apache.org/repos/asf/camel/blob/a13ff4a4/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java 
b/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
index 4e9ad05..0e49e32 100644
--- a/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
+++ b/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
@@ -80,6 +80,15 @@ public final class ObjectHelper {
      * a String and Integer type as Camel will be able to coerce the types.
      */
     public static boolean typeCoerceEquals(TypeConverter converter, Object 
leftValue, Object rightValue) {
+        return typeCoerceEquals(converter, leftValue, rightValue, false);
+    }
+
+    /**
+     * A helper method for comparing objects for equality in which it uses 
type coercion to coerce
+     * types between the left and right values. This allows you test for 
equality for example with
+     * a String and Integer type as Camel will be able to coerce the types.
+     */
+    public static boolean typeCoerceEquals(TypeConverter converter, Object 
leftValue, Object rightValue, boolean ignoreCase) {
         // sanity check
         if (leftValue == null && rightValue == null) {
             // they are equal
@@ -90,7 +99,7 @@ public final class ObjectHelper {
         }
 
         // try without type coerce
-        boolean answer = equal(leftValue, rightValue);
+        boolean answer = equal(leftValue, rightValue, ignoreCase);
         if (answer) {
             return true;
         }
@@ -102,14 +111,14 @@ public final class ObjectHelper {
 
         // convert left to right
         Object value = converter.tryConvertTo(rightValue.getClass(), 
leftValue);
-        answer = equal(value, rightValue);
+        answer = equal(value, rightValue, ignoreCase);
         if (answer) {
             return true;
         }
 
         // convert right to left
         value = converter.tryConvertTo(leftValue.getClass(), rightValue);
-        answer = equal(leftValue, value);
+        answer = equal(leftValue, value, ignoreCase);
         return answer;
     }
 
@@ -178,6 +187,13 @@ public final class ObjectHelper {
      * A helper method for comparing objects for equality while handling nulls
      */
     public static boolean equal(Object a, Object b) {
+        return equal(a, b, false);
+    }
+
+    /**
+     * A helper method for comparing objects for equality while handling nulls
+     */
+    public static boolean equal(Object a, Object b, boolean ignoreCase) {
         if (a == b) {
             return true;
         }
@@ -186,6 +202,12 @@ public final class ObjectHelper {
             return equalByteArray((byte[])a, (byte[])b);
         }
 
+        if (ignoreCase) {
+            if (a instanceof String && b instanceof String) {
+                return ((String) a).equalsIgnoreCase((String) b);
+            }
+        }
+
         return a != null && b != null && a.equals(b);
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/a13ff4a4/camel-core/src/test/java/org/apache/camel/builder/ValueBuilderTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/builder/ValueBuilderTest.java 
b/camel-core/src/test/java/org/apache/camel/builder/ValueBuilderTest.java
index b07ebbe..58846b4 100644
--- a/camel-core/src/test/java/org/apache/camel/builder/ValueBuilderTest.java
+++ b/camel-core/src/test/java/org/apache/camel/builder/ValueBuilderTest.java
@@ -42,6 +42,7 @@ public class ValueBuilderTest extends ContextTestSupport {
 
         MockEndpoint mock = getMockEndpoint("mock:result");
         mock.expectedBodiesReceived("Hello World");
+        mock.message(0).body().isEqualToIgnoreCase("hello WORLD");
 
         template.sendBody("direct:start", "Hello");
 
@@ -59,6 +60,7 @@ public class ValueBuilderTest extends ContextTestSupport {
 
         MockEndpoint mock = getMockEndpoint("mock:result");
         mock.expectedBodiesReceived("Hello World");
+        mock.message(0).body().isEqualToIgnoreCase("hello world");
 
         template.sendBody("direct:start", "World");
 

http://git-wip-us.apache.org/repos/asf/camel/blob/a13ff4a4/camel-core/src/test/java/org/apache/camel/language/simple/SimpleOperatorTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/language/simple/SimpleOperatorTest.java
 
b/camel-core/src/test/java/org/apache/camel/language/simple/SimpleOperatorTest.java
index fb64858..e9e4d6f 100644
--- 
a/camel-core/src/test/java/org/apache/camel/language/simple/SimpleOperatorTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/language/simple/SimpleOperatorTest.java
@@ -152,6 +152,22 @@ public class SimpleOperatorTest extends 
LanguageTestSupport {
         assertPredicate("${in.header.bar} == '1'", false);
     }
 
+    public void testEqualIgnoreOperator() throws Exception {
+        // string to string comparison
+        assertPredicate("${in.header.foo} =~ 'abc'", true);
+        assertPredicate("${in.header.foo} =~ 'ABC'", true);
+        assertPredicate("${in.header.foo} =~ 'Abc'", true);
+        assertPredicate("${in.header.foo} =~ 'Def'", false);
+        assertPredicate("${in.header.foo} =~ '1'", false);
+
+        // integer to string comparison
+        assertPredicate("${in.header.bar} =~ '123'", true);
+        assertPredicate("${in.header.bar} =~ 123", true);
+        assertPredicate("${in.header.bar} =~ '444'", false);
+        assertPredicate("${in.header.bar} =~ 444", false);
+        assertPredicate("${in.header.bar} =~ '1'", false);
+    }
+
     public void testNotEqualOperator() throws Exception {
         // string to string comparison
         assertPredicate("${in.header.foo} != 'abc'", false);

Reply via email to