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 2010/09/06 12:32:32 UTC

svn commit: r992991 - in /camel/trunk: camel-core/src/main/java/org/apache/camel/ camel-core/src/main/java/org/apache/camel/builder/ camel-core/src/main/java/org/apache/camel/component/language/ camel-core/src/main/java/org/apache/camel/language/simple...

Author: davsclaus
Date: Mon Sep  6 10:32:31 2010
New Revision: 992991

URL: http://svn.apache.org/viewvc?rev=992991&view=rev
Log:
CAMEL-3106: Added language component. So you can send messages to language endpoint and have a script being evaluated on the message, and the result as the new message body.

Added:
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/language/
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/language/LanguageComponent.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/language/LanguageEndpoint.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/language/LanguageProducer.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/language/package.html
      - copied, changed from r992940, camel/trunk/camel-core/src/main/java/org/apache/camel/component/log/package.html
    camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/language
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageEndpointScriptRouteTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageHeaderRouteTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageRouteConvertBodyTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageRouteNoTransformTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageRouteTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageScriptInHeaderRouteTakePrecedenceTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageScriptInHeaderRouteTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageScriptRouteTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageXPathRouteTest.java
    camel/trunk/components/camel-groovy/src/test/java/org/apache/camel/language/groovy/LanguageGroovyRouteTest.java   (with props)
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java
    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/spi/LanguageResolver.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleTest.java
    camel/trunk/components/camel-groovy/src/test/java/org/apache/camel/language/groovy/GroovyLanguageTest.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java?rev=992991&r1=992990&r2=992991&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java Mon Sep  6 10:32:31 2010
@@ -85,10 +85,10 @@ public interface Exchange {
     String HTTP_CHUNKED            = "CamelHttpChunked";
     String HTTP_SERVLET_REQUEST    = "CamelHttpServletRequest";
     String HTTP_SERVLET_RESPONSE   = "CamelHttpServletResponse";
-    
 
     String INTERCEPTED_ENDPOINT = "CamelInterceptedEndpoint";
 
+    String LANGUAGE_SCRIPT          = "CamelLanguageScript";
     String LOG_DEBUG_BODY_MAX_CHARS = "CamelLogDebugBodyMaxChars";
     String LOG_DEBUG_BODY_STREAMS   = "CamelLogDebugStreams";
     String LOOP_INDEX               = "CamelLoopIndex";

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=992991&r1=992990&r2=992991&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 Mon Sep  6 10:32:31 2010
@@ -660,6 +660,34 @@ public final class ExpressionBuilder {
     }
 
     /**
+     * Returns the expression for the exchanges inbound message body converted
+     * to the given type
+     */
+    public static Expression mandatoryBodyExpression(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);
+                }
+                try {
+                    return exchange.getIn().getMandatoryBody(type);
+                } catch (InvalidPayloadException e) {
+                    throw ObjectHelper.wrapCamelExecutionException(exchange, e);
+                }
+            }
+
+            @Override
+            public String toString() {
+                return "mandatoryBodyAs[" + name + "]";
+            }
+        };
+    }
+
+    /**
      * Returns the expression for the current thread name
      */
     public static Expression threadNameExpression() {

Added: camel/trunk/camel-core/src/main/java/org/apache/camel/component/language/LanguageComponent.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/language/LanguageComponent.java?rev=992991&view=auto
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/language/LanguageComponent.java (added)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/language/LanguageComponent.java Mon Sep  6 10:32:31 2010
@@ -0,0 +1,56 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.language;
+
+import java.util.Map;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Expression;
+import org.apache.camel.impl.DefaultComponent;
+import org.apache.camel.spi.Language;
+import org.apache.camel.util.ObjectHelper;
+
+/**
+ * The <a href="http://camel.apache.org/language-component.html">language component</a> to send
+ * {@link org.apache.camel.Exchange}s to a given language and have the script being executed.
+ *
+ * @version $Revision$
+ */
+public class LanguageComponent extends DefaultComponent {
+
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        String name = ObjectHelper.before(remaining, ":");
+        String script = ObjectHelper.after(remaining, ":");
+        // no script then remaining is the language name
+        if (name == null && script == null) {
+            name = remaining;
+        }
+
+        if (ObjectHelper.isEmpty(name)) {
+            throw new IllegalArgumentException("Illegal syntax. Name of language not given in uri: " + uri);
+        }
+        Language language = getCamelContext().resolveLanguage(name);
+
+        Expression expression = null;
+        if (ObjectHelper.isNotEmpty(script)) {
+            expression = language.createExpression(script);
+        }
+
+        return new LanguageEndpoint(uri, this, language, expression);
+    }
+
+}

Added: camel/trunk/camel-core/src/main/java/org/apache/camel/component/language/LanguageEndpoint.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/language/LanguageEndpoint.java?rev=992991&view=auto
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/language/LanguageEndpoint.java (added)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/language/LanguageEndpoint.java Mon Sep  6 10:32:31 2010
@@ -0,0 +1,119 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.language;
+
+import org.apache.camel.Component;
+import org.apache.camel.Consumer;
+import org.apache.camel.Expression;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.impl.DefaultEndpoint;
+import org.apache.camel.spi.Language;
+import org.apache.camel.util.ObjectHelper;
+
+/**
+ * Language endpoint.
+ *
+ * @version $Revision$
+ */
+public class LanguageEndpoint extends DefaultEndpoint {
+    private Language language;
+    private Expression expression;
+    private String languageName;
+    private String script;
+    private boolean transform = true;
+
+    public LanguageEndpoint() {
+    }
+
+    public LanguageEndpoint(String endpointUri, Component component, Language language, Expression expression) {
+        super(endpointUri, component);
+        this.language = language;
+        this.expression = expression;
+    }
+
+    public Producer createProducer() throws Exception {
+        ObjectHelper.notNull(getCamelContext(), "CamelContext", this);
+
+        if (language == null && languageName != null) {
+            language = getCamelContext().resolveLanguage(languageName);
+        }
+
+        ObjectHelper.notNull(language, "language", this);
+        if (expression == null && script != null) {
+            expression = language.createExpression(script);
+        }
+
+        return new LanguageProducer(this);
+    }
+
+    public Consumer createConsumer(Processor processor) throws Exception {
+        throw new RuntimeCamelException("Cannot consume to a LanguageEndpoint: " + getEndpointUri());
+    }
+
+    public boolean isSingleton() {
+        return true;
+    }
+
+    @Override
+    protected String createEndpointUri() {
+        return languageName + ":" + script;
+    }
+
+    public Language getLanguage() {
+        return language;
+    }
+
+    public Expression getExpression() {
+        return expression;
+    }
+
+    public boolean isTransform() {
+        return transform;
+    }
+
+    /**
+     * Whether or not the result of the script should be used as message body.
+     * <p/>
+     * This options is default <tt>true</tt>.
+     *
+     * @param transform <tt>true</tt> to use result as new message body, <tt>false</tt> to keep the existing message body
+     */
+    public void setTransform(boolean transform) {
+        this.transform = transform;
+    }
+
+    /**
+     * Sets the name of the language to use
+     *
+     * @param languageName the name of the language
+     */
+    public void setLanguageName(String languageName) {
+        this.languageName = languageName;
+    }
+
+    /**
+     * Sets the script to execute
+     *
+     * @param script the script
+     */
+    public void setScript(String script) {
+        this.script = script;
+    }
+
+}

Added: camel/trunk/camel-core/src/main/java/org/apache/camel/component/language/LanguageProducer.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/language/LanguageProducer.java?rev=992991&view=auto
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/language/LanguageProducer.java (added)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/language/LanguageProducer.java Mon Sep  6 10:32:31 2010
@@ -0,0 +1,70 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.language;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Expression;
+import org.apache.camel.impl.DefaultProducer;
+import org.apache.camel.util.ObjectHelper;
+
+/**
+ * Language producer.
+ *
+ * @version $Revision$
+ */
+public class LanguageProducer extends DefaultProducer {
+
+    public LanguageProducer(LanguageEndpoint endpoint) {
+        super(endpoint);
+    }
+
+    public void process(Exchange exchange) throws Exception {
+        // is there a custom expression in the header?
+        Expression exp = exchange.getIn().getHeader(Exchange.LANGUAGE_SCRIPT, Expression.class);
+        if (exp == null) {
+            String script = exchange.getIn().getHeader(Exchange.LANGUAGE_SCRIPT, String.class);
+            if (script != null) {
+                exp = getEndpoint().getLanguage().createExpression(script);
+            }
+        }
+        // if not fallback to use expression from endpoint
+        if (exp == null) {
+            exp = getEndpoint().getExpression();
+        }
+
+        ObjectHelper.notNull(exp, "expression");
+
+        Object result = exp.evaluate(exchange, Object.class);
+        if (log.isDebugEnabled()) {
+            log.debug("Evaluated expression as: " + result + " with: " + exchange);
+        }
+
+        // set message body if transform is enabled
+        if (getEndpoint().isTransform()) {
+            if (exchange.hasOut()) {
+                exchange.getOut().setBody(result);
+            } else {
+                exchange.getIn().setBody(result);
+            }
+        }
+    }
+
+    @Override
+    public LanguageEndpoint getEndpoint() {
+        return (LanguageEndpoint) super.getEndpoint();
+    }
+}

Copied: camel/trunk/camel-core/src/main/java/org/apache/camel/component/language/package.html (from r992940, camel/trunk/camel-core/src/main/java/org/apache/camel/component/log/package.html)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/language/package.html?p2=camel/trunk/camel-core/src/main/java/org/apache/camel/component/language/package.html&p1=camel/trunk/camel-core/src/main/java/org/apache/camel/component/log/package.html&r1=992940&r2=992991&rev=992991&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/log/package.html (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/language/package.html Mon Sep  6 10:32:31 2010
@@ -19,7 +19,8 @@
 </head>
 <body>
 
-The <a href="http://camel.apache.org/log.html">Log Component</a> uses Jakarta Commons Logging to log message exchanges.
+The <a href="http://camel.apache.org/language-component.html">Language Component</a> to send messages to language endpoints executing
+the script.
 
 
 </body>

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=992991&r1=992990&r2=992991&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 Mon Sep  6 10:32:31 2010
@@ -133,6 +133,16 @@ public class SimpleLanguage extends Simp
             type = StringHelper.removeQuotes(type);
             return ExpressionBuilder.bodyExpression(type);
         }
+        // mandatoryBodyAs
+        remainder = ifStartsWithReturnRemainder("mandatoryBodyAs", expression);
+        if (remainder != null) {
+            String type = ObjectHelper.between(remainder, "(", ")");
+            if (type == null) {
+                throw new ExpressionIllegalSyntaxException("Valid syntax: ${mandatoryBodyAs(type)} was: " + expression);
+            }
+            type = StringHelper.removeQuotes(type);
+            return ExpressionBuilder.mandatoryBodyExpression(type);
+        }
 
         // body OGNL
         remainder = ifStartsWithReturnRemainder("body", expression);

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/LanguageResolver.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/LanguageResolver.java?rev=992991&r1=992990&r2=992991&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/spi/LanguageResolver.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/spi/LanguageResolver.java Mon Sep  6 10:32:31 2010
@@ -17,6 +17,7 @@
 package org.apache.camel.spi;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.NoSuchLanguageException;
 
 /**
  * A pluggable strategy for resolving different languages in a loosely coupled manner
@@ -28,9 +29,10 @@ public interface LanguageResolver {
     /**
      * Resolves the given language.
      *
-     * @param name    the name of the langauge
+     * @param name    the name of the language
      * @param context the camel context
      * @return the resolved language
+     * @throws NoSuchLanguageException is thrown if language could not be resolved
      */
-    Language resolveLanguage(String name, CamelContext context);
+    Language resolveLanguage(String name, CamelContext context) throws NoSuchLanguageException;
 }

Added: camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/language
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/language?rev=992991&view=auto
==============================================================================
--- camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/language (added)
+++ camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/language Mon Sep  6 10:32:31 2010
@@ -0,0 +1,18 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+class=org.apache.camel.component.language.LanguageComponent
\ No newline at end of file

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageEndpointScriptRouteTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageEndpointScriptRouteTest.java?rev=992991&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageEndpointScriptRouteTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageEndpointScriptRouteTest.java Mon Sep  6 10:32:31 2010
@@ -0,0 +1,51 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.language;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * @version $Revision$
+ */
+public class LanguageEndpointScriptRouteTest extends ContextTestSupport {
+
+    public void testLanguage() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        template.sendBody("direct:start", "World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                // START SNIPPET: e1
+                LanguageEndpoint le = new LanguageEndpoint();
+                le.setCamelContext(context);
+                le.setLanguageName("simple");
+                le.setScript("Hello ${body}");
+
+                from("direct:start").to(le).to("mock:result");
+                // END SNIPPET: e1
+            }
+        };
+    }
+}

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageHeaderRouteTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageHeaderRouteTest.java?rev=992991&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageHeaderRouteTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageHeaderRouteTest.java Mon Sep  6 10:32:31 2010
@@ -0,0 +1,44 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.language;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * @version $Revision$
+ */
+public class LanguageHeaderRouteTest extends ContextTestSupport {
+
+    public void testLanguage() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        template.sendBodyAndHeader("direct:start", "Hi", "foo", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("language:header:foo").to("mock:result");
+            }
+        };
+    }
+}

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageRouteConvertBodyTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageRouteConvertBodyTest.java?rev=992991&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageRouteConvertBodyTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageRouteConvertBodyTest.java Mon Sep  6 10:32:31 2010
@@ -0,0 +1,61 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.language;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * @version $Revision$
+ */
+public class LanguageRouteConvertBodyTest extends ContextTestSupport {
+
+    public void testLanguage() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("123;Camel in Action");
+
+        template.sendBody("direct:start", new MyOrder(123, "Camel in Action"));
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                // START SNIPPET: e1
+                from("direct:start").to("language:simple:${mandatoryBodyAs(String)}").to("mock:result");
+                // END SNIPPET: e1
+            }
+        };
+    }
+
+    private final class MyOrder {
+        private int id;
+        private String name;
+
+        private MyOrder(int id, String name) {
+            this.id = id;
+            this.name = name;
+        }
+
+        @Override
+        public String toString() {
+            return id + ";" + name;
+        }
+    }
+}

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageRouteNoTransformTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageRouteNoTransformTest.java?rev=992991&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageRouteNoTransformTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageRouteNoTransformTest.java Mon Sep  6 10:32:31 2010
@@ -0,0 +1,44 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.language;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * @version $Revision$
+ */
+public class LanguageRouteNoTransformTest extends ContextTestSupport {
+
+    public void testLanguage() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("World");
+
+        template.sendBody("direct:start", "World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("language:simple:Hello ${body}?transform=false").to("mock:result");
+            }
+        };
+    }
+}

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageRouteTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageRouteTest.java?rev=992991&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageRouteTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageRouteTest.java Mon Sep  6 10:32:31 2010
@@ -0,0 +1,46 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.language;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * @version $Revision$
+ */
+public class LanguageRouteTest extends ContextTestSupport {
+
+    public void testLanguage() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        template.sendBody("direct:start", "World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                // START SNIPPET: e1
+                from("direct:start").to("language:simple:Hello ${body}").to("mock:result");
+                // END SNIPPET: e1
+            }
+        };
+    }
+}

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageScriptInHeaderRouteTakePrecedenceTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageScriptInHeaderRouteTakePrecedenceTest.java?rev=992991&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageScriptInHeaderRouteTakePrecedenceTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageScriptInHeaderRouteTakePrecedenceTest.java Mon Sep  6 10:32:31 2010
@@ -0,0 +1,53 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.language;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * @version $Revision$
+ */
+public class LanguageScriptInHeaderRouteTakePrecedenceTest extends ContextTestSupport {
+
+    public void testLanguageWithHeader() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        template.sendBodyAndHeader("direct:start", "World", Exchange.LANGUAGE_SCRIPT, "Hello ${body}");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testLanguageNoHeader() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
+
+        template.sendBody("direct:start", "World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("language:simple:Bye ${body}").to("mock:result");
+            }
+        };
+    }
+}

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageScriptInHeaderRouteTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageScriptInHeaderRouteTest.java?rev=992991&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageScriptInHeaderRouteTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageScriptInHeaderRouteTest.java Mon Sep  6 10:32:31 2010
@@ -0,0 +1,45 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.language;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * @version $Revision$
+ */
+public class LanguageScriptInHeaderRouteTest extends ContextTestSupport {
+
+    public void testLanguage() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        template.sendBodyAndHeader("direct:start", "World", Exchange.LANGUAGE_SCRIPT, "Hello ${body}");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("language:simple").to("mock:result");
+            }
+        };
+    }
+}

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageScriptRouteTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageScriptRouteTest.java?rev=992991&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageScriptRouteTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageScriptRouteTest.java Mon Sep  6 10:32:31 2010
@@ -0,0 +1,54 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.language;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.JndiRegistry;
+
+/**
+ * @version $Revision$
+ */
+public class LanguageScriptRouteTest extends ContextTestSupport {
+
+    public void testLanguage() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        template.sendBody("direct:start", "World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        JndiRegistry jndi = super.createRegistry();
+        jndi.bind("myScript", "Hello ${body}");
+        return jndi;
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                // START SNIPPET: e1
+                from("direct:start").to("language:simple?script=#myScript").to("mock:result");
+                // END SNIPPET: e1
+            }
+        };
+    }
+}

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageXPathRouteTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageXPathRouteTest.java?rev=992991&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageXPathRouteTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/language/LanguageXPathRouteTest.java Mon Sep  6 10:32:31 2010
@@ -0,0 +1,44 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.language;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * @version $Revision$
+ */
+public class LanguageXPathRouteTest extends ContextTestSupport {
+
+    public void testLanguage() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        template.sendBody("direct:start", "<foo>Hello World</foo>");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("language:xpath:/foo/text()").to("mock:result");
+            }
+        };
+    }
+}

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=992991&r1=992990&r2=992991&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 Mon Sep  6 10:32:31 2010
@@ -28,6 +28,7 @@ import org.apache.camel.CamelExecutionEx
 import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
 import org.apache.camel.ExpressionIllegalSyntaxException;
+import org.apache.camel.InvalidPayloadException;
 import org.apache.camel.LanguageTestSupport;
 import org.apache.camel.component.bean.MethodNotFoundException;
 import org.apache.camel.language.bean.RuntimeBeanExpressionException;
@@ -165,6 +166,9 @@ public class SimpleTest extends Language
         assertExpression("${bodyAs(String)}", "<hello id='m123'>world!</hello>");
         assertExpression("${bodyAs('String')}", "<hello id='m123'>world!</hello>");
 
+        exchange.getIn().setBody(null);
+        assertExpression("${bodyAs('String')}", null);
+
         exchange.getIn().setBody(456);
         assertExpression("${bodyAs(Integer)}", 456);
         assertExpression("${bodyAs(int)}", 456);
@@ -178,6 +182,30 @@ public class SimpleTest extends Language
         }
     }
 
+    public void testMandatoryBodyAs() throws Exception {
+        assertExpression("${mandatoryBodyAs(String)}", "<hello id='m123'>world!</hello>");
+        assertExpression("${mandatoryBodyAs('String')}", "<hello id='m123'>world!</hello>");
+
+        exchange.getIn().setBody(null);
+        try {
+            assertExpression("${mandatoryBodyAs('String')}", "");
+        } catch (CamelExecutionException e) {
+            assertIsInstanceOf(InvalidPayloadException.class, e.getCause());
+        }
+
+        exchange.getIn().setBody(456);
+        assertExpression("${mandatoryBodyAs(Integer)}", 456);
+        assertExpression("${mandatoryBodyAs(int)}", 456);
+        assertExpression("${mandatoryBodyAs('int')}", 456);
+
+        try {
+            assertExpression("${mandatoryBodyAs(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");
 

Modified: camel/trunk/components/camel-groovy/src/test/java/org/apache/camel/language/groovy/GroovyLanguageTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-groovy/src/test/java/org/apache/camel/language/groovy/GroovyLanguageTest.java?rev=992991&r1=992990&r2=992991&view=diff
==============================================================================
--- camel/trunk/components/camel-groovy/src/test/java/org/apache/camel/language/groovy/GroovyLanguageTest.java (original)
+++ camel/trunk/components/camel-groovy/src/test/java/org/apache/camel/language/groovy/GroovyLanguageTest.java Mon Sep  6 10:32:31 2010
@@ -22,10 +22,11 @@ import org.apache.camel.LanguageTestSupp
  * @version $Revision$
  */
 public class GroovyLanguageTest extends LanguageTestSupport {
+
     public void testGroovyExpressions() throws Exception {
         assertExpression("exchange.in.headers.foo", "abc");
         assertExpression("request.headers.foo", "abc");
-        //assertExpression("headers.foo", "abc");
+        assertExpression("headers.foo", "abc");
     }
 
     protected String getLanguageName() {

Added: camel/trunk/components/camel-groovy/src/test/java/org/apache/camel/language/groovy/LanguageGroovyRouteTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-groovy/src/test/java/org/apache/camel/language/groovy/LanguageGroovyRouteTest.java?rev=992991&view=auto
==============================================================================
--- camel/trunk/components/camel-groovy/src/test/java/org/apache/camel/language/groovy/LanguageGroovyRouteTest.java (added)
+++ camel/trunk/components/camel-groovy/src/test/java/org/apache/camel/language/groovy/LanguageGroovyRouteTest.java Mon Sep  6 10:32:31 2010
@@ -0,0 +1,49 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.language.groovy;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+/**
+ * @version $Revision$
+ */
+public class LanguageGroovyRouteTest extends CamelTestSupport {
+
+    @Test
+    public void testLanguage() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived(6);
+
+        template.sendBody("direct:start", 3);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                // START SNIPPET: e1
+                from("direct:start").to("language:groovy:request.body * 2").to("mock:result");
+                // END SNIPPET: e1
+            }
+        };
+    }
+
+}

Propchange: camel/trunk/components/camel-groovy/src/test/java/org/apache/camel/language/groovy/LanguageGroovyRouteTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-groovy/src/test/java/org/apache/camel/language/groovy/LanguageGroovyRouteTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date