[[olingo2-component]]
= Olingo2 Component
//THIS FILE IS COPIED: EDIT THE SOURCE FILE:
:page-source: components/camel-olingo2/camel-olingo2-component/src/main/docs/olingo2-component.adoc
:docTitle: Olingo2
:artifactId: camel-olingo2
:description: Communicate with OData 2.0 services using Apache Olingo.
:since: 2.14
:supportLevel: Stable
:component-header: Both producer and consumer are supported

*Since Camel {since}*

*{component-header}*

The Olingo2 component utilizes http://olingo.apache.org/[Apache Olingo]
version 2.0 APIs to interact with OData 2.0 compliant services.
A number of popular commercial and enterprise vendors and products
support the OData protocol. A sample list of supporting products can be
found on the OData http://www.odata.org/ecosystem/[website].

The Olingo2 component supports reading feeds, delta feeds, entities,
simple and complex properties, links, counts, using custom and OData
system query parameters. It supports updating entities, properties, and
association links. It also supports submitting queries and change
requests as a single OData batch operation. 

The component supports configuring HTTP connection parameters and
headers for OData service connection. This allows configuring use of
SSL, OAuth2.0, etc. as required by the target OData service. 

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

[source,java]
----------------------------------------------
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-olingo2</artifactId>
        <version>${camel-version}</version>
    </dependency>
----------------------------------------------

== URI format

[source,java]
------------------------------------------------
    olingo2://endpoint/<resource-path>?[options]
------------------------------------------------

== Olingo2 Options




// component options: START
The Olingo2 component supports 16 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *configuration* (common) | To use the shared configuration |  | Olingo2Configuration
| *connectTimeout* (common) | HTTP connection creation timeout in milliseconds, defaults to 30,000 (30 seconds) | 30000 | int
| *contentType* (common) | Content-Type header value can be used to specify JSON or XML message format, defaults to application/json;charset=utf-8 | application/json;charset=utf-8 | String
| *filterAlreadySeen* (common) | Set this to true to filter out results that have already been communicated by this component. | false | boolean
| *httpHeaders* (common) | Custom HTTP headers to inject into every request, this could include OAuth tokens, etc. |  | Map
| *proxy* (common) | HTTP proxy server configuration |  | HttpHost
| *serviceUri* (common) | Target OData service base URI, e.g. \http://services.odata.org/OData/OData.svc |  | String
| *socketTimeout* (common) | HTTP request timeout in milliseconds, defaults to 30,000 (30 seconds) | 30000 | int
| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
| *splitResult* (consumer) | For endpoints that return an array or collection, a consumer endpoint will map every element to distinct messages, unless splitResult is set to false. | true | boolean
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *httpAsyncClientBuilder* (advanced) | Custom HTTP async client builder for more complex HTTP client configuration, overrides connectionTimeout, socketTimeout, proxy and sslContext. Note that a socketTimeout MUST be specified in the builder, otherwise OData requests could block indefinitely |  | HttpAsyncClientBuilder
| *httpClientBuilder* (advanced) | Custom HTTP client builder for more complex HTTP client configuration, overrides connectionTimeout, socketTimeout, proxy and sslContext. Note that a socketTimeout MUST be specified in the builder, otherwise OData requests could block indefinitely |  | HttpClientBuilder
| *sslContextParameters* (security) | To configure security using SSLContextParameters |  | SSLContextParameters
| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
|===
// component options: END






// endpoint options: START
The Olingo2 endpoint is configured using URI syntax:

----
olingo2:apiName/methodName
----

with the following path and query parameters:

=== Path Parameters (2 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *apiName* | *Required* What kind of operation to perform. The value can be one of: DEFAULT |  | Olingo2ApiName
| *methodName* | *Required* What sub operation to use for the selected operation |  | String
|===


=== Query Parameters (34 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *connectTimeout* (common) | HTTP connection creation timeout in milliseconds, defaults to 30,000 (30 seconds) | 30000 | int
| *contentType* (common) | Content-Type header value can be used to specify JSON or XML message format, defaults to application/json;charset=utf-8 | application/json;charset=utf-8 | String
| *filterAlreadySeen* (common) | Set this to true to filter out results that have already been communicated by this component. | false | boolean
| *httpHeaders* (common) | Custom HTTP headers to inject into every request, this could include OAuth tokens, etc. |  | Map
| *inBody* (common) | Sets the name of a parameter to be passed in the exchange In Body |  | String
| *proxy* (common) | HTTP proxy server configuration |  | HttpHost
| *serviceUri* (common) | Target OData service base URI, e.g. \http://services.odata.org/OData/OData.svc |  | String
| *socketTimeout* (common) | HTTP request timeout in milliseconds, defaults to 30,000 (30 seconds) | 30000 | int
| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
| *sendEmptyMessageWhenIdle* (consumer) | If the polling consumer did not poll any files, you can enable this option to send an empty message (no body) instead. | false | boolean
| *splitResult* (consumer) | For endpoints that return an array or collection, a consumer endpoint will map every element to distinct messages, unless splitResult is set to false. | true | boolean
| *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
| *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. The value can be one of: InOnly, InOut, InOptionalOut |  | ExchangePattern
| *pollStrategy* (consumer) | A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the poll operation before an Exchange have been created and being routed in Camel. |  | PollingConsumerPollStrategy
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *httpAsyncClientBuilder* (advanced) | Custom HTTP async client builder for more complex HTTP client configuration, overrides connectionTimeout, socketTimeout, proxy and sslContext. Note that a socketTimeout MUST be specified in the builder, otherwise OData requests could block indefinitely |  | HttpAsyncClientBuilder
| *httpClientBuilder* (advanced) | Custom HTTP client builder for more complex HTTP client configuration, overrides connectionTimeout, socketTimeout, proxy and sslContext. Note that a socketTimeout MUST be specified in the builder, otherwise OData requests could block indefinitely |  | HttpClientBuilder
| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
| *backoffErrorThreshold* (scheduler) | The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in. |  | int
| *backoffIdleThreshold* (scheduler) | The number of subsequent idle polls that should happen before the backoffMultipler should kick-in. |  | int
| *backoffMultiplier* (scheduler) | To let the scheduled polling consumer backoff if there has been a number of subsequent idles/errors in a row. The multiplier is then the number of polls that will be skipped before the next actual attempt is happening again. When this option is in use then backoffIdleThreshold and/or backoffErrorThreshold must also be configured. |  | int
| *delay* (scheduler) | Milliseconds before the next poll. | 500 | long
| *greedy* (scheduler) | If greedy is enabled, then the ScheduledPollConsumer will run immediately again, if the previous run polled 1 or more messages. | false | boolean
| *initialDelay* (scheduler) | Milliseconds before the first poll starts. | 1000 | long
| *repeatCount* (scheduler) | Specifies a maximum limit of number of fires. So if you set it to 1, the scheduler will only fire once. If you set it to 5, it will only fire five times. A value of zero or negative means fire forever. | 0 | long
| *runLoggingLevel* (scheduler) | The consumer logs a start/complete log line when it polls. This option allows you to configure the logging level for that. The value can be one of: TRACE, DEBUG, INFO, WARN, ERROR, OFF | TRACE | LoggingLevel
| *scheduledExecutorService* (scheduler) | Allows for configuring a custom/shared thread pool to use for the consumer. By default each consumer has its own single threaded thread pool. |  | ScheduledExecutorService
| *scheduler* (scheduler) | To use a cron scheduler from either camel-spring or camel-quartz component. The value can be one of: none, spring, quartz | none | String
| *schedulerProperties* (scheduler) | To configure additional properties when using a custom scheduler or any of the Quartz, Spring based scheduler. |  | Map
| *startScheduler* (scheduler) | Whether the scheduler should be auto started. | true | boolean
| *timeUnit* (scheduler) | Time unit for initialDelay and delay options. The value can be one of: NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS | MILLISECONDS | TimeUnit
| *useFixedDelay* (scheduler) | Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details. | true | boolean
| *sslContextParameters* (security) | To configure security using SSLContextParameters |  | SSLContextParameters
|===
// endpoint options: END

== Producer Endpoints

Producer endpoints can use endpoint names and options listed
next. Producer endpoints can also use a special option *`inBody`* that
in turn should contain the name of the endpoint option whose value will
be contained in the Camel Exchange In message. The *inBody* option
defaults to *data* for endpoints that take that option. 

== Endpoint Options

Any of the endpoint options can be provided in either the endpoint URI,
or dynamically in a message header. The message header name must be of
the format *`CamelOlingo2.<option>`*. Note that the *`inBody`* option
overrides message header, i.e. the endpoint
option *`inBody=option`* would override
a *`CamelOlingo2.option`* header. In addition, query parameters can be
specified. 

[width="100%",cols="10%,20%,70%",options="header",]
|=======================================================================
|Name |Type |Description
|data |Object |Data with appropriate type used to create or modify the OData resource
|keyPredicate |String |Key predicate to create a parameterized OData resource endpoint. Useful for 
create/update operations where the key predicate value is dynamically provided in a header
|queryParams |java.util.Map<String,String> |OData system options and custom query options. For more 
information see http://www.odata.org/documentation/odata-version-2-0/uri-conventions/[OData 2.0 URI Conventions]
|resourcePath |String |OData resource path, may or may not contain key predicate
|endpointHttpHeaders |java.util.Map<String, String> |Dynamic HTTP Headers to be sent to the endpoint
|responseHttpHeaders |java.util.Map<String, String> |Dynamic HTTP Response Headers from the endpoint 
|=======================================================================

Note that the resourcePath option can either in specified in the URI as
a part of the URI path, as an endpoint option
?resourcePath=<resource-path> or as a header value
CamelOlingo2.resourcePath. The OData entity key predicate can either be
a part of the resource path, e.g. _Manufacturers('1')_, where _'__1'_ is
the key predicate, or be specified separately with resource path
_Manufacturers_ and keyPredicate option _'1'_. 

[width="100%",cols="10%,10%,10%,70%",options="header",]
|=======================================================================
|Endpoint |Options |HTTP Method |Result Body Type

|batch |data, endpointHttpHeaders |POST with multipart/mixed batch request |java.util.List<org.apache.camel.component.olingo2.api.batch.Olingo2BatchResponse>

|create |data, resourcePath, endpointHttpHeaders |POST |org.apache.olingo.odata2.api.ep.entry.ODataEntry for new entries
org.apache.olingo.odata2.api.commons.HttpStatusCodes for other OData resources

|delete |resourcePath, endpointHttpHeaders |DELETE |org.apache.olingo.odata2.api.commons.HttpStatusCodes

|merge |data, resourcePath, endpointHttpHeaders |MERGE |org.apache.olingo.odata2.api.commons.HttpStatusCodes

|patch |data, resourcePath, endpointHttpHeaders |PATCH |org.apache.olingo.odata2.api.commons.HttpStatusCodes

|read |queryParams, resourcePath, endpointHttpHeaders |GET |Depends on OData resource being queried as described next

|update |data, resourcePath, endpointHttpHeaders |PUT |org.apache.olingo.odata2.api.commons.HttpStatusCodes
|=======================================================================

== Endpoint HTTP Headers
The component level configuration property **httpHeaders** supplies static HTTP header information. 
However, some systems requires dynamic header information to be passed to and received from the endpoint.
A sample use case would be systems that require dynamic security tokens.  The **endpointHttpHeaders** 
and **responseHttpHeaders** endpoint properties provides this capability.  Set headers that need to 
be passed to the endpoint in the *`CamelOlingo2.endpointHttpHeaders`* property and the 
response headers will be returned in a *`CamelOlingo2.responseHttpHeaders`* property.  
Both properties are of the type *`java.util.Map<String, String>`*.

== OData Resource Type Mapping

The result of *read* endpoint and data type of *data* option depends on
the OData resource being queried, created or modified. 

[width="100%",cols="10%,10%,80%",options="header",]
|=======================================================================
|OData Resource Type |Resource URI from resourcePath and keyPredicate |In or Out Body Type

|Entity data model |$metadata |org.apache.olingo.odata2.api.edm.Edm

|Service document |/ |org.apache.olingo.odata2.api.servicedocument.ServiceDocument

|OData feed |<entity-set> |org.apache.olingo.odata2.api.ep.feed.ODataFeed

|OData entry |<entity-set>(<key-predicate>) |org.apache.olingo.odata2.api.ep.entry.ODataEntry for Out body (response)
java.util.Map<String, Object> for In body (request)

|Simple property |<entity-set>(<key-predicate>)/<simple-property> |Appropriate Java data type as described by Olingo EdmProperty

|Simple property value |<entity-set>(<key-predicate>)/<simple-property>/$value |Appropriate Java data type as described by Olingo EdmProperty

|Complex property |<entity-set>(<key-predicate>)/<complex-property> |java.util.Map<String, Object>

|Zero or one association link |<entity-set>(<key-predicate>/$link/<one-to-one-entity-set-property> |String for response
java.util.Map<String, Object> with key property names and values for request

|Zero or many association links |<entity-set>(<key-predicate>/$link/<one-to-many-entity-set-property> |java.util.List<String> for response
java.util.List<java.util.Map<String, Object>> containing list of key property names and values for request

|Count |<resource-uri>/$count |java.lang.Long
|=======================================================================

== Consumer Endpoints

Only the *read* endpoint can be used as a consumer endpoint. Consumer
endpoints can
use http://camel.apache.org/polling-consumer.html#PollingConsumer-ScheduledPollConsumerOptions[Scheduled
Poll Consumer Options] to schedule endpoint
invocation. By default consumer endpoints that return an array or
collection will generate one exchange per element, and their routes will
be executed once for each exchange. This behavior can be disabled by
setting the endpoint property *splitResult=false*.

== Message Headers

Any URI option can be provided in a message header for producer
endpoints with a *`CamelOlingo2.`* prefix.

== Message Body

All result message bodies utilize objects provided by the underlying
http://olingo.apache.org/javadoc/odata2/index.html[Apache Olingo 2.0
API] used by the Olingo2Component. Producer endpoints can specify the
option name for incoming message body in the *`inBody`* endpoint URI
parameter. For endpoints that return an array or collection, a consumer
endpoint will map every element to distinct messages, unless
*splitResult* is set to *false*.

== Use cases

The following route reads top 5 entries from the Manufacturer feed
ordered by ascending Name property. 

 

[source,java]
------------------------------------------------------------
from("direct:...")
    .setHeader("CamelOlingo2.$top", "5");
    .to("olingo2://read/Manufacturers?orderBy=Name%20asc");
------------------------------------------------------------

 

The following route reads Manufacturer entry using the key property
value in incoming *id* header. 

 

[source,java]
------------------------------------------------------------
from("direct:...")
    .setHeader("CamelOlingo2.keyPredicate", header("id"))
    .to("olingo2://read/Manufacturers");
------------------------------------------------------------

 

The following route creates Manufacturer entry using the
*java.util.Map<String, Object>* in body message. 

 

[source,java]
------------------------------------------------------------
from("direct:...")
    .to("olingo2://create/Manufacturers");
------------------------------------------------------------

 

The following route polls Manufacturer
http://olingo.apache.org/doc/tutorials/deltaClient.html[delta
feed] every 30 seconds. The bean *blah* updates the bean *paramsBean* to
add an updated *!deltatoken* property with the value returned in the
*ODataDeltaFeed* result. Since the initial delta token is not known, the
consumer endpoint will produce an *ODataFeed* value the first time, and
*ODataDeltaFeed* on subsequent polls. 

 

[source,java]
---------------------------------------------------------------------------------------------------------
from("olingo2://read/Manufacturers?queryParams=#paramsBean&timeUnit=SECONDS&delay=30")
    .to("bean:blah");
---------------------------------------------------------------------------------------------------------

include::camel-spring-boot::page$olingo2-starter.adoc[]
