You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2013/08/15 15:30:33 UTC

[2/3] git commit: CAMEL-6639: Added statis methods to simple language for predicate vs expression.

CAMEL-6639: Added statis methods to simple language for predicate vs expression.


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

Branch: refs/heads/camel-2.11.x
Commit: dd836f75088bdb30e5b7caf854c38d34cb9ee73a
Parents: b158d8d
Author: Claus Ibsen <da...@apache.org>
Authored: Thu Aug 15 12:15:09 2013 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Thu Aug 15 15:27:54 2013 +0200

----------------------------------------------------------------------
 .../camel/language/simple/SimpleLanguage.java   | 38 +++++++++++++++-
 .../util/PredicateToExpressionAdapter.java      | 48 ++++++++++++++++++++
 .../camel/language/simple/SimpleTest.java       | 26 +++++++++++
 3 files changed, 110 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/dd836f75/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java b/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java
index ff0a9e2..76db93a 100644
--- a/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java
+++ b/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java
@@ -21,6 +21,7 @@ import org.apache.camel.Predicate;
 import org.apache.camel.builder.ExpressionBuilder;
 import org.apache.camel.support.LanguageSupport;
 import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.PredicateToExpressionAdapter;
 
 /**
  * A <a href="http://camel.apache.org/simple.html">simple language</a>
@@ -158,14 +159,47 @@ public class SimpleLanguage extends LanguageSupport {
         return answer;
     }
 
+    /**
+     * Creates a new {@link Expression}.
+     * <p/>
+     * <b>Important:</b> If you need to use a predicate (function to return true|false) then use
+     * {@link #predicate(String)} instead.
+     */
     public static Expression simple(String expression) {
-        return SIMPLE.createExpression(expression);
+        return expression(expression);
     }
 
+    /**
+     * Creates a new {@link Expression} (or {@link Predicate}
+     * if the resultType is a <tt>Boolean</tt>, or <tt>boolean</tt> type).
+     */
     public static Expression simple(String expression, Class<?> resultType) {
         SimpleLanguage answer = new SimpleLanguage();
         answer.setResultType(resultType);
-        return answer.createExpression(expression);
+        if (resultType == Boolean.class || resultType == boolean.class) {
+            // if its a boolean as result then its a predicate
+            Predicate predicate = answer.createPredicate(expression);
+            return PredicateToExpressionAdapter.toExpression(predicate);
+        } else {
+            return answer.createExpression(expression);
+        }
+    }
+
+    /**
+     * Creates a new {@link Expression}.
+     * <p/>
+     * <b>Important:</b> If you need to use a predicate (function to return true|false) then use
+     * {@link #predicate(String)} instead.
+     */
+    public static Expression expression(String expression) {
+        return SIMPLE.createExpression(expression);
+    }
+
+    /**
+     * Creates a new {@link Predicate}.
+     */
+    public static Predicate predicate(String predicate) {
+        return SIMPLE.createPredicate(predicate);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/camel/blob/dd836f75/camel-core/src/main/java/org/apache/camel/util/PredicateToExpressionAdapter.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/util/PredicateToExpressionAdapter.java b/camel-core/src/main/java/org/apache/camel/util/PredicateToExpressionAdapter.java
new file mode 100644
index 0000000..8f76abf
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/util/PredicateToExpressionAdapter.java
@@ -0,0 +1,48 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.util;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Expression;
+import org.apache.camel.Predicate;
+
+public final class PredicateToExpressionAdapter implements Expression {
+    private final Predicate predicate;
+
+    public PredicateToExpressionAdapter(Predicate predicate) {
+        this.predicate = predicate;
+    }
+
+    @Override
+    public <T> T evaluate(Exchange exchange, Class<T> type) {
+        boolean matches = predicate.matches(exchange);
+        return exchange.getContext().getTypeConverter().convertTo(type, exchange, matches);
+    }
+
+    @Override
+    public String toString() {
+        return predicate.toString();
+    }
+
+    /**
+     * Converts the given predicate into an {@link org.apache.camel.Expression}
+     */
+    public static Expression toExpression(final Predicate predicate) {
+        return new PredicateToExpressionAdapter(predicate);
+    }
+    
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/dd836f75/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java b/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
index 0dcba7f8..bc85a0f 100644
--- a/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
+++ b/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
@@ -33,6 +33,7 @@ import org.apache.camel.Expression;
 import org.apache.camel.ExpressionIllegalSyntaxException;
 import org.apache.camel.InvalidPayloadException;
 import org.apache.camel.LanguageTestSupport;
+import org.apache.camel.Predicate;
 import org.apache.camel.component.bean.MethodNotFoundException;
 import org.apache.camel.impl.JndiRegistry;
 import org.apache.camel.language.bean.RuntimeBeanExpressionException;
@@ -52,6 +53,31 @@ public class SimpleTest extends LanguageTestSupport {
         return jndi;
     }
 
+    public void testSimpleExpressionOrPredicate() throws Exception {
+        Predicate predicate = SimpleLanguage.predicate("${header.bar} == 123");
+        assertTrue(predicate.matches(exchange));
+
+        predicate = SimpleLanguage.predicate("${header.bar} == 124");
+        assertFalse(predicate.matches(exchange));
+
+        Expression expression = SimpleLanguage.expression("${body}");
+        assertEquals("<hello id='m123'>world!</hello>", expression.evaluate(exchange, String.class));
+
+        expression = SimpleLanguage.simple("${body}");
+        assertEquals("<hello id='m123'>world!</hello>", expression.evaluate(exchange, String.class));
+        expression = SimpleLanguage.simple("${body}", String.class);
+        assertEquals("<hello id='m123'>world!</hello>", expression.evaluate(exchange, String.class));
+
+        expression = SimpleLanguage.simple("${header.bar} == 123", boolean.class);
+        assertEquals(Boolean.TRUE, expression.evaluate(exchange, Object.class));
+        expression = SimpleLanguage.simple("${header.bar} == 124", boolean.class);
+        assertEquals(Boolean.FALSE, expression.evaluate(exchange, Object.class));
+        expression = SimpleLanguage.simple("${header.bar} == 123", Boolean.class);
+        assertEquals(Boolean.TRUE, expression.evaluate(exchange, Object.class));
+        expression = SimpleLanguage.simple("${header.bar} == 124", Boolean.class);
+        assertEquals(Boolean.FALSE, expression.evaluate(exchange, Object.class));
+    }
+
     public void testResultType() throws Exception {
         assertEquals(123, SimpleLanguage.simple("${header.bar}", int.class).evaluate(exchange, Object.class));
         assertEquals("123", SimpleLanguage.simple("${header.bar}", String.class).evaluate(exchange, Object.class));