## JavaScript Language

*Available as of Camel version 1.0*

Camel supports
http://en.wikipedia.org/wiki/JavaScript[JavaScript/ECMAScript] among
other link:scripting-languages.html[Scripting Languages] to allow an
link:expression.html[Expression] or link:predicate.html[Predicate] to be
used in the link:dsl.html[DSL] or link:xml-configuration.html[Xml
Configuration].

To use a JavaScript expression use the following Java code

[source,java]
-----------------------------------------------
... javaScript("someJavaScriptExpression") ... 
-----------------------------------------------

For example you could use the *javaScript* function to create an
link:predicate.html[Predicate] in a link:message-filter.html[Message
Filter] or as an link:expression.html[Expression] for a
link:recipient-list.html[Recipient List]

### Javascript Language Options

// language options: START
The JavaScript language supports 1 options which are listed below.



[width="100%",cols="2,1m,1m,6",options="header"]
|=======================================================================
| Name | Default | Java Type | Description
| trim | true | Boolean | Whether to trim the value to remove leading and trailing whitespaces and line breaks
|=======================================================================
// language options: END

### Example

In the sample below we use JavaScript to create a
link:predicate.html[Predicate] use in the route path, to route exchanges
from admin users to a special queue.

[source,java]
----------------------------------------------------------------------------------------------
    from("direct:start")
        .choice()
            .when().javaScript("request.headers.get('user') == 'admin'").to("seda:adminQueue")
        .otherwise()
            .to("seda:regularQueue");
----------------------------------------------------------------------------------------------

And a Spring DSL sample as well:

[source,xml]
-------------------------------------------------------------------------------
    <route>
        <from uri="direct:start"/>
        <choice>
            <when>
                <javaScript>request.headers.get('user') == 'admin'</javaScript>
                <to uri="seda:adminQueue"/>
            </when>
            <otherwise>
                <to uri="seda:regularQueue"/>
            </otherwise>
        </choice>
    </route>
-------------------------------------------------------------------------------

### ScriptContext

The JSR-223 scripting languages ScriptContext is pre configured with the
following attributes all set at `ENGINE_SCOPE`:

[width="100%",cols="10%,10%,80%",options="header",]
|=======================================================================
|Attribute |Type |Value

|context |`org.apache.camel.CamelContext` |The Camel Context ( It cannot be used in groovy)

|camelContext |`org.apache.camel.CamelContext` |The Camel Context

|exchange |`org.apache.camel.Exchange` |The current Exchange

|request |`org.apache.camel.Message` |The message (IN message)

|response |`org.apache.camel.Message` |*Deprecated*: The OUT message. The OUT message if null by default. Use
IN message instead.

|properties |`org.apache.camel.builder.script.PropertiesFunction` |*Camel 2.9:* Function with a `resolve` method to make it easier to use
Camels link:properties.html[Properties] component from scripts. See
further below for example.
|=======================================================================

See link:scripting-languages.html[Scripting Languages] for the list of
languages with explicit DSL support.

### Additional arguments to ScriptingEngine

*Available as of Camel 2.8*

You can provide additional arguments to the `ScriptingEngine` using a
header on the Camel message with the key `CamelScriptArguments`. +
 See this example:

### Using properties function

*Available as of Camel 2.9*

If you need to use the link:properties.html[Properties] component from a
script to lookup property placeholders, then its a bit cumbersome to do
so. +
 For example to set a header name myHeader with a value from a property
placeholder, which key is provided in a header named "foo".

[source,java]
{% raw %}
--------------------------------------------------------------------------------------------------------------
.setHeader("myHeader").groovy("context.resolvePropertyPlaceholders('{{' + request.headers.get('foo') + '}}')")
--------------------------------------------------------------------------------------------------------------
{% endraw %}

From Camel 2.9 onwards you can now use the properties function and the
same example is simpler:

[source,java]
-------------------------------------------------------------------------------
.setHeader("myHeader").groovy("properties.resolve(request.headers.get('foo'))")
-------------------------------------------------------------------------------

### Loading script from external resource

*Available as of Camel 2.11*

You can externalize the script and have Camel load it from a resource
such as `"classpath:"`, `"file:"`, or `"http:"`. +
 This is done using the following syntax: `"resource:scheme:location"`,
eg to refer to a file on the classpath you can do:

[source,java]
-------------------------------------------------------------------
.setHeader("myHeader").groovy("resource:classpath:mygroovy.groovy")
-------------------------------------------------------------------

### How to get the result from multiple statements script

*Available as of Camel 2.14*

As the scripteengine evale method just return a Null if it runs a
multiple statments script. Camel now look up the value of script result
by using the key of "result" from the value set. If you have multiple
statements script, you need to make sure you set the value of result
variable as the script return value.

[source,text]
-------------------------------------------------------------
bar = "baz";
# some other statements ... 
# camel take the result value as the script evaluation result
result = body * 2 + 1
-------------------------------------------------------------

 

### Dependencies

To use scripting languages in your camel routes you need to add the a
dependency on *camel-script* which integrates the JSR-223 scripting
engine.

If you use maven you could just add the following to your pom.xml,
substituting the version number for the latest & greatest release (see
link:download.html[the download page for the latest versions]).

[source,xml]
---------------------------------------
<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-script</artifactId>
  <version>x.x.x</version>
</dependency>
---------------------------------------
