Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

A number of example Camel Routes are available in the fcrepo-camel project, along with numerous production-ready projects in fcrepo-camel-toolbox. Below are some additional Camel Routes to get you started.

LDPath Transformations

If an fcr:transform program has been installed as mytransform, you can generate a JSON representation of a container and send it to a low-latency, highly available document store, such as Riak. The following route determines if a container has been removed or simply added/updated. It then routes the message appropriately to a load-balancer sitting in front of the Riak HTTP endpoint.

...

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
val riakKeyProcessor = (exchange: Exchange) => {
    exchange.getIn.setHeader(
        Exchange.HTTP_PATH,
        "/buckets/fcrepo/keys/" + URLEncoder.encode(exchange.getIn.getHeader("org.fcrepo.jms.identifier", classOf[String]))
    )
}
 
"activemq:topic:fedora" ==> {
    choice() {
        when(_.in("org.fcrepo.jms.eventType"== "http://fedora.info/definitions/v4/repository#NODE_REMOVED") {
            setHeader(Exchange.HTTP_METHOD, constant("DELETE"))
            process(riakKeyProcessor)
            to("http4:localhost:8098")
        }
        otherwise() {
            to("fcrepo:localhost:8080/fedora/rest")
            filter(xpathFilter) {
                to("fcrepo:localhost:8080/fedora/rest?accept=application/json&transform=mytransform")
                setHeader(Exchange.HTTP_METHOD, constant("PUT"))
                process(riakKeyProcessor)
                to("http4:localhost:8098")
            }
        }
    }
}

 

External Triplestore

Some additional processing must be done to transform an application/n-triples response into a validapplication/sparql-update payload before sending to an external triplestore such as Fuseki or Sesame. The fcrepo component contains some processors in org.fcrepo.camel.processor to handle this case. The examples below assume that messages have already been routed based on eventType (see below) and passed to the appropriate queue.

...

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from("direct:delete")
  .process(new SparqlDescribeProcessor())
  .to("http4:localhost:3030/db/query")
  .process(new SparqlDeleteProcessor())
  .to("http4:localhost:3030/db/update");
 
from("direct:new")
 .to("fcrepo:localhost:8080/rest")
 .process(new SparqlInsertProcessor())
 .to("http4:localhost:3030/db/update");
 
from("direct:update")
  .to("fcrepo:localhost:8080/rest")
  .process(new SparqlUpdateProcessor())
  .to("http4:localhost:3030/db/update");

 

Event-based Routing

It is often helpful to route messages to different queues based on the eventType value. This example splits messages oneventType values and routes the messages to appropriate queues. Following this example, it would be prudent to aggregate the messages based on org.fcrepo.jms.identifier value after retrieving the messages from the downstream queues.

...