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

[camel] branch master updated: CAMEL-15478: camel-catalog now validates API component endpoints and uses it extra set of options in the validation.

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 <cl...@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