This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch camel-3.x in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-3.x by this push: new e44a7e7d66c fix!: specify array name when fetching collections instead of inferring the array name since it's not always going to work (#10715) e44a7e7d66c is described below commit e44a7e7d66c6ac72e8bb377d64e82dc288d65606 Author: Claude Mamo <823038+claudem...@users.noreply.github.com> AuthorDate: Tue Jul 18 13:46:30 2023 +0200 fix!: specify array name when fetching collections instead of inferring the array name since it's not always going to work (#10715) --- .../java/org/apache/camel/component/dhis2/api/Dhis2Get.java | 9 ++++----- .../apache/camel/component/dhis2/api/Dhis2GetTestCase.java | 6 +++--- .../camel/component/dhis2/Dhis2EndpointUriFactory.java | 3 ++- .../component/dhis2/Dhis2GetEndpointConfiguration.java | 13 ++++++++++++- .../dhis2/Dhis2GetEndpointConfigurationConfigurer.java | 7 +++++++ .../camel/component/dhis2/internal/Dhis2GetApiMethod.java | 1 + .../resources/org/apache/camel/component/dhis2/dhis2.json | 4 ++-- .../src/main/docs/dhis2-component.adoc | 13 +++++++------ .../java/org/apache/camel/component/dhis2/Dhis2GetIT.java | 11 +---------- 9 files changed, 39 insertions(+), 28 deletions(-) diff --git a/components/camel-dhis2/camel-dhis2-api/src/main/java/org/apache/camel/component/dhis2/api/Dhis2Get.java b/components/camel-dhis2/camel-dhis2-api/src/main/java/org/apache/camel/component/dhis2/api/Dhis2Get.java index fcefb54a9eb..9ccdd50ae0d 100644 --- a/components/camel-dhis2/camel-dhis2-api/src/main/java/org/apache/camel/component/dhis2/api/Dhis2Get.java +++ b/components/camel-dhis2/camel-dhis2-api/src/main/java/org/apache/camel/component/dhis2/api/Dhis2Get.java @@ -76,7 +76,8 @@ public class Dhis2Get { } public <T> Iterator<T> collection( - String path, String itemType, Boolean paging, String fields, String filter, RootJunctionEnum rootJunction, + String path, String itemType, String arrayName, Boolean paging, String fields, String filter, + RootJunctionEnum rootJunction, Map<String, Object> queryParams) { GetOperation getOperation = newGetOperation(path, fields, filter, rootJunction, queryParams); Iterable<T> iterable; @@ -89,12 +90,10 @@ public class Dhis2Get { } if (itemType == null) { - iterable = (Iterable<T>) iteratorDhis2Response - .returnAs(Map.class, path); + iterable = (Iterable<T>) iteratorDhis2Response.returnAs(Map.class, arrayName); } else { try { - iterable = (Iterable<T>) iteratorDhis2Response - .returnAs(Class.forName(itemType), path); + iterable = (Iterable<T>) iteratorDhis2Response.returnAs(Class.forName(itemType), arrayName); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } diff --git a/components/camel-dhis2/camel-dhis2-api/src/test/java/org/apache/camel/component/dhis2/api/Dhis2GetTestCase.java b/components/camel-dhis2/camel-dhis2-api/src/test/java/org/apache/camel/component/dhis2/api/Dhis2GetTestCase.java index 325a4f692ec..706143d5fe2 100644 --- a/components/camel-dhis2/camel-dhis2-api/src/test/java/org/apache/camel/component/dhis2/api/Dhis2GetTestCase.java +++ b/components/camel-dhis2/camel-dhis2-api/src/test/java/org/apache/camel/component/dhis2/api/Dhis2GetTestCase.java @@ -184,7 +184,7 @@ public class Dhis2GetTestCase { "https://play.dhis2.org/2.39.0.1", "", null, new JacksonConverterFactory(), getOperation)); Dhis2Get dhis2Get = new Dhis2Get(dhis2Client); - dhis2Get.collection("bunnies", null, null, null, null, null, Map.of("foo", "bar")); + dhis2Get.collection("bunnies", null, "bunnies", null, null, null, null, Map.of("foo", "bar")); verify(getOperation, times(1)).withParameter("foo", "bar"); } @@ -216,7 +216,7 @@ public class Dhis2GetTestCase { new JacksonConverterFactory(), getOperation)); Dhis2Get dhis2Get = new Dhis2Get(dhis2Client); - dhis2Get.collection("bunnies", null, null, null, null, RootJunctionEnum.OR, null); + dhis2Get.collection("bunnies", null, "bunnies", null, null, null, RootJunctionEnum.OR, null); verify(getOperation, times(1)).withOrRootJunction(); } @@ -246,7 +246,7 @@ public class Dhis2GetTestCase { "https://play.dhis2.org/2.39.0.1", "", null, new JacksonConverterFactory(), getOperation)); Dhis2Get dhis2Get = new Dhis2Get(dhis2Client); - dhis2Get.collection("bunnies", null, null, null, null, RootJunctionEnum.AND, null); + dhis2Get.collection("bunnies", null, "bunnies", null, null, null, RootJunctionEnum.AND, null); verify(getOperation, times(1)).withAndRootJunction(); } } diff --git a/components/camel-dhis2/camel-dhis2-component/src/generated/java/org/apache/camel/component/dhis2/Dhis2EndpointUriFactory.java b/components/camel-dhis2/camel-dhis2-component/src/generated/java/org/apache/camel/component/dhis2/Dhis2EndpointUriFactory.java index 4a7b44074cd..0bcc1c424df 100644 --- a/components/camel-dhis2/camel-dhis2-component/src/generated/java/org/apache/camel/component/dhis2/Dhis2EndpointUriFactory.java +++ b/components/camel-dhis2/camel-dhis2-component/src/generated/java/org/apache/camel/component/dhis2/Dhis2EndpointUriFactory.java @@ -21,8 +21,9 @@ public class Dhis2EndpointUriFactory extends org.apache.camel.support.component. private static final Set<String> SECRET_PROPERTY_NAMES; private static final Set<String> MULTI_VALUE_PREFIXES; static { - Set<String> props = new HashSet<>(39); + Set<String> props = new HashSet<>(40); props.add("apiName"); + props.add("arrayName"); props.add("backoffErrorThreshold"); props.add("backoffIdleThreshold"); props.add("backoffMultiplier"); diff --git a/components/camel-dhis2/camel-dhis2-component/src/generated/java/org/apache/camel/component/dhis2/Dhis2GetEndpointConfiguration.java b/components/camel-dhis2/camel-dhis2-component/src/generated/java/org/apache/camel/component/dhis2/Dhis2GetEndpointConfiguration.java index 9ec1227a69f..7f7a9e99a38 100644 --- a/components/camel-dhis2/camel-dhis2-component/src/generated/java/org/apache/camel/component/dhis2/Dhis2GetEndpointConfiguration.java +++ b/components/camel-dhis2/camel-dhis2-component/src/generated/java/org/apache/camel/component/dhis2/Dhis2GetEndpointConfiguration.java @@ -16,10 +16,13 @@ import org.apache.camel.spi.UriParams; */ @ApiParams(apiName = "get", description = "", - apiMethods = {@ApiMethod(methodName = "collection", signatures={"java.util.Iterator collection(String path, String itemType, Boolean paging, String fields, String filter, org.apache.camel.component.dhis2.api.RootJunctionEnum rootJunction, java.util.Map<String, Object> queryParams)"}), @ApiMethod(methodName = "resource", signatures={"java.io.InputStream resource(String path, String fields, String filter, org.apache.camel.component.dhis2.api.RootJunctionEnum rootJunction, java.u [...] + apiMethods = {@ApiMethod(methodName = "collection", signatures={"java.util.Iterator collection(String path, String itemType, String arrayName, Boolean paging, String fields, String filter, org.apache.camel.component.dhis2.api.RootJunctionEnum rootJunction, java.util.Map<String, Object> queryParams)"}), @ApiMethod(methodName = "resource", signatures={"java.io.InputStream resource(String path, String fields, String filter, org.apache.camel.component.dhis2.api.RootJunctionEnum ro [...] @UriParams @Configurer(extended = true) public final class Dhis2GetEndpointConfiguration extends Dhis2Configuration { + @UriParam + @ApiParam(optional = false, apiMethods = {@ApiMethod(methodName = "collection")}) + private String arrayName; @UriParam @ApiParam(optional = true, apiMethods = {@ApiMethod(methodName = "collection"), @ApiMethod(methodName = "resource")}) private String fields; @@ -42,6 +45,14 @@ public final class Dhis2GetEndpointConfiguration extends Dhis2Configuration { @ApiParam(optional = true, apiMethods = {@ApiMethod(methodName = "collection"), @ApiMethod(methodName = "resource")}) private org.apache.camel.component.dhis2.api.RootJunctionEnum rootJunction; + public String getArrayName() { + return arrayName; + } + + public void setArrayName(String arrayName) { + this.arrayName = arrayName; + } + public String getFields() { return fields; } diff --git a/components/camel-dhis2/camel-dhis2-component/src/generated/java/org/apache/camel/component/dhis2/Dhis2GetEndpointConfigurationConfigurer.java b/components/camel-dhis2/camel-dhis2-component/src/generated/java/org/apache/camel/component/dhis2/Dhis2GetEndpointConfigurationConfigurer.java index d68646f3074..9670058b051 100644 --- a/components/camel-dhis2/camel-dhis2-component/src/generated/java/org/apache/camel/component/dhis2/Dhis2GetEndpointConfigurationConfigurer.java +++ b/components/camel-dhis2/camel-dhis2-component/src/generated/java/org/apache/camel/component/dhis2/Dhis2GetEndpointConfigurationConfigurer.java @@ -21,6 +21,7 @@ public class Dhis2GetEndpointConfigurationConfigurer extends org.apache.camel.su static { Map<String, Object> map = new CaseInsensitiveMap(); map.put("ApiName", org.apache.camel.component.dhis2.internal.Dhis2ApiName.class); + map.put("ArrayName", java.lang.String.class); map.put("BaseApiUrl", java.lang.String.class); map.put("Client", org.hisp.dhis.integration.sdk.api.Dhis2Client.class); map.put("Fields", java.lang.String.class); @@ -42,6 +43,8 @@ public class Dhis2GetEndpointConfigurationConfigurer extends org.apache.camel.su switch (ignoreCase ? name.toLowerCase() : name) { case "apiname": case "ApiName": target.setApiName(property(camelContext, org.apache.camel.component.dhis2.internal.Dhis2ApiName.class, value)); return true; + case "arrayname": + case "ArrayName": target.setArrayName(property(camelContext, java.lang.String.class, value)); return true; case "baseapiurl": case "BaseApiUrl": target.setBaseApiUrl(property(camelContext, java.lang.String.class, value)); return true; case "client": @@ -80,6 +83,8 @@ public class Dhis2GetEndpointConfigurationConfigurer extends org.apache.camel.su switch (ignoreCase ? name.toLowerCase() : name) { case "apiname": case "ApiName": return org.apache.camel.component.dhis2.internal.Dhis2ApiName.class; + case "arrayname": + case "ArrayName": return java.lang.String.class; case "baseapiurl": case "BaseApiUrl": return java.lang.String.class; case "client": @@ -114,6 +119,8 @@ public class Dhis2GetEndpointConfigurationConfigurer extends org.apache.camel.su switch (ignoreCase ? name.toLowerCase() : name) { case "apiname": case "ApiName": return target.getApiName(); + case "arrayname": + case "ArrayName": return target.getArrayName(); case "baseapiurl": case "BaseApiUrl": return target.getBaseApiUrl(); case "client": diff --git a/components/camel-dhis2/camel-dhis2-component/src/generated/java/org/apache/camel/component/dhis2/internal/Dhis2GetApiMethod.java b/components/camel-dhis2/camel-dhis2-component/src/generated/java/org/apache/camel/component/dhis2/internal/Dhis2GetApiMethod.java index 66cca60bd5c..7e37f358f5e 100644 --- a/components/camel-dhis2/camel-dhis2-component/src/generated/java/org/apache/camel/component/dhis2/internal/Dhis2GetApiMethod.java +++ b/components/camel-dhis2/camel-dhis2-component/src/generated/java/org/apache/camel/component/dhis2/internal/Dhis2GetApiMethod.java @@ -25,6 +25,7 @@ public enum Dhis2GetApiMethod implements ApiMethod { "collection", arg("path", String.class), arg("itemType", String.class), + arg("arrayName", String.class), arg("paging", Boolean.class), arg("fields", String.class), arg("filter", String.class), diff --git a/components/camel-dhis2/camel-dhis2-component/src/generated/resources/org/apache/camel/component/dhis2/dhis2.json b/components/camel-dhis2/camel-dhis2-component/src/generated/resources/org/apache/camel/component/dhis2/dhis2.json index 2cf4346ecd6..69bc25a9b77 100644 --- a/components/camel-dhis2/camel-dhis2-component/src/generated/resources/org/apache/camel/component/dhis2/dhis2.json +++ b/components/camel-dhis2/camel-dhis2-component/src/generated/resources/org/apache/camel/component/dhis2/dhis2.json @@ -63,14 +63,14 @@ }, "apis": { "delete": { "consumerOnly": false, "producerOnly": false, "description": "", "methods": { "resource": { "description": "", "signatures": [ "java.io.InputStream resource(String path, Object resource, java.util.Map<String, Object> queryParams)" ] } } }, - "get": { "consumerOnly": false, "producerOnly": false, "description": "", "methods": { "collection": { "description": "", "signatures": [ "java.util.Iterator collection(String path, String itemType, Boolean paging, String fields, String filter, org.apache.camel.component.dhis2.api.RootJunctionEnum rootJunction, java.util.Map<String, Object> queryParams)" ] }, "resource": { "description": "", "signatures": [ "java.io.InputStream resource(String path, String fields, String filter, org. [...] + "get": { "consumerOnly": false, "producerOnly": false, "description": "", "methods": { "collection": { "description": "", "signatures": [ "java.util.Iterator collection(String path, String itemType, String arrayName, Boolean paging, String fields, String filter, org.apache.camel.component.dhis2.api.RootJunctionEnum rootJunction, java.util.Map<String, Object> queryParams)" ] }, "resource": { "description": "", "signatures": [ "java.io.InputStream resource(String path, String fields, S [...] "post": { "consumerOnly": false, "producerOnly": false, "description": "", "methods": { "resource": { "description": "", "signatures": [ "java.io.InputStream resource(String path, Object resource, java.util.Map<String, Object> queryParams)" ] } } }, "put": { "consumerOnly": false, "producerOnly": false, "description": "", "methods": { "resource": { "description": "", "signatures": [ "java.io.InputStream resource(String path, Object resource, java.util.Map<String, Object> queryParams)" ] } } }, "resourceTables": { "consumerOnly": false, "producerOnly": false, "description": "", "methods": { "analytics": { "description": "", "signatures": [ "void analytics(Boolean skipAggregate, Boolean skipEvents, Integer lastYears, Integer interval)" ] } } } }, "apiProperties": { "delete": { "methods": { "resource": { "properties": { "path": { "kind": "parameter", "displayName": "Path", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "", "optional": false }, "queryParams": { "kind": "parameter", "displayName": "Query Params", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.Strin [...] - "get": { "methods": { "collection": { "properties": { "fields": { "kind": "parameter", "displayName": "Fields", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "", "optional": true }, "filter": { "kind": "parameter", "displayName": "Filter", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false [...] + "get": { "methods": { "collection": { "properties": { "arrayName": { "kind": "parameter", "displayName": "Array Name", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "", "optional": false }, "fields": { "kind": "parameter", "displayName": "Fields", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated [...] "post": { "methods": { "resource": { "properties": { "path": { "kind": "parameter", "displayName": "Path", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "", "optional": false }, "queryParams": { "kind": "parameter", "displayName": "Query Params", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, [...] "put": { "methods": { "resource": { "properties": { "path": { "kind": "parameter", "displayName": "Path", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "", "optional": false }, "queryParams": { "kind": "parameter", "displayName": "Query Params", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, [...] "resourceTables": { "methods": { "analytics": { "properties": { "interval": { "kind": "parameter", "displayName": "Interval", "group": "common", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "", "optional": true }, "lastYears": { "kind": "parameter", "displayName": "Last Years", "group": "common", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Inte [...] diff --git a/components/camel-dhis2/camel-dhis2-component/src/main/docs/dhis2-component.adoc b/components/camel-dhis2/camel-dhis2-component/src/main/docs/dhis2-component.adoc index d02c0bd4e06..5a402a17f5d 100644 --- a/components/camel-dhis2/camel-dhis2-component/src/main/docs/dhis2-component.adoc +++ b/components/camel-dhis2/camel-dhis2-component/src/main/docs/dhis2-component.adoc @@ -100,6 +100,7 @@ The get/collection API method has the parameters listed in the table below: | Parameter | Description | Type | path | Resource URL path | String | itemType | Fully-qualified Java class name to deserialise items into| String +| arrayName | JSON property name holding the array to read | String | paging | Turn paging on/off | Boolean | fields | Comma-delimited list of fields to fetch | String | filter | Search criteria | String @@ -120,7 +121,7 @@ public class MyRouteBuilder extends RouteBuilder { public void configure() { from("direct:getCollection") - .to("dhis2://get/collection?path=organisationUnits&itemType=org.hisp.dhis.api.model.v2_39_1.OrganisationUnit&username=admin&password=district&baseApiUrl=https://play.dhis2.org/2.39.1/api") + .to("dhis2://get/collection?path=organisationUnits&itemType=org.hisp.dhis.api.model.v2_39_1.OrganisationUnit&arrayName=organisationUnits&username=admin&password=district&baseApiUrl=https://play.dhis2.org/2.39.1/api") .split().body().log("${body}"); } } @@ -138,7 +139,7 @@ public class MyRouteBuilder extends RouteBuilder { public void configure() { from("direct:getCollection") - .to("dhis2://get/collection?path=organisationUnits&fields=code&itemType=org.hisp.dhis.api.model.v2_39_1.OrganisationUnit&username=admin&password=district&baseApiUrl=https://play.dhis2.org/2.39.1/api") + .to("dhis2://get/collection?path=organisationUnits&fields=code&itemType=org.hisp.dhis.api.model.v2_39_1.OrganisationUnit&arrayName=organisationUnits&username=admin&password=district&baseApiUrl=https://play.dhis2.org/2.39.1/api") .split().body().log("${body}"); } } @@ -156,7 +157,7 @@ public class MyRouteBuilder extends RouteBuilder { public void configure() { from("direct:getCollection") - .to("dhis2://get/collection?path=users&filter=phoneNumber:!null:&itemType=org.hisp.dhis.api.model.v2_39_1.User&username=admin&password=district&baseApiUrl=https://play.dhis2.org/2.39.1/api") + .to("dhis2://get/collection?path=users&filter=phoneNumber:!null:&itemType=org.hisp.dhis.api.model.v2_39_1.User&arrayName=users&username=admin&password=district&baseApiUrl=https://play.dhis2.org/2.39.1/api") .split().body().log("${body}"); } } @@ -217,13 +218,13 @@ public class MyRouteBuilder extends RouteBuilder { public void configure() { from("direct:postResource") - .process(exchange -> exchange.getMessage().setBody(new DataValueSet().withCompleteDate( + .setBody(exchange -> new DataValueSet().withCompleteDate( ZonedDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT)) .withOrgUnit("O6uvpzGd5pu") .withDataSet("lyLU2wR22tC").withPeriod(PeriodBuilder.monthOf(new Date(), -1)) .withDataValues( - List.of(new DataValue__1().withDataElement("aIJZ2d2QgVV").withValue("20"))))) - .to("dhis2://post/resource?path=dataValueSets&inBody=resource&username=admin&password=district&baseApiUrl=https://play.dhis2.org/2.39.1/api") + List.of(new DataValue__1().withDataElement("aIJZ2d2QgVV").withValue("20")))) + .to("dhis2://post/resource?path=dataValueSets&username=admin&password=district&baseApiUrl=https://play.dhis2.org/2.39.1/api") .unmarshal().json(ImportReportWebMessageResponse.class) .choice() .when(exchange -> !exchange.getMessage().getBody(ImportReportWebMessageResponse.class).getStatus().get().equals(DescriptiveWebMessage.Status.OK)) diff --git a/components/camel-dhis2/camel-dhis2-component/src/test/java/org/apache/camel/component/dhis2/Dhis2GetIT.java b/components/camel-dhis2/camel-dhis2-component/src/test/java/org/apache/camel/component/dhis2/Dhis2GetIT.java index db2e47ac047..c580a75f5da 100644 --- a/components/camel-dhis2/camel-dhis2-component/src/test/java/org/apache/camel/component/dhis2/Dhis2GetIT.java +++ b/components/camel-dhis2/camel-dhis2-component/src/test/java/org/apache/camel/component/dhis2/Dhis2GetIT.java @@ -42,17 +42,12 @@ public class Dhis2GetIT extends AbstractDhis2TestSupport { @Test public void testCollection() throws Exception { final Map<String, Object> headers = new HashMap<String, Object>(); - // parameter type is String headers.put("CamelDhis2.path", "organisationUnits"); - // parameter type is String headers.put("CamelDhis2.itemType", "org.hisp.dhis.api.model.v2_39_1.OrganisationUnit"); - // parameter type is Boolean + headers.put("CamelDhis2.arrayName", "organisationUnits"); headers.put("CamelDhis2.paging", true); - // parameter type is String headers.put("CamelDhis2.fields", null); - // parameter type is String headers.put("CamelDhis2.filter", null); - // parameter type is java.util.Map headers.put("CamelDhis2.queryParams", new HashMap<>()); final java.util.Iterator result = requestBodyAndHeaders("direct://COLLECTION", null, headers); @@ -64,13 +59,9 @@ public class Dhis2GetIT extends AbstractDhis2TestSupport { @Test public void testResource() throws Exception { final Map<String, Object> headers = new HashMap<String, Object>(); - // parameter type is String headers.put("CamelDhis2.path", String.format("organisationUnits/%s", Environment.ORG_UNIT_ID)); - // parameter type is String headers.put("CamelDhis2.fields", null); - // parameter type is String headers.put("CamelDhis2.filter", null); - // parameter type is java.util.Map headers.put("CamelDhis2.queryParams", null); final java.io.InputStream result = requestBodyAndHeaders("direct://RESOURCE", null, headers);