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));
+    }
 }

Reply via email to