Repository: camel Updated Branches: refs/heads/master 5aa5ef9ba -> a02395e00
[CAMEL-11425] camel-olingo2 - Add ability to send/receive endpoint HTTP headers. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/a02395e0 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/a02395e0 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/a02395e0 Branch: refs/heads/master Commit: a02395e00fe151154d435dd9fe5cffadc008ec5f Parents: 5aa5ef9 Author: Sean Haynes <s.a.hay...@ieee.org> Authored: Wed Jul 19 10:50:36 2017 -0400 Committer: Claus Ibsen <davscl...@apache.org> Committed: Wed Jul 19 18:15:35 2017 +0200 ---------------------------------------------------------------------- .../camel/component/olingo2/api/Olingo2App.java | 28 +++- .../olingo2/api/Olingo2ResponseHandler.java | 5 +- .../olingo2/api/impl/Olingo2AppImpl.java | 132 ++++++++++++++----- .../camel-olingo2-component/pom.xml | 3 +- .../src/main/docs/olingo2-component.adoc | 40 ++++-- .../component/olingo2/Olingo2AppWrapper.java | 5 +- .../component/olingo2/Olingo2Consumer.java | 2 +- .../component/olingo2/Olingo2Endpoint.java | 2 + .../component/olingo2/Olingo2Producer.java | 8 +- .../src/signatures/olingo-api-signature.txt | 16 +-- .../component/olingo2/Olingo2AppAPITest.java | 60 ++++----- 11 files changed, 207 insertions(+), 94 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/a02395e0/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/Olingo2App.java ---------------------------------------------------------------------- diff --git a/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/Olingo2App.java b/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/Olingo2App.java index 4bddbf6..121cf3b 100644 --- a/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/Olingo2App.java +++ b/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/Olingo2App.java @@ -76,9 +76,11 @@ public interface Olingo2App { * @param resourcePath OData Resource path * @param queryParams OData query params * from http://www.odata.org/documentation/odata-version-2-0/uri-conventions#SystemQueryOptions + * @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, + Map<String, String> endpointHttpHeaders, Olingo2ResponseHandler<T> responseHandler); /** @@ -87,60 +89,74 @@ public interface Olingo2App { * @param resourcePath OData Resource path * @param queryParams OData query params * from http://www.odata.org/documentation/odata-version-2-0/uri-conventions#SystemQueryOptions + * @param endpointHttpHeaders HTTP Headers to add/override the component versions * @param responseHandler callback handler */ void uread(Edm edm, String resourcePath, Map<String, String> queryParams, + Map<String, String> endpointHttpHeaders, Olingo2ResponseHandler<InputStream> responseHandler); /** * Deletes an OData resource and invokes callback * with {@link org.apache.olingo.odata2.api.commons.HttpStatusCodes} 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.odata2.api.commons.HttpStatusCodes} callback handler */ - void delete(String resourcePath, Olingo2ResponseHandler<HttpStatusCodes> responseHandler); + void delete(String resourcePath, Map<String, String> endpointHttpHeaders, + Olingo2ResponseHandler<HttpStatusCodes> 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, Olingo2ResponseHandler<T> responseHandler); + <T> void create(Edm edm, String resourcePath, Map<String, String> endpointHttpHeaders, Object data, + Olingo2ResponseHandler<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.odata2.api.ep.entry.ODataEntry} callback handler */ - <T> void update(Edm edm, String resourcePath, Object data, Olingo2ResponseHandler<T> responseHandler); + <T> void update(Edm edm, String resourcePath, Map<String, String> endpointHttpHeaders, Object data, + Olingo2ResponseHandler<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.odata2.api.ep.entry.ODataEntry} callback handler */ - <T> void patch(Edm edm, String resourcePath, Object data, Olingo2ResponseHandler<T> responseHandler); + <T> void patch(Edm edm, String resourcePath, Map<String, String> endpointHttpHeaders, Object data, + Olingo2ResponseHandler<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.odata2.api.ep.entry.ODataEntry} callback handler */ - <T> void merge(Edm edm, String resourcePath, Object data, Olingo2ResponseHandler<T> responseHandler); + <T> void merge(Edm edm, String resourcePath, Map<String, String> endpointHttpHeaders, Object data, + Olingo2ResponseHandler<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.olingo2.api.batch.Olingo2BatchRequest} list * @param responseHandler callback handler */ - void batch(Edm edm, Object data, Olingo2ResponseHandler<List<Olingo2BatchResponse>> responseHandler); + void batch(Edm edm, Map<String, String> endpointHttpHeaders, Object data, + Olingo2ResponseHandler<List<Olingo2BatchResponse>> responseHandler); } http://git-wip-us.apache.org/repos/asf/camel/blob/a02395e0/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/Olingo2ResponseHandler.java ---------------------------------------------------------------------- diff --git a/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/Olingo2ResponseHandler.java b/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/Olingo2ResponseHandler.java index e96e345..f895328 100644 --- a/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/Olingo2ResponseHandler.java +++ b/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/Olingo2ResponseHandler.java @@ -16,6 +16,8 @@ */ package org.apache.camel.component.olingo2.api; +import java.util.Map; + /** * Callback interface to asynchronously process Olingo2 response. */ @@ -24,8 +26,9 @@ public interface Olingo2ResponseHandler<T> { /** * Handle response data on successful completion of Olingo2 request. * @param response response data from Olingo2, may be NULL for Olingo2 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 Olingo2 request. http://git-wip-us.apache.org/repos/asf/camel/blob/a02395e0/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/impl/Olingo2AppImpl.java ---------------------------------------------------------------------- diff --git a/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/impl/Olingo2AppImpl.java b/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/impl/Olingo2AppImpl.java index 6ec94fc..f4423b7 100644 --- a/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/impl/Olingo2AppImpl.java +++ b/components/camel-olingo2/camel-olingo2-api/src/main/java/org/apache/camel/component/olingo2/api/impl/Olingo2AppImpl.java @@ -24,6 +24,7 @@ import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; import java.nio.charset.Charset; +import java.nio.charset.UnsupportedCharsetException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -46,6 +47,7 @@ import org.apache.http.Header; import org.apache.http.HttpHeaders; import org.apache.http.HttpResponse; import org.apache.http.HttpVersion; +import org.apache.http.ParseException; import org.apache.http.StatusLine; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpDelete; @@ -214,16 +216,19 @@ public final class Olingo2AppImpl implements Olingo2App { @Override public <T> void read(final Edm edm, final String resourcePath, final Map<String, String> queryParams, + final Map<String, String> endpointHttpHeaders, final Olingo2ResponseHandler<T> responseHandler) { final UriInfoWithType uriInfo = parseUri(edm, resourcePath, queryParams); execute(new HttpGet(createUri(resourcePath, queryParams)), getResourceContentType(uriInfo), - new AbstractFutureCallback<T>(responseHandler) { + endpointHttpHeaders, new AbstractFutureCallback<T>(responseHandler) { @Override public void onCompleted(HttpResponse result) throws IOException { - readContent(uriInfo, result.getEntity() != null ? result.getEntity().getContent() : null, + readContent(uriInfo, + headersToMap(result.getAllHeaders()), + result.getEntity() != null ? result.getEntity().getContent() : null, responseHandler); } @@ -232,16 +237,19 @@ public final class Olingo2AppImpl implements Olingo2App { @Override public void uread(final Edm edm, final String resourcePath, final Map<String, String> queryParams, + final Map<String, String> endpointHttpHeaders, final Olingo2ResponseHandler<InputStream> responseHandler) { final UriInfoWithType uriInfo = parseUri(edm, resourcePath, queryParams); execute(new HttpGet(createUri(resourcePath, queryParams)), getResourceContentType(uriInfo), - new AbstractFutureCallback<InputStream>(responseHandler) { + endpointHttpHeaders, new AbstractFutureCallback<InputStream>(responseHandler) { @Override public void onCompleted(HttpResponse result) throws IOException { - responseHandler.onResponse(result.getEntity() != null ? result.getEntity().getContent() : null); + responseHandler.onResponse( + (result.getEntity() != null) ? result.getEntity().getContent() : null, + headersToMap(result.getAllHeaders())); } }); @@ -282,56 +290,78 @@ public final class Olingo2AppImpl implements Olingo2App { } @Override - public <T> void create(Edm edm, String resourcePath, Object data, Olingo2ResponseHandler<T> responseHandler) { + public <T> void create(final Edm edm, + final String resourcePath, + final Map<String, String> endpointHttpHeaders, + final Object data, + final Olingo2ResponseHandler<T> responseHandler) { final UriInfoWithType uriInfo = parseUri(edm, resourcePath, null); - writeContent(edm, new HttpPost(createUri(resourcePath, null)), uriInfo, data, responseHandler); + writeContent(edm, new HttpPost(createUri(resourcePath, null)), uriInfo, endpointHttpHeaders, data, responseHandler); } @Override - public <T> void update(Edm edm, String resourcePath, Object data, Olingo2ResponseHandler<T> responseHandler) { + public <T> void update(final Edm edm, + final String resourcePath, + final Map<String, String> endpointHttpHeaders, + final Object data, + final Olingo2ResponseHandler<T> responseHandler) { final UriInfoWithType uriInfo = parseUri(edm, resourcePath, null); - writeContent(edm, new HttpPut(createUri(resourcePath, null)), uriInfo, data, responseHandler); + writeContent(edm, new HttpPut(createUri(resourcePath, null)), uriInfo, endpointHttpHeaders, data, responseHandler); } @Override - public <T> void patch(Edm edm, String resourcePath, Object data, Olingo2ResponseHandler<T> responseHandler) { + public <T> void patch(final Edm edm, + final String resourcePath, + final Map<String, String> endpointHttpHeaders, + final Object data, + final Olingo2ResponseHandler<T> responseHandler) { final UriInfoWithType uriInfo = parseUri(edm, resourcePath, null); - writeContent(edm, new HttpPatch(createUri(resourcePath, null)), uriInfo, data, responseHandler); + writeContent(edm, new HttpPatch(createUri(resourcePath, null)), uriInfo, endpointHttpHeaders, data, responseHandler); } @Override - public <T> void merge(Edm edm, String resourcePath, Object data, Olingo2ResponseHandler<T> responseHandler) { + public <T> void merge(final Edm edm, + final String resourcePath, + final Map<String, String> endpointHttpHeaders, + final Object data, + final Olingo2ResponseHandler<T> responseHandler) { final UriInfoWithType uriInfo = parseUri(edm, resourcePath, null); - writeContent(edm, new HttpMerge(createUri(resourcePath, null)), uriInfo, data, responseHandler); + writeContent(edm, new HttpMerge(createUri(resourcePath, null)), uriInfo, endpointHttpHeaders, data, responseHandler); } @Override - public void batch(Edm edm, Object data, Olingo2ResponseHandler<List<Olingo2BatchResponse>> responseHandler) { + public void batch(final Edm edm, + final Map<String, String> endpointHttpHeaders, + final Object data, + final Olingo2ResponseHandler<List<Olingo2BatchResponse>> responseHandler) { final UriInfoWithType uriInfo = parseUri(edm, BATCH, null); - writeContent(edm, new HttpPost(createUri(BATCH, null)), uriInfo, data, responseHandler); + writeContent(edm, new HttpPost(createUri(BATCH, null)), uriInfo, endpointHttpHeaders, data, responseHandler); } @Override - public void delete(String resourcePath, final Olingo2ResponseHandler<HttpStatusCodes> responseHandler) { + public void delete(final String resourcePath, + final Map<String, String> endpointHttpHeaders, + final Olingo2ResponseHandler<HttpStatusCodes> responseHandler) { execute(new HttpDelete(createUri(resourcePath)), contentType, - new AbstractFutureCallback<HttpStatusCodes>(responseHandler) { + endpointHttpHeaders, new AbstractFutureCallback<HttpStatusCodes>(responseHandler) { @Override public void onCompleted(HttpResponse result) { final StatusLine statusLine = result.getStatusLine(); - responseHandler.onResponse(HttpStatusCodes.fromStatusCode(statusLine.getStatusCode())); + responseHandler.onResponse(HttpStatusCodes.fromStatusCode(statusLine.getStatusCode()), + headersToMap(result.getAllHeaders())); } }); } - private <T> void readContent(UriInfoWithType uriInfo, InputStream content, Olingo2ResponseHandler<T> responseHandler) { + private <T> void readContent(UriInfoWithType uriInfo, Map<String, String> responseHeaders, InputStream content, Olingo2ResponseHandler<T> responseHandler) { try { - responseHandler.onResponse(this.<T>readContent(uriInfo, content)); + responseHandler.onResponse(this.<T>readContent(uriInfo, content), responseHeaders); } catch (Exception e) { responseHandler.onException(e); } catch (Error e) { @@ -439,8 +469,10 @@ public final class Olingo2AppImpl implements Olingo2App { return response; } - private <T> void writeContent(final Edm edm, HttpEntityEnclosingRequestBase httpEntityRequest, - final UriInfoWithType uriInfo, final Object content, + private <T> void writeContent(final Edm edm, final HttpEntityEnclosingRequestBase httpEntityRequest, + final UriInfoWithType uriInfo, + final Map<String, String> endpointHttpHeaders, + final Object content, final Olingo2ResponseHandler<T> responseHandler) { try { @@ -467,7 +499,7 @@ public final class Olingo2AppImpl implements Olingo2App { final Header requestContentTypeHeader = httpEntityRequest.getFirstHeader(HttpHeaders.CONTENT_TYPE); 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) @@ -480,7 +512,8 @@ public final class Olingo2AppImpl implements Olingo2App { final boolean noEntity = result.getEntity() == null || result.getEntity().getContentLength() == 0; if (statusCode == HttpStatusCodes.NO_CONTENT || noEntity) { responseHandler.onResponse( - (T) HttpStatusCodes.fromStatusCode(result.getStatusLine().getStatusCode())); + (T) HttpStatusCodes.fromStatusCode(result.getStatusLine().getStatusCode()), + headersToMap(result.getAllHeaders())); } else { switch (uriInfo.getUriType()) { @@ -519,7 +552,7 @@ public final class Olingo2AppImpl implements Olingo2App { Locale.ENGLISH, e))); } } - responseHandler.onResponse((T) responses); + responseHandler.onResponse((T) responses, headersToMap(result.getAllHeaders())); break; case URI4: @@ -531,12 +564,14 @@ public final class Olingo2AppImpl implements Olingo2App { if (uriInfo.isValue()) { responseHandler.onResponse( (T) EntityProvider.readPropertyValue(simpleProperty, - result.getEntity().getContent())); + result.getEntity().getContent()), + headersToMap(result.getAllHeaders())); } else { responseHandler.onResponse( (T) EntityProvider.readProperty(getContentType(), simpleProperty, result.getEntity().getContent(), - EntityProviderReadProperties.init().build())); + EntityProviderReadProperties.init().build()), + headersToMap(result.getAllHeaders())); } break; @@ -550,7 +585,8 @@ public final class Olingo2AppImpl implements Olingo2App { .getEntity() .getContent(), EntityProviderReadProperties - .init().build())); + .init().build()), + headersToMap(result.getAllHeaders())); break; case URI7A: @@ -560,7 +596,8 @@ public final class Olingo2AppImpl implements Olingo2App { responseHandler.onResponse((T) EntityProvider.readLink(getContentType(), targetLinkEntitySet, result .getEntity() - .getContent())); + .getContent()), + headersToMap(result.getAllHeaders())); break; case URI7B: @@ -570,7 +607,8 @@ public final class Olingo2AppImpl implements Olingo2App { responseHandler.onResponse((T) EntityProvider.readLinks(getContentType(), targetLinksEntitySet, result.getEntity() - .getContent())); + .getContent()), + headersToMap(result.getAllHeaders())); break; case URI1: @@ -582,7 +620,8 @@ public final class Olingo2AppImpl implements Olingo2App { responseHandler.onResponse((T) EntityProvider.readEntry(response.getContentHeader(), uriInfo.getTargetEntitySet(), result.getEntity().getContent(), - EntityProviderReadProperties.init().build())); + EntityProviderReadProperties.init().build()), + headersToMap(result.getAllHeaders())); break; default: @@ -873,9 +912,14 @@ public final class Olingo2AppImpl implements Olingo2App { ByteArrayInputStream content = null; try { if (response.getBody() != null) { - final ContentType partContentType = receiveWithCharsetParameter(ContentType.parse( - headers.get(HttpHeaders.CONTENT_TYPE)), Consts.UTF_8); - final String charset = partContentType.getCharset().toString(); + String charset = Consts.UTF_8.toString(); + try { + final ContentType partContentType = receiveWithCharsetParameter(ContentType.parse( + headers.get(HttpHeaders.CONTENT_TYPE)), Consts.UTF_8); + charset = partContentType.getCharset().toString(); + } catch (ParseException | UnsupportedCharsetException ex) { + // Use default charset of UTF-8. + } final String body = response.getBody(); content = body != null ? new ByteArrayInputStream(body.getBytes(charset)) : null; @@ -1015,12 +1059,21 @@ public final class Olingo2AppImpl implements Olingo2App { 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 for unit test, not to be used otherwise */ - public void execute(HttpUriRequest httpUriRequest, ContentType contentType, - FutureCallback<HttpResponse> callback) { + public void execute(final HttpUriRequest httpUriRequest, final ContentType contentType, + final Map<String, String> endpointHttpHeaders, + final FutureCallback<HttpResponse> callback) { // add accept header when its not a form or multipart if (!ContentType.APPLICATION_FORM_URLENCODED.getMimeType().equals(contentType.getMimeType()) @@ -1044,6 +1097,13 @@ public final class Olingo2AppImpl implements Olingo2App { httpUriRequest.setHeader(entry.getKey(), entry.getValue()); } } + + // set user specified endpoint headers + if ((endpointHttpHeaders != null) && !endpointHttpHeaders.isEmpty()) { + for (Map.Entry<String, String> entry : endpointHttpHeaders.entrySet()) { + httpUriRequest.setHeader(entry.getKey(), entry.getValue()); + } + } // add client protocol version if not specified if (!httpUriRequest.containsHeader(ODataHttpHeaders.DATASERVICEVERSION)) { http://git-wip-us.apache.org/repos/asf/camel/blob/a02395e0/components/camel-olingo2/camel-olingo2-component/pom.xml ---------------------------------------------------------------------- diff --git a/components/camel-olingo2/camel-olingo2-component/pom.xml b/components/camel-olingo2/camel-olingo2-component/pom.xml index dccfb03..fcaeba8 100644 --- a/components/camel-olingo2/camel-olingo2-component/pom.xml +++ b/components/camel-olingo2/camel-olingo2-component/pom.xml @@ -40,7 +40,7 @@ <camel.osgi.export.pkg>${componentPackage}</camel.osgi.export.pkg> <camel.osgi.private.pkg>${outPackage}</camel.osgi.private.pkg> - <maven.exe.file.extension></maven.exe.file.extension> + <maven.exe.file.extension /> </properties> <dependencies> @@ -179,6 +179,7 @@ </extraOptions> <nullableOptions> <nullableOption>queryParams</nullableOption> + <nullableOption>endpointHttpHeaders</nullableOption> </nullableOptions> </api> </apis> http://git-wip-us.apache.org/repos/asf/camel/blob/a02395e0/components/camel-olingo2/camel-olingo2-component/src/main/docs/olingo2-component.adoc ---------------------------------------------------------------------- diff --git a/components/camel-olingo2/camel-olingo2-component/src/main/docs/olingo2-component.adoc b/components/camel-olingo2/camel-olingo2-component/src/main/docs/olingo2-component.adoc index ae4723b..a4001fb 100644 --- a/components/camel-olingo2/camel-olingo2-component/src/main/docs/olingo2-component.adoc +++ b/components/camel-olingo2/camel-olingo2-component/src/main/docs/olingo2-component.adoc @@ -108,13 +108,28 @@ 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 +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 @@ -128,22 +143,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.olingo2.api.batch.Olingo2BatchResponse> +|batch |data, endpointHttpHeaders |POST with multipart/mixed batch request |java.util.List<org.apache.camel.component.olingo2.api.batch.Olingo2BatchResponse> -|create |data, resourcePath |POST |org.apache.olingo.odata2.api.ep.entry.ODataEntry for new entries +|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 |DELETE |org.apache.olingo.odata2.api.commons.HttpStatusCodes +|delete |resourcePath, endpointHttpHeaders |DELETE |org.apache.olingo.odata2.api.commons.HttpStatusCodes -|merge |data, resourcePath |MERGE |org.apache.olingo.odata2.api.commons.HttpStatusCodes +|merge |data, resourcePath, endpointHttpHeaders |MERGE |org.apache.olingo.odata2.api.commons.HttpStatusCodes -|patch |data, resourcePath |PATCH |org.apache.olingo.odata2.api.commons.HttpStatusCodes +|patch |data, resourcePath, endpointHttpHeaders |PATCH |org.apache.olingo.odata2.api.commons.HttpStatusCodes -|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.odata2.api.commons.HttpStatusCodes +|update |data, resourcePath, endpointHttpHeaders |PUT |org.apache.olingo.odata2.api.commons.HttpStatusCodes |======================================================================= +### Endpoint HTTP Headers (Since 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 *`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 http://git-wip-us.apache.org/repos/asf/camel/blob/a02395e0/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2AppWrapper.java ---------------------------------------------------------------------- diff --git a/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2AppWrapper.java b/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2AppWrapper.java index 63f7f97..164ad8b 100644 --- a/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2AppWrapper.java +++ b/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2AppWrapper.java @@ -16,6 +16,7 @@ */ package org.apache.camel.component.olingo2; +import java.util.Map; import java.util.concurrent.CountDownLatch; import org.apache.camel.RuntimeCamelException; @@ -58,10 +59,10 @@ public class Olingo2AppWrapper { final CountDownLatch latch = new CountDownLatch(1); final Exception[] error = new Exception[1]; - olingo2App.read(null, "$metadata", null, new Olingo2ResponseHandler<Edm>() { + olingo2App.read(null, "$metadata", null, null, new Olingo2ResponseHandler<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/a02395e0/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Consumer.java ---------------------------------------------------------------------- diff --git a/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Consumer.java b/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Consumer.java index 4a46675..3418fbe 100644 --- a/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Consumer.java +++ b/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Consumer.java @@ -55,7 +55,7 @@ public class Olingo2Consumer extends AbstractApiConsumer<Olingo2ApiName, Olingo2 args.put(Olingo2Endpoint.RESPONSE_HANDLER_PROPERTY, new Olingo2ResponseHandler<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/a02395e0/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Endpoint.java ---------------------------------------------------------------------- diff --git a/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Endpoint.java b/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Endpoint.java index 652d3ae..94fdc7a 100644 --- a/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Endpoint.java +++ b/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Endpoint.java @@ -46,6 +46,7 @@ public class Olingo2Endpoint extends AbstractApiEndpoint<Olingo2ApiName, Olingo2 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"; @@ -72,6 +73,7 @@ public class Olingo2Endpoint extends AbstractApiEndpoint<Olingo2ApiName, Olingo2 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/a02395e0/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Producer.java ---------------------------------------------------------------------- diff --git a/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Producer.java b/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Producer.java index b9e46a4..dcd8891 100644 --- a/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Producer.java +++ b/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Producer.java @@ -24,6 +24,7 @@ import org.apache.camel.Exchange; import org.apache.camel.RuntimeCamelException; import org.apache.camel.component.olingo2.api.Olingo2ResponseHandler; import org.apache.camel.component.olingo2.internal.Olingo2ApiName; +import org.apache.camel.component.olingo2.internal.Olingo2Constants; import org.apache.camel.component.olingo2.internal.Olingo2PropertiesHelper; import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.component.AbstractApiProducer; @@ -38,6 +39,8 @@ public class Olingo2Producer extends AbstractApiProducer<Olingo2ApiName, Olingo2 private static final Logger LOG = LoggerFactory.getLogger(Olingo2Producer.class); + private static final String RESPONSE_HTTP_HEADERS = "responseHttpHeaders"; + public Olingo2Producer(Olingo2Endpoint endpoint) { super(endpoint, Olingo2PropertiesHelper.getHelper()); } @@ -56,11 +59,14 @@ public class Olingo2Producer extends AbstractApiProducer<Olingo2ApiName, Olingo2 // create response handler properties.put(Olingo2Endpoint.RESPONSE_HANDLER_PROPERTY, new Olingo2ResponseHandler<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(Olingo2Constants.PROPERTY_PREFIX + RESPONSE_HTTP_HEADERS, responseHeaders); interceptResult(response, exchange); http://git-wip-us.apache.org/repos/asf/camel/blob/a02395e0/components/camel-olingo2/camel-olingo2-component/src/signatures/olingo-api-signature.txt ---------------------------------------------------------------------- diff --git a/components/camel-olingo2/camel-olingo2-component/src/signatures/olingo-api-signature.txt b/components/camel-olingo2/camel-olingo2-component/src/signatures/olingo-api-signature.txt index 006fba7..d4ba9ad 100644 --- a/components/camel-olingo2/camel-olingo2-component/src/signatures/olingo-api-signature.txt +++ b/components/camel-olingo2/camel-olingo2-component/src/signatures/olingo-api-signature.txt @@ -1,8 +1,8 @@ -void read(org.apache.olingo.odata2.api.edm.Edm edm, String resourcePath, java.util.Map<String, String> queryParams, org.apache.camel.component.olingo2.api.Olingo2ResponseHandler responseHandler); -void uread(org.apache.olingo.odata2.api.edm.Edm edm, String resourcePath, java.util.Map<String, String> queryParams, org.apache.camel.component.olingo2.api.Olingo2ResponseHandler responseHandler); -void delete(String resourcePath, org.apache.camel.component.olingo2.api.Olingo2ResponseHandler responseHandler); -void create(org.apache.olingo.odata2.api.edm.Edm edm, String resourcePath, Object data, org.apache.camel.component.olingo2.api.Olingo2ResponseHandler responseHandler); -void update(org.apache.olingo.odata2.api.edm.Edm edm, String resourcePath, Object data, org.apache.camel.component.olingo2.api.Olingo2ResponseHandler responseHandler); -void patch(org.apache.olingo.odata2.api.edm.Edm edm, String resourcePath, Object data, org.apache.camel.component.olingo2.api.Olingo2ResponseHandler responseHandler); -void merge(org.apache.olingo.odata2.api.edm.Edm edm, String resourcePath, Object data, org.apache.camel.component.olingo2.api.Olingo2ResponseHandler responseHandler); -void batch(org.apache.olingo.odata2.api.edm.Edm edm, Object data, org.apache.camel.component.olingo2.api.Olingo2ResponseHandler responseHandler); +void read(org.apache.olingo.odata2.api.edm.Edm edm, String resourcePath, java.util.Map<String, String> queryParams, java.util.Map<String, String> endpointHttpHeaders, org.apache.camel.component.olingo2.api.Olingo2ResponseHandler responseHandler); +void uread(org.apache.olingo.odata2.api.edm.Edm edm, String resourcePath, java.util.Map<String, String> queryParams, java.util.Map<String, String> endpointHttpHeaders, org.apache.camel.component.olingo2.api.Olingo2ResponseHandler responseHandler); +void delete(String resourcePath, java.util.Map<String, String> endpointHttpHeaders, org.apache.camel.component.olingo2.api.Olingo2ResponseHandler responseHandler); +void create(org.apache.olingo.odata2.api.edm.Edm edm, String resourcePath, java.util.Map<String, String> endpointHttpHeaders, Object data, org.apache.camel.component.olingo2.api.Olingo2ResponseHandler responseHandler); +void update(org.apache.olingo.odata2.api.edm.Edm edm, String resourcePath, java.util.Map<String, String> endpointHttpHeaders, Object data, org.apache.camel.component.olingo2.api.Olingo2ResponseHandler responseHandler); +void patch(org.apache.olingo.odata2.api.edm.Edm edm, String resourcePath, java.util.Map<String, String> endpointHttpHeaders, Object data, org.apache.camel.component.olingo2.api.Olingo2ResponseHandler responseHandler); +void merge(org.apache.olingo.odata2.api.edm.Edm edm, String resourcePath, java.util.Map<String, String> endpointHttpHeaders, Object data, org.apache.camel.component.olingo2.api.Olingo2ResponseHandler responseHandler); +void batch(org.apache.olingo.odata2.api.edm.Edm edm, java.util.Map<String, String> endpointHttpHeaders, Object data, org.apache.camel.component.olingo2.api.Olingo2ResponseHandler responseHandler); http://git-wip-us.apache.org/repos/asf/camel/blob/a02395e0/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2AppAPITest.java ---------------------------------------------------------------------- diff --git a/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2AppAPITest.java b/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2AppAPITest.java index d0b0934..28b43a9 100644 --- a/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2AppAPITest.java +++ b/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2AppAPITest.java @@ -139,7 +139,7 @@ public class Olingo2AppAPITest { LOG.info("Read Edm "); final TestOlingo2ResponseHandler<Edm> responseHandler = new TestOlingo2ResponseHandler<Edm>(); - olingoApp.read(null, Olingo2AppImpl.METADATA, null, responseHandler); + olingoApp.read(null, Olingo2AppImpl.METADATA, null, null, responseHandler); edm = responseHandler.await(); LOG.info("Read default EntityContainer: {}", responseHandler.await().getDefaultEntityContainer().getName()); @@ -158,7 +158,7 @@ public class Olingo2AppAPITest { final TestOlingo2ResponseHandler<ServiceDocument> responseHandler = new TestOlingo2ResponseHandler<ServiceDocument>(); - olingoApp.read(null, "", null, responseHandler); + olingoApp.read(null, "", null, null, responseHandler); final ServiceDocument serviceDocument = responseHandler.await(); final List<Collection> collections = serviceDocument.getAtomInfo().getWorkspaces().get(0).getCollections(); @@ -174,7 +174,7 @@ public class Olingo2AppAPITest { public void testReadFeed() throws Exception { final TestOlingo2ResponseHandler<ODataFeed> responseHandler = new TestOlingo2ResponseHandler<ODataFeed>(); - olingoApp.read(edm, MANUFACTURERS, null, responseHandler); + olingoApp.read(edm, MANUFACTURERS, null, null, responseHandler); final ODataFeed dataFeed = responseHandler.await(); assertNotNull("Data feed", dataFeed); @@ -185,7 +185,7 @@ public class Olingo2AppAPITest { public void testReadUnparsedFeed() throws Exception { final TestOlingo2ResponseHandler<InputStream> responseHandler = new TestOlingo2ResponseHandler<InputStream>(); - olingoApp.uread(edm, MANUFACTURERS, null, responseHandler); + olingoApp.uread(edm, MANUFACTURERS, null, null, responseHandler); final InputStream rawfeed = responseHandler.await(); assertNotNull("Data feed", rawfeed); @@ -199,13 +199,13 @@ public class Olingo2AppAPITest { public void testReadEntry() throws Exception { final TestOlingo2ResponseHandler<ODataEntry> responseHandler = new TestOlingo2ResponseHandler<ODataEntry>(); - olingoApp.read(edm, TEST_MANUFACTURER, null, responseHandler); + olingoApp.read(edm, TEST_MANUFACTURER, null, null, responseHandler); ODataEntry entry = responseHandler.await(); LOG.info("Single Entry: {}", prettyPrint(entry)); responseHandler.reset(); - olingoApp.read(edm, TEST_CAR, null, responseHandler); + olingoApp.read(edm, TEST_CAR, null, null, responseHandler); entry = responseHandler.await(); LOG.info("Single Entry: {}", prettyPrint(entry)); @@ -213,7 +213,7 @@ public class Olingo2AppAPITest { final Map<String, String> queryParams = new HashMap<String, String>(); queryParams.put(SystemQueryOption.$expand.toString(), CARS); - olingoApp.read(edm, TEST_MANUFACTURER, queryParams, responseHandler); + olingoApp.read(edm, TEST_MANUFACTURER, queryParams, null, responseHandler); ODataEntry entryExpanded = responseHandler.await(); LOG.info("Single Entry with expanded Cars relation: {}", prettyPrint(entryExpanded)); @@ -223,7 +223,7 @@ public class Olingo2AppAPITest { public void testReadUnparsedEntry() throws Exception { final TestOlingo2ResponseHandler<InputStream> responseHandler = new TestOlingo2ResponseHandler<InputStream>(); - olingoApp.uread(edm, TEST_MANUFACTURER, null, responseHandler); + olingoApp.uread(edm, TEST_MANUFACTURER, null, null, responseHandler); InputStream rawentry = responseHandler.await(); ODataEntry entry = EntityProvider.readEntry(TEST_FORMAT_STRING, edmEntitySetMap.get(MANUFACTURERS), rawentry, EntityProviderReadProperties.init().build()); @@ -231,7 +231,7 @@ public class Olingo2AppAPITest { responseHandler.reset(); - olingoApp.uread(edm, TEST_CAR, null, responseHandler); + olingoApp.uread(edm, TEST_CAR, null, null, responseHandler); rawentry = responseHandler.await(); entry = EntityProvider.readEntry(TEST_FORMAT_STRING, edmEntitySetMap.get(CARS), rawentry, EntityProviderReadProperties.init().build()); @@ -241,7 +241,7 @@ public class Olingo2AppAPITest { final Map<String, String> queryParams = new HashMap<String, String>(); queryParams.put(SystemQueryOption.$expand.toString(), CARS); - olingoApp.uread(edm, TEST_MANUFACTURER, queryParams, responseHandler); + olingoApp.uread(edm, TEST_MANUFACTURER, queryParams, null, responseHandler); rawentry = responseHandler.await(); ODataEntry entryExpanded = EntityProvider.readEntry(TEST_FORMAT_STRING, edmEntitySetMap.get(MANUFACTURERS), @@ -255,14 +255,14 @@ public class Olingo2AppAPITest { final TestOlingo2ResponseHandler<Map<String, Object>> propertyHandler = new TestOlingo2ResponseHandler<Map<String, Object>>(); - olingoApp.read(edm, TEST_MANUFACTURER_FOUNDED_PROPERTY, null, propertyHandler); + olingoApp.read(edm, TEST_MANUFACTURER_FOUNDED_PROPERTY, null, null, propertyHandler); Calendar founded = (Calendar) propertyHandler.await().get(FOUNDED_PROPERTY); LOG.info("Founded property {}", founded.toString()); final TestOlingo2ResponseHandler<Calendar> valueHandler = new TestOlingo2ResponseHandler<Calendar>(); - olingoApp.read(edm, TEST_MANUFACTURER_FOUNDED_VALUE, null, valueHandler); + olingoApp.read(edm, TEST_MANUFACTURER_FOUNDED_VALUE, null, null, valueHandler); founded = valueHandler.await(); LOG.info("Founded property {}", founded.toString()); @@ -274,20 +274,20 @@ public class Olingo2AppAPITest { // olingoApp.update(edm, TEST_MANUFACTURER_FOUNDED_PROPERTY, properties, statusHandler); // requires a plain Date for XML - olingoApp.update(edm, TEST_MANUFACTURER_FOUNDED_PROPERTY, new Date(), statusHandler); + olingoApp.update(edm, TEST_MANUFACTURER_FOUNDED_PROPERTY, null, new Date(), statusHandler); LOG.info("Founded property updated with status {}", statusHandler.await().getStatusCode()); statusHandler.reset(); - olingoApp.update(edm, TEST_MANUFACTURER_FOUNDED_VALUE, new Date(), statusHandler); + olingoApp.update(edm, TEST_MANUFACTURER_FOUNDED_VALUE, null, new Date(), statusHandler); LOG.info("Founded property updated with status {}", statusHandler.await().getStatusCode()); // test complex property Manufacturer.Address propertyHandler.reset(); - olingoApp.read(edm, TEST_MANUFACTURER_ADDRESS_PROPERTY, null, propertyHandler); + olingoApp.read(edm, TEST_MANUFACTURER_ADDRESS_PROPERTY, null, null, propertyHandler); final Map<String, Object> address = propertyHandler.await(); LOG.info("Address property {}", prettyPrint(address, 0)); @@ -303,7 +303,7 @@ public class Olingo2AppAPITest { address.put("Country", "Germany"); // olingoApp.patch(edm, TEST_MANUFACTURER_ADDRESS_PROPERTY, address, statusHandler); - olingoApp.merge(edm, TEST_MANUFACTURER_ADDRESS_PROPERTY, address, statusHandler); + olingoApp.merge(edm, TEST_MANUFACTURER_ADDRESS_PROPERTY, null, address, statusHandler); LOG.info("Address property updated with status {}", statusHandler.await().getStatusCode()); } @@ -312,7 +312,7 @@ public class Olingo2AppAPITest { public void testReadDeleteCreateLinks() throws Exception { final TestOlingo2ResponseHandler<List<String>> linksHandler = new TestOlingo2ResponseHandler<List<String>>(); - olingoApp.read(edm, TEST_MANUFACTURER_LINKS_CARS, null, linksHandler); + olingoApp.read(edm, TEST_MANUFACTURER_LINKS_CARS, null, null, linksHandler); final List<String> links = linksHandler.await(); assertFalse(links.isEmpty()); @@ -320,7 +320,7 @@ public class Olingo2AppAPITest { final TestOlingo2ResponseHandler<String> linkHandler = new TestOlingo2ResponseHandler<String>(); - olingoApp.read(edm, TEST_CAR_LINK_MANUFACTURER, null, linkHandler); + olingoApp.read(edm, TEST_CAR_LINK_MANUFACTURER, null, null, linkHandler); final String link = linkHandler.await(); LOG.info("Read link: {}", link); @@ -377,22 +377,22 @@ public class Olingo2AppAPITest { public void testReadCount() throws Exception { final TestOlingo2ResponseHandler<Long> countHandler = new TestOlingo2ResponseHandler<Long>(); - olingoApp.read(edm, MANUFACTURERS + COUNT_OPTION, null, countHandler); + olingoApp.read(edm, MANUFACTURERS + COUNT_OPTION, null, null, countHandler); LOG.info("Manufacturers count: {}", countHandler.await()); countHandler.reset(); - olingoApp.read(edm, TEST_MANUFACTURER + COUNT_OPTION, null, countHandler); + olingoApp.read(edm, TEST_MANUFACTURER + COUNT_OPTION, null, null, countHandler); LOG.info("Manufacturer count: {}", countHandler.await()); countHandler.reset(); - olingoApp.read(edm, TEST_MANUFACTURER_LINKS_CARS + COUNT_OPTION, null, countHandler); + olingoApp.read(edm, TEST_MANUFACTURER_LINKS_CARS + COUNT_OPTION, null, null, countHandler); LOG.info("Manufacturers links count: {}", countHandler.await()); countHandler.reset(); - olingoApp.read(edm, TEST_CAR_LINK_MANUFACTURER + COUNT_OPTION, null, countHandler); + olingoApp.read(edm, TEST_CAR_LINK_MANUFACTURER + COUNT_OPTION, null, null, countHandler); LOG.info("Manufacturer link count: {}", countHandler.await()); } @@ -403,7 +403,7 @@ public class Olingo2AppAPITest { // create entry to update final TestOlingo2ResponseHandler<ODataEntry> entryHandler = new TestOlingo2ResponseHandler<ODataEntry>(); - olingoApp.create(edm, MANUFACTURERS, getEntityData(), entryHandler); + olingoApp.create(edm, MANUFACTURERS, null, getEntityData(), entryHandler); ODataEntry createdEntry = entryHandler.await(); LOG.info("Created Entry: {}", prettyPrint(createdEntry)); @@ -417,22 +417,22 @@ public class Olingo2AppAPITest { final TestOlingo2ResponseHandler<HttpStatusCodes> statusHandler = new TestOlingo2ResponseHandler<HttpStatusCodes>(); - olingoApp.update(edm, TEST_CREATE_MANUFACTURER, data, statusHandler); + olingoApp.update(edm, TEST_CREATE_MANUFACTURER, null, data, statusHandler); statusHandler.await(); statusHandler.reset(); data.put("Name", "MyCarManufacturer Patched"); - olingoApp.patch(edm, TEST_CREATE_MANUFACTURER, data, statusHandler); + olingoApp.patch(edm, TEST_CREATE_MANUFACTURER, null, data, statusHandler); statusHandler.await(); entryHandler.reset(); - olingoApp.read(edm, TEST_CREATE_MANUFACTURER, null, entryHandler); + olingoApp.read(edm, TEST_CREATE_MANUFACTURER, null, null, entryHandler); ODataEntry updatedEntry = entryHandler.await(); LOG.info("Updated Entry successfully: {}", prettyPrint(updatedEntry)); statusHandler.reset(); - olingoApp.delete(TEST_CREATE_MANUFACTURER, statusHandler); + olingoApp.delete(TEST_CREATE_MANUFACTURER, null, statusHandler); HttpStatusCodes statusCode = statusHandler.await(); LOG.info("Deletion of Entry was successful: {}: {}", statusCode.getStatusCode(), statusCode.getInfo()); @@ -441,7 +441,7 @@ public class Olingo2AppAPITest { LOG.info("Verify Delete Entry"); entryHandler.reset(); - olingoApp.read(edm, TEST_CREATE_MANUFACTURER, null, entryHandler); + olingoApp.read(edm, TEST_CREATE_MANUFACTURER, null, null, entryHandler); entryHandler.await(); fail("Entry not deleted!"); @@ -493,7 +493,7 @@ public class Olingo2AppAPITest { // read to verify delete batchParts.add(Olingo2BatchQueryRequest.resourcePath(TEST_CREATE_MANUFACTURER).build()); - olingoApp.batch(edm, batchParts, responseHandler); + olingoApp.batch(edm, null, batchParts, responseHandler); final List<Olingo2BatchResponse> responseParts = responseHandler.await(15, TimeUnit.MINUTES); assertEquals("Batch responses expected", 8, responseParts.size()); @@ -602,7 +602,7 @@ public class Olingo2AppAPITest { 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 ODataFeed) {