Author: davsclaus Date: Wed Feb 15 14:56:42 2012 New Revision: 1244518 URL: http://svn.apache.org/viewvc?rev=1244518&view=rev Log: CAMEL-5005: Fixed NPE when empty expression evaluated by simple language.
Added: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/language/SpringSimpleEmptyStringTest.java - copied, changed from r1244465, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/language/SpringSimpleRegexTest.java camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/language/SpringSimpleEmptyStringTest.xml - copied, changed from r1244465, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/language/springSimpleRegexContext.xml Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/builder/PredicateBuilder.java camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleExpressionParser.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/SimplePredicateParser.java camel/trunk/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/builder/PredicateBuilder.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/PredicateBuilder.java?rev=1244518&r1=1244517&r2=1244518&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/builder/PredicateBuilder.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/builder/PredicateBuilder.java Wed Feb 15 14:56:42 2012 @@ -441,4 +441,24 @@ public final class PredicateBuilder { } return answer; } + + /** + * A constant predicate. + * + * @param answer the constant matches + * @return a predicate that always returns the given answer. + */ + public static Predicate constant(final boolean answer) { + return new Predicate() { + @Override + public boolean matches(Exchange exchange) { + return answer; + } + + @Override + public String toString() { + return "" + answer; + } + }; + } } Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleExpressionParser.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleExpressionParser.java?rev=1244518&r1=1244517&r2=1244518&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleExpressionParser.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleExpressionParser.java Wed Feb 15 14:56:42 2012 @@ -79,7 +79,8 @@ public class SimpleExpressionParser exte // create and return as a Camel expression List<Expression> expressions = createExpressions(); if (expressions.isEmpty()) { - return null; + // return an empty string as response as there was nothing to parse + return ExpressionBuilder.constantExpression(""); } else if (expressions.size() == 1) { return expressions.get(0); } else { 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=1244518&r1=1244517&r2=1244518&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 Wed Feb 15 14:56:42 2012 @@ -21,6 +21,7 @@ import org.apache.camel.IsSingleton; import org.apache.camel.Predicate; import org.apache.camel.builder.ExpressionBuilder; import org.apache.camel.spi.Language; +import org.apache.camel.util.ObjectHelper; /** * A <a href="http://camel.apache.org/simple.html">simple language</a> @@ -126,6 +127,8 @@ public class SimpleLanguage implements L } public Predicate createPredicate(String expression) { + ObjectHelper.notNull(expression, "expression"); + // trim the expression first expression = expression.trim(); // support old simple language syntax @@ -140,6 +143,8 @@ public class SimpleLanguage implements L } public Expression createExpression(String expression) { + ObjectHelper.notNull(expression, "expression"); + // trim the expression first expression = expression.trim(); // support old simple language syntax Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimplePredicateParser.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimplePredicateParser.java?rev=1244518&r1=1244517&r2=1244518&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimplePredicateParser.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimplePredicateParser.java Wed Feb 15 14:56:42 2012 @@ -112,7 +112,8 @@ public class SimplePredicateParser exten // create and return as a Camel predicate List<Predicate> predicates = createPredicates(); if (predicates.isEmpty()) { - return null; + // return a false predicate as response as there was nothing to parse + return PredicateBuilder.constant(false); } else if (predicates.size() == 1) { return predicates.get(0); } else { Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java?rev=1244518&r1=1244517&r2=1244518&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java Wed Feb 15 14:56:42 2012 @@ -75,6 +75,26 @@ public class SimpleTest extends Language assertExpression("Hello World", "Hello World"); } + public void testEmptyExpression() throws Exception { + assertExpression("", ""); + assertExpression(" ", ""); + try { + assertExpression(null, null); + fail("Should have thrown exception"); + } catch (IllegalArgumentException e) { + assertEquals("expression must be specified", e.getMessage()); + } + + assertPredicate("", false); + assertPredicate(" ", false); + try { + assertPredicate(null, false); + fail("Should have thrown exception"); + } catch (IllegalArgumentException e) { + assertEquals("expression must be specified", e.getMessage()); + } + } + public void testBodyExpression() throws Exception { Expression exp = SimpleLanguage.simple("${body}"); assertNotNull(exp); Copied: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/language/SpringSimpleEmptyStringTest.java (from r1244465, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/language/SpringSimpleRegexTest.java) URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/language/SpringSimpleEmptyStringTest.java?p2=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/language/SpringSimpleEmptyStringTest.java&p1=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/language/SpringSimpleRegexTest.java&r1=1244465&r2=1244518&rev=1244518&view=diff ============================================================================== --- camel/trunk/components/camel-spring/src/test/java/org/apache/camel/language/SpringSimpleRegexTest.java (original) +++ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/language/SpringSimpleEmptyStringTest.java Wed Feb 15 14:56:42 2012 @@ -20,19 +20,19 @@ import org.apache.camel.spring.SpringTes import org.springframework.context.support.AbstractXmlApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; -public class SpringSimpleRegexTest extends SpringTestSupport { +public class SpringSimpleEmptyStringTest extends SpringTestSupport { @Override protected AbstractXmlApplicationContext createApplicationContext() { - return new ClassPathXmlApplicationContext("org/apache/camel/language/springSimpleRegexContext.xml"); + return new ClassPathXmlApplicationContext("org/apache/camel/language/SpringSimpleEmptyStringTest.xml"); } - public void testSimpleRegex() { - String result = template.requestBody("direct:start", "Something is wrong", String.class); - assertEquals("Let's keep looking.", result); + public void testSimpleEmptyString() throws Exception { + getMockEndpoint("mock:result").expectedBodiesReceived(""); - result = template.requestBody("direct:start", "12.34.5678", String.class); - assertEquals("Found the result.", result); + template.sendBody("direct:start", "Hello World"); + + assertMockEndpointsSatisfied(); } } Copied: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/language/SpringSimpleEmptyStringTest.xml (from r1244465, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/language/springSimpleRegexContext.xml) URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/language/SpringSimpleEmptyStringTest.xml?p2=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/language/SpringSimpleEmptyStringTest.xml&p1=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/language/springSimpleRegexContext.xml&r1=1244465&r2=1244518&rev=1244518&view=diff ============================================================================== --- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/language/springSimpleRegexContext.xml (original) +++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/language/SpringSimpleEmptyStringTest.xml Wed Feb 15 14:56:42 2012 @@ -24,20 +24,11 @@ <camelContext xmlns="http://camel.apache.org/schema/spring"> <route> - <from uri="direct:start" /> - <choice> - <when> - <simple>${body} regex '^\d{2}\.\d{2}\.\d{4}$'</simple> - <setBody> - <constant>Found the result.</constant> - </setBody> - </when> - <otherwise> - <setBody> - <constant>Let's keep looking.</constant> - </setBody> - </otherwise> - </choice> + <from uri="direct:start"/> + <setBody> + <simple></simple> + </setBody> + <to uri="mock:result"/> </route> </camelContext>