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


Reply via email to