CAMEL-6414: The unary operators in Simple is now only applied on functions
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/e75fc01c Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/e75fc01c Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/e75fc01c Branch: refs/heads/camel-2.11.x Commit: e75fc01c9fe3e5f2c6fd76261bf3489e5c7c17fe Parents: b2a0f59 Author: Claus Ibsen <davscl...@apache.org> Authored: Tue Jul 9 10:01:43 2013 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Tue Jul 9 10:02:32 2013 +0200 ---------------------------------------------------------------------- .../camel/language/simple/SimpleTokenizer.java | 21 +++++++++++++++++- .../simple/SimpleParserExpressionTest.java | 23 ++++++++++++++++++-- 2 files changed, 41 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/e75fc01c/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 f70a7d7..9d59507 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 @@ -22,6 +22,7 @@ import java.util.concurrent.CopyOnWriteArrayList; import org.apache.camel.language.simple.types.SimpleToken; import org.apache.camel.language.simple.types.SimpleTokenType; import org.apache.camel.language.simple.types.TokenType; +import org.apache.camel.util.ObjectHelper; /** * Tokenizer to create {@link SimpleToken} from the input. @@ -203,7 +204,7 @@ public final class SimpleTokenizer { String text = expression.substring(index); for (SimpleTokenType token : KNOWN_TOKENS) { if (acceptType(token.getType(), filters)) { - if (text.startsWith(token.getValue())) { + if (acceptToken(token, text, expression, index)) { return new SimpleToken(token, index); } } @@ -227,4 +228,22 @@ public final class SimpleTokenizer { return false; } + private static boolean acceptToken(SimpleTokenType token, String text, String expression, int index) { + if (token.isUnary() && text.startsWith(token.getValue())) { + // special check for unary as the previous must be a function end, and the next a whitespace + // to ensure unary operators is only applied on functions as intended + int len = token.getValue().length(); + char previous = ' '; + if (index > 0) { + previous = expression.charAt(index - 1); + } + String after = text.substring(len); + boolean whiteSpace = ObjectHelper.isEmpty(after) || after.startsWith(" "); + boolean functionEnd = previous == '}'; + return functionEnd && whiteSpace; + } + + return text.startsWith(token.getValue()); + } + } http://git-wip-us.apache.org/repos/asf/camel/blob/e75fc01c/camel-core/src/test/java/org/apache/camel/language/simple/SimpleParserExpressionTest.java ---------------------------------------------------------------------- diff --git a/camel-core/src/test/java/org/apache/camel/language/simple/SimpleParserExpressionTest.java b/camel-core/src/test/java/org/apache/camel/language/simple/SimpleParserExpressionTest.java index 4b6e68d..d88f490 100644 --- a/camel-core/src/test/java/org/apache/camel/language/simple/SimpleParserExpressionTest.java +++ b/camel-core/src/test/java/org/apache/camel/language/simple/SimpleParserExpressionTest.java @@ -182,8 +182,7 @@ public class SimpleParserExpressionTest extends ExchangeTestSupport { assertEquals("456", exp.evaluate(exchange, Object.class)); } - // FIXME: see CAMEL-6414 - public void xxxTestSimpleParser() throws Exception { + public void testUnaryLenient() throws Exception { exchange.getIn().setHeader("JMSMessageID", "JMSMessageID-123"); exchange.getIn().setBody("THE MSG ID ${header.JMSMessageID} isA --"); @@ -192,4 +191,24 @@ public class SimpleParserExpressionTest extends ExchangeTestSupport { assertEquals("THE MSG ID JMSMessageID-123 isA --", exp.evaluate(exchange, String.class)); } + + public void testUnaryLenient2() throws Exception { + exchange.getIn().setHeader("JMSMessageID", "JMSMessageID-123"); + exchange.getIn().setBody("------------THE MSG ID ${header.JMSMessageID}------------"); + + SimpleExpressionParser parser = new SimpleExpressionParser("------------THE MSG ID ${header.JMSMessageID}------------", true); + Expression exp = parser.parseExpression(); + + assertEquals("------------THE MSG ID JMSMessageID-123------------", exp.evaluate(exchange, String.class)); + } + + public void testUnaryLenient3() throws Exception { + exchange.getIn().setHeader("JMSMessageID", "JMSMessageID-123"); + exchange.getIn().setBody("------------ THE MSG ID ${header.JMSMessageID} ------------"); + + SimpleExpressionParser parser = new SimpleExpressionParser("------------ THE MSG ID ${header.JMSMessageID} ------------", true); + Expression exp = parser.parseExpression(); + + assertEquals("------------ THE MSG ID JMSMessageID-123 ------------", exp.evaluate(exchange, String.class)); + } }