Repository: camel Updated Branches: refs/heads/camel-2.12.x 8684be7fe -> 9cd739d24
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/9cd739d2 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/9cd739d2 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/9cd739d2 Branch: refs/heads/camel-2.12.x Commit: 9cd739d24f584577d1c9fb6f500ba2a5674bb968 Parents: 8684be7 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:13:21 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/9cd739d2/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/9cd739d2/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/9cd739d2/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/9cd739d2/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/9cd739d2/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"); + } + }; + } +}