[[Grape-GrapeComponent]]
Grape Component
~~~~~~~~~~~~~~~

Available as of Camel 2.16 

http://docs.groovy-lang.org/latest/html/documentation/grape.html[Grape]
component allows you to fetch, load and manage additional jars when
`CamelContext` is running. In practice with Camel Grape component you
can add new components, data formats and beans to your `CamelContext`
without the restart of the router.


[[Grape-Options]]
Grape options
^^^^^^^^^^^^^

// component options: START
The Grape component has no options.
// component options: END


// endpoint options: START
The Grape component supports 3 endpoint options which are listed below:

{% raw %}
[width="100%",cols="2,1,1m,1m,5",options="header"]
|=======================================================================
| Name | Group | Default | Java Type | Description
| defaultCoordinates |  |  | String | *Required* Maven coordinates to use as default to grab if the message body is empty.
| exchangePattern |  | InOnly | ExchangePattern | Sets the default exchange pattern when creating an exchange.
| synchronous |  | false | boolean | Sets whether synchronous processing should be strictly used or Camel is allowed to use asynchronous processing (if supported).
|=======================================================================
{% endraw %}
// endpoint options: END



[[Grape-Settingupclassloader]]
Setting up class loader
^^^^^^^^^^^^^^^^^^^^^^^

Grape requires using Groovy class loader with the `CamelContext`. You
can enable Groovy class loading on the existing Camel Context using the
`GrapeComponent#grapeCamelContext()` method:

[source,java]
--------------------------------------------------------------------------------
import static org.apache.camel.component.grape.GrapeComponent.grapeCamelContext;
...
CamelContext camelContext = grapeCamelContext(new DefaultCamelContext());
--------------------------------------------------------------------------------

You can also set up the Groovy class loader used be Camel context by
yourself:

[source,java]
------------------------------------------------------------------------------------
camelContext.setApplicationContextClassLoader(new GroovyClassLoader(myClassLoader));
------------------------------------------------------------------------------------

[[Grape-URIformat]]
URI format
^^^^^^^^^^

Grape component supports only producer endpoints.

[source,java]
-----------------------------
grape:defaultMavenCoordinates
-----------------------------

For example the following snippet loads Camel FTP component:

[source,java]
------------------------------------------------
from("direct:loadCamelFTP").
  to("grape:org.apache.camel/camel-ftp/2.15.2");
------------------------------------------------

You can also specify the Maven coordinates by sending them to the
endpoint as the exchange body:

[source,java]
----------------------------------------------------------
from("direct:loadCamelFTP").
  setBody().constant("org.apache.camel/camel-ftp/2.15.2").
  to("grape:defaultMavenCoordinates");
----------------------------------------------------------

[[Grape-AddingtheGrapecomponenttotheproject]]
Adding the Grape component to the project
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Maven users will need to add the following dependency to their `pom.xml`
for this component:

[source,xml]
------------------------------------------------------------
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-grape</artifactId>
    <version>x.y.z</version>
    <!-- use the same version as your Camel core version -->
</dependency>
------------------------------------------------------------

[[Grape-Defaultpayloadtype]]
Default payload type
^^^^^^^^^^^^^^^^^^^^

By default Camel Grape component operates on the String payloads:

[source,java]
------------------------------------------------------------------------------------------------
producerTemplate.sendBody("grape:defaultMavenCoordinates", "org.apache.camel/camel-ftp/2.15.2");
------------------------------------------------------------------------------------------------

But of course Camel build-in link:type-converter.html[type conversion
API] can perform the automatic data type transformations for you. In the
example below Camel automatically converts binary payload into the
String:

 

[source,java]
-----------------------------------------------------------------------------------------------------------
producerTemplate.sendBody("grape:defaultMavenCoordinates", "org.apache.camel/camel-ftp/2.15.2".getBytes());
-----------------------------------------------------------------------------------------------------------

[[Grape-Headers]]
Headers
^^^^^^^

The following headers are recognized by the Grape component:

[width="100%",cols="10%,10%,10%,10%,60%",options="header",]
|=======================================================================
|Header |Java constant |Endpoint type |Value type |Description

|`CamelGrapeCommand` |`GrapeConstants.GRAPE_COMMAND` |Producer |`org.apache.camel.component.grape.GrapeCommand` |The command to be performed by the Grape endpoint. Default to `grab`.
|=======================================================================

[[Grape-Loadingcomponentsatruntime]]
Loading components at runtime
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

In order to load the new component at the router runtime, just grab the
jar containing the given component:

[source,java]
-------------------------------------------------------------------------
ProducerTemplate template = camelContext.createProducerTemplate();
template.sendBody("grape:grape", "org.apache.camel/camel-stream/2.15.2");
template.sendBody("stream:out", "msg");
-------------------------------------------------------------------------

[[Grape-Loadingprocessorsbeanatruntime]]
Loading processors bean at runtime
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

In order to load the new processor bean  with your custom business login
at the router runtime, just grab the jar containing the required bean:

[source,java]
-----------------------------------------------------------------------------------------------------------------
ProducerTemplate template = camelContext.createProducerTemplate();
template.sendBody("grape:grape", "com.example/my-business-processors/1.0");
int productId = 1;
int price = template.requestBody("bean:com.example.PricingBean?method=currentProductPrice", productId, int.class)
-----------------------------------------------------------------------------------------------------------------

 

[[Grape-LoadingdeployedjarsafterCamelcontextrestart]]
Loading deployed jars after Camel context restart
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

After you download new jar, you usually would like to have it loaded by
the Camel again after the restart of the `CamelContext`. It is certainly
possible, as Grape component keeps track of the jar files you have
installed. In order to load again the installed jars on the context
startup, use the `GrapeEndpoint.loadPatches()` method in your route: 

 

[source,java]
-------------------------------------------------------------------------
import static org.apache.camel.component.grape.GrapeEndpoint.loadPatches;

... 
camelContext.addRoutes(
  new RouteBuilder() { 
    @Override 
    public void configure() throws Exception { 
      loadPatches(camelContext);
 
      from("direct:loadCamelFTP").
        to("grape:org.apache.camel/camel-ftp/2.15.2"); 
    }
  });
-------------------------------------------------------------------------

 

[[Grape-Managingtheinstalledjars]]
Managing the installed jars
^^^^^^^^^^^^^^^^^^^^^^^^^^^

If you would like to check what jars have been installed into the given
`CamelContext`, send message to the grape endpoint with
the `CamelGrapeCommand` header set to `GrapeCommand.listPatches`:

[source,java]
----------------------------------------------------------------------------------------
      from("netty-http4:http://0.0.0.0:80/patches").
        setHeader(GrapeConstats.GRAPE_COMMAND, constant(CamelGrapeCommand.listPatches)).
        to("grape:list"); 
----------------------------------------------------------------------------------------

Connecting the to the route defined above using the HTTP client returns
the list of the jars installed by Grape component:

[source,java]
---------------------------------------
$ curl http://my-router.com/patches
grape:org.apache.camel/camel-ftp/2.15.2
grape:org.apache.camel/camel-jms/2.15.2
---------------------------------------

If you would like to remove the installed jars, so these won't be loaded
again after the context restart, use the `GrapeCommand.``clearPatches`
command:

[source,java]
-----------------------------------------------------------------------------------------
      from("netty-http4:http://0.0.0.0:80/patches").
        setHeader(GrapeConstats.GRAPE_COMMAND, constant(CamelGrapeCommand.clearPatches)).
        setBody().constant("Installed patches have been deleted."); 
-----------------------------------------------------------------------------------------

[[Grape-SeeAlso]]
See Also
^^^^^^^^

* link:configuring-camel.html[Configuring Camel]
* link:component.html[Component]
* link:endpoint.html[Endpoint]
* link:getting-started.html[Getting Started]

