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 2009/05/08 12:31:11 UTC

svn commit: r772927 - in /camel/trunk/camel-core/src: main/java/org/apache/camel/builder/ main/java/org/apache/camel/language/simple/ test/java/org/apache/camel/language/

Author: davsclaus
Date: Fri May  8 10:31:10 2009
New Revision: 772927

URL: http://svn.apache.org/viewvc?rev=772927&view=rev
Log:
CAMEL-1582: Improved syntax validation for file language, so it reports error if syntax is invalid.

Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/builder/FileExpressionBuilder.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/FileLanguage.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguageSupport.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/language/FileLanguageTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleTest.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/builder/FileExpressionBuilder.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/FileExpressionBuilder.java?rev=772927&r1=772926&r2=772927&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/builder/FileExpressionBuilder.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/builder/FileExpressionBuilder.java Fri May  8 10:31:10 2009
@@ -240,14 +240,8 @@
             public Object evaluate(Exchange exchange) {
                 // must call evaluate to return the nested language evaluate when evaluating
                 // stacked expressions
-                try {
-                    Language simple = exchange.getContext().resolveLanguage("simple");
-                    return simple.createExpression(expression).evaluate(exchange, Object.class);
-                } catch (ExpressionIllegalSyntaxException e) {
-                    // fallback to constant so end users can enter a fixed filename
-                    Language constant = exchange.getContext().resolveLanguage("constant");
-                    return constant.createExpression(expression).evaluate(exchange, Object.class);
-                }
+                Language simple = exchange.getContext().resolveLanguage("simple");
+                return simple.createExpression(expression).evaluate(exchange, Object.class);
             }
 
             @Override

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/FileLanguage.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/FileLanguage.java?rev=772927&r1=772926&r2=772927&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/FileLanguage.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/FileLanguage.java Fri May  8 10:31:10 2009
@@ -54,12 +54,14 @@
  */
 public class FileLanguage extends SimpleLanguageSupport {
 
+    private static final SimpleLanguage SIMPLE = new SimpleLanguage();
+
     public static Expression file(String expression) {
         FileLanguage language = new FileLanguage();
         return language.createExpression(expression);
     }
 
-    protected Expression createSimpleExpression(String expression) {
+    protected Expression createSimpleExpression(String expression, boolean strict) {
 
         // file: prefix
         String remainder = ifStartsWithReturnRemainder("file:", expression);
@@ -102,7 +104,7 @@
         }
 
         // fallback to simple language if not file specific
-        return FileExpressionBuilder.simpleExpression(expression);
+        return SIMPLE.createSimpleExpression(expression, strict);
     }
 
     public boolean isSingleton() {

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java?rev=772927&r1=772926&r2=772927&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java Fri May  8 10:31:10 2009
@@ -52,7 +52,7 @@
         return language.createExpression(expression);
     }
 
-    protected Expression createSimpleExpression(String expression) {
+    protected Expression createSimpleExpression(String expression, boolean strict) {
         if (ObjectHelper.isEqualToAny(expression, "body", "in.body")) {
             return ExpressionBuilder.bodyExpression();
         } else if (ObjectHelper.equal(expression, "out.body")) {
@@ -117,7 +117,11 @@
             return ExpressionBuilder.beanExpression(remainder);
         }
 
-        throw new ExpressionIllegalSyntaxException(expression);
+        if (strict) {
+            throw new ExpressionIllegalSyntaxException(expression);
+        } else {
+            return ExpressionBuilder.constantExpression(expression);
+        }
     }
 
     public boolean isSingleton() {

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguageSupport.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguageSupport.java?rev=772927&r1=772926&r2=772927&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguageSupport.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguageSupport.java Fri May  8 10:31:10 2009
@@ -52,24 +52,24 @@
         Matcher matcher = PATTERN.matcher(expression);
         if (matcher.matches()) {
             if (log.isDebugEnabled()) {
-                log.debug("Expression is evaluated as operator expression: " + expression);
+                log.debug("Expression is evaluated as simple expression wiht operator: " + expression);
             }
             return createOperatorExpression(matcher, expression);
         } else if (expression.indexOf("${") >= 0) {
             if (log.isDebugEnabled()) {
-                log.debug("Expression is evaluated as complex expression: " + expression);
+                log.debug("Expression is evaluated as simple (strict) expression: " + expression);
             }
             return createComplexConcatExpression(expression);
         } else {
             if (log.isDebugEnabled()) {
-                log.debug("Expression is evaluated as simple expression: " + expression);
+                log.debug("Expression is evaluated as simple (non strict) expression: " + expression);
             }
-            return createSimpleExpression(expression);
+            return createSimpleExpression(expression, false);
         }
     }
 
     private Expression createOperatorExpression(final Matcher matcher, final String expression) {
-        final Expression left = createSimpleExpression(matcher.group(1));
+        final Expression left = createSimpleExpression(matcher.group(1), true);
         final SimpleLangaugeOperator operator = asOperator(matcher.group(2));
 
         // the right hand side expression can either be a constant expression wiht ' '
@@ -91,7 +91,7 @@
             }
             String simple = ObjectHelper.between(text, "${", "}");
 
-            right = simple != null ? createSimpleExpression(simple) : createConstantExpression(constant);
+            right = simple != null ? createSimpleExpression(simple, true) : createConstantExpression(constant);
             // to support numeric comparions using > and < operators we must convert the right hand side
             // to the same type as the left
             rightConverted = ExpressionBuilder.convertToExpression(right, left);
@@ -176,7 +176,7 @@
                 }
                 String simpleText = expression.substring(pivot, endIdx);
 
-                Expression simpleExpression = createSimpleExpression(simpleText);
+                Expression simpleExpression = createSimpleExpression(simpleText, true);
                 results.add(simpleExpression);
                 pivot = endIdx + 1;
             }
@@ -196,9 +196,12 @@
      * Creates the simple expression based on the extracted content from the ${ } place holders
      *
      * @param expression  the content between ${ and }
+     * @param strict whether it is strict mode or not, if strict it will throw a
+     * {@link org.apache.camel.ExpressionIllegalSyntaxException} if the expression was not known.
+     * Set to <tt>false</tt> to support constant expressions
      * @return the expression
      */
-    protected abstract Expression createSimpleExpression(String expression);
+    protected abstract Expression createSimpleExpression(String expression, boolean strict);
 
     protected String ifStartsWithReturnRemainder(String prefix, String text) {
         if (text.startsWith(prefix)) {

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/language/FileLanguageTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/language/FileLanguageTest.java?rev=772927&r1=772926&r2=772927&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/language/FileLanguageTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/language/FileLanguageTest.java Fri May  8 10:31:10 2009
@@ -24,6 +24,7 @@
 
 import org.apache.camel.Exchange;
 import org.apache.camel.LanguageTestSupport;
+import org.apache.camel.ExpressionIllegalSyntaxException;
 import org.apache.camel.component.file.FileConsumer;
 import org.apache.camel.component.file.FileEndpoint;
 import org.apache.camel.component.file.GenericFile;
@@ -131,6 +132,34 @@
         return answer;
     }
 
+    public void testIllegalSyntax() throws Exception {
+        try {
+            // it should be with colon
+            assertExpression("${file.name}", "");
+            fail("Should have thrown an exception");
+        } catch (ExpressionIllegalSyntaxException e) {
+            assertEquals("Illegal syntax: file.name", e.getMessage());
+        }
+
+        try {
+            assertExpression("hey ${xxx} how are you?", "");
+            fail("Should have thrown an exception");
+        } catch (ExpressionIllegalSyntaxException e) {
+            assertEquals("Illegal syntax: xxx", e.getMessage());
+        }
+
+        try {
+            assertExpression("${xxx}", "");
+            fail("Should have thrown an exception");
+        } catch (ExpressionIllegalSyntaxException e) {
+            assertEquals("Illegal syntax: xxx", e.getMessage());
+        }
+    }
+
+    public void testConstantFilename() throws Exception {
+        assertExpression("hello.txt", "hello.txt");
+    }
+
     public class MyFileNameGenerator {
         public String generateFilename(Exchange exchange) {
             return "generatorbybean";

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleTest.java?rev=772927&r1=772926&r2=772927&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleTest.java Fri May  8 10:31:10 2009
@@ -26,12 +26,7 @@
 public class SimpleTest extends LanguageTestSupport {
 
     public void testConstantExpression() throws Exception {
-        try {
-            assertExpression("Hello World", "Hello World");
-            fail("Should have thrown an Exception");
-        } catch (ExpressionIllegalSyntaxException e) {
-            // constants is not supported
-        }
+        assertExpression("Hello World", "Hello World");
     }
 
     public void testSimpleExpressions() throws Exception {
@@ -81,6 +76,22 @@
         assertExpression("Hello ${exception.message} World", "Hello Just testing World");
     }
 
+    public void testIllegalSyntax() throws Exception {
+        try {
+            assertExpression("hey ${xxx} how are you?", "");
+            fail("Should have thrown an exception");
+        } catch (ExpressionIllegalSyntaxException e) {
+            assertEquals("Illegal syntax: xxx", e.getMessage());
+        }
+
+        try {
+            assertExpression("${xxx}", "");
+            fail("Should have thrown an exception");
+        } catch (ExpressionIllegalSyntaxException e) {
+            assertEquals("Illegal syntax: xxx", e.getMessage());
+        }
+    }
+
     protected String getLanguageName() {
         return "simple";
     }