This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch camel-3.4.x
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-3.4.x by this push:
new 775af5f camel-olingo2 improvements (#4098) (#4102)
775af5f is described below
commit 775af5f1c3ada53382199752f42f11fcf80fa62a
Author: Christoph Deppisch <[email protected]>
AuthorDate: Wed Aug 19 17:08:40 2020 +0200
camel-olingo2 improvements (#4098) (#4102)
* fix(CAMEL-15405): Propagate inline count in camel-olingo2 component
Add result count (coming from system query option $inlinecount) to OData
entries when using splitResults
* fix(CAMEL-15406): Configure entity provider properties on camel-olingo2
Add uri param configuration settings for read/write entity provider
properties. The entity provider properties are used for each read/write
operation and specify the way to serialize OData entries as Json/Xml/Atom data.
* fix(CAMEL-15407): Fix merge operation in camel-olingo2
Merge operation must enable isDataBasedPropertySerialization setting in the
entity provider write properties in order to not overwrite unspecified fields
with null values.
(cherry picked from commit 26392dfd37f7bd079a11bb48defb587d827df5b5)
---
.../camel/component/olingo2/api/Olingo2App.java | 58 ++++--
.../component/olingo2/api/impl/Olingo2AppImpl.java | 111 ++++++++----
.../olingo2/Olingo2ComponentConfigurer.java | 10 ++
.../olingo2/Olingo2EndpointConfigurer.java | 10 ++
.../apache/camel/component/olingo2/olingo2.json | 4 +
.../src/main/docs/olingo2-component.adoc | 8 +-
.../camel/component/olingo2/Olingo2Component.java | 6 +-
.../component/olingo2/Olingo2Configuration.java | 73 ++++++--
.../camel/component/olingo2/Olingo2Consumer.java | 7 +
.../olingo2/Olingo2ComponentConsumerTest.java | 45 ++++-
.../olingo2/Olingo2ComponentProducerTest.java | 62 ++++++-
.../dsl/Olingo2ComponentBuilderFactory.java | 35 ++++
.../dsl/Olingo2EndpointBuilderFactory.java | 198 +++++++++++++++++++++
.../modules/ROOT/pages/olingo2-component.adoc | 8 +-
14 files changed, 557 insertions(+), 78 deletions(-)
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 d44d46a..07b9c3e 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
@@ -23,6 +23,8 @@ import java.util.Map;
import org.apache.camel.component.olingo2.api.batch.Olingo2BatchResponse;
import org.apache.olingo.odata2.api.commons.HttpStatusCodes;
import org.apache.olingo.odata2.api.edm.Edm;
+import org.apache.olingo.odata2.api.ep.EntityProviderReadProperties;
+import org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties;
/**
* Olingo2 Client Api Interface.
@@ -31,28 +33,56 @@ public interface Olingo2App {
/**
* Sets Service base URI.
- *
+ *
* @param serviceUri
*/
void setServiceUri(String serviceUri);
/**
* Returns Service base URI.
- *
+ *
* @return service base URI.
*/
String getServiceUri();
/**
* Sets custom Http headers to add to every service request.
- *
+ *
* @param httpHeaders custom Http headers.
*/
void setHttpHeaders(Map<String, String> httpHeaders);
/**
+ * Specify custom entity provider read properties.
+ *
+ * @param entityProviderReadProperties the custom properties to set.
+ */
+ void setEntityProviderReadProperties(EntityProviderReadProperties
entityProviderReadProperties);
+
+ /**
+ * Obtains the custom entity provider read properties.
+ *
+ * @return the custom read properties.
+ */
+ EntityProviderReadProperties getEntityProviderReadProperties();
+
+ /**
+ * Specify custom entity provider write properties.
+ *
+ * @param entityProviderWriteProperties the custom properties to set.
+ */
+ void setEntityProviderWriteProperties(EntityProviderWriteProperties
entityProviderWriteProperties);
+
+ /**
+ * Obtains the custom entity provider write properties.
+ *
+ * @return the custom write properties.
+ */
+ EntityProviderWriteProperties getEntityProviderWriteProperties();
+
+ /**
* Returns custom Http headers.
- *
+ *
* @return custom Http headers.
*/
Map<String, String> getHttpHeaders();
@@ -60,14 +90,14 @@ public interface Olingo2App {
/**
* Returns content type for service calls. Defaults to
* <code>application/json;charset=utf-8</code>.
- *
+ *
* @return content type.
*/
String getContentType();
/**
* Set default service call content type.
- *
+ *
* @param contentType content type.
*/
void setContentType(String contentType);
@@ -79,7 +109,7 @@ public interface Olingo2App {
/**
* Reads an OData resource and invokes callback with appropriate result.
- *
+ *
* @param edm Service Edm, read from calling
* <code>read(null, "$metdata", null, responseHandler)</code>
* @param resourcePath OData Resource path
@@ -94,7 +124,7 @@ public interface Olingo2App {
/**
* Reads an OData resource and invokes callback with the unparsed input
* stream.
- *
+ *
* @param edm Service Edm, read from calling
* <code>read(null, "$metdata", null, responseHandler)</code>
* @param resourcePath OData Resource path
@@ -110,7 +140,7 @@ public interface Olingo2App {
* 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
@@ -122,7 +152,7 @@ public interface Olingo2App {
/**
* Creates a new OData resource.
- *
+ *
* @param edm service Edm
* @param resourcePath resource path to create
* @param endpointHttpHeaders HTTP Headers to add/override the component
@@ -134,7 +164,7 @@ public interface Olingo2App {
/**
* Updates an OData resource.
- *
+ *
* @param edm service Edm
* @param resourcePath resource path to update
* @param endpointHttpHeaders HTTP Headers to add/override the component
@@ -148,7 +178,7 @@ public interface Olingo2App {
/**
* 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
@@ -162,7 +192,7 @@ public interface Olingo2App {
/**
* 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
@@ -176,7 +206,7 @@ public interface Olingo2App {
/**
* Executes a batch request.
- *
+ *
* @param edm service Edm
* @param endpointHttpHeaders HTTP Headers to add/override the component
* versions
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 8ad7774..301a6a2 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
@@ -128,6 +128,8 @@ public final class Olingo2AppImpl implements Olingo2App {
private String serviceUri;
private ContentType contentType;
private Map<String, String> httpHeaders;
+ private EntityProviderReadProperties entityProviderReadProperties;
+ private EntityProviderWriteProperties entityProviderWriteProperties;
/**
* Create Olingo2 Application with default HTTP configuration.
@@ -197,6 +199,34 @@ public final class Olingo2AppImpl implements Olingo2App {
}
@Override
+ public void setEntityProviderReadProperties(EntityProviderReadProperties
entityProviderReadProperties) {
+ this.entityProviderReadProperties = entityProviderReadProperties;
+ }
+
+ @Override
+ public EntityProviderReadProperties getEntityProviderReadProperties() {
+ if (entityProviderReadProperties == null) {
+ entityProviderReadProperties =
EntityProviderReadProperties.init().build();
+ }
+
+ return entityProviderReadProperties;
+ }
+
+ @Override
+ public void setEntityProviderWriteProperties(EntityProviderWriteProperties
entityProviderWriteProperties) {
+ this.entityProviderWriteProperties = entityProviderWriteProperties;
+ }
+
+ @Override
+ public EntityProviderWriteProperties getEntityProviderWriteProperties() {
+ if (entityProviderWriteProperties == null) {
+ entityProviderWriteProperties =
EntityProviderWriteProperties.serviceRoot(null).build();
+ }
+
+ return entityProviderWriteProperties;
+ }
+
+ @Override
public String getContentType() {
return contentType.toString();
}
@@ -300,7 +330,8 @@ public final class Olingo2AppImpl implements Olingo2App {
final Olingo2ResponseHandler<T> responseHandler) {
final UriInfoWithType uriInfo = parseUri(edm, resourcePath, null);
- writeContent(edm, new HttpPost(createUri(resourcePath, null)),
uriInfo, endpointHttpHeaders, data, responseHandler);
+ writeContent(edm, new HttpPost(createUri(resourcePath, null)), uriInfo,
+ endpointHttpHeaders, data, responseHandler,
getEntityProviderWriteProperties());
}
@Override
@@ -309,7 +340,9 @@ public final class Olingo2AppImpl implements Olingo2App {
final UriInfoWithType uriInfo = parseUri(edm, resourcePath, null);
augmentWithETag(edm, resourcePath, endpointHttpHeaders, new
HttpPut(createUri(resourcePath, null)),
- request -> writeContent(edm, (HttpPut)request, uriInfo,
endpointHttpHeaders, data, responseHandler), responseHandler);
+ request -> writeContent(edm, (HttpPut) request, uriInfo,
+ endpointHttpHeaders, data, responseHandler,
getEntityProviderWriteProperties()),
+ responseHandler);
}
@Override
@@ -318,7 +351,9 @@ public final class Olingo2AppImpl implements Olingo2App {
final UriInfoWithType uriInfo = parseUri(edm, resourcePath, null);
augmentWithETag(edm, resourcePath, endpointHttpHeaders, new
HttpPatch(createUri(resourcePath, null)),
- request -> writeContent(edm, (HttpPatch)request, uriInfo,
endpointHttpHeaders, data, responseHandler), responseHandler);
+ request -> writeContent(edm, (HttpPatch) request, uriInfo,
+ endpointHttpHeaders, data, responseHandler,
getEntityProviderWriteProperties()),
+ responseHandler);
}
@Override
@@ -326,15 +361,23 @@ public final class Olingo2AppImpl implements Olingo2App {
final Olingo2ResponseHandler<T> responseHandler) {
final UriInfoWithType uriInfo = parseUri(edm, resourcePath, null);
+ // merge operation must use data based property serialization in order
to not overwrite
+ // unspecified properties with null values
+ EntityProviderWriteProperties entityProviderWriteProperties =
+
EntityProviderWriteProperties.fromProperties(getEntityProviderWriteProperties())
+
.isDataBasedPropertySerialization(true).build();
augmentWithETag(edm, resourcePath, endpointHttpHeaders, new
HttpMerge(createUri(resourcePath, null)),
- request -> writeContent(edm, (HttpMerge)request, uriInfo,
endpointHttpHeaders, data, responseHandler), responseHandler);
+ request -> writeContent(edm, (HttpMerge) request, uriInfo,
+ endpointHttpHeaders, data, responseHandler,
entityProviderWriteProperties),
+ responseHandler);
}
@Override
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,
endpointHttpHeaders, data, responseHandler);
+ writeContent(edm, new HttpPost(createUri(BATCH, null)), uriInfo,
+ endpointHttpHeaders, data, responseHandler,
getEntityProviderWriteProperties());
}
@Override
@@ -481,7 +524,8 @@ public final class Olingo2AppImpl implements Olingo2App {
// complex property
final List<EdmProperty> complexPropertyPath =
uriInfo.getPropertyPath();
final EdmProperty complexProperty =
complexPropertyPath.get(complexPropertyPath.size() - 1);
- response = (T)EntityProvider.readProperty(getContentType(),
complexProperty, content, EntityProviderReadProperties.init().build());
+ response = (T)EntityProvider.readProperty(getContentType(),
complexProperty, content,
+ getEntityProviderReadProperties());
break;
case URI4:
@@ -492,7 +536,8 @@ public final class Olingo2AppImpl implements Olingo2App {
if (uriInfo.isValue()) {
response =
(T)EntityProvider.readPropertyValue(simpleProperty, content);
} else {
- response =
(T)EntityProvider.readProperty(getContentType(), simpleProperty, content,
EntityProviderReadProperties.init().build());
+ response =
(T)EntityProvider.readProperty(getContentType(), simpleProperty, content,
+ getEntityProviderReadProperties());
}
break;
@@ -509,16 +554,19 @@ public final class Olingo2AppImpl implements Olingo2App {
case URI6B:
if
(uriInfo.getCustomQueryOptions().containsKey("!deltatoken")) {
// ODataDeltaFeed
- response =
(T)EntityProvider.readDeltaFeed(getContentType(), uriInfo.getTargetEntitySet(),
content, EntityProviderReadProperties.init().build());
+ response =
(T)EntityProvider.readDeltaFeed(getContentType(), uriInfo.getTargetEntitySet(),
content,
+ getEntityProviderReadProperties());
} else {
// ODataFeed
- response = (T)EntityProvider.readFeed(getContentType(),
uriInfo.getTargetEntitySet(), content,
EntityProviderReadProperties.init().build());
+ response = (T)EntityProvider.readFeed(getContentType(),
uriInfo.getTargetEntitySet(), content,
+ getEntityProviderReadProperties());
}
break;
case URI2:
case URI6A:
- response = (T)EntityProvider.readEntry(getContentType(),
uriInfo.getTargetEntitySet(), content,
EntityProviderReadProperties.init().build());
+ response = (T)EntityProvider.readEntry(getContentType(),
uriInfo.getTargetEntitySet(), content,
+ getEntityProviderReadProperties());
break;
// Function Imports
@@ -527,7 +575,8 @@ public final class Olingo2AppImpl implements Olingo2App {
case URI12:
case URI13:
case URI14:
- response =
(T)EntityProvider.readFunctionImport(getContentType(),
uriInfo.getFunctionImport(), content,
EntityProviderReadProperties.init().build());
+ response =
(T)EntityProvider.readFunctionImport(getContentType(),
uriInfo.getFunctionImport(), content,
+ getEntityProviderReadProperties());
break;
default:
@@ -538,11 +587,12 @@ public final class Olingo2AppImpl implements Olingo2App {
}
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) {
+ final Map<String, String> endpointHttpHeaders, final Object
content,
+ final Olingo2ResponseHandler<T> responseHandler,
EntityProviderWriteProperties entityProviderWriteProperties) {
try {
// process resource by UriType
- final ODataResponse response = writeContent(edm, uriInfo, content);
+ final ODataResponse response = writeContent(edm, uriInfo, content,
entityProviderWriteProperties);
// copy all response headers
for (String header : response.getHeaderNames()) {
@@ -623,8 +673,8 @@ public final class Olingo2AppImpl implements Olingo2App {
responseHandler.onResponse((T)EntityProvider.readPropertyValue(simpleProperty,
result.getEntity().getContent()),
headersToMap(result.getAllHeaders()));
} else {
-
responseHandler.onResponse((T)EntityProvider.readProperty(getContentType(),
simpleProperty, result.getEntity().getContent(),
-
EntityProviderReadProperties.init().build()),
+
responseHandler.onResponse((T)EntityProvider.readProperty(getContentType(),
simpleProperty,
+
result.getEntity().getContent(), getEntityProviderReadProperties()),
headersToMap(result.getAllHeaders()));
}
break;
@@ -634,8 +684,8 @@ public final class Olingo2AppImpl implements Olingo2App {
// get the response content as Map<String,
Object>
final List<EdmProperty> complexPropertyPath =
uriInfo.getPropertyPath();
final EdmProperty complexProperty =
complexPropertyPath.get(complexPropertyPath.size() - 1);
-
responseHandler.onResponse((T)EntityProvider.readProperty(getContentType(),
complexProperty, result.getEntity().getContent(),
-
EntityProviderReadProperties.init().build()),
+
responseHandler.onResponse((T)EntityProvider.readProperty(getContentType(),
complexProperty,
+
result.getEntity().getContent(), getEntityProviderReadProperties()),
headersToMap(result.getAllHeaders()));
break;
@@ -662,8 +712,8 @@ public final class Olingo2AppImpl implements Olingo2App {
case URI6B:
// Entity
// get the response content as an ODataEntry
object
-
responseHandler.onResponse((T)EntityProvider.readEntry(response.getContentHeader(),
uriInfo.getTargetEntitySet(), result.getEntity().getContent(),
-
EntityProviderReadProperties.init().build()),
+
responseHandler.onResponse((T)EntityProvider.readEntry(response.getContentHeader(),
uriInfo.getTargetEntitySet(),
+
result.getEntity().getContent(), getEntityProviderReadProperties()),
headersToMap(result.getAllHeaders()));
break;
@@ -681,7 +731,8 @@ public final class Olingo2AppImpl implements Olingo2App {
}
}
- private ODataResponse writeContent(Edm edm, UriInfoWithType uriInfo,
Object content)
+ private ODataResponse writeContent(Edm edm, UriInfoWithType uriInfo,
+ Object content,
EntityProviderWriteProperties entityProviderWriteProperties)
throws ODataApplicationException, EdmException,
EntityProviderException, URISyntaxException, IOException {
String responseContentType = getContentType();
@@ -712,7 +763,8 @@ public final class Olingo2AppImpl implements Olingo2App {
case URI7A:
// $links with 0..1 cardinality property
final EdmEntitySet targetLinkEntitySet =
uriInfo.getTargetEntitySet();
- EntityProviderWriteProperties linkProperties =
EntityProviderWriteProperties.serviceRoot(new URI(serviceUri +
SEPARATOR)).build();
+ EntityProviderWriteProperties linkProperties =
EntityProviderWriteProperties.fromProperties(entityProviderWriteProperties)
+ .serviceRoot(new
URI(serviceUri + SEPARATOR)).build();
@SuppressWarnings("unchecked")
final Map<String, Object> linkMap = (Map<String,
Object>)content;
response = EntityProvider.writeLink(responseContentType,
targetLinkEntitySet, linkMap, linkProperties);
@@ -721,7 +773,8 @@ public final class Olingo2AppImpl implements Olingo2App {
case URI7B:
// $links with * cardinality property
final EdmEntitySet targetLinksEntitySet =
uriInfo.getTargetEntitySet();
- EntityProviderWriteProperties linksProperties =
EntityProviderWriteProperties.serviceRoot(new URI(serviceUri +
SEPARATOR)).build();
+ EntityProviderWriteProperties linksProperties =
EntityProviderWriteProperties.fromProperties(entityProviderWriteProperties)
+ .serviceRoot(new
URI(serviceUri + SEPARATOR)).build();
@SuppressWarnings("unchecked")
final List<Map<String, Object>> linksMap = (List<Map<String,
Object>>)content;
response = EntityProvider.writeLinks(responseContentType,
targetLinksEntitySet, linksMap, linksProperties);
@@ -733,7 +786,8 @@ public final class Olingo2AppImpl implements Olingo2App {
case URI6B:
// Entity
final EdmEntitySet targetEntitySet =
uriInfo.getTargetEntitySet();
- EntityProviderWriteProperties properties =
EntityProviderWriteProperties.serviceRoot(new URI(serviceUri +
SEPARATOR)).build();
+ EntityProviderWriteProperties properties =
EntityProviderWriteProperties.fromProperties(entityProviderWriteProperties)
+ .serviceRoot(new
URI(serviceUri + SEPARATOR)).build();
@SuppressWarnings("unchecked")
final Map<String, Object> objectMap = (Map<String,
Object>)content;
response = EntityProvider.writeEntry(responseContentType,
targetEntitySet, objectMap, properties);
@@ -825,7 +879,8 @@ public final class Olingo2AppImpl implements Olingo2App {
if (batchRequest.getBody() != null &&
!Operation.DELETE.equals(batchRequest.getOperation())) {
- final ODataResponse response = writeContent(edm, uriInfo,
batchRequest.getBody());
+ final ODataResponse response = writeContent(edm, uriInfo,
batchRequest.getBody(),
+ getEntityProviderWriteProperties());
// copy response headers
for (String header : response.getHeaderNames()) {
headers.put(header, response.getHeader(header));
@@ -952,9 +1007,7 @@ public final class Olingo2AppImpl implements Olingo2App {
}
AbstractFutureCallback.checkStatus(httpResponse);
- } catch (ODataApplicationException e) {
- return new Olingo2BatchResponse(statusCode, statusInfo,
response.getContentId(), response.getHeaders(), e);
- } catch (UnsupportedEncodingException e) {
+ } catch (ODataApplicationException | UnsupportedEncodingException e) {
return new Olingo2BatchResponse(statusCode, statusInfo,
response.getContentId(), response.getHeaders(), e);
}
@@ -1066,9 +1119,7 @@ public final class Olingo2AppImpl implements Olingo2App {
}
}
result = new UriInfoWithType(UriParser.parse(edm, pathSegments,
queryParams), resourcePath);
- } catch (URISyntaxException e) {
- throw new IllegalArgumentException("resourcePath: " +
e.getMessage(), e);
- } catch (ODataException e) {
+ } catch (URISyntaxException | ODataException e) {
throw new IllegalArgumentException("resourcePath: " +
e.getMessage(), e);
}
diff --git
a/components/camel-olingo2/camel-olingo2-component/src/generated/java/org/apache/camel/component/olingo2/Olingo2ComponentConfigurer.java
b/components/camel-olingo2/camel-olingo2-component/src/generated/java/org/apache/camel/component/olingo2/Olingo2ComponentConfigurer.java
index 9fe3d6e..c3469aa 100644
---
a/components/camel-olingo2/camel-olingo2-component/src/generated/java/org/apache/camel/component/olingo2/Olingo2ComponentConfigurer.java
+++
b/components/camel-olingo2/camel-olingo2-component/src/generated/java/org/apache/camel/component/olingo2/Olingo2ComponentConfigurer.java
@@ -35,6 +35,10 @@ public class Olingo2ComponentConfigurer extends
PropertyConfigurerSupport implem
case "connectTimeout":
getOrCreateConfiguration(target).setConnectTimeout(property(camelContext,
int.class, value)); return true;
case "contenttype":
case "contentType":
getOrCreateConfiguration(target).setContentType(property(camelContext,
java.lang.String.class, value)); return true;
+ case "entityproviderreadproperties":
+ case "entityProviderReadProperties":
getOrCreateConfiguration(target).setEntityProviderReadProperties(property(camelContext,
org.apache.olingo.odata2.api.ep.EntityProviderReadProperties.class, value));
return true;
+ case "entityproviderwriteproperties":
+ case "entityProviderWriteProperties":
getOrCreateConfiguration(target).setEntityProviderWriteProperties(property(camelContext,
org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties.class, value));
return true;
case "filteralreadyseen":
case "filterAlreadySeen":
getOrCreateConfiguration(target).setFilterAlreadySeen(property(camelContext,
boolean.class, value)); return true;
case "httpasyncclientbuilder":
@@ -68,6 +72,8 @@ public class Olingo2ComponentConfigurer extends
PropertyConfigurerSupport implem
answer.put("configuration",
org.apache.camel.component.olingo2.Olingo2Configuration.class);
answer.put("connectTimeout", int.class);
answer.put("contentType", java.lang.String.class);
+ answer.put("entityProviderReadProperties",
org.apache.olingo.odata2.api.ep.EntityProviderReadProperties.class);
+ answer.put("entityProviderWriteProperties",
org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties.class);
answer.put("filterAlreadySeen", boolean.class);
answer.put("httpAsyncClientBuilder",
org.apache.http.impl.nio.client.HttpAsyncClientBuilder.class);
answer.put("httpClientBuilder",
org.apache.http.impl.client.HttpClientBuilder.class);
@@ -95,6 +101,10 @@ public class Olingo2ComponentConfigurer extends
PropertyConfigurerSupport implem
case "connectTimeout": return
getOrCreateConfiguration(target).getConnectTimeout();
case "contenttype":
case "contentType": return
getOrCreateConfiguration(target).getContentType();
+ case "entityproviderreadproperties":
+ case "entityProviderReadProperties": return
getOrCreateConfiguration(target).getEntityProviderReadProperties();
+ case "entityproviderwriteproperties":
+ case "entityProviderWriteProperties": return
getOrCreateConfiguration(target).getEntityProviderWriteProperties();
case "filteralreadyseen":
case "filterAlreadySeen": return
getOrCreateConfiguration(target).isFilterAlreadySeen();
case "httpasyncclientbuilder":
diff --git
a/components/camel-olingo2/camel-olingo2-component/src/generated/java/org/apache/camel/component/olingo2/Olingo2EndpointConfigurer.java
b/components/camel-olingo2/camel-olingo2-component/src/generated/java/org/apache/camel/component/olingo2/Olingo2EndpointConfigurer.java
index dcde97e..25c616e 100644
---
a/components/camel-olingo2/camel-olingo2-component/src/generated/java/org/apache/camel/component/olingo2/Olingo2EndpointConfigurer.java
+++
b/components/camel-olingo2/camel-olingo2-component/src/generated/java/org/apache/camel/component/olingo2/Olingo2EndpointConfigurer.java
@@ -34,6 +34,10 @@ public class Olingo2EndpointConfigurer extends
PropertyConfigurerSupport impleme
case "contenttype":
case "contentType":
target.getConfiguration().setContentType(property(camelContext,
java.lang.String.class, value)); return true;
case "delay": target.setDelay(property(camelContext, long.class,
value)); return true;
+ case "entityproviderreadproperties":
+ case "entityProviderReadProperties":
target.getConfiguration().setEntityProviderReadProperties(property(camelContext,
org.apache.olingo.odata2.api.ep.EntityProviderReadProperties.class, value));
return true;
+ case "entityproviderwriteproperties":
+ case "entityProviderWriteProperties":
target.getConfiguration().setEntityProviderWriteProperties(property(camelContext,
org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties.class, value));
return true;
case "exceptionhandler":
case "exceptionHandler":
target.setExceptionHandler(property(camelContext,
org.apache.camel.spi.ExceptionHandler.class, value)); return true;
case "exchangepattern":
@@ -97,6 +101,8 @@ public class Olingo2EndpointConfigurer extends
PropertyConfigurerSupport impleme
answer.put("connectTimeout", int.class);
answer.put("contentType", java.lang.String.class);
answer.put("delay", long.class);
+ answer.put("entityProviderReadProperties",
org.apache.olingo.odata2.api.ep.EntityProviderReadProperties.class);
+ answer.put("entityProviderWriteProperties",
org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties.class);
answer.put("exceptionHandler",
org.apache.camel.spi.ExceptionHandler.class);
answer.put("exchangePattern", org.apache.camel.ExchangePattern.class);
answer.put("filterAlreadySeen", boolean.class);
@@ -145,6 +151,10 @@ public class Olingo2EndpointConfigurer extends
PropertyConfigurerSupport impleme
case "contenttype":
case "contentType": return target.getConfiguration().getContentType();
case "delay": return target.getDelay();
+ case "entityproviderreadproperties":
+ case "entityProviderReadProperties": return
target.getConfiguration().getEntityProviderReadProperties();
+ case "entityproviderwriteproperties":
+ case "entityProviderWriteProperties": return
target.getConfiguration().getEntityProviderWriteProperties();
case "exceptionhandler":
case "exceptionHandler": return target.getExceptionHandler();
case "exchangepattern":
diff --git
a/components/camel-olingo2/camel-olingo2-component/src/generated/resources/org/apache/camel/component/olingo2/olingo2.json
b/components/camel-olingo2/camel-olingo2-component/src/generated/resources/org/apache/camel/component/olingo2/olingo2.json
index 78dc5bb..042ddf1 100644
---
a/components/camel-olingo2/camel-olingo2-component/src/generated/resources/org/apache/camel/component/olingo2/olingo2.json
+++
b/components/camel-olingo2/camel-olingo2-component/src/generated/resources/org/apache/camel/component/olingo2/olingo2.json
@@ -24,6 +24,8 @@
"configuration": { "kind": "property", "displayName": "Configuration",
"group": "common", "label": "", "required": false, "type": "object",
"javaType": "org.apache.camel.component.olingo2.Olingo2Configuration",
"deprecated": false, "secret": false, "description": "To use the shared
configuration" },
"connectTimeout": { "kind": "property", "displayName": "Connect Timeout",
"group": "common", "label": "", "required": false, "type": "integer",
"javaType": "int", "deprecated": false, "secret": false, "defaultValue":
"30000", "configurationClass":
"org.apache.camel.component.olingo2.Olingo2Configuration",
"configurationField": "configuration", "description": "HTTP connection creation
timeout in milliseconds, defaults to 30,000 (30 seconds)" },
"contentType": { "kind": "property", "displayName": "Content Type",
"group": "common", "label": "", "required": false, "type": "string",
"javaType": "java.lang.String", "deprecated": false, "secret": false,
"defaultValue": "application\/json;charset=utf-8", "configurationClass":
"org.apache.camel.component.olingo2.Olingo2Configuration",
"configurationField": "configuration", "description": "Content-Type header
value can be used to specify JSON or XML message format, defaults to appli [...]
+ "entityProviderReadProperties": { "kind": "property", "displayName":
"Entity Provider Read Properties", "group": "common", "label": "", "required":
false, "type": "object", "javaType":
"org.apache.olingo.odata2.api.ep.EntityProviderReadProperties", "deprecated":
false, "secret": false, "configurationClass":
"org.apache.camel.component.olingo2.Olingo2Configuration",
"configurationField": "configuration", "description": "Custom entity provider
read properties applied to all read operat [...]
+ "entityProviderWriteProperties": { "kind": "property", "displayName":
"Entity Provider Write Properties", "group": "common", "label": "", "required":
false, "type": "object", "javaType":
"org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties", "deprecated":
false, "secret": false, "configurationClass":
"org.apache.camel.component.olingo2.Olingo2Configuration",
"configurationField": "configuration", "description": "Custom entity provider
write properties applied to create, upd [...]
"filterAlreadySeen": { "kind": "property", "displayName": "Filter Already
Seen", "group": "common", "label": "", "required": false, "type": "boolean",
"javaType": "boolean", "deprecated": false, "secret": false, "defaultValue":
false, "configurationClass":
"org.apache.camel.component.olingo2.Olingo2Configuration",
"configurationField": "configuration", "description": "Set this to true to
filter out results that have already been communicated by this component." },
"httpHeaders": { "kind": "property", "displayName": "Http Headers",
"group": "common", "label": "", "required": false, "type": "object",
"javaType": "java.util.Map<java.lang.String, java.lang.String>", "deprecated":
false, "secret": false, "configurationClass":
"org.apache.camel.component.olingo2.Olingo2Configuration",
"configurationField": "configuration", "description": "Custom HTTP headers to
inject into every request, this could include OAuth tokens, etc." },
"proxy": { "kind": "property", "displayName": "Proxy", "group": "common",
"label": "", "required": false, "type": "object", "javaType":
"org.apache.http.HttpHost", "deprecated": false, "secret": false,
"configurationClass":
"org.apache.camel.component.olingo2.Olingo2Configuration",
"configurationField": "configuration", "description": "HTTP proxy server
configuration" },
@@ -43,6 +45,8 @@
"methodName": { "kind": "path", "displayName": "Method Name", "group":
"common", "label": "", "required": true, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "deprecationNote": "", "secret":
false, "configurationClass":
"org.apache.camel.component.olingo2.Olingo2Configuration",
"configurationField": "configuration", "description": "What sub operation to
use for the selected operation" },
"connectTimeout": { "kind": "parameter", "displayName": "Connect Timeout",
"group": "common", "label": "", "required": false, "type": "integer",
"javaType": "int", "deprecated": false, "secret": false, "defaultValue":
"30000", "configurationClass":
"org.apache.camel.component.olingo2.Olingo2Configuration",
"configurationField": "configuration", "description": "HTTP connection creation
timeout in milliseconds, defaults to 30,000 (30 seconds)" },
"contentType": { "kind": "parameter", "displayName": "Content Type",
"group": "common", "label": "", "required": false, "type": "string",
"javaType": "java.lang.String", "deprecated": false, "secret": false,
"defaultValue": "application\/json;charset=utf-8", "configurationClass":
"org.apache.camel.component.olingo2.Olingo2Configuration",
"configurationField": "configuration", "description": "Content-Type header
value can be used to specify JSON or XML message format, defaults to appl [...]
+ "entityProviderReadProperties": { "kind": "parameter", "displayName":
"Entity Provider Read Properties", "group": "common", "label": "", "required":
false, "type": "object", "javaType":
"org.apache.olingo.odata2.api.ep.EntityProviderReadProperties", "deprecated":
false, "secret": false, "configurationClass":
"org.apache.camel.component.olingo2.Olingo2Configuration",
"configurationField": "configuration", "description": "Custom entity provider
read properties applied to all read opera [...]
+ "entityProviderWriteProperties": { "kind": "parameter", "displayName":
"Entity Provider Write Properties", "group": "common", "label": "", "required":
false, "type": "object", "javaType":
"org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties", "deprecated":
false, "secret": false, "configurationClass":
"org.apache.camel.component.olingo2.Olingo2Configuration",
"configurationField": "configuration", "description": "Custom entity provider
write properties applied to create, up [...]
"filterAlreadySeen": { "kind": "parameter", "displayName": "Filter Already
Seen", "group": "common", "label": "", "required": false, "type": "boolean",
"javaType": "boolean", "deprecated": false, "secret": false, "defaultValue":
false, "configurationClass":
"org.apache.camel.component.olingo2.Olingo2Configuration",
"configurationField": "configuration", "description": "Set this to true to
filter out results that have already been communicated by this component." },
"httpHeaders": { "kind": "parameter", "displayName": "Http Headers",
"group": "common", "label": "", "required": false, "type": "object",
"javaType": "java.util.Map<java.lang.String, java.lang.String>", "deprecated":
false, "secret": false, "configurationClass":
"org.apache.camel.component.olingo2.Olingo2Configuration",
"configurationField": "configuration", "description": "Custom HTTP headers to
inject into every request, this could include OAuth tokens, etc." },
"inBody": { "kind": "parameter", "displayName": "In Body", "group":
"common", "label": "", "required": false, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "secret": false, "description": "Sets
the name of a parameter to be passed in the exchange In Body" },
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 c81dad4..bd2e800 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
@@ -52,7 +52,7 @@ for this component:
// component options: START
-The Olingo2 component supports 16 options, which are listed below.
+The Olingo2 component supports 18 options, which are listed below.
@@ -62,6 +62,8 @@ The Olingo2 component supports 16 options, which are listed
below.
| *configuration* (common) | To use the shared configuration | |
Olingo2Configuration
| *connectTimeout* (common) | HTTP connection creation timeout in
milliseconds, defaults to 30,000 (30 seconds) | 30000 | int
| *contentType* (common) | Content-Type header value can be used to specify
JSON or XML message format, defaults to application/json;charset=utf-8 |
application/json;charset=utf-8 | String
+| *entityProviderReadProperties* (common) | Custom entity provider read
properties applied to all read operations. | | EntityProviderReadProperties
+| *entityProviderWriteProperties* (common) | Custom entity provider write
properties applied to create, update, patch, batch and merge operations. For
instance users can skip the Json object wrapper or enable content only mode
when sending request data. A service URI set in the properties will always be
overwritten by the serviceUri configuration parameter. Please consider to using
the serviceUri configuration parameter instead of setting the respective write
property here. | | EntityPr [...]
| *filterAlreadySeen* (common) | Set this to true to filter out results that
have already been communicated by this component. | false | boolean
| *httpHeaders* (common) | Custom HTTP headers to inject into every request,
this could include OAuth tokens, etc. | | Map
| *proxy* (common) | HTTP proxy server configuration | | HttpHost
@@ -103,7 +105,7 @@ with the following path and query parameters:
|===
-=== Query Parameters (34 parameters):
+=== Query Parameters (36 parameters):
[width="100%",cols="2,5,^1,2",options="header"]
@@ -111,6 +113,8 @@ with the following path and query parameters:
| Name | Description | Default | Type
| *connectTimeout* (common) | HTTP connection creation timeout in
milliseconds, defaults to 30,000 (30 seconds) | 30000 | int
| *contentType* (common) | Content-Type header value can be used to specify
JSON or XML message format, defaults to application/json;charset=utf-8 |
application/json;charset=utf-8 | String
+| *entityProviderReadProperties* (common) | Custom entity provider read
properties applied to all read operations. | | EntityProviderReadProperties
+| *entityProviderWriteProperties* (common) | Custom entity provider write
properties applied to create, update, patch, batch and merge operations. For
instance users can skip the Json object wrapper or enable content only mode
when sending request data. A service URI set in the properties will always be
overwritten by the serviceUri configuration parameter. Please consider to using
the serviceUri configuration parameter instead of setting the respective write
property here. | | EntityPr [...]
| *filterAlreadySeen* (common) | Set this to true to filter out results that
have already been communicated by this component. | false | boolean
| *httpHeaders* (common) | Custom HTTP headers to inject into every request,
this could include OAuth tokens, etc. | | Map
| *inBody* (common) | Sets the name of a parameter to be passed in the
exchange In Body | | String
diff --git
a/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Component.java
b/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Component.java
index a7f8995..af58c18 100644
---
a/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Component.java
+++
b/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Component.java
@@ -169,9 +169,7 @@ public class Olingo2Component extends
AbstractApiComponent<Olingo2ApiName, Oling
}
try {
asyncClientBuilder.setSSLContext(sslContextParameters.createSSLContext(getCamelContext()));
- } catch (GeneralSecurityException e) {
- throw RuntimeCamelException.wrapRuntimeCamelException(e);
- } catch (IOException e) {
+ } catch (GeneralSecurityException | IOException e) {
throw RuntimeCamelException.wrapRuntimeCamelException(e);
}
@@ -187,6 +185,8 @@ public class Olingo2Component extends
AbstractApiComponent<Olingo2ApiName, Oling
apiProxy = new Olingo2AppWrapper(olingo2App);
apiProxy.getOlingo2App().setContentType(configuration.getContentType());
apiProxy.getOlingo2App().setHttpHeaders(configuration.getHttpHeaders());
+
apiProxy.getOlingo2App().setEntityProviderReadProperties(configuration.getEntityProviderReadProperties());
+
apiProxy.getOlingo2App().setEntityProviderWriteProperties(configuration.getEntityProviderWriteProperties());
return apiProxy;
}
diff --git
a/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Configuration.java
b/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Configuration.java
index 15940a3..d8d290c 100644
---
a/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Configuration.java
+++
b/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Configuration.java
@@ -29,6 +29,8 @@ import org.apache.http.HttpHost;
import org.apache.http.entity.ContentType;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
+import org.apache.olingo.odata2.api.ep.EntityProviderReadProperties;
+import org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties;
/**
* Component configuration for Olingo2 component.
@@ -51,6 +53,10 @@ public class Olingo2Configuration {
private String contentType = DEFAULT_CONTENT_TYPE;
@UriParam
private Map<String, String> httpHeaders;
+ @UriParam
+ private EntityProviderReadProperties entityProviderReadProperties;
+ @UriParam
+ private EntityProviderWriteProperties entityProviderWriteProperties;
@UriParam(defaultValue = "" + DEFAULT_TIMEOUT)
private int connectTimeout = DEFAULT_TIMEOUT;
@UriParam(defaultValue = "" + DEFAULT_TIMEOUT)
@@ -126,6 +132,31 @@ public class Olingo2Configuration {
this.httpHeaders = httpHeaders;
}
+ public EntityProviderReadProperties getEntityProviderReadProperties() {
+ return entityProviderReadProperties;
+ }
+
+ /**
+ * Custom entity provider read properties applied to all read operations.
+ */
+ public void setEntityProviderReadProperties(EntityProviderReadProperties
entityProviderReadProperties) {
+ this.entityProviderReadProperties = entityProviderReadProperties;
+ }
+
+ public EntityProviderWriteProperties getEntityProviderWriteProperties() {
+ return entityProviderWriteProperties;
+ }
+
+ /**
+ * Custom entity provider write properties applied to create, update,
patch, batch and merge operations. For
+ * instance users can skip the Json object wrapper or enable content only
mode when sending request data. A service
+ * URI set in the properties will always be overwritten by the serviceUri
configuration parameter. Please consider
+ * to using the serviceUri configuration parameter instead of setting the
respective write property here.
+ */
+ public void setEntityProviderWriteProperties(EntityProviderWriteProperties
entityProviderWriteProperties) {
+ this.entityProviderWriteProperties = entityProviderWriteProperties;
+ }
+
public int getConnectTimeout() {
return connectTimeout;
}
@@ -209,7 +240,7 @@ public class Olingo2Configuration {
/**
* Set this to true to filter out results that have already been
* communicated by this component.
- *
+ *
* @param filterAlreadySeen
*/
public void setFilterAlreadySeen(boolean filterAlreadySeen) {
@@ -230,27 +261,39 @@ public class Olingo2Configuration {
@Override
public int hashCode() {
- return new
HashCodeBuilder().append(serviceUri).append(contentType).append(httpHeaders).append(connectTimeout).append(socketTimeout).append(proxy)
-
.append(sslContextParameters).append(httpAsyncClientBuilder).append(httpClientBuilder).hashCode();
+ return new HashCodeBuilder().append(serviceUri).append(contentType)
+ .append(httpHeaders).append(connectTimeout)
+ .append(socketTimeout).append(proxy)
+
.append(entityProviderReadProperties).append(entityProviderWriteProperties)
+ .append(filterAlreadySeen).append(splitResult)
+
.append(sslContextParameters).append(httpAsyncClientBuilder).append(httpClientBuilder).hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Olingo2Configuration) {
- Olingo2Configuration other = (Olingo2Configuration)obj;
- return serviceUri == null
- ? other.serviceUri == null
- : serviceUri.equals(other.serviceUri) && contentType == null
- ? other.contentType == null
+ Olingo2Configuration other = (Olingo2Configuration) obj;
+ return connectTimeout == other.connectTimeout && filterAlreadySeen
== other.filterAlreadySeen
+ && splitResult == other.splitResult && socketTimeout ==
other.socketTimeout && serviceUri == null
+ ? other.serviceUri == null
+ : serviceUri.equals(other.serviceUri) && contentType ==
null
+ ? other.contentType == null
: contentType.equals(other.contentType) && httpHeaders ==
null
- ? other.httpHeaders == null
- : httpHeaders.equals(other.httpHeaders) &&
connectTimeout == other.connectTimeout && socketTimeout == other.socketTimeout
&& proxy == null
+ ? other.httpHeaders == null
+ : httpHeaders.equals(other.httpHeaders) &&
entityProviderReadProperties == null
+ ? other.entityProviderReadProperties == null
+ :
entityProviderReadProperties.equals(other.entityProviderReadProperties) &&
proxy == null
? other.proxy == null
- : proxy.equals(other.proxy) &&
sslContextParameters == null
- ? other.sslContextParameters == null
- :
sslContextParameters.equals(other.sslContextParameters) &&
httpAsyncClientBuilder == null
- ? other.httpAsyncClientBuilder == null :
httpAsyncClientBuilder.equals(other.httpAsyncClientBuilder) &&
httpClientBuilder == null
- ? other.httpClientBuilder == null :
httpClientBuilder.equals(other.httpClientBuilder);
+ : proxy.equals(other.proxy) &&
entityProviderWriteProperties == null
+ ? other.entityProviderWriteProperties == null
+ :
entityProviderWriteProperties.equals(other.entityProviderWriteProperties)
+ && sslContextParameters == null
+ ? other.sslContextParameters == null
+ : sslContextParameters.equals(other.sslContextParameters)
&& httpAsyncClientBuilder == null
+ ? other.httpAsyncClientBuilder == null
+ :
httpAsyncClientBuilder.equals(other.httpAsyncClientBuilder) &&
httpClientBuilder == null
+ ? other.httpClientBuilder == null
+ : httpClientBuilder.equals(other.httpClientBuilder);
}
return false;
}
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 4077ff8..285369f 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
@@ -145,6 +145,13 @@ public class Olingo2Consumer extends
AbstractApiConsumer<Olingo2ApiName, Olingo2
if (result instanceof ODataFeed) {
ODataFeed odataFeed = (ODataFeed)result;
for (ODataEntry entry : odataFeed.getEntries()) {
+ if (odataFeed.getFeedMetadata().getInlineCount() != null) {
+ //
+ // If $inlinecount was set to true in the query then
+ // need to include the count in the entities
+ //
+ entry.getProperties().put("ResultCount",
odataFeed.getFeedMetadata().getInlineCount());
+ }
splitResult.add(entry);
}
} else if (result instanceof List) {
diff --git
a/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2ComponentConsumerTest.java
b/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2ComponentConsumerTest.java
index e24df0d..af32b9d 100644
---
a/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2ComponentConsumerTest.java
+++
b/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2ComponentConsumerTest.java
@@ -29,10 +29,9 @@ import org.junit.jupiter.api.Test;
import static org.apache.camel.test.junit5.TestSupport.assertIsInstanceOf;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.fail;
/**
* Test class for {@link org.apache.camel.component.olingo2.api.Olingo2App}
@@ -261,7 +260,7 @@ public class Olingo2ComponentConsumerTest extends
AbstractOlingo2TestSupport {
}
/**
- * Read value of the People object and split the results into individual
+ * Read value of the Address object and split the results into individual
* messages
*/
@SuppressWarnings("unchecked")
@@ -330,4 +329,44 @@ public class Olingo2ComponentConsumerTest extends
AbstractOlingo2TestSupport {
assertTrue(name.toString().contains("Powered Racing"));
}
}
+
+ /**
+ * Read entity set of the Manufacturers object and split the results into
individual messages. Auto add inline count
+ * or results to entities.
+ */
+ @Test
+ public void testConsumerReadSplitResultsWithInlineCount() throws Exception
{
+ int expectedMsgCount = 2;
+ MockEndpoint mockEndpoint =
getMockEndpoint("mock:consumer-splitresult-with-count");
+ mockEndpoint.expectedMinimumMessageCount(expectedMsgCount);
+
+ RouteBuilder builder = new RouteBuilder() {
+ public void configure() {
+
from("olingo2://read/Manufacturers/?$inlinecount=allpages&splitResult=true")
+ .to("mock:consumer-splitresult-with-count");
+ }
+ };
+
+ addRouteAndStartContext(builder);
+
+ mockEndpoint.assertIsSatisfied();
+
+ //
+ // 2 individual messages in the exchange,
+ // each containing a different entity.
+ //
+ for (int i = 0; i < expectedMsgCount; ++i) {
+ Object body = mockEndpoint.getExchanges().get(i).getIn().getBody();
+ assertTrue(body instanceof ODataEntry);
+ ODataEntry entry = (ODataEntry) body;
+ Map<String, Object> properties = entry.getProperties();
+ assertNotNull(properties);
+
+ Object name = properties.get("Name");
+ assertNotNull(name);
+ assertTrue(name.toString().contains("Powered Racing"));
+ Object resultCount = properties.get("ResultCount");
+ assertTrue(((Integer) resultCount) > 0);
+ }
+ }
}
diff --git
a/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2ComponentProducerTest.java
b/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2ComponentProducerTest.java
index 04b64aa..32b5781 100644
---
a/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2ComponentProducerTest.java
+++
b/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2ComponentProducerTest.java
@@ -46,9 +46,8 @@ import org.slf4j.LoggerFactory;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.fail;
+import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Test class for {@link org.apache.camel.component.olingo2.api.Olingo2App}
@@ -70,7 +69,10 @@ public class Olingo2ComponentProducerTest extends
AbstractOlingo2TestSupport {
private static final String ADDRESS = "Address";
private static final String TEST_RESOURCE = "$1";
private static final String TEST_RESOURCE_ADDRESS = TEST_RESOURCE +
"/Address";
- private static final String TEST_CREATE_MANUFACTURER =
"DefaultContainer.Manufacturers('123')";
+ private static final String TEST_MERGE_MANUFACTURER_ID = "124";
+ private static final String TEST_CREATE_MANUFACTURER_ID = "123";
+ private static final String TEST_CREATE_MANUFACTURER
+ = String.format("DefaultContainer.Manufacturers('%s')",
TEST_CREATE_MANUFACTURER_ID);
private static final String TEST_SERVICE_URL = "http://localhost:" + PORT
+ "/MyFormula.svc";
private static Olingo2SampleServer server;
@@ -138,7 +140,7 @@ public class Olingo2ComponentProducerTest extends
AbstractOlingo2TestSupport {
final ODataEntry manufacturer = requestBody("direct:CREATE", data);
assertNotNull(manufacturer, "Created Manufacturer");
final Map<String, Object> properties = manufacturer.getProperties();
- assertEquals("123", properties.get(ID_PROPERTY), "Created Manufacturer
Id");
+ assertEquals(TEST_CREATE_MANUFACTURER_ID, properties.get(ID_PROPERTY),
"Created Manufacturer Id");
LOG.info("Created Manufacturer: {}", properties);
// update
@@ -151,6 +153,15 @@ public class Olingo2ComponentProducerTest extends
AbstractOlingo2TestSupport {
assertEquals(HttpStatusCodes.NO_CONTENT.getStatusCode(),
status.getStatusCode(), "Update status");
LOG.info("Update status: {}", status);
+ final Map<String, Object> headers = new HashMap<>();
+ headers.put(Olingo2Constants.PROPERTY_PREFIX + "keyPredicate",
String.format("'%s'", TEST_CREATE_MANUFACTURER_ID));
+ final ODataEntry updatedManufacturer =
requestBodyAndHeaders("direct:READENTRY", null, headers);
+ assertNotNull(updatedManufacturer);
+ final Map<String, Object> updatedProperties =
updatedManufacturer.getProperties();
+ assertEquals(TEST_CREATE_MANUFACTURER_ID,
updatedProperties.get(ID_PROPERTY), "Manufacturer Id");
+ assertEquals("MyCarManufacturer Renamed",
updatedProperties.get("Name"), "Manufacturer Name");
+ LOG.info("Updated Manufacturer: {}", updatedProperties);
+
// delete
status = requestBody("direct:DELETE", null);
assertNotNull(status, "Delete status");
@@ -158,9 +169,40 @@ public class Olingo2ComponentProducerTest extends
AbstractOlingo2TestSupport {
LOG.info("Delete status: {}", status);
}
+ @Test
+ public void testCreateMerge() throws Exception {
+ final Map<String, Object> data = getEntityData();
+ data.put(ID_PROPERTY, TEST_MERGE_MANUFACTURER_ID);
+
+ final ODataEntry manufacturer = requestBody("direct:CREATE", data);
+ assertNotNull(manufacturer, "Created Manufacturer");
+ final Map<String, Object> properties = manufacturer.getProperties();
+ assertEquals(TEST_MERGE_MANUFACTURER_ID, properties.get(ID_PROPERTY),
"Created Manufacturer Id");
+ LOG.info("Created Manufacturer: {}", properties);
+
+ final Map<String, Object> propertiesToUpdate = new HashMap<>();
+ propertiesToUpdate.put(ID_PROPERTY, TEST_MERGE_MANUFACTURER_ID);
+ propertiesToUpdate.put("Name", "MyCarManufacturer Updated");
+
+ HttpStatusCodes status = requestBody("direct:MERGE",
propertiesToUpdate);
+ assertNotNull(status, "Merge status");
+ assertEquals(HttpStatusCodes.NO_CONTENT.getStatusCode(),
status.getStatusCode(), "Merge status");
+ LOG.info("Merge status: {}", status);
+
+ final Map<String, Object> headers = new HashMap<>();
+ headers.put(Olingo2Constants.PROPERTY_PREFIX + "keyPredicate",
String.format("'%s'", TEST_MERGE_MANUFACTURER_ID));
+ final ODataEntry mergedManufacturer =
requestBodyAndHeaders("direct:READENTRY", null, headers);
+ assertNotNull(mergedManufacturer);
+ final Map<String, Object> mergedProperties =
mergedManufacturer.getProperties();
+ assertEquals(TEST_MERGE_MANUFACTURER_ID,
mergedProperties.get(ID_PROPERTY), "Manufacturer Id");
+ assertEquals("MyCarManufacturer Updated",
mergedProperties.get("Name"), "Manufacturer Name");
+ assertNotNull(mergedProperties.get("Address"), "Manufacturer Address");
+ LOG.info("Merged Manufacturer: {}", mergedProperties);
+ }
+
private Map<String, Object> getEntityData() {
final Map<String, Object> data = new HashMap<>();
- data.put("Id", "123");
+ data.put(ID_PROPERTY, TEST_CREATE_MANUFACTURER_ID);
data.put("Name", "MyCarManufacturer");
data.put("Founded", new Date());
Map<String, Object> address = new HashMap<>();
@@ -350,14 +392,16 @@ public class Olingo2ComponentProducerTest extends
AbstractOlingo2TestSupport {
from("direct:CREATE").to("olingo2://create/Manufacturers");
// test route for update
-
from("direct:UPDATE").to("olingo2://update/Manufacturers('123')");
+
from("direct:UPDATE").to(String.format("olingo2://update/Manufacturers('%s')",
TEST_CREATE_MANUFACTURER_ID));
// test route for delete
-
from("direct:DELETE").to("olingo2://delete/Manufacturers('123')");
+
from("direct:DELETE").to(String.format("olingo2://delete/Manufacturers('%s')",
TEST_CREATE_MANUFACTURER_ID));
+
+ // test route for merge
+
from("direct:MERGE").to(String.format("olingo2://merge/Manufacturers('%s')",
TEST_MERGE_MANUFACTURER_ID));
/*
- * // test route for merge from("direct:MERGE")
- * .to("olingo2://merge"); // test route for patch
+ * // test route for patch
* from("direct:PATCH") .to("olingo2://patch");
*/
diff --git
a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Olingo2ComponentBuilderFactory.java
b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Olingo2ComponentBuilderFactory.java
index 04f042c..96a7fed 100644
---
a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Olingo2ComponentBuilderFactory.java
+++
b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Olingo2ComponentBuilderFactory.java
@@ -89,6 +89,39 @@ public interface Olingo2ComponentBuilderFactory {
return this;
}
/**
+ * Custom entity provider read properties applied to all read
+ * operations.
+ *
+ * The option is a:
+ *
<code>org.apache.olingo.odata2.api.ep.EntityProviderReadProperties</code> type.
+ *
+ * Group: common
+ */
+ default Olingo2ComponentBuilder entityProviderReadProperties(
+ org.apache.olingo.odata2.api.ep.EntityProviderReadProperties
entityProviderReadProperties) {
+ doSetProperty("entityProviderReadProperties",
entityProviderReadProperties);
+ return this;
+ }
+ /**
+ * Custom entity provider write properties applied to create, update,
+ * patch, batch and merge operations. For instance users can skip the
+ * Json object wrapper or enable content only mode when sending request
+ * data. A service URI set in the properties will always be overwritten
+ * by the serviceUri configuration parameter. Please consider to using
+ * the serviceUri configuration parameter instead of setting the
+ * respective write property here.
+ *
+ * The option is a:
+ *
<code>org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties</code> type.
+ *
+ * Group: common
+ */
+ default Olingo2ComponentBuilder entityProviderWriteProperties(
+ org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties
entityProviderWriteProperties) {
+ doSetProperty("entityProviderWriteProperties",
entityProviderWriteProperties);
+ return this;
+ }
+ /**
* Set this to true to filter out results that have already been
* communicated by this component.
*
@@ -306,6 +339,8 @@ public interface Olingo2ComponentBuilderFactory {
case "configuration": ((Olingo2Component)
component).setConfiguration((org.apache.camel.component.olingo2.Olingo2Configuration)
value); return true;
case "connectTimeout": getOrCreateConfiguration((Olingo2Component)
component).setConnectTimeout((int) value); return true;
case "contentType": getOrCreateConfiguration((Olingo2Component)
component).setContentType((java.lang.String) value); return true;
+ case "entityProviderReadProperties":
getOrCreateConfiguration((Olingo2Component)
component).setEntityProviderReadProperties((org.apache.olingo.odata2.api.ep.EntityProviderReadProperties)
value); return true;
+ case "entityProviderWriteProperties":
getOrCreateConfiguration((Olingo2Component)
component).setEntityProviderWriteProperties((org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties)
value); return true;
case "filterAlreadySeen":
getOrCreateConfiguration((Olingo2Component)
component).setFilterAlreadySeen((boolean) value); return true;
case "httpHeaders": getOrCreateConfiguration((Olingo2Component)
component).setHttpHeaders((java.util.Map) value); return true;
case "proxy": getOrCreateConfiguration((Olingo2Component)
component).setProxy((org.apache.http.HttpHost) value); return true;
diff --git
a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/Olingo2EndpointBuilderFactory.java
b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/Olingo2EndpointBuilderFactory.java
index c51467f..26fa6f5 100644
---
a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/Olingo2EndpointBuilderFactory.java
+++
b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/Olingo2EndpointBuilderFactory.java
@@ -87,6 +87,72 @@ public interface Olingo2EndpointBuilderFactory {
return this;
}
/**
+ * Custom entity provider read properties applied to all read
+ * operations.
+ *
+ * The option is a:
+ *
<code>org.apache.olingo.odata2.api.ep.EntityProviderReadProperties</code> type.
+ *
+ * Group: common
+ */
+ default Olingo2EndpointConsumerBuilder entityProviderReadProperties(
+ Object entityProviderReadProperties) {
+ doSetProperty("entityProviderReadProperties",
entityProviderReadProperties);
+ return this;
+ }
+ /**
+ * Custom entity provider read properties applied to all read
+ * operations.
+ *
+ * The option will be converted to a
+ *
<code>org.apache.olingo.odata2.api.ep.EntityProviderReadProperties</code> type.
+ *
+ * Group: common
+ */
+ default Olingo2EndpointConsumerBuilder entityProviderReadProperties(
+ String entityProviderReadProperties) {
+ doSetProperty("entityProviderReadProperties",
entityProviderReadProperties);
+ return this;
+ }
+ /**
+ * Custom entity provider write properties applied to create, update,
+ * patch, batch and merge operations. For instance users can skip the
+ * Json object wrapper or enable content only mode when sending request
+ * data. A service URI set in the properties will always be overwritten
+ * by the serviceUri configuration parameter. Please consider to using
+ * the serviceUri configuration parameter instead of setting the
+ * respective write property here.
+ *
+ * The option is a:
+ *
<code>org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties</code> type.
+ *
+ * Group: common
+ */
+ default Olingo2EndpointConsumerBuilder entityProviderWriteProperties(
+ Object entityProviderWriteProperties) {
+ doSetProperty("entityProviderWriteProperties",
entityProviderWriteProperties);
+ return this;
+ }
+ /**
+ * Custom entity provider write properties applied to create, update,
+ * patch, batch and merge operations. For instance users can skip the
+ * Json object wrapper or enable content only mode when sending request
+ * data. A service URI set in the properties will always be overwritten
+ * by the serviceUri configuration parameter. Please consider to using
+ * the serviceUri configuration parameter instead of setting the
+ * respective write property here.
+ *
+ * The option will be converted to a
+ *
<code>org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties</code> type.
+ *
+ * Group: common
+ */
+ default Olingo2EndpointConsumerBuilder entityProviderWriteProperties(
+ String entityProviderWriteProperties) {
+ doSetProperty("entityProviderWriteProperties",
entityProviderWriteProperties);
+ return this;
+ }
+ /**
* Set this to true to filter out results that have already been
* communicated by this component.
*
@@ -982,6 +1048,72 @@ public interface Olingo2EndpointBuilderFactory {
return this;
}
/**
+ * Custom entity provider read properties applied to all read
+ * operations.
+ *
+ * The option is a:
+ *
<code>org.apache.olingo.odata2.api.ep.EntityProviderReadProperties</code> type.
+ *
+ * Group: common
+ */
+ default Olingo2EndpointProducerBuilder entityProviderReadProperties(
+ Object entityProviderReadProperties) {
+ doSetProperty("entityProviderReadProperties",
entityProviderReadProperties);
+ return this;
+ }
+ /**
+ * Custom entity provider read properties applied to all read
+ * operations.
+ *
+ * The option will be converted to a
+ *
<code>org.apache.olingo.odata2.api.ep.EntityProviderReadProperties</code> type.
+ *
+ * Group: common
+ */
+ default Olingo2EndpointProducerBuilder entityProviderReadProperties(
+ String entityProviderReadProperties) {
+ doSetProperty("entityProviderReadProperties",
entityProviderReadProperties);
+ return this;
+ }
+ /**
+ * Custom entity provider write properties applied to create, update,
+ * patch, batch and merge operations. For instance users can skip the
+ * Json object wrapper or enable content only mode when sending request
+ * data. A service URI set in the properties will always be overwritten
+ * by the serviceUri configuration parameter. Please consider to using
+ * the serviceUri configuration parameter instead of setting the
+ * respective write property here.
+ *
+ * The option is a:
+ *
<code>org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties</code> type.
+ *
+ * Group: common
+ */
+ default Olingo2EndpointProducerBuilder entityProviderWriteProperties(
+ Object entityProviderWriteProperties) {
+ doSetProperty("entityProviderWriteProperties",
entityProviderWriteProperties);
+ return this;
+ }
+ /**
+ * Custom entity provider write properties applied to create, update,
+ * patch, batch and merge operations. For instance users can skip the
+ * Json object wrapper or enable content only mode when sending request
+ * data. A service URI set in the properties will always be overwritten
+ * by the serviceUri configuration parameter. Please consider to using
+ * the serviceUri configuration parameter instead of setting the
+ * respective write property here.
+ *
+ * The option will be converted to a
+ *
<code>org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties</code> type.
+ *
+ * Group: common
+ */
+ default Olingo2EndpointProducerBuilder entityProviderWriteProperties(
+ String entityProviderWriteProperties) {
+ doSetProperty("entityProviderWriteProperties",
entityProviderWriteProperties);
+ return this;
+ }
+ /**
* Set this to true to filter out results that have already been
* communicated by this component.
*
@@ -1363,6 +1495,72 @@ public interface Olingo2EndpointBuilderFactory {
return this;
}
/**
+ * Custom entity provider read properties applied to all read
+ * operations.
+ *
+ * The option is a:
+ *
<code>org.apache.olingo.odata2.api.ep.EntityProviderReadProperties</code> type.
+ *
+ * Group: common
+ */
+ default Olingo2EndpointBuilder entityProviderReadProperties(
+ Object entityProviderReadProperties) {
+ doSetProperty("entityProviderReadProperties",
entityProviderReadProperties);
+ return this;
+ }
+ /**
+ * Custom entity provider read properties applied to all read
+ * operations.
+ *
+ * The option will be converted to a
+ *
<code>org.apache.olingo.odata2.api.ep.EntityProviderReadProperties</code> type.
+ *
+ * Group: common
+ */
+ default Olingo2EndpointBuilder entityProviderReadProperties(
+ String entityProviderReadProperties) {
+ doSetProperty("entityProviderReadProperties",
entityProviderReadProperties);
+ return this;
+ }
+ /**
+ * Custom entity provider write properties applied to create, update,
+ * patch, batch and merge operations. For instance users can skip the
+ * Json object wrapper or enable content only mode when sending request
+ * data. A service URI set in the properties will always be overwritten
+ * by the serviceUri configuration parameter. Please consider to using
+ * the serviceUri configuration parameter instead of setting the
+ * respective write property here.
+ *
+ * The option is a:
+ *
<code>org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties</code> type.
+ *
+ * Group: common
+ */
+ default Olingo2EndpointBuilder entityProviderWriteProperties(
+ Object entityProviderWriteProperties) {
+ doSetProperty("entityProviderWriteProperties",
entityProviderWriteProperties);
+ return this;
+ }
+ /**
+ * Custom entity provider write properties applied to create, update,
+ * patch, batch and merge operations. For instance users can skip the
+ * Json object wrapper or enable content only mode when sending request
+ * data. A service URI set in the properties will always be overwritten
+ * by the serviceUri configuration parameter. Please consider to using
+ * the serviceUri configuration parameter instead of setting the
+ * respective write property here.
+ *
+ * The option will be converted to a
+ *
<code>org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties</code> type.
+ *
+ * Group: common
+ */
+ default Olingo2EndpointBuilder entityProviderWriteProperties(
+ String entityProviderWriteProperties) {
+ doSetProperty("entityProviderWriteProperties",
entityProviderWriteProperties);
+ return this;
+ }
+ /**
* Set this to true to filter out results that have already been
* communicated by this component.
*
diff --git a/docs/components/modules/ROOT/pages/olingo2-component.adoc
b/docs/components/modules/ROOT/pages/olingo2-component.adoc
index 588ce96..3abfd05 100644
--- a/docs/components/modules/ROOT/pages/olingo2-component.adoc
+++ b/docs/components/modules/ROOT/pages/olingo2-component.adoc
@@ -54,7 +54,7 @@ for this component:
// component options: START
-The Olingo2 component supports 16 options, which are listed below.
+The Olingo2 component supports 18 options, which are listed below.
@@ -64,6 +64,8 @@ The Olingo2 component supports 16 options, which are listed
below.
| *configuration* (common) | To use the shared configuration | |
Olingo2Configuration
| *connectTimeout* (common) | HTTP connection creation timeout in
milliseconds, defaults to 30,000 (30 seconds) | 30000 | int
| *contentType* (common) | Content-Type header value can be used to specify
JSON or XML message format, defaults to application/json;charset=utf-8 |
application/json;charset=utf-8 | String
+| *entityProviderReadProperties* (common) | Custom entity provider read
properties applied to all read operations. | | EntityProviderReadProperties
+| *entityProviderWriteProperties* (common) | Custom entity provider write
properties applied to create, update and merge operations. For instance users
can enable content only settings and skip meta data wrappers when sending
request data. | | EntityProviderWriteProperties
| *filterAlreadySeen* (common) | Set this to true to filter out results that
have already been communicated by this component. | false | boolean
| *httpHeaders* (common) | Custom HTTP headers to inject into every request,
this could include OAuth tokens, etc. | | Map
| *proxy* (common) | HTTP proxy server configuration | | HttpHost
@@ -105,7 +107,7 @@ with the following path and query parameters:
|===
-=== Query Parameters (34 parameters):
+=== Query Parameters (36 parameters):
[width="100%",cols="2,5,^1,2",options="header"]
@@ -113,6 +115,8 @@ with the following path and query parameters:
| Name | Description | Default | Type
| *connectTimeout* (common) | HTTP connection creation timeout in
milliseconds, defaults to 30,000 (30 seconds) | 30000 | int
| *contentType* (common) | Content-Type header value can be used to specify
JSON or XML message format, defaults to application/json;charset=utf-8 |
application/json;charset=utf-8 | String
+| *entityProviderReadProperties* (common) | Custom entity provider read
properties applied to all read operations. | | EntityProviderReadProperties
+| *entityProviderWriteProperties* (common) | Custom entity provider write
properties applied to create, update and merge operations. For instance users
can enable content only settings and skip meta data wrappers when sending
request data. | | EntityProviderWriteProperties
| *filterAlreadySeen* (common) | Set this to true to filter out results that
have already been communicated by this component. | false | boolean
| *httpHeaders* (common) | Custom HTTP headers to inject into every request,
this could include OAuth tokens, etc. | | Map
| *inBody* (common) | Sets the name of a parameter to be passed in the
exchange In Body | | String