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 +}