Author: davsclaus
Date: Fri Aug 13 14:19:37 2010
New Revision: 985206
URL: http://svn.apache.org/viewvc?rev=985206&view=rev
Log:
CAMEL-3054: Added headerAs to Simple language.
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.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/util/StringHelper.java
camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleTest.java
camel/trunk/camel-core/src/test/java/org/apache/camel/util/StringHelperTest.java
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java?rev=985206&r1=985205&r2=985206&view=diff
==============================================================================
---
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
(original)
+++
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
Fri Aug 13 14:19:37 2010
@@ -102,6 +102,68 @@ public final class ExpressionBuilder {
}
/**
+ * Returns an expression for the header value with the given name
converted to the given type
+ * <p/>
+ * Will fallback and look in properties if not found in headers.
+ *
+ * @param headerName the name of the header the expression will return
+ * @param type the type to convert to
+ * @return an expression object which will return the header value
+ */
+ public static <T> Expression headerExpression(final String headerName,
final Class<T> type) {
+ return new ExpressionAdapter() {
+ public Object evaluate(Exchange exchange) {
+ Object header = exchange.getIn().getHeader(headerName, type);
+ if (header == null) {
+ // fall back on a property
+ header = exchange.getProperty(headerName, type);
+ }
+ return header;
+ }
+
+ @Override
+ public String toString() {
+ return "headerAs(" + headerName + ", " + type + ")";
+ }
+ };
+ }
+
+ /**
+ * Returns an expression for the header value with the given name
converted to the given type
+ * <p/>
+ * Will fallback and look in properties if not found in headers.
+ *
+ * @param headerName the name of the header the expression will return
+ * @param name the type to convert to as a FQN class name
+ * @return an expression object which will return the header value
+ */
+ public static Expression headerExpression(final String headerName, final
String name) {
+ return new ExpressionAdapter() {
+ @SuppressWarnings("unchecked")
+ public Object evaluate(Exchange exchange) {
+ Class type;
+ try {
+ type =
exchange.getContext().getClassResolver().resolveMandatoryClass(name);
+ } catch (ClassNotFoundException e) {
+ throw ObjectHelper.wrapCamelExecutionException(exchange,
e);
+ }
+
+ Object header = exchange.getIn().getHeader(headerName, type);
+ if (header == null) {
+ // fall back on a property
+ header = exchange.getProperty(headerName, type);
+ }
+ return header;
+ }
+
+ @Override
+ public String toString() {
+ return "headerAs(" + headerName + ", " + name + ")";
+ }
+ };
+ }
+
+ /**
* Returns the expression for the exchanges inbound message header
invoking methods defined
* in a simple OGNL notation
*
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=985206&r1=985205&r2=985206&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 Aug 13 14:19:37 2010
@@ -21,6 +21,7 @@ import org.apache.camel.ExpressionIllega
import org.apache.camel.builder.ExpressionBuilder;
import org.apache.camel.util.ObjectHelper;
import org.apache.camel.util.OgnlHelper;
+import org.apache.camel.util.StringHelper;
/**
* A <a href="http://camel.apache.org/simple.html">simple language</a>
@@ -128,6 +129,7 @@ public class SimpleLanguage extends Simp
if (type == null) {
throw new ExpressionIllegalSyntaxException("Valid syntax:
${bodyAs(type)} was: " + expression);
}
+ type = StringHelper.removeQuotes(type);
return ExpressionBuilder.bodyExpression(type);
}
@@ -154,6 +156,24 @@ public class SimpleLanguage extends Simp
return
ExpressionBuilder.exchangeExceptionOgnlExpression(remainder);
}
+ // headerAs
+ remainder = ifStartsWithReturnRemainder("headerAs", expression);
+ if (remainder != null) {
+ String keyAndType = ObjectHelper.between(remainder, "(", ")");
+ if (keyAndType == null) {
+ throw new ExpressionIllegalSyntaxException("Valid syntax:
${headerAs(key, type)} was: " + expression);
+ }
+
+ String key = ObjectHelper.before(keyAndType, ",");
+ String type = ObjectHelper.after(keyAndType, ",");
+ if (ObjectHelper.isEmpty(key) || ObjectHelper.isEmpty(type)) {
+ throw new ExpressionIllegalSyntaxException("Valid syntax:
${headerAs(key, type)} was: " + expression);
+ }
+ key = StringHelper.removeQuotes(key);
+ type = StringHelper.removeQuotes(type);
+ return ExpressionBuilder.headerExpression(key, type);
+ }
+
// in header expression
remainder = ifStartsWithReturnRemainder("in.headers", expression);
if (remainder == null) {
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/util/StringHelper.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/StringHelper.java?rev=985206&r1=985205&r2=985206&view=diff
==============================================================================
---
camel/trunk/camel-core/src/main/java/org/apache/camel/util/StringHelper.java
(original)
+++
camel/trunk/camel-core/src/main/java/org/apache/camel/util/StringHelper.java
Fri Aug 13 14:19:37 2010
@@ -30,11 +30,9 @@ public final class StringHelper {
/**
* Ensures that <code>s</code> is friendly for a URL or file system.
*
- * @param s
- * String to be sanitized.
+ * @param s String to be sanitized.
* @return sanitized version of <code>s</code>.
- * @throws NullPointerException
- * if <code>s</code> is <code>null</code>.
+ * @throws NullPointerException if <code>s</code> is <code>null</code>.
*/
public static String sanitize(String s) {
return s
@@ -67,5 +65,15 @@ public final class StringHelper {
return matches;
}
+
+ public static String removeQuotes(String s) {
+ if (ObjectHelper.isEmpty(s)) {
+ return s;
+ }
+
+ s = s.replaceAll("'", "");
+ s = s.replaceAll("\"", "");
+ return s;
+ }
}
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=985206&r1=985205&r2=985206&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 Aug 13 14:19:37 2010
@@ -24,6 +24,7 @@ import java.util.List;
import java.util.Map;
import org.apache.camel.CamelAuthorizationException;
+import org.apache.camel.CamelExecutionException;
import org.apache.camel.Exchange;
import org.apache.camel.Expression;
import org.apache.camel.ExpressionIllegalSyntaxException;
@@ -162,9 +163,47 @@ public class SimpleTest extends Language
public void testBodyAs() throws Exception {
assertExpression("${bodyAs(String)}", "<hello
id='m123'>world!</hello>");
+ assertExpression("${bodyAs('String')}", "<hello
id='m123'>world!</hello>");
exchange.getIn().setBody(456);
assertExpression("${bodyAs(Integer)}", 456);
+ assertExpression("${bodyAs(int)}", 456);
+ assertExpression("${bodyAs('int')}", 456);
+
+ try {
+ assertExpression("${bodyAs(XXX)}", 456);
+ fail("Should have thrown an exception");
+ } catch (CamelExecutionException e) {
+ assertIsInstanceOf(ClassNotFoundException.class, e.getCause());
+ }
+ }
+
+ public void testHeaderAs() throws Exception {
+ assertExpression("${headerAs(foo,String)}", "abc");
+
+ assertExpression("${headerAs(bar,int)}", 123);
+ assertExpression("${headerAs(bar, int)}", 123);
+ assertExpression("${headerAs('bar', int)}", 123);
+ assertExpression("${headerAs('bar','int')}", 123);
+ assertExpression("${headerAs('bar','Integer')}", 123);
+ assertExpression("${headerAs('bar',\"int\")}", 123);
+ assertExpression("${headerAs(bar,String)}", "123");
+
+ assertExpression("${headerAs(unknown,String)}", null);
+
+ try {
+ assertExpression("${headerAs(unknown String)}", null);
+ fail("Should have thrown an exception");
+ } catch (ExpressionIllegalSyntaxException e) {
+ assertEquals("Illegal syntax: Valid syntax: ${headerAs(key, type)}
was: headerAs(unknown String)", e.getMessage());
+ }
+
+ try {
+ assertExpression("${headerAs(bar,XXX)}", 123);
+ fail("Should have thrown an exception");
+ } catch (CamelExecutionException e) {
+ assertIsInstanceOf(ClassNotFoundException.class, e.getCause());
+ }
}
public void testIllegalSyntax() throws Exception {
Modified:
camel/trunk/camel-core/src/test/java/org/apache/camel/util/StringHelperTest.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/util/StringHelperTest.java?rev=985206&r1=985205&r2=985206&view=diff
==============================================================================
---
camel/trunk/camel-core/src/test/java/org/apache/camel/util/StringHelperTest.java
(original)
+++
camel/trunk/camel-core/src/test/java/org/apache/camel/util/StringHelperTest.java
Fri Aug 13 14:19:37 2010
@@ -44,4 +44,18 @@ public class StringHelperTest extends Te
assertEquals(0, StringHelper.countChar(null, ' '));
}
+ public void testRemoveQuotes() throws Exception {
+ assertEquals("Hello World", StringHelper.removeQuotes("Hello World"));
+ assertEquals("", StringHelper.removeQuotes(""));
+ assertEquals(null, StringHelper.removeQuotes(null));
+ assertEquals(" ", StringHelper.removeQuotes(" "));
+ assertEquals("foo", StringHelper.removeQuotes("'foo'"));
+ assertEquals("foo", StringHelper.removeQuotes("'foo"));
+ assertEquals("foo", StringHelper.removeQuotes("foo'"));
+ assertEquals("foo", StringHelper.removeQuotes("\"foo\""));
+ assertEquals("foo", StringHelper.removeQuotes("\"foo"));
+ assertEquals("foo", StringHelper.removeQuotes("foo\""));
+ assertEquals("foo", StringHelper.removeQuotes("'foo\""));
+ }
+
}