Author: davsclaus
Date: Sun May 29 09:05:19 2011
New Revision: 1128842

URL: http://svn.apache.org/viewvc?rev=1128842&view=rev
Log:
CAMEL-3964: Added support for providing arguments to script engine from message 
header. Thanks to Teiva for the patch.

Modified:
    
camel/trunk/components/camel-script/src/main/java/org/apache/camel/builder/script/ScriptBuilder.java
    
camel/trunk/components/camel-script/src/test/java/org/apache/camel/builder/script/JavaScriptExpressionTest.java

Modified: 
camel/trunk/components/camel-script/src/main/java/org/apache/camel/builder/script/ScriptBuilder.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-script/src/main/java/org/apache/camel/builder/script/ScriptBuilder.java?rev=1128842&r1=1128841&r2=1128842&view=diff
==============================================================================
--- 
camel/trunk/components/camel-script/src/main/java/org/apache/camel/builder/script/ScriptBuilder.java
 (original)
+++ 
camel/trunk/components/camel-script/src/main/java/org/apache/camel/builder/script/ScriptBuilder.java
 Sun May 29 09:05:19 2011
@@ -21,6 +21,7 @@ import java.io.IOException;
 import java.io.InputStreamReader;
 import java.lang.reflect.Method;
 import java.net.URL;
+import java.util.Map;
 
 import javax.script.Compilable;
 import javax.script.CompiledScript;
@@ -34,7 +35,7 @@ import org.apache.camel.Expression;
 import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
 import org.apache.camel.converter.ObjectConverter;
-import org.apache.camel.spi.ScriptEngineResolver;
+import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.core.io.FileSystemResource;
@@ -48,6 +49,13 @@ import org.springframework.core.io.UrlRe
  * @version 
  */
 public class ScriptBuilder implements Expression, Predicate, Processor {
+
+    /**
+     * Additional arguments to {@link ScriptEngine} provided as a header on 
the IN {@link org.apache.camel.Message}
+     * using the key {@link #ARGUMENTS}
+     */
+    public static final String ARGUMENTS = "CamelScriptArguments";
+
     private static final transient Logger LOG = 
LoggerFactory.getLogger(ScriptBuilder.class);
 
     private String scriptEngineName;
@@ -524,6 +532,7 @@ public class ScriptBuilder implements Ex
         try {
             getScriptContext();
             populateBindings(getEngine(), exchange);
+            addScriptEngineArguments(getEngine(), exchange);
             Object result = runScript();
             if (LOG.isDebugEnabled()) {
                 LOG.debug("The script evaluation result is: " + result);
@@ -565,6 +574,25 @@ public class ScriptBuilder implements Ex
         }
     }
 
+    @SuppressWarnings("unchecked")
+    protected void addScriptEngineArguments(ScriptEngine engine, Exchange 
exchange) {
+        if (!exchange.getIn().hasHeaders()) {
+            return;
+        }
+
+        Map<Object, Object> args = exchange.getIn().getHeader(ARGUMENTS, 
Map.class);
+        if (args != null) {
+            for (Map.Entry<Object, Object> entry : args.entrySet()) {
+                String key = 
exchange.getContext().getTypeConverter().convertTo(String.class, 
entry.getKey());
+                Object value = entry.getValue();
+                if (!ObjectHelper.isEmpty(key) && value != null) {
+                    LOG.trace("Putting {} -> {} on ScriptEngine", key, value);
+                    engine.put(key, value);
+                }
+            }
+        }
+    }
+
     protected InputStreamReader createScriptReader() throws IOException {
         // TODO consider character sets?
         return new InputStreamReader(scriptResource.getInputStream());

Modified: 
camel/trunk/components/camel-script/src/test/java/org/apache/camel/builder/script/JavaScriptExpressionTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-script/src/test/java/org/apache/camel/builder/script/JavaScriptExpressionTest.java?rev=1128842&r1=1128841&r2=1128842&view=diff
==============================================================================
--- 
camel/trunk/components/camel-script/src/test/java/org/apache/camel/builder/script/JavaScriptExpressionTest.java
 (original)
+++ 
camel/trunk/components/camel-script/src/test/java/org/apache/camel/builder/script/JavaScriptExpressionTest.java
 Sun May 29 09:05:19 2011
@@ -29,7 +29,7 @@ import org.junit.Test;
  * Tests a routing expression using JavaScript
  */
 public class JavaScriptExpressionTest extends CamelTestSupport {
-    
+
     @Test
     public void testSendMatchingMessage() throws Exception {
         if (!ScriptTestHelper.canRunTestOnThisPlatform()) {
@@ -65,6 +65,88 @@ public class JavaScriptExpressionTest ex
         assertMockEndpointsSatisfied();
     }
 
+    @Test
+    // START SNIPPET: e1
+    public void testArgumentsExample() throws Exception {
+        if (!ScriptTestHelper.canRunTestOnThisPlatform()) {
+            return;
+        }
+
+        getMockEndpoint("mock:result").expectedMessageCount(0);
+        getMockEndpoint("mock:unmatched").expectedMessageCount(1);
+
+        // additional arguments to ScriptEngine
+        Map<String, Object> arguments = new HashMap<String, Object>();
+        arguments.put("foo", "bar");
+        arguments.put("baz", 7);
+
+        // those additional arguments is provided as a header on the Camel 
Message
+        template.sendBodyAndHeader("direct:start", "hello", 
ScriptBuilder.ARGUMENTS, arguments);
+
+        assertMockEndpointsSatisfied();
+    }
+    // END SNIPPET: e1
+
+    @Test
+    public void testArgumentsWithStringMap() throws Exception {
+        if (!ScriptTestHelper.canRunTestOnThisPlatform()) {
+            return;
+        }
+
+        getMockEndpoint("mock:result").expectedMessageCount(0);
+        getMockEndpoint("mock:unmatched").expectedMessageCount(1);
+
+        Map<String, Object> headers = new HashMap<String, Object>();
+        Map<String, Object> arguments = new HashMap<String, Object>();
+        arguments.put("foo", "bar");
+        arguments.put("baz", 7);
+        arguments.put("", "foo");
+        arguments.put(null, "bar");
+        headers.put(ScriptBuilder.ARGUMENTS, arguments);
+
+        sendBody("direct:start", "hello", headers);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
+    public void testArgumentsWithIntegerMap() throws Exception {
+        if (!ScriptTestHelper.canRunTestOnThisPlatform()) {
+            return;
+        }
+
+        getMockEndpoint("mock:result").expectedMessageCount(0);
+        getMockEndpoint("mock:unmatched").expectedMessageCount(1);
+
+        Map<String, Object> headers = new HashMap<String, Object>();
+        Map<Integer, Object> arguments = new HashMap<Integer, Object>();
+        arguments.put(0, "bar");
+        arguments.put(1, 7);
+        headers.put(ScriptBuilder.ARGUMENTS, arguments);
+
+        sendBody("direct:start", "hello", headers);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
+    public void testArgumentsWithNonMap() throws Exception {
+        if (!ScriptTestHelper.canRunTestOnThisPlatform()) {
+            return;
+        }
+
+        getMockEndpoint("mock:result").expectedMessageCount(0);
+        getMockEndpoint("mock:unmatched").expectedMessageCount(1);
+
+        Map<String, Object> headers = new HashMap<String, Object>();
+        String arguments = "foo";
+        headers.put(ScriptBuilder.ARGUMENTS, arguments);
+
+        sendBody("direct:start", "hello", headers);
+
+        assertMockEndpointsSatisfied();
+    }
+
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
             public void configure() throws Exception {
@@ -74,4 +156,4 @@ public class JavaScriptExpressionTest ex
             }
         };
     }
-}
\ No newline at end of file
+}


Reply via email to