[[Kura-EclipseKuracomponent]]
= Eclipse Kura component
:page-source: components/camel-kura/src/main/docs/kura.adoc

*Since Camel 2.15*

This documentation page covers the integration options of Camel with the
https://eclipse.org/kura/[Eclipse Kura] M2M gateway. The common reason
to deploy Camel routes into the Eclipse Kura is to provide enterprise
integration patterns and Camel components to the messaging M2M gateway.
For example you might want to install Kura on Raspberry PI, then read
temperature from the sensor attached to that Raspberry PI using Kura
services and finally forward the current temperature value to your data
center service using Camel EIP and components.

[[Kura-KuraRouteractivator]]
== KuraRouter activator

Bundles deployed to the Eclipse Kura are usually
http://eclipse.github.io/kura/doc/hello-example.html#create-java-class[developed
as bundle activators]. So the easiest way to deploy Apache Camel routes
into the Kura is to create an OSGi bundle containing the class extending
`org.apache.camel.kura.KuraRouter` class:

[source,java]
-------------------------------------------------------
public class MyKuraRouter extends KuraRouter {

  @Override
  public void configure() throws Exception {
    from("timer:trigger").
      to("netty-http:http://app.mydatacenter.com/api");
  }

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

Keep in mind that `KuraRouter` implements
the `org.osgi.framework.BundleActivator` interface, so you need to
register its `start` and `stop` lifecycle methods
while http://eclipse.github.io/kura/doc/hello-example.html#create-component-class[creating
Kura bundle component class].

Kura router starts its own OSGi-aware `CamelContext`. It means that for
every class extending `KuraRouter`, there will be a dedicated
`CamelContext` instance. Ideally we recommend to deploy one `KuraRouter`
per OSGi bundle.

[[Kura-DeployingKuraRouter]]
=== Deploying KuraRouter

Bundle containing your Kura router class should import the following
packages in the OSGi manifest:

[source,xml]
--------------------------------------------------------------------------------------------------------------------
Import-Package: org.osgi.framework;version="1.3.0",
  org.slf4j;version="1.6.4",
  org.apache.camel,org.apache.camel.impl,org.apache.camel.core.osgi,org.apache.camel.builder,org.apache.camel.model,
  org.apache.camel.component.kura
--------------------------------------------------------------------------------------------------------------------

Keep in mind that you don't have to import every Camel component bundle
you plan to use in your routes, as Camel components are resolved as the
services on the runtime level.

Before you deploy your router bundle, be sure that you have deployed
(and started) the following Camel core bundles (using Kura GoGo
shell)...

[source,xml]
-----------------------------------------------------------------------------------------------------------
install file:///home/user/.m2/repository/org/apache/camel/camel-core/2.15.0/camel-core-2.15.0.jar
start <camel-core-bundle-id>
install file:///home/user/.m2/repository/org/apache/camel/camel-core-osgi/2.15.0/camel-core-osgi-2.15.0.jar
start <camel-core-osgi-bundle-id>
install file:///home/user/.m2/repository/org/apache/camel/camel-kura/2.15.0/camel-kura-2.15.0.jar 
start <camel-kura-bundle-id>
-----------------------------------------------------------------------------------------------------------

...and all the components you plan to use in your routes:

[source,xml]
-----------------------------------------------------------------------------------------------------
install file:///home/user/.m2/repository/org/apache/camel/camel-stream/2.15.0/camel-stream-2.15.0.jar
start <camel-stream-bundle-id>
-----------------------------------------------------------------------------------------------------

Then finally deploy your router bundle:

[source,xml]
----------------------------------------------------------------------------------
install file:///home/user/.m2/repository/com/example/myrouter/1.0/myrouter-1.0.jar
start <your-bundle-id>
----------------------------------------------------------------------------------

[[Kura-KuraRouterutilities]]
=== KuraRouter utilities 

 Kura router base class provides many useful utilities. This section
explores each of them.

[[Kura-SLF4Jlogger]]
==== SLF4J logger

Kura uses SLF4J facade for logging purposes. Protected member `log`
returns SLF4J logger instance associated with the given Kura router.

[source,java]
----------------------------------------------
public class MyKuraRouter extends KuraRouter {

    @Override
    public void configure() throws Exception {
        log.info("Configuring Camel routes!");
        ...
    }

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

[[Kura-BundleContext]]
==== BundleContext

Protected member `bundleContext` returns bundle context associated with
the given Kura router.

[source,java]
---------------------------------------------------------------------------------------------------------------
public class MyKuraRouter extends KuraRouter {

    @Override
    public void configure() throws Exception {
        ServiceReference<MyService> serviceRef = bundleContext.getServiceReference(LogService.class.getName());
        MyService myService = bundleContext.getService(serviceRef);
        ...
    }

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

[[Kura-CamelContext]]
==== CamelContext

Protected member `camelContext` is the `CamelContext` associated with
the given Kura router.

[source,java]
----------------------------------------------
public class MyKuraRouter extends KuraRouter {

    @Override
    public void configure() throws Exception {
        camelContext.getStatus();
        ...
    }

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

[[Kura-ProducerTemplate]]
==== ProducerTemplate

Protected member `producerTemplate` is the `ProducerTemplate` instance
associated with the given Camel context.

[source,java]
-----------------------------------------------------------
public class MyKuraRouter extends KuraRouter {

    @Override
    public void configure() throws Exception {
        producerTemplate.sendBody("jms:temperature", 22.0);
        ...
    }

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

[[Kura-ConsumerTemplate]]
==== ConsumerTemplate

Protected member `consumerTemplate` is the `ConsumerTemplate` instance
associated with the given Camel context.

[source,java]
--------------------------------------------------------------------------------------------------
public class MyKuraRouter extends KuraRouter {

    @Override
    public void configure() throws Exception {
        double currentTemperature = producerTemplate.receiveBody("jms:temperature", Double.class);
        ...
    }

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

[[Kura-OSGiserviceresolver]]
==== OSGi service resolver

OSGi service resolver (`service(Class<T> serviceType)`) can be used to
easily retrieve service by type from the OSGi bundle context.

[source,java]
-------------------------------------------------------
public class MyKuraRouter extends KuraRouter {

    @Override
    public void configure() throws Exception {
        MyService myService = service(MyService.class);
        ...
    }

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

If service is not found, a `null` value is returned. If you want your
application to fail if the service is not available, use
`requiredService(Class)` method instead. The `requiredService` throws
`IllegalStateException` if a service cannot be found.

[source,java]
---------------------------------------------------------------
public class MyKuraRouter extends KuraRouter {

    @Override
    public void configure() throws Exception {
        MyService myService = requiredService(MyService.class);
        ...
    }

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

[[Kura-KuraRouteractivatorcallbacks]]
=== KuraRouter activator callbacks

Kura router comes with the lifecycle callbacks that can be used to
customize the way the Camel router works. For example to configure the
`CamelContext` instance associated with the router just before the
former is started, override `beforeStart` method of the `KuraRouter`
class:

[source,java]
--------------------------------------------------------------------------
public class MyKuraRouter extends KuraRouter {
 
  ...

  protected void beforeStart(CamelContext camelContext) {
    OsgiDefaultCamelContext osgiContext = (OsgiCamelContext) camelContext;
    osgiContext.setName("NameOfTheRouter");
  }

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

[[Kura-LoadingXMLroutesfromConfigurationAdmin]]
=== Loading XML routes from ConfigurationAdmin

Sometimes it is desired to read the XML definition of the routes from
the server configuration. This a common scenario for IoT gateways where
over-the-air redeployment cost may be significant. To address this
requirement each `KuraRouter` looks for the
`kura.camel.BUNDLE-SYMBOLIC-NAME.route` property from the `kura.camel`
PID using the OSGi ConfigurationAdmin. This approach allows you to
define Camel XML routes file per deployed `KuraRouter`. In order to
update a route, just edit an appropriate configuration property and
restart a bundle associated with it. The content of
the `kura.camel.BUNDLE-SYMBOLIC-NAME.route` property is expected to be
Camel XML route file, for example:

[source,java]
------------------------------------------------------
<routes xmlns="http://camel.apache.org/schema/spring">
    <route id="loaded">
        <from uri="direct:bar"/>
        <to uri="mock:bar"/>
    </route>
</routes>
------------------------------------------------------

 

[[Kura-DeployingKurarouterasadeclarativeOSGiservice]]
=== Deploying Kura router as a declarative OSGi service

If you would like to deploy your Kura router as a declarative OSGi
service, you can use `activate` and `deactivate` methods provided by
`KuraRouter`.

[source,java]
----------------------------------------------------------------------------------------------------------------------------------------------
<scr:component name="org.eclipse.kura.example.camel.MyKuraRouter" activate="activate" deactivate="deactivate" enabled="true" immediate="true">
  <implementation class="org.eclipse.kura.example.camel.MyKuraRouter"/>
</scr:component>
----------------------------------------------------------------------------------------------------------------------------------------------

