You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2017/07/25 09:02:32 UTC

camel git commit: CAMEL-11569: Implements CAMEL-11425 for camel-olingo4

Repository: camel
Updated Branches:
  refs/heads/master 66049a922 -> 3ee4c0822


CAMEL-11569: Implements CAMEL-11425 for camel-olingo4

Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/3ee4c082
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/3ee4c082
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/3ee4c082

Branch: refs/heads/master
Commit: 3ee4c0822ebb6cc8b5facccc6837218955cc61cc
Parents: 66049a9
Author: Dmitry Volodin <dm...@gmail.com>
Authored: Thu Jul 20 19:40:58 2017 +0300
Committer: Claus Ibsen <da...@apache.org>
Committed: Tue Jul 25 11:01:32 2017 +0200

----------------------------------------------------------------------
 .../camel-olingo4/camel-olingo4-api/pom.xml     |  5 ++
 .../camel/component/olingo4/api/Olingo4App.java | 25 ++++---
 .../olingo4/api/Olingo4ResponseHandler.java     |  5 +-
 .../olingo4/api/impl/Olingo4AppImpl.java        | 76 ++++++++++++--------
 .../component/olingo4/Olingo4AppAPITest.java    | 46 ++++++------
 .../camel-olingo4-component/pom.xml             |  3 +-
 .../src/main/docs/olingo4-component.adoc        | 27 ++++---
 .../component/olingo4/Olingo4AppWrapper.java    |  5 +-
 .../component/olingo4/Olingo4Consumer.java      |  2 +-
 .../component/olingo4/Olingo4Endpoint.java      |  2 +
 .../component/olingo4/Olingo4Producer.java      |  6 +-
 .../olingo4/internal/Olingo4Constants.java      |  2 +
 .../src/signatures/olingo-api-signature.txt     | 16 ++---
 .../component/olingo4/Olingo4ComponentTest.java | 32 +++++++++
 14 files changed, 168 insertions(+), 84 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/3ee4c082/components/camel-olingo4/camel-olingo4-api/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-olingo4/camel-olingo4-api/pom.xml b/components/camel-olingo4/camel-olingo4-api/pom.xml
index cecf86b..ba2184e 100644
--- a/components/camel-olingo4/camel-olingo4-api/pom.xml
+++ b/components/camel-olingo4/camel-olingo4-api/pom.xml
@@ -60,6 +60,11 @@
     </dependency>
     
     <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-core</artifactId>
+    </dependency>
+    
+    <dependency>
       <groupId>org.apache.httpcomponents</groupId>
       <artifactId>httpasyncclient</artifactId>
     </dependency>

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee4c082/components/camel-olingo4/camel-olingo4-api/src/main/java/org/apache/camel/component/olingo4/api/Olingo4App.java
----------------------------------------------------------------------
diff --git a/components/camel-olingo4/camel-olingo4-api/src/main/java/org/apache/camel/component/olingo4/api/Olingo4App.java b/components/camel-olingo4/camel-olingo4-api/src/main/java/org/apache/camel/component/olingo4/api/Olingo4App.java
index 95d42c2..3c3447a 100644
--- a/components/camel-olingo4/camel-olingo4-api/src/main/java/org/apache/camel/component/olingo4/api/Olingo4App.java
+++ b/components/camel-olingo4/camel-olingo4-api/src/main/java/org/apache/camel/component/olingo4/api/Olingo4App.java
@@ -76,9 +76,10 @@ public interface Olingo4App {
      * @param resourcePath OData Resource path
      * @param queryParams OData query params
      *                    http://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part1-protocol.html#_Toc453752288
+     * @param endpointHttpHeaders HTTP Headers to add/override the component versions
      * @param responseHandler callback handler
      */
-    <T> void read(Edm edm, String resourcePath, Map<String, String> queryParams, Olingo4ResponseHandler<T> responseHandler);
+    <T> void read(Edm edm, String resourcePath, Map<String, String> queryParams, Map<String, String> endpointHttpHeaders, Olingo4ResponseHandler<T> responseHandler);
 
     /**
      * Reads an OData resource and invokes callback with the unparsed input stream.
@@ -86,60 +87,66 @@ public interface Olingo4App {
      * @param resourcePath OData Resource path
      * @param queryParams OData query params
      *                    http://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part1-protocol.html#_Toc453752288
+     * @param endpointHttpHeaders HTTP Headers to add/override the component versions
      * @param responseHandler callback handler
      */
-    void uread(Edm edm, String resourcePath, Map<String, String> queryParams,
-               Olingo4ResponseHandler<InputStream> responseHandler);
+    void uread(Edm edm, String resourcePath, Map<String, String> queryParams, Map<String, String> endpointHttpHeaders, Olingo4ResponseHandler<InputStream> responseHandler);
 
     /**
      * Deletes an OData resource and invokes callback
      * with {@link org.apache.olingo.commons.api.http.HttpStatusCode} on success, or with exception on failure.
      * @param resourcePath resource path for Entry
+     * @param endpointHttpHeaders HTTP Headers to add/override the component versions
      * @param responseHandler {@link org.apache.olingo.commons.api.http.HttpStatusCode} callback handler
      */
-    void delete(String resourcePath, Olingo4ResponseHandler<HttpStatusCode> responseHandler);
+    void delete(String resourcePath, Map<String, String> endpointHttpHeaders, Olingo4ResponseHandler<HttpStatusCode> responseHandler);
 
     /**
      * Creates a new OData resource.
      * @param edm service Edm
      * @param resourcePath resource path to create
+     * @param endpointHttpHeaders HTTP Headers to add/override the component versions
      * @param data request data
      * @param responseHandler callback handler
      */
-    <T> void create(Edm edm, String resourcePath, Object data, Olingo4ResponseHandler<T> responseHandler);
+    <T> void create(Edm edm, String resourcePath, Map<String, String> endpointHttpHeaders, Object data, Olingo4ResponseHandler<T> responseHandler);
 
     /**
      * Updates an OData resource.
      * @param edm service Edm
      * @param resourcePath resource path to update
+     * @param endpointHttpHeaders HTTP Headers to add/override the component versions
      * @param data updated data
      * @param responseHandler {@link org.apache.olingo.client.api.domain.ClientEntity} callback handler
      */
-    <T> void update(Edm edm, String resourcePath, Object data, Olingo4ResponseHandler<T> responseHandler);
+    <T> void update(Edm edm, String resourcePath, Map<String, String> endpointHttpHeaders, Object data, Olingo4ResponseHandler<T> responseHandler);
 
     /**
      * Patches/merges an OData resource using HTTP PATCH.
      * @param edm service Edm
      * @param resourcePath resource path to update
+     * @param endpointHttpHeaders HTTP Headers to add/override the component versions
      * @param data patch/merge data
      * @param responseHandler {@link org.apache.olingo.client.api.domain.ClientEntity} callback handler
      */
-    <T> void patch(Edm edm, String resourcePath, Object data, Olingo4ResponseHandler<T> responseHandler);
+    <T> void patch(Edm edm, String resourcePath, Map<String, String> endpointHttpHeaders, Object data, Olingo4ResponseHandler<T> responseHandler);
 
     /**
      * Patches/merges an OData resource using HTTP MERGE.
      * @param edm service Edm
      * @param resourcePath resource path to update
+     * @param endpointHttpHeaders HTTP Headers to add/override the component versions
      * @param data patch/merge data
      * @param responseHandler {@link org.apache.olingo.client.api.domain.ClientEntity} callback handler
      */
-    <T> void merge(Edm edm, String resourcePath, Object data, Olingo4ResponseHandler<T> responseHandler);
+    <T> void merge(Edm edm, String resourcePath, Map<String, String> endpointHttpHeaders, Object data, Olingo4ResponseHandler<T> responseHandler);
 
     /**
      * Executes a batch request.
      * @param edm service Edm
+     * @param endpointHttpHeaders HTTP Headers to add/override the component versions
      * @param data ordered {@link org.apache.camel.component.olingo4.api.batch.Olingo4BatchRequest} list
      * @param responseHandler callback handler
      */
-    void batch(Edm edm, Object data, Olingo4ResponseHandler<List<Olingo4BatchResponse>> responseHandler);
+    void batch(Edm edm, Map<String, String> endpointHttpHeaders, Object data, Olingo4ResponseHandler<List<Olingo4BatchResponse>> responseHandler);
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee4c082/components/camel-olingo4/camel-olingo4-api/src/main/java/org/apache/camel/component/olingo4/api/Olingo4ResponseHandler.java
----------------------------------------------------------------------
diff --git a/components/camel-olingo4/camel-olingo4-api/src/main/java/org/apache/camel/component/olingo4/api/Olingo4ResponseHandler.java b/components/camel-olingo4/camel-olingo4-api/src/main/java/org/apache/camel/component/olingo4/api/Olingo4ResponseHandler.java
index 13438ba..4853431 100644
--- a/components/camel-olingo4/camel-olingo4-api/src/main/java/org/apache/camel/component/olingo4/api/Olingo4ResponseHandler.java
+++ b/components/camel-olingo4/camel-olingo4-api/src/main/java/org/apache/camel/component/olingo4/api/Olingo4ResponseHandler.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.component.olingo4.api;
 
+import java.util.Map;
+
 /**
  * Callback interface to asynchronously process Olingo4 response.
  */
@@ -24,8 +26,9 @@ public interface Olingo4ResponseHandler<T> {
     /**
      * Handle response data on successful completion of Olingo4 request.
      * @param response response data from Olingo4, may be NULL for Olingo4 operations with no response data.
+     * @param responseHeaders the response HTTP headers received from the endpoint.
      */
-    void onResponse(T response);
+    void onResponse(T response, Map<String, String> responseHeaders);
 
     /**
      * Handle exception raised from Olingo4 request.

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee4c082/components/camel-olingo4/camel-olingo4-api/src/main/java/org/apache/camel/component/olingo4/api/impl/Olingo4AppImpl.java
----------------------------------------------------------------------
diff --git a/components/camel-olingo4/camel-olingo4-api/src/main/java/org/apache/camel/component/olingo4/api/impl/Olingo4AppImpl.java b/components/camel-olingo4/camel-olingo4-api/src/main/java/org/apache/camel/component/olingo4/api/impl/Olingo4AppImpl.java
index 980c409..ecc825a 100644
--- a/components/camel-olingo4/camel-olingo4-api/src/main/java/org/apache/camel/component/olingo4/api/impl/Olingo4AppImpl.java
+++ b/components/camel-olingo4/camel-olingo4-api/src/main/java/org/apache/camel/component/olingo4/api/impl/Olingo4AppImpl.java
@@ -37,6 +37,7 @@ import org.apache.camel.component.olingo4.api.batch.Olingo4BatchQueryRequest;
 import org.apache.camel.component.olingo4.api.batch.Olingo4BatchRequest;
 import org.apache.camel.component.olingo4.api.batch.Olingo4BatchResponse;
 import org.apache.camel.component.olingo4.api.batch.Operation;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.LineIterator;
 import org.apache.commons.lang3.StringUtils;
@@ -229,26 +230,28 @@ public final class Olingo4AppImpl implements Olingo4App {
     }
 
     @Override
-    public <T> void read(final Edm edm, final String resourcePath, final Map<String, String> queryParams, final Olingo4ResponseHandler<T> responseHandler) {
+    public <T> void read(final Edm edm, final String resourcePath, final Map<String, String> queryParams, final Map<String, String> endpointHttpHeaders,
+                         final Olingo4ResponseHandler<T> responseHandler) {
         final String queryOptions = concatQueryParams(queryParams);
         final UriInfo uriInfo = parseUri(edm, resourcePath, queryOptions);
 
-        execute(new HttpGet(createUri(resourcePath, queryOptions)), getResourceContentType(uriInfo), new AbstractFutureCallback<T>(responseHandler) {
+        execute(new HttpGet(createUri(resourcePath, queryOptions)), getResourceContentType(uriInfo), endpointHttpHeaders, new AbstractFutureCallback<T>(responseHandler) {
 
             @Override
             public void onCompleted(HttpResponse result) throws IOException {
-                readContent(uriInfo, result.getEntity() != null ? result.getEntity().getContent() : null, responseHandler);
+                readContent(uriInfo, result.getEntity() != null ? result.getEntity().getContent() : null, headersToMap(result.getAllHeaders()), responseHandler);
             }
 
         });
     }
 
     @Override
-    public void uread(final Edm edm, final String resourcePath, final Map<String, String> queryParams, final Olingo4ResponseHandler<InputStream> responseHandler) {
+    public void uread(final Edm edm, final String resourcePath, final Map<String, String> queryParams, final Map<String, String> endpointHttpHeaders,
+                      final Olingo4ResponseHandler<InputStream> responseHandler) {
         final String queryOptions = concatQueryParams(queryParams);
         final UriInfo uriInfo = parseUri(edm, resourcePath, queryOptions);
 
-        execute(new HttpGet(createUri(resourcePath, queryOptions)), getResourceContentType(uriInfo), new AbstractFutureCallback<InputStream>(responseHandler) {
+        execute(new HttpGet(createUri(resourcePath, queryOptions)), getResourceContentType(uriInfo), endpointHttpHeaders, new AbstractFutureCallback<InputStream>(responseHandler) {
 
             @Override
             public void onCompleted(HttpResponse result) throws IOException {
@@ -256,58 +259,58 @@ public final class Olingo4AppImpl implements Olingo4App {
                 if (responseStream != null && result.getEntity() instanceof DecompressingEntity) {
                     // In case of GZIP compression it's necessary to create
                     // InputStream from the source byte array
-                    responseHandler.onResponse(new ByteArrayInputStream(IOUtils.toByteArray(responseStream)));
+                    responseHandler.onResponse(new ByteArrayInputStream(IOUtils.toByteArray(responseStream)), headersToMap(result.getAllHeaders()));
                 } else {
-                    responseHandler.onResponse(responseStream);
+                    responseHandler.onResponse(responseStream, headersToMap(result.getAllHeaders()));
                 }
             }
         });
     }
 
     @Override
-    public <T> void create(Edm edm, String resourcePath, Object data, Olingo4ResponseHandler<T> responseHandler) {
+    public <T> void create(final Edm edm, final String resourcePath, final Map<String, String> endpointHttpHeaders, final Object data, final Olingo4ResponseHandler<T> responseHandler) {
         final UriInfo uriInfo = parseUri(edm, resourcePath, null);
 
-        writeContent(edm, new HttpPost(createUri(resourcePath, null)), uriInfo, data, responseHandler);
+        writeContent(edm, new HttpPost(createUri(resourcePath, null)), uriInfo, data, endpointHttpHeaders, responseHandler);
     }
 
     @Override
-    public <T> void update(Edm edm, String resourcePath, Object data, Olingo4ResponseHandler<T> responseHandler) {
+    public <T> void update(final Edm edm, final String resourcePath, final Map<String, String> endpointHttpHeaders, final Object data, final Olingo4ResponseHandler<T> responseHandler) {
         final UriInfo uriInfo = parseUri(edm, resourcePath, null);
 
-        writeContent(edm, new HttpPut(createUri(resourcePath, null)), uriInfo, data, responseHandler);
+        writeContent(edm, new HttpPut(createUri(resourcePath, null)), uriInfo, data, endpointHttpHeaders, responseHandler);
     }
 
     @Override
-    public void delete(String resourcePath, final Olingo4ResponseHandler<HttpStatusCode> responseHandler) {
-        execute(new HttpDelete(createUri(resourcePath)), contentType, new AbstractFutureCallback<HttpStatusCode>(responseHandler) {
+    public void delete(final String resourcePath, final Map<String, String> endpointHttpHeaders, final Olingo4ResponseHandler<HttpStatusCode> responseHandler) {
+        execute(new HttpDelete(createUri(resourcePath)), contentType, endpointHttpHeaders, new AbstractFutureCallback<HttpStatusCode>(responseHandler) {
             @Override
             public void onCompleted(HttpResponse result) {
                 final StatusLine statusLine = result.getStatusLine();
-                responseHandler.onResponse(HttpStatusCode.fromStatusCode(statusLine.getStatusCode()));
+                responseHandler.onResponse(HttpStatusCode.fromStatusCode(statusLine.getStatusCode()), headersToMap(result.getAllHeaders()));
             }
         });
     }
 
     @Override
-    public <T> void patch(Edm edm, String resourcePath, Object data, Olingo4ResponseHandler<T> responseHandler) {
+    public <T> void patch(final Edm edm, final String resourcePath, final Map<String, String> endpointHttpHeaders, final Object data, final Olingo4ResponseHandler<T> responseHandler) {
         final UriInfo uriInfo = parseUri(edm, resourcePath, null);
 
-        writeContent(edm, new HttpPatch(createUri(resourcePath, null)), uriInfo, data, responseHandler);
+        writeContent(edm, new HttpPatch(createUri(resourcePath, null)), uriInfo, data, endpointHttpHeaders, responseHandler);
     }
 
     @Override
-    public <T> void merge(Edm edm, String resourcePath, Object data, Olingo4ResponseHandler<T> responseHandler) {
+    public <T> void merge(final Edm edm, final String resourcePath, final Map<String, String> endpointHttpHeaders, final Object data, final Olingo4ResponseHandler<T> responseHandler) {
         final UriInfo uriInfo = parseUri(edm, resourcePath, null);
 
-        writeContent(edm, new HttpMerge(createUri(resourcePath, null)), uriInfo, data, responseHandler);
+        writeContent(edm, new HttpMerge(createUri(resourcePath, null)), uriInfo, data, endpointHttpHeaders, responseHandler);
     }
 
     @Override
-    public void batch(Edm edm, Object data, Olingo4ResponseHandler<List<Olingo4BatchResponse>> responseHandler) {
+    public void batch(final Edm edm, final Map<String, String> endpointHttpHeaders, final Object data, final Olingo4ResponseHandler<List<Olingo4BatchResponse>> responseHandler) {
         final UriInfo uriInfo = parseUri(edm, SegmentType.BATCH.getValue(), null);
 
-        writeContent(edm, new HttpPost(createUri(SegmentType.BATCH.getValue(), null)), uriInfo, data, responseHandler);
+        writeContent(edm, new HttpPost(createUri(SegmentType.BATCH.getValue(), null)), uriInfo, data, endpointHttpHeaders, responseHandler);
     }
 
     private ContentType getResourceContentType(UriInfo uriInfo) {
@@ -337,9 +340,9 @@ public final class Olingo4AppImpl implements Olingo4App {
         return resourceContentType;
     }
 
-    private <T> void readContent(UriInfo uriInfo, InputStream content, Olingo4ResponseHandler<T> responseHandler) {
+    private <T> void readContent(UriInfo uriInfo, InputStream content, Map<String, String> endpointHttpHeaders, Olingo4ResponseHandler<T> responseHandler) {
         try {
-            responseHandler.onResponse(this.<T> readContent(uriInfo, content));
+            responseHandler.onResponse(this.<T> readContent(uriInfo, content), endpointHttpHeaders);
         } catch (Exception e) {
             responseHandler.onException(e);
         } catch (Error e) {
@@ -447,7 +450,7 @@ public final class Olingo4AppImpl implements Olingo4App {
     }
 
     private <T> void writeContent(final Edm edm, HttpEntityEnclosingRequestBase httpEntityRequest, final UriInfo uriInfo, final Object content,
-                                  final Olingo4ResponseHandler<T> responseHandler) {
+                                  final Map<String, String> endpointHttpHeaders, final Olingo4ResponseHandler<T> responseHandler) {
 
         try {
             httpEntityRequest.setEntity(writeContent(edm, uriInfo, content));
@@ -455,7 +458,7 @@ public final class Olingo4AppImpl implements Olingo4App {
             final Header requestContentTypeHeader = httpEntityRequest.getEntity().getContentType();
             final ContentType requestContentType = requestContentTypeHeader != null ? ContentType.parse(requestContentTypeHeader.getValue()) : contentType;
 
-            execute(httpEntityRequest, requestContentType, new AbstractFutureCallback<T>(responseHandler) {
+            execute(httpEntityRequest, requestContentType, endpointHttpHeaders, new AbstractFutureCallback<T>(responseHandler) {
                 @SuppressWarnings("unchecked")
                 @Override
                 public void onCompleted(HttpResponse result) throws IOException, ODataException {
@@ -467,7 +470,7 @@ public final class Olingo4AppImpl implements Olingo4App {
                     // look for no content, or no response body!!!
                     final boolean noEntity = result.getEntity() == null || result.getEntity().getContentLength() == 0;
                     if (statusCode == HttpStatusCode.NO_CONTENT || noEntity) {
-                        responseHandler.onResponse((T)HttpStatusCode.fromStatusCode(result.getStatusLine().getStatusCode()));
+                        responseHandler.onResponse((T)HttpStatusCode.fromStatusCode(result.getStatusLine().getStatusCode()), headersToMap(result.getAllHeaders()));
                     } else {
                         if (uriInfo.getKind() == UriInfoKind.resource) {
                             List<UriResource> listResource = uriInfo.getUriResourceParts();
@@ -477,7 +480,7 @@ public final class Olingo4AppImpl implements Olingo4App {
                                 if (content instanceof ClientEntity) {
                                     ClientEntity entity = odataReader.readEntity(result.getEntity().getContent(),
                                                                                  ContentType.parse(result.getEntity().getContentType().getValue()));
-                                    responseHandler.onResponse((T)entity);
+                                    responseHandler.onResponse((T)entity, headersToMap(result.getAllHeaders()));
                                 } else {
                                     throw new ODataException("Unsupported content type: " + content);
                                 }
@@ -487,7 +490,7 @@ public final class Olingo4AppImpl implements Olingo4App {
                             }
                         } else if (uriInfo.getKind() == UriInfoKind.batch) {
                             List<Olingo4BatchResponse> batchResponse = parseBatchResponse(edm, result, (List<Olingo4BatchRequest>)content);
-                            responseHandler.onResponse((T)batchResponse);
+                            responseHandler.onResponse((T)batchResponse, headersToMap(result.getAllHeaders()));
                         } else {
                             throw new ODataException("Unsupported resource type: " + uriInfo.getKind().name());
                         }
@@ -805,8 +808,16 @@ public final class Olingo4AppImpl implements Olingo4App {
         }
         return result;
     }
+    
+    private static Map<String, String> headersToMap(final Header[] headers) {
+        final Map<String, String> responseHeaders = new HashMap<>();
+        for (Header header : headers) {
+            responseHeaders.put(header.getName(), header.getValue());
+        }
+        return responseHeaders;
+    }
 
-    public void execute(HttpUriRequest httpUriRequest, ContentType contentType, FutureCallback<HttpResponse> callback) {
+    public void execute(HttpUriRequest httpUriRequest, ContentType contentType, final Map<String, String> endpointHttpHeaders, FutureCallback<HttpResponse> callback) {
         // add accept header when its not a form or multipart
         if (!ContentType.APPLICATION_FORM_URLENCODED.equals(contentType) && !contentType.toContentTypeString().startsWith(MULTIPART_MIME_TYPE)) {
             // otherwise accept what is being sent
@@ -823,11 +834,18 @@ public final class Olingo4AppImpl implements Olingo4App {
         }
 
         // set user specified custom headers
-        if (httpHeaders != null && !httpHeaders.isEmpty()) {
+        if (ObjectHelper.isNotEmpty(httpHeaders)) {
             for (Map.Entry<String, String> entry : httpHeaders.entrySet()) {
                 httpUriRequest.setHeader(entry.getKey(), entry.getValue());
             }
         }
+        
+        // set user specified endpoint headers
+        if (ObjectHelper.isNotEmpty(endpointHttpHeaders)) {
+            for (Map.Entry<String, String> entry : endpointHttpHeaders.entrySet()) {
+                httpUriRequest.setHeader(entry.getKey(), entry.getValue());
+            }
+        }
 
         // add 'Accept-Charset' header to avoid BOM marker presents inside
         // response stream

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee4c082/components/camel-olingo4/camel-olingo4-api/src/test/java/org/apache/camel/component/olingo4/Olingo4AppAPITest.java
----------------------------------------------------------------------
diff --git a/components/camel-olingo4/camel-olingo4-api/src/test/java/org/apache/camel/component/olingo4/Olingo4AppAPITest.java b/components/camel-olingo4/camel-olingo4-api/src/test/java/org/apache/camel/component/olingo4/Olingo4AppAPITest.java
index 6cfe3e9..7079679 100644
--- a/components/camel-olingo4/camel-olingo4-api/src/test/java/org/apache/camel/component/olingo4/Olingo4AppAPITest.java
+++ b/components/camel-olingo4/camel-olingo4-api/src/test/java/org/apache/camel/component/olingo4/Olingo4AppAPITest.java
@@ -128,7 +128,7 @@ public class Olingo4AppAPITest {
         LOG.info("Read Edm ");
         final TestOlingo4ResponseHandler<Edm> responseHandler = new TestOlingo4ResponseHandler<Edm>();
 
-        olingoApp.read(null, Constants.METADATA, null, responseHandler);
+        olingoApp.read(null, Constants.METADATA, null, null, responseHandler);
 
         edm = responseHandler.await();
         LOG.info("Read default EntityContainer:  {}", responseHandler.await().getEntityContainer().getName());
@@ -158,7 +158,7 @@ public class Olingo4AppAPITest {
     public void testServiceDocument() throws Exception {
         final TestOlingo4ResponseHandler<ClientServiceDocument> responseHandler = new TestOlingo4ResponseHandler<ClientServiceDocument>();
 
-        olingoApp.read(null, "", null, responseHandler);
+        olingoApp.read(null, "", null, null, responseHandler);
         final ClientServiceDocument serviceDocument = responseHandler.await();
 
         final Map<String, URI> entitySets = serviceDocument.getEntitySets();
@@ -170,7 +170,7 @@ public class Olingo4AppAPITest {
     public void testReadEntitySet() throws Exception {
         final TestOlingo4ResponseHandler<ClientEntitySet> responseHandler = new TestOlingo4ResponseHandler<ClientEntitySet>();
 
-        olingoApp.read(edm, PEOPLE, null, responseHandler);
+        olingoApp.read(edm, PEOPLE, null, null, responseHandler);
 
         final ClientEntitySet entitySet = responseHandler.await();
         assertNotNull(entitySet);
@@ -182,7 +182,7 @@ public class Olingo4AppAPITest {
     public void testReadUnparsedEntitySet() throws Exception {
         final TestOlingo4ResponseHandler<InputStream> responseHandler = new TestOlingo4ResponseHandler<InputStream>();
 
-        olingoApp.uread(edm, PEOPLE, null, responseHandler);
+        olingoApp.uread(edm, PEOPLE, null, null, responseHandler);
 
         final InputStream rawEntitySet = responseHandler.await();
         assertNotNull("Data entity set", rawEntitySet);
@@ -195,14 +195,14 @@ public class Olingo4AppAPITest {
     public void testReadEntity() throws Exception {
         final TestOlingo4ResponseHandler<ClientEntity> responseHandler = new TestOlingo4ResponseHandler<ClientEntity>();
 
-        olingoApp.read(edm, TEST_AIRLINE, null, responseHandler);
+        olingoApp.read(edm, TEST_AIRLINE, null, null, responseHandler);
         ClientEntity entity = responseHandler.await();
         assertEquals("Shanghai Airline", entity.getProperty("Name").getValue().toString());
         LOG.info("Single Entity:  {}", prettyPrint(entity));
 
         responseHandler.reset();
 
-        olingoApp.read(edm, TEST_PEOPLE, null, responseHandler);
+        olingoApp.read(edm, TEST_PEOPLE, null, null, responseHandler);
         entity = responseHandler.await();
         assertEquals("Russell", entity.getProperty("FirstName").getValue().toString());
         LOG.info("Single Entry:  {}", prettyPrint(entity));
@@ -211,7 +211,7 @@ public class Olingo4AppAPITest {
         final Map<String, String> queryParams = new HashMap<String, String>();
         queryParams.put(SystemQueryOptionKind.EXPAND.toString(), TRIPS);
 
-        olingoApp.read(edm, TEST_PEOPLE, queryParams, responseHandler);
+        olingoApp.read(edm, TEST_PEOPLE, queryParams, null, responseHandler);
         ClientEntity entityExpanded = responseHandler.await();
         LOG.info("Single People Entiry with expanded Trips relation:  {}", prettyPrint(entityExpanded));
     }
@@ -220,7 +220,7 @@ public class Olingo4AppAPITest {
     public void testReadUnparsedEntity() throws Exception {
         final TestOlingo4ResponseHandler<InputStream> responseHandler = new TestOlingo4ResponseHandler<InputStream>();
 
-        olingoApp.uread(edm, TEST_AIRLINE, null, responseHandler);
+        olingoApp.uread(edm, TEST_AIRLINE, null, null, responseHandler);
         InputStream rawEntity = responseHandler.await();
         assertNotNull("Data entity", rawEntity);
         ClientEntity entity = reader.readEntity(rawEntity, TEST_FORMAT);
@@ -229,7 +229,7 @@ public class Olingo4AppAPITest {
 
         responseHandler.reset();
 
-        olingoApp.uread(edm, TEST_PEOPLE, null, responseHandler);
+        olingoApp.uread(edm, TEST_PEOPLE, null, null, responseHandler);
         rawEntity = responseHandler.await();
         entity = reader.readEntity(rawEntity, TEST_FORMAT);
         assertEquals("Russell", entity.getProperty("FirstName").getValue().toString());
@@ -239,7 +239,7 @@ public class Olingo4AppAPITest {
         final Map<String, String> queryParams = new HashMap<String, String>();
         queryParams.put(SystemQueryOptionKind.EXPAND.toString(), TRIPS);
 
-        olingoApp.uread(edm, TEST_PEOPLE, queryParams, responseHandler);
+        olingoApp.uread(edm, TEST_PEOPLE, queryParams, null, responseHandler);
 
         rawEntity = responseHandler.await();
         entity = reader.readEntity(rawEntity, TEST_FORMAT);
@@ -251,7 +251,7 @@ public class Olingo4AppAPITest {
         // test simple property Airports.Name
         final TestOlingo4ResponseHandler<ClientPrimitiveValue> propertyHandler = new TestOlingo4ResponseHandler<ClientPrimitiveValue>();
 
-        olingoApp.read(edm, TEST_AIRPORTS_SIMPLE_PROPERTY, null, propertyHandler);
+        olingoApp.read(edm, TEST_AIRPORTS_SIMPLE_PROPERTY, null, null, propertyHandler);
 
         ClientPrimitiveValue name = (ClientPrimitiveValue)propertyHandler.await();
         assertEquals("San Francisco International Airport", name.toString());
@@ -259,7 +259,7 @@ public class Olingo4AppAPITest {
 
         final TestOlingo4ResponseHandler<ClientPrimitiveValue> valueHandler = new TestOlingo4ResponseHandler<ClientPrimitiveValue>();
 
-        olingoApp.read(edm, TEST_AIRPORTS_SIMPLE_PROPERTY_VALUE, null, valueHandler);
+        olingoApp.read(edm, TEST_AIRPORTS_SIMPLE_PROPERTY_VALUE, null, null, valueHandler);
         ClientPrimitiveValue nameValue = valueHandler.await();
         assertEquals("San Francisco International Airport", name.toString());
         LOG.info("Airport name property value {}", nameValue.toString());
@@ -269,7 +269,7 @@ public class Olingo4AppAPITest {
         // ClientEntity object
         ClientEntity clientEntity = objFactory.newEntity(null);
         clientEntity.getProperties().add(objFactory.newPrimitiveProperty("MiddleName", objFactory.newPrimitiveValueBuilder().buildString("Middle")));
-        olingoApp.update(edm, TEST_PEOPLE, clientEntity, statusHandler);
+        olingoApp.update(edm, TEST_PEOPLE, null, clientEntity, statusHandler);
         HttpStatusCode statusCode = statusHandler.await();
         assertEquals(HttpStatusCode.NO_CONTENT, statusCode);
         LOG.info("Name property updated with status {}", statusCode.getStatusCode());
@@ -277,7 +277,7 @@ public class Olingo4AppAPITest {
         // Check for updated property by reading entire entity
         final TestOlingo4ResponseHandler<ClientEntity> responseHandler = new TestOlingo4ResponseHandler<ClientEntity>();
 
-        olingoApp.read(edm, TEST_PEOPLE, null, responseHandler);
+        olingoApp.read(edm, TEST_PEOPLE, null, null, responseHandler);
         ClientEntity entity = responseHandler.await();
         assertEquals("Middle", entity.getProperty("MiddleName").getValue().toString());
         LOG.info("Updated Single Entity:  {}", prettyPrint(entity));
@@ -287,7 +287,7 @@ public class Olingo4AppAPITest {
     public void testReadCount() throws Exception {
         final TestOlingo4ResponseHandler<Long> countHandler = new TestOlingo4ResponseHandler<Long>();
 
-        olingoApp.read(edm, PEOPLE + COUNT_OPTION, null, countHandler);
+        olingoApp.read(edm, PEOPLE + COUNT_OPTION, null, null, countHandler);
         Long count = countHandler.await();
         assertEquals(20, count.intValue());
         LOG.info("People count: {}", count);
@@ -299,7 +299,7 @@ public class Olingo4AppAPITest {
         // create an entity to update
         final TestOlingo4ResponseHandler<ClientEntity> entryHandler = new TestOlingo4ResponseHandler<ClientEntity>();
 
-        olingoApp.create(edm, PEOPLE, createEntity(), entryHandler);
+        olingoApp.create(edm, PEOPLE, null, createEntity(), entryHandler);
 
         ClientEntity createdEntity = entryHandler.await();
         LOG.info("Created Entity:  {}", prettyPrint(createdEntity));
@@ -307,22 +307,22 @@ public class Olingo4AppAPITest {
         final TestOlingo4ResponseHandler<HttpStatusCode> statusHandler = new TestOlingo4ResponseHandler<HttpStatusCode>();
         ClientEntity updateEntity = createEntity();
         updateEntity.getProperties().add(objFactory.newPrimitiveProperty("MiddleName", objFactory.newPrimitiveValueBuilder().buildString("Middle")));
-        olingoApp.update(edm, TEST_CREATE_PEOPLE, updateEntity, statusHandler);
+        olingoApp.update(edm, TEST_CREATE_PEOPLE, null, updateEntity, statusHandler);
         statusHandler.await();
 
         statusHandler.reset();
         updateEntity = createEntity();
         updateEntity.getProperties().add(objFactory.newPrimitiveProperty("MiddleName", objFactory.newPrimitiveValueBuilder().buildString("Middle Patched")));
-        olingoApp.patch(edm, TEST_CREATE_PEOPLE, updateEntity, statusHandler);
+        olingoApp.patch(edm, TEST_CREATE_PEOPLE, null, updateEntity, statusHandler);
         statusHandler.await();
 
         entryHandler.reset();
-        olingoApp.read(edm, TEST_CREATE_PEOPLE, null, entryHandler);
+        olingoApp.read(edm, TEST_CREATE_PEOPLE, null, null, entryHandler);
         ClientEntity updatedEntity = entryHandler.await();
         LOG.info("Updated Entity successfully:  {}", prettyPrint(updatedEntity));
 
         statusHandler.reset();
-        olingoApp.delete(TEST_CREATE_PEOPLE, statusHandler);
+        olingoApp.delete(TEST_CREATE_PEOPLE, null, statusHandler);
         HttpStatusCode statusCode = statusHandler.await();
         LOG.info("Deletion of Entity was successful:  {}: {}", statusCode.getStatusCode(), statusCode.getInfo());
 
@@ -330,7 +330,7 @@ public class Olingo4AppAPITest {
             LOG.info("Verify Delete Entity");
 
             entryHandler.reset();
-            olingoApp.read(edm, TEST_CREATE_PEOPLE, null, entryHandler);
+            olingoApp.read(edm, TEST_CREATE_PEOPLE, null, null, entryHandler);
 
             entryHandler.await();
             fail("Entity not deleted!");
@@ -375,7 +375,7 @@ public class Olingo4AppAPITest {
         batchParts.add(Olingo4BatchQueryRequest.resourcePath(TEST_CREATE_PEOPLE).resourceUri(TEST_SERVICE_BASE_URL).build());
 
         final TestOlingo4ResponseHandler<List<Olingo4BatchResponse>> responseHandler = new TestOlingo4ResponseHandler<List<Olingo4BatchResponse>>();
-        olingoApp.batch(edm, batchParts, responseHandler);
+        olingoApp.batch(edm, null, batchParts, responseHandler);
 
         final List<Olingo4BatchResponse> responseParts = responseHandler.await(15, TimeUnit.MINUTES);
         assertEquals("Batch responses expected", 8, responseParts.size());
@@ -494,7 +494,7 @@ public class Olingo4AppAPITest {
         private CountDownLatch latch = new CountDownLatch(1);
 
         @Override
-        public void onResponse(T response) {
+        public void onResponse(T response, Map<String, String> responseHeaders) {
             this.response = response;
             if (LOG.isDebugEnabled()) {
                 if (response instanceof ClientEntitySet) {

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee4c082/components/camel-olingo4/camel-olingo4-component/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-olingo4/camel-olingo4-component/pom.xml b/components/camel-olingo4/camel-olingo4-component/pom.xml
index 81fe36d..592dbf6 100644
--- a/components/camel-olingo4/camel-olingo4-component/pom.xml
+++ b/components/camel-olingo4/camel-olingo4-component/pom.xml
@@ -35,7 +35,7 @@
   <properties>
     <componentName>Olingo4</componentName>
     <schemeName>olingo4</schemeName>
-    <maven.exe.file.extension></maven.exe.file.extension>
+    <maven.exe.file.extension/>
     <camel.osgi.export.pkg>${componentPackage}</camel.osgi.export.pkg>
     <componentPackage>org.apache.camel.component.olingo4</componentPackage>
     <outPackage>org.apache.camel.component.olingo4.internal</outPackage>
@@ -148,6 +148,7 @@
                   </extraOptions>
                   <nullableOptions>
                     <nullableOption>queryParams</nullableOption>
+                    <nullableOption>endpointHttpHeaders</nullableOption>
                   </nullableOptions>
                 </api>
               </apis>

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee4c082/components/camel-olingo4/camel-olingo4-component/src/main/docs/olingo4-component.adoc
----------------------------------------------------------------------
diff --git a/components/camel-olingo4/camel-olingo4-component/src/main/docs/olingo4-component.adoc b/components/camel-olingo4/camel-olingo4-component/src/main/docs/olingo4-component.adoc
index ada5f98..2883925 100644
--- a/components/camel-olingo4/camel-olingo4-component/src/main/docs/olingo4-component.adoc
+++ b/components/camel-olingo4/camel-olingo4-component/src/main/docs/olingo4-component.adoc
@@ -4,12 +4,12 @@
 
 The Olingo4 component utilizes http://olingo.apache.org/[Apache Olingo]
 version 4.0 APIs to interact with OData 4.0 compliant service.
-Since verison 4.0 OData is OASIS standard and number of popular opensource 
+Since version 4.0 OData is OASIS standard and number of popular open source 
 and commercial vendors and products support this protocol.
 A sample list of supporting products can be found on the OData 
 http://www.odata.org/ecosystem/[website].
 
-The Olingo4 component supports reading entitiy sets, entities,
+The Olingo4 component supports reading entity sets, entities,
 simple and complex properties, counts, using custom and OData
 system query parameters. It supports updating entities and properties.
 It also supports submitting queries and change requests as a single OData batch operation. 
@@ -129,22 +129,31 @@ _Manufacturers_ and keyPredicate option _'1'_. 
 |=======================================================================
 |Endpoint |Options |HTTP Method |Result Body Type
 
-|batch |data |POST with multipart/mixed batch request |java.util.List<org.apache.camel.component.olingo4.api.batch.Olingo4BatchResponse>
+|batch |data, endpointHttpHeaders |POST with multipart/mixed batch request |java.util.List<org.apache.camel.component.olingo4.api.batch.Olingo4BatchResponse>
 
-|create |data, resourcePath |POST |org.apache.olingo.client.api.domain.ClientEntity for new entries
+|create |data, resourcePath, endpointHttpHeaders |POST |org.apache.olingo.client.api.domain.ClientEntity for new entries
 org.apache.olingo.commons.api.http.HttpStatusCode for other OData resources
 
-|delete |resourcePath |DELETE |org.apache.olingo.commons.api.http.HttpStatusCode
+|delete |resourcePath, endpointHttpHeaders |DELETE |org.apache.olingo.commons.api.http.HttpStatusCode
 
-|merge |data, resourcePath |MERGE |org.apache.olingo.commons.api.http.HttpStatusCode
+|merge |data, resourcePath, endpointHttpHeaders |MERGE |org.apache.olingo.commons.api.http.HttpStatusCode
 
-|patch |data, resourcePath |PATCH |org.apache.olingo.commons.api.http.HttpStatusCode
+|patch |data, resourcePath, endpointHttpHeaders |PATCH |org.apache.olingo.commons.api.http.HttpStatusCode
 
-|read |queryParams, resourcePath |GET |Depends on OData resource being queried as described next
+|read |queryParams, resourcePath, endpointHttpHeaders |GET |Depends on OData resource being queried as described next
 
-|update |data, resourcePath |PUT |org.apache.olingo.commons.api.http.HttpStatusCode
+|update |data, resourcePath, endpointHttpHeaders |PUT |org.apache.olingo.commons.api.http.HttpStatusCode
 |=======================================================================
 
+### Endpoint HTTP Headers (since *Camel 2.20*)
+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 *`CamelOlingo4.endpointHttpHeaders`* property and the 
+response headers will be returned in a *`CamelOlingo4.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

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee4c082/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4AppWrapper.java
----------------------------------------------------------------------
diff --git a/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4AppWrapper.java b/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4AppWrapper.java
index 1ed09a1..dc6f130 100644
--- a/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4AppWrapper.java
+++ b/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4AppWrapper.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.component.olingo4;
 
+import java.util.Map;
 import java.util.concurrent.CountDownLatch;
 
 import org.apache.camel.RuntimeCamelException;
@@ -59,10 +60,10 @@ public class Olingo4AppWrapper {
 
                     final CountDownLatch latch = new CountDownLatch(1);
                     final Exception[] error = new Exception[1];
-                    olingo4App.read(null, Constants.METADATA, null, new Olingo4ResponseHandler<Edm>() {
+                    olingo4App.read(null, Constants.METADATA, null, null, new Olingo4ResponseHandler<Edm>() {
 
                         @Override
-                        public void onResponse(Edm response) {
+                        public void onResponse(Edm response, Map<String, String> responseHeaders) {
                             edm = response;
                             latch.countDown();
                         }

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee4c082/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Consumer.java
----------------------------------------------------------------------
diff --git a/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Consumer.java b/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Consumer.java
index 02465c5..b50bd31 100644
--- a/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Consumer.java
+++ b/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Consumer.java
@@ -55,7 +55,7 @@ public class Olingo4Consumer extends AbstractApiConsumer<Olingo4ApiName, Olingo4
 
             args.put(Olingo4Endpoint.RESPONSE_HANDLER_PROPERTY, new Olingo4ResponseHandler<Object>() {
                 @Override
-                public void onResponse(Object response) {
+                public void onResponse(Object response, Map<String, String> responseHeaders) {
                     result[0] = response;
                     latch.countDown();
                 }

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee4c082/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Endpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Endpoint.java b/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Endpoint.java
index 482f733..6cd095d 100644
--- a/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Endpoint.java
+++ b/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Endpoint.java
@@ -46,6 +46,7 @@ public class Olingo4Endpoint extends AbstractApiEndpoint<Olingo4ApiName, Olingo4
 
     private static final String KEY_PREDICATE_PROPERTY = "keyPredicate";
     private static final String QUERY_PARAMS_PROPERTY = "queryParams";
+    private static final String ENDPOINT_HTTP_HEADERS_PROPERTY = "endpointHttpHeaders";
 
     private static final String READ_METHOD = "read";
     private static final String EDM_PROPERTY = "edm";
@@ -71,6 +72,7 @@ public class Olingo4Endpoint extends AbstractApiEndpoint<Olingo4ApiName, Olingo4
         endpointPropertyNames = new HashSet<String>(getPropertiesHelper().getValidEndpointProperties(configuration));
         // avoid adding edm as queryParam
         endpointPropertyNames.add(EDM_PROPERTY);
+        endpointPropertyNames.add(ENDPOINT_HTTP_HEADERS_PROPERTY);
     }
 
     public Producer createProducer() throws Exception {

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee4c082/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Producer.java
----------------------------------------------------------------------
diff --git a/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Producer.java b/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Producer.java
index da09d79..75804a6 100644
--- a/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Producer.java
+++ b/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Producer.java
@@ -24,6 +24,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.component.olingo4.api.Olingo4ResponseHandler;
 import org.apache.camel.component.olingo4.internal.Olingo4ApiName;
+import org.apache.camel.component.olingo4.internal.Olingo4Constants;
 import org.apache.camel.component.olingo4.internal.Olingo4PropertiesHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.component.AbstractApiProducer;
@@ -56,12 +57,15 @@ public class Olingo4Producer extends AbstractApiProducer<Olingo4ApiName, Olingo4
         // create response handler
         properties.put(Olingo4Endpoint.RESPONSE_HANDLER_PROPERTY, new Olingo4ResponseHandler<Object>() {
             @Override
-            public void onResponse(Object response) {
+            public void onResponse(Object response, Map<String, String> responseHeaders) {
                 // producer returns a single response, even for methods with
                 // List return types
                 exchange.getOut().setBody(response);
                 // copy headers
                 exchange.getOut().setHeaders(exchange.getIn().getHeaders());
+                
+                // Add http response headers
+                exchange.getOut().setHeader(Olingo4Constants.PROPERTY_PREFIX + Olingo4Constants.RESPONSE_HTTP_HEADERS, responseHeaders);
 
                 interceptResult(response, exchange);
 

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee4c082/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/internal/Olingo4Constants.java
----------------------------------------------------------------------
diff --git a/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/internal/Olingo4Constants.java b/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/internal/Olingo4Constants.java
index 2261771..f5978d1 100644
--- a/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/internal/Olingo4Constants.java
+++ b/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/internal/Olingo4Constants.java
@@ -26,4 +26,6 @@ public interface Olingo4Constants {
 
     // thread profile name for this component
     String THREAD_PROFILE_NAME = "CamelOlingo4";
+    
+    String RESPONSE_HTTP_HEADERS = "responseHttpHeaders";
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee4c082/components/camel-olingo4/camel-olingo4-component/src/signatures/olingo-api-signature.txt
----------------------------------------------------------------------
diff --git a/components/camel-olingo4/camel-olingo4-component/src/signatures/olingo-api-signature.txt b/components/camel-olingo4/camel-olingo4-component/src/signatures/olingo-api-signature.txt
index 27257f7..fb941e6 100644
--- a/components/camel-olingo4/camel-olingo4-component/src/signatures/olingo-api-signature.txt
+++ b/components/camel-olingo4/camel-olingo4-component/src/signatures/olingo-api-signature.txt
@@ -1,8 +1,8 @@
-void read(org.apache.olingo.commons.api.edm.Edm edm, String resourcePath, java.util.Map<String, String> queryParams, org.apache.camel.component.olingo4.api.Olingo4ResponseHandler responseHandler);
-void uread(org.apache.olingo.commons.api.edm.Edm edm, String resourcePath, java.util.Map<String, String> queryParams, org.apache.camel.component.olingo4.api.Olingo4ResponseHandler responseHandler);
-void delete(String resourcePath, org.apache.camel.component.olingo4.api.Olingo4ResponseHandler responseHandler);
-void create(org.apache.olingo.commons.api.edm.Edm edm, String resourcePath, Object data, org.apache.camel.component.olingo4.api.Olingo4ResponseHandler responseHandler);
-void update(org.apache.olingo.commons.api.edm.Edm edm, String resourcePath, Object data, org.apache.camel.component.olingo4.api.Olingo4ResponseHandler responseHandler);
-void patch(org.apache.olingo.commons.api.edm.Edm edm, String resourcePath, Object data, org.apache.camel.component.olingo4.api.Olingo4ResponseHandler responseHandler);
-void merge(org.apache.olingo.commons.api.edm.Edm edm, String resourcePath, Object data, org.apache.camel.component.olingo4.api.Olingo4ResponseHandler responseHandler);
-void batch(org.apache.olingo.commons.api.edm.Edm edm, Object data, org.apache.camel.component.olingo4.api.Olingo4ResponseHandler responseHandler);
+void read(org.apache.olingo.commons.api.edm.Edm edm, String resourcePath, java.util.Map<String, String> queryParams, java.util.Map<String, String> endpointHttpHeaders, org.apache.camel.component.olingo4.api.Olingo4ResponseHandler responseHandler);
+void uread(org.apache.olingo.commons.api.edm.Edm edm, String resourcePath, java.util.Map<String, String> queryParams, java.util.Map<String, String> endpointHttpHeaders, org.apache.camel.component.olingo4.api.Olingo4ResponseHandler responseHandler);
+void delete(String resourcePath, java.util.Map<String, String> endpointHttpHeaders, org.apache.camel.component.olingo4.api.Olingo4ResponseHandler responseHandler);
+void create(org.apache.olingo.commons.api.edm.Edm edm, String resourcePath, java.util.Map<String, String> endpointHttpHeaders, Object data, org.apache.camel.component.olingo4.api.Olingo4ResponseHandler responseHandler);
+void update(org.apache.olingo.commons.api.edm.Edm edm, String resourcePath, java.util.Map<String, String> endpointHttpHeaders, Object data, org.apache.camel.component.olingo4.api.Olingo4ResponseHandler responseHandler);
+void patch(org.apache.olingo.commons.api.edm.Edm edm, String resourcePath, java.util.Map<String, String> endpointHttpHeaders, Object data, org.apache.camel.component.olingo4.api.Olingo4ResponseHandler responseHandler);
+void merge(org.apache.olingo.commons.api.edm.Edm edm, String resourcePath, java.util.Map<String, String> endpointHttpHeaders, Object data, org.apache.camel.component.olingo4.api.Olingo4ResponseHandler responseHandler);
+void batch(org.apache.olingo.commons.api.edm.Edm edm, java.util.Map<String, String> endpointHttpHeaders, Object data, org.apache.camel.component.olingo4.api.Olingo4ResponseHandler responseHandler);

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee4c082/components/camel-olingo4/camel-olingo4-component/src/test/java/org/apache/camel/component/olingo4/Olingo4ComponentTest.java
----------------------------------------------------------------------
diff --git a/components/camel-olingo4/camel-olingo4-component/src/test/java/org/apache/camel/component/olingo4/Olingo4ComponentTest.java b/components/camel-olingo4/camel-olingo4-component/src/test/java/org/apache/camel/component/olingo4/Olingo4ComponentTest.java
index e9435e6..63ed723 100644
--- a/components/camel-olingo4/camel-olingo4-component/src/test/java/org/apache/camel/component/olingo4/Olingo4ComponentTest.java
+++ b/components/camel-olingo4/camel-olingo4-component/src/test/java/org/apache/camel/component/olingo4/Olingo4ComponentTest.java
@@ -22,7 +22,9 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.camel.CamelExecutionException;
+import org.apache.camel.Header;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.component.olingo4.api.batch.Olingo4BatchChangeRequest;
 import org.apache.camel.component.olingo4.api.batch.Olingo4BatchQueryRequest;
 import org.apache.camel.component.olingo4.api.batch.Olingo4BatchRequest;
@@ -220,6 +222,32 @@ public class Olingo4ComponentTest extends AbstractOlingo4TestSupport {
         assertNotNull(error);
         LOG.info("Read deleted entity error: {}", error.getMessage());
     }
+    
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testEndpointHttpHeaders() throws Exception {
+        final Map<String, Object> headers = new HashMap<String, Object>();
+        final ClientEntity entity = (ClientEntity)requestBodyAndHeaders("direct://read-etag", null, headers);
+        
+        MockEndpoint mockEndpoint = getMockEndpoint("mock:check-etag-header");
+        mockEndpoint.expectedMessageCount(1);
+        mockEndpoint.assertIsSatisfied();
+        
+        Map<String, String> responseHttpHeaders = (Map<String, String>)mockEndpoint.getExchanges().get(0).getIn().getHeader("CamelOlingo4.responseHttpHeaders");
+        assertEquals(responseHttpHeaders.get("ETag"), entity.getETag());
+        
+        Map<String, String> endpointHttpHeaders = new HashMap<String, String>();
+        endpointHttpHeaders.put("If-Match", entity.getETag());
+        headers.put("CamelOlingo4.endpointHttpHeaders", endpointHttpHeaders);
+        requestBodyAndHeaders("direct://delete-with-etag", null, headers);
+        
+        // check for deleted entity with ETag
+        try {
+            requestBody("direct://read-etag", null);
+        } catch (CamelExecutionException e) {
+            assertStringContains(e.getCause().getMessage(), "The request resource is not found.");
+        }
+    }
 
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
@@ -258,6 +286,10 @@ public class Olingo4ComponentTest extends AbstractOlingo4TestSupport {
 
                 // test route for batch
                 from("direct://batch").to("olingo4://batch");
+                
+                from("direct://read-etag").to("olingo4://read/Airlines('AA')").to("mock:check-etag-header");
+                
+                from("direct://delete-with-etag").to("olingo4://delete/Airlines('AA')");
             }
         };
     }