---
apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    funktion.fabric8.io/kind: Connector
  name: geocoder
data:
  deployment.yml: |
    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      labels:
        funktion.fabric8.io/kind: Subscription
        connector: geocoder
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            funktion.fabric8.io/kind: Subscription
            connector: geocoder
        spec:
          containers:
          - image: funktion/connector-geocoder:${project.version}
            name: connector
  schema.yml: |
    ---
    component:
      kind: component
      scheme: geocoder
      syntax: geocoder:address:latlng
      title: Geocoder
      description: The geocoder component is used for looking up geocodes (latitude and longitude) for a given address or reverse lookup.
      label: api,location
      deprecated: false
      async: false
      producerOnly: true
      javaType: org.apache.camel.component.geocoder.GeoCoderComponent
      groupId: org.apache.camel
      artifactId: camel-geocoder
      version: 2.18.3
    componentProperties: {}
    properties:
      address:
        kind: path
        group: producer
        type: string
        javaType: java.lang.String
        deprecated: false
        secret: false
        description: 'The geo address which should be prefixed with address:'
        order: 0
      latlng:
        kind: path
        group: producer
        type: string
        javaType: java.lang.String
        deprecated: false
        secret: false
        description: 'The geo latitude and longitude which should be prefixed with latlng:'
        order: 1
      clientId:
        kind: parameter
        group: producer
        type: string
        javaType: java.lang.String
        deprecated: false
        secret: false
        description: To use google premium with this client id
        order: 2
      clientKey:
        kind: parameter
        group: producer
        type: string
        javaType: java.lang.String
        deprecated: false
        secret: false
        description: To use google premium with this client key
        order: 3
      headersOnly:
        kind: parameter
        group: producer
        type: boolean
        javaType: boolean
        deprecated: false
        secret: false
        defaultValue: false
        description: Whether to only enrich the Exchange with headers and leave the body as-is.
        order: 4
      language:
        kind: parameter
        group: producer
        type: string
        javaType: java.lang.String
        deprecated: false
        secret: false
        defaultValue: en
        description: The language to use.
        order: 5
      httpClientConfigurer:
        kind: parameter
        group: advanced
        label: advanced
        type: object
        javaType: org.apache.camel.component.geocoder.http.HttpClientConfigurer
        deprecated: false
        secret: false
        description: Register a custom configuration strategy for new HttpClient instances created by producers or consumers such as to configure authentication mechanisms etc
        order: 6
      httpConnectionManager:
        kind: parameter
        group: advanced
        label: advanced
        type: object
        javaType: org.apache.commons.httpclient.HttpConnectionManager
        deprecated: false
        secret: false
        description: To use a custom HttpConnectionManager to manage connections
        order: 7
      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: 8
      proxyAuthDomain:
        kind: parameter
        group: proxy
        label: proxy
        type: string
        javaType: java.lang.String
        deprecated: false
        secret: false
        description: Domain for proxy NTML authentication
        order: 9
      proxyAuthHost:
        kind: parameter
        group: proxy
        label: proxy
        type: string
        javaType: java.lang.String
        deprecated: false
        secret: false
        description: Optional host for proxy NTML authentication
        order: 10
      proxyAuthMethod:
        kind: parameter
        group: proxy
        label: proxy
        type: string
        javaType: java.lang.String
        deprecated: false
        secret: false
        description: Authentication method for proxy either as Basic Digest or NTLM.
        order: 11
      proxyAuthPassword:
        kind: parameter
        group: proxy
        label: proxy
        type: string
        javaType: java.lang.String
        deprecated: false
        secret: false
        description: Password for proxy authentication
        order: 12
      proxyAuthUsername:
        kind: parameter
        group: proxy
        label: proxy
        type: string
        javaType: java.lang.String
        deprecated: false
        secret: false
        description: Username for proxy authentication
        order: 13
      proxyHost:
        kind: parameter
        group: proxy
        label: proxy
        type: string
        javaType: java.lang.String
        deprecated: false
        secret: false
        description: The proxy host name
        order: 14
      proxyPort:
        kind: parameter
        group: proxy
        label: proxy
        type: integer
        javaType: java.lang.Integer
        deprecated: false
        secret: false
        description: The proxy port number
        order: 15
  documentation.adoc: |
    [[Geocoder-GeocoderComponent]]
    Geocoder Component
    ~~~~~~~~~~~~~~~~~~

    *Available as of Camel 2.12*

    The *geocoder:* component is used for looking up geocodes (latitude and
    longitude) for a given address, or reverse lookup. The component uses
    the https://code.google.com/p/geocoder-java/[Java API for Google
    Geocoder] library.

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

    [[Geocoder-URIformat]]
    URI format
    ^^^^^^^^^^

    [source,java]
    --------------------------------------------
    geocoder:address:name[?options]
    geocoder:latlng:latitude,longitude[?options]
    --------------------------------------------

    [[Geocoder-Options]]
    Options
    ^^^^^^^


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




    // endpoint options: START
    The Geocoder component supports 16 endpoint options which are listed below:

    {% raw %}
    [width="100%",cols="2,1,1m,1m,5",options="header"]
    |=======================================================================
    | Name | Group | Default | Java Type | Description
    | address | producer |  | String | The geo address which should be prefixed with address:
    | latlng | producer |  | String | The geo latitude and longitude which should be prefixed with latlng:
    | clientId | producer |  | String | To use google premium with this client id
    | clientKey | producer |  | String | To use google premium with this client key
    | headersOnly | producer | false | boolean | Whether to only enrich the Exchange with headers and leave the body as-is.
    | language | producer | en | String | The language to use.
    | httpClientConfigurer | advanced |  | HttpClientConfigurer | Register a custom configuration strategy for new HttpClient instances created by producers or consumers such as to configure authentication mechanisms etc
    | httpConnectionManager | advanced |  | HttpConnectionManager | To use a custom HttpConnectionManager to manage connections
    | synchronous | advanced | false | boolean | Sets whether synchronous processing should be strictly used or Camel is allowed to use asynchronous processing (if supported).
    | proxyAuthDomain | proxy |  | String | Domain for proxy NTML authentication
    | proxyAuthHost | proxy |  | String | Optional host for proxy NTML authentication
    | proxyAuthMethod | proxy |  | String | Authentication method for proxy either as Basic Digest or NTLM.
    | proxyAuthPassword | proxy |  | String | Password for proxy authentication
    | proxyAuthUsername | proxy |  | String | Username for proxy authentication
    | proxyHost | proxy |  | String | The proxy host name
    | proxyPort | proxy |  | Integer | The proxy port number
    |=======================================================================
    {% endraw %}
    // endpoint options: END



    [[Geocoder-Exchangedataformat]]
    Exchange data format
    ^^^^^^^^^^^^^^^^^^^^

    Camel will deliver the body as a
    `com.google.code.geocoder.model.GeocodeResponse` type. +
     And if the address is `"current"` then the response is a String type
    with a JSON representation of the current location.

    If the option `headersOnly` is set to `true` then the message body is
    left as-is, and only headers will be added to the
    link:exchange.html[Exchange].

    [[Geocoder-MessageHeaders]]
    Message Headers
    ^^^^^^^^^^^^^^^

    [width="100%",cols="50%,50%",options="header",]
    |=======================================================================
    |Header |Description

    |`CamelGeoCoderStatus` |Mandatory. Status code from the geocoder library. If status is
    `GeocoderStatus.OK` then additional headers is enriched

    |`CamelGeoCoderAddress` |The formatted address

    |`CamelGeoCoderLat` |The latitude of the location.

    |`CamelGeoCoderLng` |The longitude of the location.

    |`CamelGeoCoderLatlng` |The latitude and longitude of the location. Separated by comma.

    |`CamelGeoCoderCity` |The city long name.

    |`CamelGeoCoderRegionCode` |The region code.

    |`CamelGeoCoderRegionName` |The region name.

    |`CamelGeoCoderCountryLong` |The country long name.

    |`CamelGeoCoderCountryShort` |The country short name.
    |=======================================================================

    Notice not all headers may be provided depending on available data and
    mode in use (address vs latlng).

    [[Geocoder-Samples]]
    Samples
    ^^^^^^^

    In the example below we get the latitude and longitude for Paris, France

    [source,java]
    -----------------------------------------
      from("direct:start")
        .to("geocoder:address:Paris, France")
    -----------------------------------------

    If you provide a header with the `CamelGeoCoderAddress` then that
    overrides the endpoint configuration, so to get the location of
    Copenhagen, Denmark we can send a message with a headers as shown:

    [source,java]
    ------------------------------------------------------------------------------------------------------
    template.sendBodyAndHeader("direct:start", "Hello", GeoCoderConstants.ADDRESS, "Copenhagen, Denmark");
    ------------------------------------------------------------------------------------------------------

    To get the address for a latitude and longitude we can do:

    [source,java]
    ---------------------------------------------------------------------------------------------------------------------------------------------------
      from("direct:start")
        .to("geocoder:latlng:40.714224,-73.961452")
        .log("Location ${header.CamelGeocoderAddress} is at lat/lng: ${header.CamelGeocoderLatlng} and in country ${header.CamelGeoCoderCountryShort}")
    ---------------------------------------------------------------------------------------------------------------------------------------------------

    Which will log

    [source,java]
    --------------------------------------------------------------------------------------------------------------
    Location 285 Bedford Avenue, Brooklyn, NY 11211, USA is at lat/lng: 40.71412890,-73.96140740 and in country US
    --------------------------------------------------------------------------------------------------------------

    To get the current location you can use "current" as the address as
    shown:

    [source,java]
    -----------------------------------
      from("direct:start")
        .to("geocoder:address:current")
    -----------------------------------
