Repository: camel
Updated Branches:
  refs/heads/master f105ac29d -> 3d359ec1c


CAMEL-7298: Simple language used in routes now eval as predicate if result type 
is set to a boolean. Added missing support for true|false in predicate parser 
as valid token.


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

Branch: refs/heads/master
Commit: 3d359ec1c3cd24f2e282dde20d4b815028e72cde
Parents: f105ac2
Author: Claus Ibsen <davscl...@apache.org>
Authored: Mon Mar 17 11:07:00 2014 +0100
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Mon Mar 17 11:12:31 2014 +0100

----------------------------------------------------------------------
 .../org/apache/camel/builder/SimpleBuilder.java |  6 +--
 .../camel/language/simple/SimpleLanguage.java   |  9 ++--
 .../language/simple/SimplePredicateParser.java  |  9 ++++
 .../simple/SimpleParserPredicateTest.java       | 12 +++++
 .../SimpleRouteExpressionAsPredicateTest.java   | 51 ++++++++++++++++++++
 5 files changed, 79 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/3d359ec1/camel-core/src/main/java/org/apache/camel/builder/SimpleBuilder.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/builder/SimpleBuilder.java 
b/camel-core/src/main/java/org/apache/camel/builder/SimpleBuilder.java
index 0a6861d..c39ebe6 100644
--- a/camel-core/src/main/java/org/apache/camel/builder/SimpleBuilder.java
+++ b/camel-core/src/main/java/org/apache/camel/builder/SimpleBuilder.java
@@ -99,11 +99,7 @@ public class SimpleBuilder implements Predicate, Expression {
         // resolve property placeholders
         try {
             String resolve = 
exchange.getContext().resolvePropertyPlaceholders(text);
-            Expression exp = simple.createExpression(resolve);
-            if (resultType != null) {
-                exp = ExpressionBuilder.convertToExpression(exp, resultType);
-            }
-            return exp;
+            return simple.createExpression(resolve, resultType);
         } catch (Exception e) {
             throw ObjectHelper.wrapCamelExecutionException(exchange, e);
         }

http://git-wip-us.apache.org/repos/asf/camel/blob/3d359ec1/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 b4d0f62..16d8d14 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
@@ -148,13 +148,16 @@ public class SimpleLanguage extends LanguageSupport {
      * 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();
+        return new SimpleLanguage().createExpression(expression, resultType);
+    }
+
+    public Expression createExpression(String expression, Class<?> resultType) 
{
         if (resultType == Boolean.class || resultType == boolean.class) {
             // if its a boolean as result then its a predicate
-            Predicate predicate = answer.createPredicate(expression);
+            Predicate predicate = createPredicate(expression);
             return PredicateToExpressionAdapter.toExpression(predicate);
         } else {
-            Expression exp = answer.createExpression(expression);
+            Expression exp = createExpression(expression);
             if (resultType != null) {
                 exp = ExpressionBuilder.convertToExpression(exp, resultType);
             }

http://git-wip-us.apache.org/repos/asf/camel/blob/3d359ec1/camel-core/src/main/java/org/apache/camel/language/simple/SimplePredicateParser.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/language/simple/SimplePredicateParser.java
 
b/camel-core/src/main/java/org/apache/camel/language/simple/SimplePredicateParser.java
index 44f7cc0..56e28da 100644
--- 
a/camel-core/src/main/java/org/apache/camel/language/simple/SimplePredicateParser.java
+++ 
b/camel-core/src/main/java/org/apache/camel/language/simple/SimplePredicateParser.java
@@ -86,6 +86,7 @@ public class SimplePredicateParser extends BaseSimpleParser {
                     && !unaryOperator()
                     && !binaryOperator()
                     && !logicalOperator()
+                    && !isBooleanValue()
                     && !token.getType().isWhitespace()
                     && !token.getType().isEol()) {
                 // okay the symbol was not one of the above, so its not 
supported
@@ -448,6 +449,7 @@ public class SimplePredicateParser extends BaseSimpleParser 
{
     // --------------------------------------------------------------
 
     // the predicate parser understands a lot more than the expression parser
+    // - boolean value = either true or false value (literal)
     // - single quoted = block of nodes enclosed by single quotes
     // - double quoted = block of nodes enclosed by double quotes
     // - single quoted with functions = block of nodes enclosed by single 
quotes allowing embedded functions
@@ -460,6 +462,13 @@ public class SimplePredicateParser extends 
BaseSimpleParser {
     // - binary operator = operator attached to both the left and right hand 
side nodes
     // - logical operator = operator attached to both the left and right hand 
side nodes
 
+    protected boolean isBooleanValue() {
+        if (accept(TokenType.booleanValue)) {
+            return true;
+        }
+        return false;
+    }
+
     protected boolean singleQuotedLiteralWithFunctionsText() {
         if (accept(TokenType.singleQuote)) {
             nextToken(TokenType.singleQuote, TokenType.eol, 
TokenType.functionStart, TokenType.functionEnd);

http://git-wip-us.apache.org/repos/asf/camel/blob/3d359ec1/camel-core/src/test/java/org/apache/camel/language/simple/SimpleParserPredicateTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/language/simple/SimpleParserPredicateTest.java
 
b/camel-core/src/test/java/org/apache/camel/language/simple/SimpleParserPredicateTest.java
index a6fc7f0..f7d0950 100644
--- 
a/camel-core/src/test/java/org/apache/camel/language/simple/SimpleParserPredicateTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/language/simple/SimpleParserPredicateTest.java
@@ -30,6 +30,18 @@ import org.apache.camel.impl.JndiRegistry;
  */
 public class SimpleParserPredicateTest extends ExchangeTestSupport {
 
+    public void testSimpleBooleanValue() throws Exception {
+        exchange.getIn().setBody("foo");
+
+        SimplePredicateParser parser = new SimplePredicateParser("true", true);
+        Predicate pre = parser.parsePredicate();
+        assertTrue(pre.matches(exchange));
+
+        parser = new SimplePredicateParser("false", true);
+        pre = parser.parsePredicate();
+        assertFalse(pre.matches(exchange));
+    }
+
     public void testSimpleEq() throws Exception {
         exchange.getIn().setBody("foo");
 

http://git-wip-us.apache.org/repos/asf/camel/blob/3d359ec1/camel-core/src/test/java/org/apache/camel/language/simple/SimpleRouteExpressionAsPredicateTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/language/simple/SimpleRouteExpressionAsPredicateTest.java
 
b/camel-core/src/test/java/org/apache/camel/language/simple/SimpleRouteExpressionAsPredicateTest.java
new file mode 100644
index 0000000..cc6507a
--- /dev/null
+++ 
b/camel-core/src/test/java/org/apache/camel/language/simple/SimpleRouteExpressionAsPredicateTest.java
@@ -0,0 +1,51 @@
+/**
+ * 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.language.simple;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+
+public class SimpleRouteExpressionAsPredicateTest extends ContextTestSupport {
+
+    public void testSimpleRouteExpressionAsPredicateTest() throws Exception {
+        getMockEndpoint("mock:foo").expectedBodiesReceived(true);
+        getMockEndpoint("mock:bar").expectedBodiesReceived("ABC == ABC");
+
+        template.sendBodyAndHeader("direct:foo", "Hello World", "foo", "ABC");
+        template.sendBodyAndHeader("direct:bar", "Hello World", "bar", "ABC");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:foo")
+                    // evaluate as predicate because the result type is boolean
+                    .setBody().simple("${header.foo} == ${header.foo}", 
boolean.class)
+                    .to("mock:foo");
+
+                from("direct:bar")
+                    // evaluate as expression as no boolean as result type
+                    .setBody().simple("${header.bar} == ${header.bar}")
+                    .to("mock:bar");
+            }
+        };
+    }
+}

Reply via email to