---
apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    funktion.fabric8.io/kind: Connector
  name: grape
data:
  deployment.yml: |
    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      labels:
        funktion.fabric8.io/kind: Subscription
        connector: grape
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            funktion.fabric8.io/kind: Subscription
            connector: grape
        spec:
          containers:
          - image: funktion/connector-grape:${project.version}
            name: connector
  schema.yml: |
    ---
    component:
      kind: component
      scheme: grape
      syntax: grape:defaultCoordinates
      title: Grape
      description: Grape component allows you to fetch, load and manage additional jars when CamelContext is running.
      label: management,deployment
      producerOnly: true
      javaType: org.apache.camel.component.grape.GrapeEndpoint
      groupId: org.apache.camel
      artifactId: camel-grape
      version: 2.18.3
    componentProperties: {}
    properties:
      defaultCoordinates:
        kind: path
        required: true
        type: string
        javaType: java.lang.String
        deprecated: false
        description: Maven coordinates to use as default to grab if the message body is empty.
        order: 0
      exchangePattern:
        kind: parameter
        type: string
        javaType: org.apache.camel.ExchangePattern
        enum:
        - InOnly
        - RobustInOnly
        - InOut
        - InOptionalOut
        - OutOnly
        - RobustOutOnly
        - OutIn
        - OutOptionalIn
        deprecated: false
        defaultValue: InOnly
        description: Sets the default exchange pattern when creating an exchange.
        order: 1
      synchronous:
        kind: parameter
        type: boolean
        javaType: boolean
        deprecated: false
        defaultValue: false
        description: Sets whether synchronous processing should be strictly used or Camel is allowed to use asynchronous processing (if supported).
        order: 2
  documentation.adoc: |+
    [[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]

