---
apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    funktion.fabric8.io/kind: Connector
  name: freemarker
data:
  deployment.yml: |
    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      labels:
        funktion.fabric8.io/kind: Subscription
        connector: freemarker
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            funktion.fabric8.io/kind: Subscription
            connector: freemarker
        spec:
          containers:
          - image: funktion/connector-freemarker:${project.version}
            name: connector
  schema.yml: |
    ---
    component:
      kind: component
      scheme: freemarker
      syntax: freemarker:resourceUri
      title: Freemarker
      description: Transforms the message using a FreeMarker template.
      label: transformation
      deprecated: false
      async: false
      producerOnly: true
      javaType: org.apache.camel.component.freemarker.FreemarkerComponent
      groupId: org.apache.camel
      artifactId: camel-freemarker
      version: 2.18.3
    componentProperties:
      configuration:
        kind: property
        type: object
        javaType: freemarker.template.Configuration
        deprecated: false
        secret: false
        description: To use an existing freemarker.template.Configuration instance as the configuration.
        order: 0
    properties:
      resourceUri:
        kind: path
        group: producer
        required: true
        type: string
        javaType: java.lang.String
        deprecated: false
        secret: false
        description: Path to the resource or a reference to lookup a bean in the Registry to use as the resource
        order: 0
      configuration:
        kind: parameter
        group: producer
        type: object
        javaType: freemarker.template.Configuration
        deprecated: false
        secret: false
        description: Sets the Freemarker configuration to use
        order: 1
      contentCache:
        kind: parameter
        group: producer
        type: boolean
        javaType: boolean
        deprecated: false
        secret: false
        defaultValue: false
        description: Sets whether to use resource content cache or not
        order: 2
      encoding:
        kind: parameter
        group: producer
        type: string
        javaType: java.lang.String
        deprecated: false
        secret: false
        description: Sets the encoding to be used for loading the template file.
        order: 3
      templateUpdateDelay:
        kind: parameter
        group: producer
        type: integer
        javaType: int
        deprecated: false
        secret: false
        description: Number of seconds the loaded template resource will remain in the cache.
        order: 4
      synchronous:
        kind: parameter
        group: advanced
        label: advanced
        type: boolean
        javaType: boolean
        deprecated: false
        secret: false
        defaultValue: false
        description: Sets whether synchronous processing should be strictly used or Camel is allowed to use asynchronous processing (if supported).
        order: 5
  documentation.adoc: |+
    [[FreeMarker-FreeMarker]]
    FreeMarker
    ~~~~~~~~~~

    The *freemarker:* component allows for processing a message using a
    http://freemarker.org/[FreeMarker] template. This can be ideal when
    using link:templating.html[Templating] to generate responses for
    requests.

    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-freemarker</artifactId>
        <version>x.x.x</version> <!-- use the same version as your Camel core version -->
    </dependency>
    -------------------------------------------------------------------------------------

    [[FreeMarker-URIformat]]
    URI format
    ^^^^^^^^^^

    [source,java]
    ---------------------------------
    freemarker:templateName[?options]
    ---------------------------------

    Where *templateName* is the classpath-local URI of the template to
    invoke; or the complete URL of the remote template (eg:
    file://folder/myfile.ftl[file://folder/myfile.ftl]).

    You can append query options to the URI in the following format,
    `?option=value&option=value&...`

    [[FreeMarker-Options]]
    Options
    ^^^^^^^




    // component options: START
    The Freemarker component supports 1 options which are listed below.



    {% raw %}
    [width="100%",cols="2,1m,7",options="header"]
    |=======================================================================
    | Name | Java Type | Description
    | configuration | Configuration | To use an existing freemarker.template.Configuration instance as the configuration.
    |=======================================================================
    {% endraw %}
    // component options: END





    // endpoint options: START
    The Freemarker component supports 6 endpoint options which are listed below:

    {% raw %}
    [width="100%",cols="2,1,1m,1m,5",options="header"]
    |=======================================================================
    | Name | Group | Default | Java Type | Description
    | resourceUri | producer |  | String | *Required* Path to the resource or a reference to lookup a bean in the Registry to use as the resource
    | configuration | producer |  | Configuration | Sets the Freemarker configuration to use
    | contentCache | producer | false | boolean | Sets whether to use resource content cache or not
    | encoding | producer |  | String | Sets the encoding to be used for loading the template file.
    | templateUpdateDelay | producer |  | int | Number of seconds the loaded template resource will remain in the cache.
    | synchronous | advanced | false | boolean | Sets whether synchronous processing should be strictly used or Camel is allowed to use asynchronous processing (if supported).
    |=======================================================================
    {% endraw %}
    // endpoint options: END



    [[FreeMarker-Headers]]
    Headers
    ^^^^^^^

    Headers set during the FreeMarker evaluation are returned to the message
    and added as headers. This provides a mechanism for the FreeMarker
    component to return values to the Message.

    An example: Set the header value of `fruit` in the FreeMarker template:

    [source,java]
    --------------------------------------
    ${request.setHeader('fruit', 'Apple')}
    --------------------------------------

    The header, `fruit`, is now accessible from the `message.out.headers`.

    [[FreeMarker-FreeMarkerContext]]
    FreeMarker Context
    ^^^^^^^^^^^^^^^^^^

    Camel will provide exchange information in the FreeMarker context (just
    a `Map`). The `Exchange` is transferred as:

    [width="100%",cols="50%,50%",options="header",]
    |=======================================================================
    |key |value

    |`exchange` |The `Exchange` itself.

    |`exchange.properties` |The `Exchange` properties.

    |`headers` |The headers of the In message.

    |`camelContext` |The Camel Context.

    |`request` |The In message.

    |`body` |The In message body.

    |`response` |The Out message (only for InOut message exchange pattern).
    |=======================================================================

    From Camel 2.14, you can setup your custom FreeMarker context in the
    message header with the key "*CamelFreemarkerDataModel*" just like this

    [source,java]
    --------------------------------------------------------------------
    Map<String, Object> variableMap = new HashMap<String, Object>();
    variableMap.put("headers", headersMap);
    variableMap.put("body", "Monday");
    variableMap.put("exchange", exchange);
    exchange.getIn().setHeader("CamelFreemarkerDataModel", variableMap);
    --------------------------------------------------------------------

    [[FreeMarker-Hotreloading]]
    Hot reloading
    ^^^^^^^^^^^^^

    The FreeMarker template resource is by default *not* hot reloadable for
    both file and classpath resources (expanded jar). If you set
    `contentCache=false`, then Camel will not cache the resource and hot
    reloading is thus enabled. This scenario can be used in development.

    [[FreeMarker-Dynamictemplates]]
    Dynamic templates
    ^^^^^^^^^^^^^^^^^

    Camel provides two headers by which you can define a different resource
    location for a template or the template content itself. If any of these
    headers is set then Camel uses this over the endpoint configured
    resource. This allows you to provide a dynamic template at runtime.

    [width="100%",cols="10%,10%,10%,70%",options="header",]
    |=======================================================================
    |Header |Type |Description |Support Version

    |FreemarkerConstants.FREEMARKER_RESOURCE |org.springframework.core.io.Resource |The template resource | <= 2.1

    |FreemarkerConstants.FREEMARKER_RESOURCE_URI |String |A URI for the template resource to use instead of the endpoint
    configured. | >= 2.1

    |FreemarkerConstants.FREEMARKER_TEMPLATE |String |The template to use instead of the endpoint configured. | >= 2.1
    |=======================================================================

    [[FreeMarker-Samples]]
    Samples
    ^^^^^^^

    For example you could use something like:

    [source,java]
    -------------------------------------------
    from("activemq:My.Queue").
      to("freemarker:com/acme/MyResponse.ftl");
    -------------------------------------------

    To use a FreeMarker template to formulate a response for a message for
    InOut message exchanges (where there is a `JMSReplyTo` header).

    If you want to use InOnly and consume the message and send it to another
    destination you could use:

    [source,java]
    -------------------------------------------
    from("activemq:My.Queue").
      to("freemarker:com/acme/MyResponse.ftl").
      to("activemq:Another.Queue");
    -------------------------------------------

    And to disable the content cache, e.g. for development usage where the
    `.ftl` template should be hot reloaded:

    [source,java]
    --------------------------------------------------------------
    from("activemq:My.Queue").
      to("freemarker:com/acme/MyResponse.ftl?contentCache=false").
      to("activemq:Another.Queue");
    --------------------------------------------------------------

    And a file-based resource:

    [source,java]
    ---------------------------------------------------------------------
    from("activemq:My.Queue").
      to("freemarker:file://myfolder/MyResponse.ftl?contentCache=false").
      to("activemq:Another.Queue");
    ---------------------------------------------------------------------

    In *Camel 2.1* it's possible to specify what template the component
    should use dynamically via a header, so for example:

    [source,java]
    ---------------------------------------------------------------------------------------------
    from("direct:in").
      setHeader(FreemarkerConstants.FREEMARKER_RESOURCE_URI).constant("path/to/my/template.ftl").
      to("freemarker:dummy");
    ---------------------------------------------------------------------------------------------

    [[FreeMarker-TheEmailSample]]
    The Email Sample
    ^^^^^^^^^^^^^^^^

    In this sample we want to use FreeMarker templating for an order
    confirmation email. The email template is laid out in FreeMarker as:

    [source,java]
    ----------------------------------------------
    Dear ${headers.lastName}, ${headers.firstName}

    Thanks for the order of ${headers.item}.

    Regards Camel Riders Bookstore
    ${body}
    ----------------------------------------------

    And the java code:

    [[FreeMarker-SeeAlso]]
    See Also
    ^^^^^^^^

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

