This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push: new 1a12f85 CAMEL-15478: camel-catalog now validates API component endpoints and uses it extra set of options in the validation. 1a12f85 is described below commit 1a12f85731f303945ffc7acf8071aa498c7589a4 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Wed Sep 2 15:07:49 2020 +0200 CAMEL-15478: camel-catalog now validates API component endpoints and uses it extra set of options in the validation. --- .../apache/camel/catalog/components/zendesk.json | 2 +- .../org/apache/camel/catalog/CamelCatalogTest.java | 24 ++++++++++++ .../apache/camel/component/zendesk/zendesk.json | 2 +- .../camel/component/zendesk/ZendeskEndpoint.java | 3 +- .../src/generated/resources/metadata.json | 2 +- .../camel/catalog/impl/AbstractCamelCatalog.java | 45 ++++++++++++++++++++++ 6 files changed, 73 insertions(+), 5 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/zendesk.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/zendesk.json index 68a0120..bd71381 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/zendesk.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/zendesk.json @@ -20,7 +20,7 @@ "apiPropertyQualifier": "methodName", "consumerOnly": false, "producerOnly": false, - "lenientProperties": true + "lenientProperties": false }, "componentProperties": { "serverUrl": { "kind": "property", "displayName": "Server Url", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The server URL to connect." }, diff --git a/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java b/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java index 08e34e0..1819914 100644 --- a/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java +++ b/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java @@ -1182,6 +1182,30 @@ public class CamelCatalogTest { } @Test + public void testValidateApiEndpoint() throws Exception { + // there is a type converter that converts from and to to phone number + String uri = "twilio:call/create?applicationSid=123&from=#555&to=#999"; + EndpointValidationResult result = catalog.validateEndpointProperties(uri); + assertTrue(result.isSuccess()); + + // there is a type converter that converts from and to to phone number + uri = "twilio:call/create?applicationSid=123&from=#555&to=#999&unknown=true"; + result = catalog.validateEndpointProperties(uri); + assertFalse(result.isSuccess()); + assertTrue(result.getUnknown().contains("unknown")); + + // there is a type converter that converts from and to to phone number + uri = "zendesk:getTopicsByUser?userId=123"; + result = catalog.validateEndpointProperties(uri); + assertTrue(result.isSuccess()); + + uri = "zendesk:getTopicsByUser?userId=123&unknown=true"; + result = catalog.validateEndpointProperties(uri); + assertFalse(result.isSuccess()); + assertTrue(result.getUnknown().contains("unknown")); + } + + @Test public void testValidateEndpointTimerDuration() throws Exception { String uri = "timer:foo?period=5s"; EndpointValidationResult result = catalog.validateEndpointProperties(uri); diff --git a/components/camel-zendesk/src/generated/resources/org/apache/camel/component/zendesk/zendesk.json b/components/camel-zendesk/src/generated/resources/org/apache/camel/component/zendesk/zendesk.json index 68a0120..bd71381 100644 --- a/components/camel-zendesk/src/generated/resources/org/apache/camel/component/zendesk/zendesk.json +++ b/components/camel-zendesk/src/generated/resources/org/apache/camel/component/zendesk/zendesk.json @@ -20,7 +20,7 @@ "apiPropertyQualifier": "methodName", "consumerOnly": false, "producerOnly": false, - "lenientProperties": true + "lenientProperties": false }, "componentProperties": { "serverUrl": { "kind": "property", "displayName": "Server Url", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The server URL to connect." }, diff --git a/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskEndpoint.java b/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskEndpoint.java index 2fa85a9..e758444 100644 --- a/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskEndpoint.java +++ b/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskEndpoint.java @@ -40,8 +40,7 @@ import org.zendesk.client.v2.Zendesk; */ @UriEndpoint(firstVersion = "2.19.0", scheme = "zendesk", title = "Zendesk", syntax = "zendesk:methodName", apiPropertyQualifier = "methodName", - consumerPrefix = "consumer", category = { Category.CLOUD, Category.API, Category.SUPPORT }, - lenientProperties = true) + consumerPrefix = "consumer", category = { Category.CLOUD, Category.API, Category.SUPPORT }) public class ZendeskEndpoint extends AbstractApiEndpoint<ZendeskApiName, ZendeskConfiguration> { @UriParam diff --git a/core/camel-componentdsl/src/generated/resources/metadata.json b/core/camel-componentdsl/src/generated/resources/metadata.json index 8944822..1521304 100644 --- a/core/camel-componentdsl/src/generated/resources/metadata.json +++ b/core/camel-componentdsl/src/generated/resources/metadata.json @@ -8233,7 +8233,7 @@ "apiPropertyQualifier": "methodName", "consumerOnly": false, "producerOnly": false, - "lenientProperties": true + "lenientProperties": false }, "ZookeeperComponentBuilderFactory": { "kind": "component", diff --git a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java index c9d03af..ee96f82 100644 --- a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java +++ b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java @@ -52,6 +52,7 @@ import org.apache.camel.tooling.model.LanguageModel; import org.apache.camel.tooling.model.MainModel; import org.apache.camel.tooling.model.OtherModel; import org.apache.camel.util.ObjectHelper; +import org.apache.camel.util.StringHelper; /** * Base class for both the runtime RuntimeCamelCatalog from camel-core and the complete CamelCatalog from camel-catalog. @@ -172,6 +173,13 @@ public abstract class AbstractCamelCatalog { model.getEndpointOptions().forEach(o -> rows.put(o.getName(), o)); model.getEndpointPathOptions().forEach(o -> rows.put(o.getName(), o)); + if (model.isApi()) { + String qualifier = model.getApiPropertyQualifier(); + String key = properties.get(qualifier); + Map<String, BaseOptionModel> apiProperties = extractApiProperties(model, key); + rows.putAll(apiProperties); + } + // the dataformat component refers to a data format so lets add the properties for the selected // data format to the list of rows if ("dataformat".equals(scheme)) { @@ -534,6 +542,17 @@ public abstract class AbstractCamelCatalog { model.getEndpointOptions().forEach(o -> rows.put(o.getName(), o)); model.getEndpointPathOptions().forEach(o -> rows.put(o.getName(), o)); + // is this an api component then there may be additional options + if (model.isApi()) { + String qualifier = model.getApiPropertyQualifier(); + int pos = word.indexOf(qualifier); + if (pos != -1) { + String key = word2.size() > pos ? word2.get(pos) : null; + Map<String, BaseOptionModel> apiProperties = extractApiProperties(model, key); + rows.putAll(apiProperties); + } + } + // word contains the syntax path elements Iterator<String> it = word2.iterator(); for (int i = 0; i < word.size(); i++) { @@ -628,6 +647,32 @@ public abstract class AbstractCamelCatalog { return answer; } + private Map<String, BaseOptionModel> extractApiProperties(ComponentModel model, String key) { + Map<String, BaseOptionModel> answer = new LinkedHashMap<>(); + if (key != null) { + String matchKey = null; + if (model.getApiOptions().containsKey(key)) { + matchKey = key; + } + if (matchKey == null) { + key = StringHelper.camelCaseToDash(key); + if (model.getApiOptions().containsKey(key)) { + matchKey = key; + } + } + if (matchKey == null) { + key = "DEFAULT"; + if (model.getApiOptions().containsKey(key)) { + matchKey = key; + } + } + if (matchKey != null) { + model.getApiOptions().get(matchKey).forEach(o -> answer.put(o.getName(), o)); + } + } + return answer; + } + public Map<String, String> endpointLenientProperties(String uri) throws URISyntaxException { // need to normalize uri first