[[JavaDSL-JavaDSL]]
Java DSL
~~~~~~~~

Apache Camel offers a Java based DSL using the fluent builder style. The
Java DSL is available by extending the
link:routebuilder.html[RouteBuilder] class, and implement the
`configure` method.

This is best illustrate by an example. In the code below we create a new
class called `MyRouteBuilder` that extends the
`org.apache.camel.builder.RouteBuilder` from Camel. +
 In the `configure` method the Java DSL is at our disposal.

[source,java]
-------------------------------------------------------------------------
import org.apache.camel.builder.RouteBuilder;

/**
 * A Camel Java DSL Router
 */
public class MyRouteBuilder extends RouteBuilder {

    /**
     * Let's configure the Camel routing rules using Java code...
     */
    public void configure() {

        // here is a sample which processes the input files
        // (leaving them in place - see the 'noop' flag)
        // then performs content based routing on the message using XPath
        from("file:src/data?noop=true")
            .choice()
                .when(xpath("/person/city = 'London'"))
                    .to("file:target/messages/uk")
                .otherwise()
                    .to("file:target/messages/others");
    }

}
-------------------------------------------------------------------------

In the `configure` method we can define Camel link:routes.html[Routes].
In the example above we have a single route, which pickup
https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=CAMEL&title=File&linkCreation=true&fromPageId=30747520[File]s,
(eg the from).

[source,java]
---------------------------------------
        from("file:src/data?noop=true")
---------------------------------------

Then we use the link:content-based-router.html[Content Based Router] (eg
the choice) to route the message depending if the person is from London
or not.

[source,java]
-------------------------------------------------------
            .choice()
                .when(xpath("/person/city = 'London'"))
                    .to("file:target/messages/uk")
                .otherwise()
                    .to("file:target/messages/others");
-------------------------------------------------------

[[JavaDSL-Routes]]
Routes
~~~~~~

Camel supports the definition of routing rules using a Java
link:dsl.html[DSL] (domain specific language) which avoids the need for
cumbersome XML using a link:routebuilder.html[RouteBuilder].

For example a simple route can be created as follows.

[source,java]
-------------------------------------------------------
RouteBuilder builder = new RouteBuilder() {
    public void configure() {
        errorHandler(deadLetterChannel("mock:error"));
 
        from("direct:a").to("direct:b");
    }
};
-------------------------------------------------------

As you can see from the above Camel uses link:uris.html[URIs] to wire
endpoints together.

[[JavaDSL-URIStringformatting]]
URI String formatting
^^^^^^^^^^^^^^^^^^^^^

*Available as of Camel 2.0*

If you have endpoint URIs that accept options and you want to be able to
substitute the value, e.g. build the URI by concat the strings together,
then you can use the `java.lang.String.format` method. But in Camel 2.0
we have added two convenient methods in the Java DSL so you can do
`fromF` and `toF` that uses String formatting to build the URI.

[source,java]
-------------------------------------------------------
from("direct:start").toF("file://%s?fileName=%s", path, name);
 
fromF("file://%s?include=%s", path, pattern).toF("mock:%s", result);
-------------------------------------------------------

[[JavaDSL-Filters]]
Filters
^^^^^^^

You can combine simple routes with filters which can be arbitrary
link:predicate.html[Predicate] implementations.

[source,java]
-------------------------------------------------------
RouteBuilder builder = new RouteBuilder() {
    public void configure() {
        errorHandler(deadLetterChannel("mock:error"));
 
        from("direct:a")
            .filter(header("foo").isEqualTo("bar"))
                .to("direct:b");
    }
};
-------------------------------------------------------

[[JavaDSL-Choices]]
Choices
^^^^^^^

With a choice you provide a list of predicates and outcomes along with
an optional default otherwise clause which is invoked if none of the
conditions are met.

[source,java]
-------------------------------------------------------
RouteBuilder builder = new RouteBuilder() {
    public void configure() {
        errorHandler(deadLetterChannel("mock:error"));
 
        from("direct:a")
            .choice()
                .when(header("foo").isEqualTo("bar"))
                    .to("direct:b")
                .when(header("foo").isEqualTo("cheese"))
                    .to("direct:c")
                .otherwise()
                    .to("direct:d");
    }
};
-------------------------------------------------------

[[JavaDSL-Usingacustomprocessor]]
Using a custom processor
++++++++++++++++++++++++

Here is an example of using a custom link:processor.html[Processor]

[source,java]
-------------------------------------------------------
myProcessor = new Processor() {
    public void process(Exchange exchange) {
        log.debug("Called with exchange: " + exchange);
    }
};
 
RouteBuilder builder = new RouteBuilder() {
    public void configure() {
        errorHandler(deadLetterChannel("mock:error"));
 
        from("direct:a")
            .process(myProcessor);
    }
};
-------------------------------------------------------

You can mix and match custom processors with filters and choices.

[source,java]
-------------------------------------------------------
RouteBuilder builder = new RouteBuilder() {
    public void configure() {
        errorHandler(deadLetterChannel("mock:error"));
 
        from("direct:a")
            .filter(header("foo").isEqualTo("bar"))
                .process(myProcessor);
    }
};
-------------------------------------------------------

[[JavaDSL-SeeAlso]]
See Also
^^^^^^^^

* link:dsl.html[DSL]
* link:examples.html[Examples]

