LibraryLink ToToggle FramesPrintFeedback

Languages for Expressions and Predicates

To provide greater flexibility when parsing and processing messages, FUSE Mediation Router supports language plug-ins for various scripting languages. For example, if an incoming message is formatted as XML, it is relatively easy to extract the contents of particular XML elements or attributes from the message using a language such as XPath. The FUSE Mediation Router implements script builder classes, which encapsulate the imported languages. Each language is accessed through a static method that takes a script expression as its argument, processes the current message using that script, and then returns an expression or a predicate. To be usable as an expression or a predicate, the script builder classes implement the following interfaces:

org.apache.camel.Expression<E>
org.apache.camel.Predicate<E>

In addition to this, the ScriptBuilder class (which wraps scripting languages such as JavaScript) inherits from the following interface:

org.apache.camel.Processor

This implies that the languages associated with the ScriptBuilder class can also be used as message processors (see Custom processor).

The simple language is a very limited expression language that is built into the router core. This language is useful when you need to eliminate dependencies on third-party libraries during testing; otherwise, you should use one of the other languages. To use the simple language in your application code, include the following import statement in your Java source files:

import static org.apache.camel.language.simple.SimpleLanguage.simple;

The simple language provides various elementary expressions that return different parts of a message exchange. For example, the expression, simple("header.timeOfDay"), would return the contents of a header called timeOfDay from the incoming message. You can also construct predicates by testing expressions for equality. For example, the predicate, simple("header.timeOfDay = '14:30'"), tests whether the timeOfDay header in the incoming message is equal to 14:30. Table 2.1 shows the list of elementary expressions supported by the simple language.


The xpath() static method parses message content using the XPath language (to learn about XPath, see the W3 Schools tutorial at http://www.w3schools.com/xpath/default.asp). To use the XPath language in your application code, include the following import statement in your Java source files:

import static org.apache.camel.builder.xml.XPathBuilder.xpath;

You can pass an XPath expression to xpath() as a string argument. The XPath expression implicitly acts on the message content and returns a node set as its result. Depending on the context, the return value is interpreted either as a predicate (where an empty node set is interpreted as false) or as an expression. For example, if you are processing an XML message with the following content:

<person user="paddington">
<firstName>Paddington</firstName>
<lastName>Bear</lastName>
<city>London</city>
</person>

Then you could choose which target endpoint to route the message to, based on the content of the city element, by using the following rule:

from("file:src/data?noop=true").
choice().
  when(xpath("/person/city = 'London'")).to("file:target/messages/uk").
  otherwise().to("file:target/messages/others");

Where the return value of xpath() is treated as a predicate in this example.

The xquery() static method parses message content using the XQuery language (to learn about XQuery, see the W3 Schools tutorial, http://www.w3schools.com/xquery/default.asp). XQuery is a superset of the XPath language; hence, any valid XPath expression is also a valid XQuery expression. To use the XQuery language in your application code, include the following import statement in your Java source files:

import static org.apache.camel.builder.saxon.XQueryBuilder.xquery;

You can pass an XQuery expression to xquery() in several ways. For simple expressions, you can pass the XQuery expressions as a string (java.lang.String). For longer XQuery expressions, you might prefer to store the expression in a file, which you can then reference by passing a java.io.File argument or a java.net.URL argument to the overloaded xquery() method. The XQuery expression implicitly acts on the message content and returns a node set as the result. Depending on the context, the return value is interpreted either as a predicate (where an empty node set is interpreted as false) or as an expression.

The sql() static method enables you to call on the JoSQL (SQL for Java objects) language to evaluate predicates and expressions in FUSE Mediation Router. JoSQL employs a SQL-like query syntax to perform selection and ordering operations on data from in-memory Java objects—however, JoSQL is not a database. In the JoSQL syntax, each Java object instance is treated like a table row and each object method is treated like a column name. Using this syntax, it is possible to construct powerful statements for extracting and compiling data from collections of Java objects. For details, see http://josql.sourceforge.net/.

To use the JoSQL language in your application code, include the following import statement in your Java source files:

import static org.apache.camel.builder.sql.SqlBuilder.sql;

The ognl() static method enables you to call on OGNL (Object Graph Navigation Language) expressions, which can then be used as predicates and expressions in a router rule. For details, see http://www.ognl.org/.

To use the OGNL language in your application code, include the following import statement in your Java source files:

import static org.apache.camel.language.ognl.OgnlExpression.ognl;

The el() static method enables you to call on the Unified Expression Language (EL) to construct predicates and expressions in a router rule. The EL was originally specified as part of the JSP 2.1 standard (JSR-245), but it is now available as a standalone language. FUSE Mediation Router integrates with JUEL (http://juel.sourceforge.net/), which is an open source implementation of the EL language.

To use the EL language in your application code, include the following import statement in your Java source files:

import static org.apache.camel.language.juel.JuelExpression.el;

The groovy() static method enables you to call on the Groovy scripting language to construct predicates and expressions in a route. To use the Groovy language in your application code, include the following import statement in your Java source files:

import static org.apache.camel.builder.camel.script.ScriptBuilder.*;

The javaScript() static method enables you to call on the JavaScript scripting language to construct predicates and expressions in a route. To use the JavaScript language in your application code, include the following import statement in your Java source files:

import static org.apache.camel.builder.camel.script.ScriptBuilder.*;

The php() static method enables you to call on the PHP scripting language to construct predicates and expressions in a route. To use the PHP language in your application code, include the following import statement in your Java source files:

import static org.apache.camel.builder.camel.script.ScriptBuilder.*;

The python() static method enables you to call on the Python scripting language to construct predicates and expressions in a route. To use the Python language in your application code, include the following import statement in your Java source files:

import static org.apache.camel.builder.camel.script.ScriptBuilder.*;

The ruby() static method enables you to call on the Ruby scripting language to construct predicates and expressions in a route. To use the Ruby language in your application code, include the following import statement in your Java source files:

import static org.apache.camel.builder.camel.script.ScriptBuilder.*;

You can also use Java beans to evaluate predicates and expressions. For example, to evaluate the predicate on a filter using the isGoldCustomer() method on the bean instance, myBean, you can use a rule like the following:

from("SourceURL")
  .filter().method("myBean", "isGoldCustomer")
  .to("TargetURL");

A discussion of bean integration in FUSE Mediation Router is beyond the scope of this Defining Routes guide. For details, see http://activemq.apache.org/camel/bean-language.html.