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 cf8a588  CAMEL-15549: Api component tooling API to validate parameters 
to filter out possible properties per method name.
cf8a588 is described below

commit cf8a5886f8869ce62d27b44afdfc45b451fa5d0f
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Mon Sep 21 10:18:45 2020 +0200

    CAMEL-15549: Api component tooling API to validate parameters to filter out 
possible properties per method name.
---
 .../apache/camel/catalog/components/braintree.json |  2 +-
 .../org/apache/camel/catalog/components/fhir.json  |  8 +--
 .../catalog/components/google-calendar-stream.json |  2 +-
 .../catalog/components/google-mail-stream.json     |  2 +-
 .../catalog/components/google-sheets-stream.json   | 22 ++++----
 .../apache/camel/catalog/components/twilio.json    |  2 +-
 .../camel/catalog/docs/braintree-component.adoc    |  3 +-
 .../org/apache/camel/catalog/CamelCatalogTest.java |  7 +++
 .../camel/component/braintree/braintree.json       |  1 +
 .../src/main/docs/braintree-component.adoc         |  3 +-
 .../braintree/BraintreeConfiguration.java          |  1 +
 .../camel/catalog/impl/AbstractCamelCatalog.java   | 58 ++++++++++++++++++----
 .../builder/endpoint/StaticEndpointBuilders.java   |  6 +++
 .../dsl/BraintreeEndpointBuilderFactory.java       |  6 +++
 .../modules/ROOT/pages/braintree-component.adoc    |  3 +-
 15 files changed, 95 insertions(+), 31 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/braintree.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/braintree.json
index f509123..34a9327 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/braintree.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/braintree.json
@@ -29,7 +29,7 @@
   },
   "properties": {
     "apiName": { "kind": "path", "displayName": "Api Name", "group": 
"producer", "label": "", "required": true, "type": "object", "javaType": 
"org.apache.camel.component.braintree.internal.BraintreeApiName", "enum": [ 
"ADD_ON", "ADDRESS", "CLIENT_TOKEN", "CREDIT_CARD_VERIFICATION", "CUSTOMER", 
"DISCOUNT", "DISPUTE", "DOCUMENT_UPLOAD", "MERCHANT_ACCOUNT", "PAYMENT_METHOD", 
"PAYMENT_METHOD_NONCE", "PLAN", "REPORT", "SETTLEMENT_BATCH_SUMMARY", 
"SUBSCRIPTION", "TRANSACTION", "WEBHOOK_NOTIFIC [...]
-    "methodName": { "kind": "path", "displayName": "Method Name", "group": 
"producer", "label": "", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "secret": false, "configurationClass": 
"org.apache.camel.component.braintree.BraintreeConfiguration", 
"configurationField": "configuration", "description": "What sub operation to 
use for the selected operation" },
+    "methodName": { "kind": "path", "displayName": "Method Name", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "secret": 
false, "configurationClass": 
"org.apache.camel.component.braintree.BraintreeConfiguration", 
"configurationField": "configuration", "description": "What sub operation to 
use for the selected operation" },
     "environment": { "kind": "parameter", "displayName": "Environment", 
"group": "producer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.braintree.BraintreeConfiguration", 
"configurationField": "configuration", "description": "The environment Either 
SANDBOX or PRODUCTION" },
     "inBody": { "kind": "parameter", "displayName": "In Body", "group": 
"producer", "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" },
     "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start 
Producer", "group": "producer", "label": "producer", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a producer may otherwise 
fail during starting and cause the  [...]
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/fhir.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/fhir.json
index 5897291..d81ad43 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/fhir.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/fhir.json
@@ -44,9 +44,9 @@
     "summary": { "kind": "property", "displayName": "Summary", "group": 
"advanced", "label": "advanced", "required": false, "type": "string", 
"javaType": "java.lang.String", "enum": [ "COUNT", "TEXT", "DATA", "TRUE", 
"FALSE" ], "deprecated": false, "secret": false, "configurationClass": 
"org.apache.camel.component.fhir.FhirConfiguration", "configurationField": 
"configuration", "description": "Request that the server modify the response 
using the _summary param" },
     "validationMode": { "kind": "property", "displayName": "Validation Mode", 
"group": "advanced", "label": "advanced", "required": false, "type": "string", 
"javaType": "java.lang.String", "enum": [ "NEVER", "ONCE" ], "deprecated": 
false, "secret": false, "defaultValue": "ONCE", "configurationClass": 
"org.apache.camel.component.fhir.FhirConfiguration", "configurationField": 
"configuration", "description": "When should Camel validate the FHIR Server's 
conformance statement" },
     "proxyHost": { "kind": "property", "displayName": "Proxy Host", "group": 
"proxy", "label": "proxy", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "secret": false, "configurationClass": 
"org.apache.camel.component.fhir.FhirConfiguration", "configurationField": 
"configuration", "description": "The proxy host" },
-    "proxyPassword": { "kind": "property", "displayName": "Proxy Password", 
"group": "proxy", "label": "proxy", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": false, 
"configurationClass": "org.apache.camel.component.fhir.FhirConfiguration", 
"configurationField": "configuration", "description": "The proxy password" },
+    "proxyPassword": { "kind": "property", "displayName": "Proxy Password", 
"group": "proxy", "label": "proxy", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": true, 
"configurationClass": "org.apache.camel.component.fhir.FhirConfiguration", 
"configurationField": "configuration", "description": "The proxy password" },
     "proxyPort": { "kind": "property", "displayName": "Proxy Port", "group": 
"proxy", "label": "proxy", "required": false, "type": "integer", "javaType": 
"java.lang.Integer", "deprecated": false, "secret": false, 
"configurationClass": "org.apache.camel.component.fhir.FhirConfiguration", 
"configurationField": "configuration", "description": "The proxy port" },
-    "proxyUser": { "kind": "property", "displayName": "Proxy User", "group": 
"proxy", "label": "proxy", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "secret": false, "configurationClass": 
"org.apache.camel.component.fhir.FhirConfiguration", "configurationField": 
"configuration", "description": "The proxy username" },
+    "proxyUser": { "kind": "property", "displayName": "Proxy User", "group": 
"proxy", "label": "proxy", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "secret": true, "configurationClass": 
"org.apache.camel.component.fhir.FhirConfiguration", "configurationField": 
"configuration", "description": "The proxy username" },
     "accessToken": { "kind": "property", "displayName": "Access Token", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": true, 
"configurationClass": "org.apache.camel.component.fhir.FhirConfiguration", 
"configurationField": "configuration", "description": "OAuth access token" },
     "password": { "kind": "property", "displayName": "Password", "group": 
"security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": true, 
"configurationClass": "org.apache.camel.component.fhir.FhirConfiguration", 
"configurationField": "configuration", "description": "Username to use for 
basic authentication" },
     "username": { "kind": "property", "displayName": "Username", "group": 
"security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": true, 
"configurationClass": "org.apache.camel.component.fhir.FhirConfiguration", 
"configurationField": "configuration", "description": "Username to use for 
basic authentication" }
@@ -80,9 +80,9 @@
     "synchronous": { "kind": "parameter", "displayName": "Synchronous", 
"group": "advanced", "label": "advanced", "required": false, "type": "boolean", 
"javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": 
"false", "description": "Sets whether synchronous processing should be strictly 
used, or Camel is allowed to use asynchronous processing (if supported)." },
     "validationMode": { "kind": "parameter", "displayName": "Validation Mode", 
"group": "advanced", "label": "advanced", "required": false, "type": "string", 
"javaType": "java.lang.String", "enum": [ "NEVER", "ONCE" ], "deprecated": 
false, "secret": false, "defaultValue": "ONCE", "configurationClass": 
"org.apache.camel.component.fhir.FhirConfiguration", "configurationField": 
"configuration", "description": "When should Camel validate the FHIR Server's 
conformance statement" },
     "proxyHost": { "kind": "parameter", "displayName": "Proxy Host", "group": 
"proxy", "label": "proxy", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "secret": false, "configurationClass": 
"org.apache.camel.component.fhir.FhirConfiguration", "configurationField": 
"configuration", "description": "The proxy host" },
-    "proxyPassword": { "kind": "parameter", "displayName": "Proxy Password", 
"group": "proxy", "label": "proxy", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": false, 
"configurationClass": "org.apache.camel.component.fhir.FhirConfiguration", 
"configurationField": "configuration", "description": "The proxy password" },
+    "proxyPassword": { "kind": "parameter", "displayName": "Proxy Password", 
"group": "proxy", "label": "proxy", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": true, 
"configurationClass": "org.apache.camel.component.fhir.FhirConfiguration", 
"configurationField": "configuration", "description": "The proxy password" },
     "proxyPort": { "kind": "parameter", "displayName": "Proxy Port", "group": 
"proxy", "label": "proxy", "required": false, "type": "integer", "javaType": 
"java.lang.Integer", "deprecated": false, "secret": false, 
"configurationClass": "org.apache.camel.component.fhir.FhirConfiguration", 
"configurationField": "configuration", "description": "The proxy port" },
-    "proxyUser": { "kind": "parameter", "displayName": "Proxy User", "group": 
"proxy", "label": "proxy", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "secret": false, "configurationClass": 
"org.apache.camel.component.fhir.FhirConfiguration", "configurationField": 
"configuration", "description": "The proxy username" },
+    "proxyUser": { "kind": "parameter", "displayName": "Proxy User", "group": 
"proxy", "label": "proxy", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "secret": true, "configurationClass": 
"org.apache.camel.component.fhir.FhirConfiguration", "configurationField": 
"configuration", "description": "The proxy username" },
     "backoffErrorThreshold": { "kind": "parameter", "displayName": "Backoff 
Error Threshold", "group": "scheduler", "label": "consumer,scheduler", 
"required": false, "type": "integer", "javaType": "int", "deprecated": false, 
"secret": false, "description": "The number of subsequent error polls (failed 
due some error) that should happen before the backoffMultipler should kick-in." 
},
     "backoffIdleThreshold": { "kind": "parameter", "displayName": "Backoff 
Idle Threshold", "group": "scheduler", "label": "consumer,scheduler", 
"required": false, "type": "integer", "javaType": "int", "deprecated": false, 
"secret": false, "description": "The number of subsequent idle polls that 
should happen before the backoffMultipler should kick-in." },
     "backoffMultiplier": { "kind": "parameter", "displayName": "Backoff 
Multiplier", "group": "scheduler", "label": "consumer,scheduler", "required": 
false, "type": "integer", "javaType": "int", "deprecated": false, "secret": 
false, "description": "To let the scheduled polling consumer backoff if there 
has been a number of subsequent idles\/errors in a row. The multiplier is then 
the number of polls that will be skipped before the next actual attempt is 
happening again. When this option  [...]
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-calendar-stream.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-calendar-stream.json
index 95df1dc..2eeb3d3 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-calendar-stream.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-calendar-stream.json
@@ -39,7 +39,7 @@
     "refreshToken": { "kind": "property", "displayName": "Refresh Token", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": true, 
"configurationClass": 
"org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration",
 "configurationField": "configuration", "description": "OAuth 2 refresh token. 
Using this, the Google Calendar component can obtain a new accessToken whenever 
the [...]
   },
   "properties": {
-    "index": { "kind": "path", "displayName": "Index", "group": "consumer", 
"label": "", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "secret": false, "configurationClass": 
"org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration",
 "configurationField": "configuration", "description": "Specifies an index for 
the endpoint" },
+    "index": { "kind": "path", "displayName": "Index", "group": "consumer", 
"label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "secret": 
false, "configurationClass": 
"org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration",
 "configurationField": "configuration", "description": "Specifies an index for 
the endpoint" },
     "applicationName": { "kind": "parameter", "displayName": "Application 
Name", "group": "consumer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration",
 "configurationField": "configuration", "description": "Google Calendar 
application name. Example would be camel-google-calendar\/1.0" },
     "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error 
Handler", "group": "consumer", "label": "consumer", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "secret": false, 
"defaultValue": false, "description": "Allows for bridging the consumer to the 
Camel routing Error Handler, which mean any exceptions occurred while the 
consumer is trying to pickup incoming messages, or the likes, will now be 
processed as a message and handled b [...]
     "calendarId": { "kind": "parameter", "displayName": "Calendar Id", 
"group": "consumer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": false, 
"defaultValue": "primary", "configurationClass": 
"org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration",
 "configurationField": "configuration", "description": "The calendarId to be 
used" },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-mail-stream.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-mail-stream.json
index 19170c1..2623c87 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-mail-stream.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-mail-stream.json
@@ -37,7 +37,7 @@
     "refreshToken": { "kind": "property", "displayName": "Refresh Token", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": true, 
"configurationClass": 
"org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", 
"configurationField": "configuration", "description": "OAuth 2 refresh token. 
Using this, the Google Calendar component can obtain a new accessToken whenever 
the current [...]
   },
   "properties": {
-    "index": { "kind": "path", "displayName": "Index", "group": "consumer", 
"label": "", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "secret": false, "configurationClass": 
"org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", 
"configurationField": "configuration", "description": "Currently not in use" },
+    "index": { "kind": "path", "displayName": "Index", "group": "consumer", 
"label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "secret": 
false, "configurationClass": 
"org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", 
"configurationField": "configuration", "description": "Currently not in use" },
     "applicationName": { "kind": "parameter", "displayName": "Application 
Name", "group": "consumer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", 
"configurationField": "configuration", "description": "Google mail application 
name. Example would be camel-google-mail\/1.0" },
     "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error 
Handler", "group": "consumer", "label": "consumer", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "secret": false, 
"defaultValue": false, "description": "Allows for bridging the consumer to the 
Camel routing Error Handler, which mean any exceptions occurred while the 
consumer is trying to pickup incoming messages, or the likes, will now be 
processed as a message and handled b [...]
     "clientId": { "kind": "parameter", "displayName": "Client Id", "group": 
"consumer", "label": "", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "secret": false, "configurationClass": 
"org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", 
"configurationField": "configuration", "description": "Client ID of the mail 
application" },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-sheets-stream.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-sheets-stream.json
index e1c4c65..4d15fbe 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-sheets-stream.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-sheets-stream.json
@@ -23,36 +23,33 @@
     "verifiers": "parameters,connectivity"
   },
   "componentProperties": {
-    "accessToken": { "kind": "property", "displayName": "Access Token", 
"group": "consumer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "OAuth 2 access token. 
This typically expires after an hour so refreshToken is recommended for long 
term usage." },
     "applicationName": { "kind": "property", "displayName": "Application 
Name", "group": "consumer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Google sheets 
application name. Example would be camel-google-sheets\/1.0" },
     "bridgeErrorHandler": { "kind": "property", "displayName": "Bridge Error 
Handler", "group": "consumer", "label": "consumer", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "secret": false, 
"defaultValue": false, "description": "Allows for bridging the consumer to the 
Camel routing Error Handler, which mean any exceptions occurred while the 
consumer is trying to pickup incoming messages, or the likes, will now be 
processed as a message and handled by [...]
     "clientId": { "kind": "property", "displayName": "Client Id", "group": 
"consumer", "label": "", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "secret": false, "configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Client ID of the sheets 
application" },
-    "clientSecret": { "kind": "property", "displayName": "Client Secret", 
"group": "consumer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Client secret of the 
sheets application" },
     "configuration": { "kind": "property", "displayName": "Configuration", 
"group": "consumer", "label": "", "required": false, "type": "object", 
"javaType": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "deprecated": false, "secret": false, "description": "To use the shared 
configuration" },
     "includeGridData": { "kind": "property", "displayName": "Include Grid 
Data", "group": "consumer", "label": "", "required": false, "type": "boolean", 
"javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": 
false, "configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "True if grid data 
should be returned." },
     "majorDimension": { "kind": "property", "displayName": "Major Dimension", 
"group": "consumer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "enum": [ "ROWS", "COLUMNS", 
"DIMENSION_UNSPECIFIED" ], "deprecated": false, "secret": false, 
"defaultValue": "ROWS", "configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Specifies the major 
dimension tha [...]
-    "maxResults": { "kind": "property", "displayName": "Max Results", "group": 
"consumer", "label": "", "required": false, "type": "integer", "javaType": 
"int", "deprecated": false, "secret": false, "defaultValue": "0", 
"configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Specify the maximum 
number of returned results. This will limit the number of rows in a returned 
value range dat [...]
+    "maxResults": { "kind": "property", "displayName": "Max Results", "group": 
"consumer", "label": "", "required": false, "type": "integer", "javaType": 
"int", "deprecated": false, "secret": false, "configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Specify the maximum 
number of returned results. This will limit the number of rows in a returned 
value range data set or the number o [...]
     "range": { "kind": "property", "displayName": "Range", "group": 
"consumer", "label": "", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "secret": false, "configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Specifies the range of 
rows and columns in a sheet to get data from." },
-    "refreshToken": { "kind": "property", "displayName": "Refresh Token", 
"group": "consumer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "OAuth 2 refresh token. 
Using this, the Google Calendar component can obtain a new accessToken whenever 
the current on [...]
     "scopes": { "kind": "property", "displayName": "Scopes", "group": 
"consumer", "label": "", "required": false, "type": "array", "javaType": 
"java.util.List<java.lang.String>", "deprecated": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Specifies the level of 
permissions you want a sheets application to have to a user account. See 
https:\/\/developer [...]
     "splitResults": { "kind": "property", "displayName": "Split Results", 
"group": "consumer", "label": "", "required": false, "type": "boolean", 
"javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": 
false, "configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "True if value range 
result should be split into rows or columns to process each of them 
individually.  [...]
     "spreadsheetId": { "kind": "property", "displayName": "Spreadsheet Id", 
"group": "consumer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Specifies the 
spreadsheet identifier that is used to identify the target to obtain." },
     "valueRenderOption": { "kind": "property", "displayName": "Value Render 
Option", "group": "consumer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "enum": [ "FORMATTED_VALUE", 
"UNFORMATTED_VALUE", "FORMULA" ], "deprecated": false, "secret": false, 
"defaultValue": "FORMATTED_VALUE", "configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Determin [...]
     "basicPropertyBinding": { "kind": "property", "displayName": "Basic 
Property Binding", "group": "advanced", "label": "advanced", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": true, "secret": false, 
"defaultValue": false, "description": "Whether the component should use basic 
property binding (Camel 2.x) or the newer property binding with additional 
capabilities" },
-    "clientFactory": { "kind": "property", "displayName": "Client Factory", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": 
"org.apache.camel.component.google.sheets.GoogleSheetsClientFactory", 
"deprecated": false, "secret": false, "description": "To use the 
GoogleSheetsClientFactory as factory for creating the client. Will by default 
use BatchGoogleSheetsClientFactory" }
+    "clientFactory": { "kind": "property", "displayName": "Client Factory", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": 
"org.apache.camel.component.google.sheets.GoogleSheetsClientFactory", 
"deprecated": false, "secret": false, "description": "To use the 
GoogleSheetsClientFactory as factory for creating the client. Will by default 
use BatchGoogleSheetsClientFactory" },
+    "accessToken": { "kind": "property", "displayName": "Access Token", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": true, 
"configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "OAuth 2 access token. 
This typically expires after an hour so refreshToken is recommended for long 
term usage." },
+    "clientSecret": { "kind": "property", "displayName": "Client Secret", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": true, 
"configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Client secret of the 
sheets application" },
+    "refreshToken": { "kind": "property", "displayName": "Refresh Token", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": true, 
"configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "OAuth 2 refresh token. 
Using this, the Google Calendar component can obtain a new accessToken whenever 
the cur [...]
   },
   "properties": {
-    "apiName": { "kind": "path", "displayName": "Api Name", "group": 
"consumer", "label": "", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "secret": false, "configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Sets the apiName." },
-    "accessToken": { "kind": "parameter", "displayName": "Access Token", 
"group": "consumer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "OAuth 2 access token. 
This typically expires after an hour so refreshToken is recommended for long 
term usage." },
+    "apiName": { "kind": "path", "displayName": "Api Name", "group": 
"consumer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "secret": 
false, "configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Sets the apiName." },
     "applicationName": { "kind": "parameter", "displayName": "Application 
Name", "group": "consumer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Google sheets 
application name. Example would be camel-google-sheets\/1.0" },
     "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error 
Handler", "group": "consumer", "label": "consumer", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "secret": false, 
"defaultValue": false, "description": "Allows for bridging the consumer to the 
Camel routing Error Handler, which mean any exceptions occurred while the 
consumer is trying to pickup incoming messages, or the likes, will now be 
processed as a message and handled b [...]
     "clientId": { "kind": "parameter", "displayName": "Client Id", "group": 
"consumer", "label": "", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "secret": false, "configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Client ID of the sheets 
application" },
-    "clientSecret": { "kind": "parameter", "displayName": "Client Secret", 
"group": "consumer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Client secret of the 
sheets application" },
     "includeGridData": { "kind": "parameter", "displayName": "Include Grid 
Data", "group": "consumer", "label": "", "required": false, "type": "boolean", 
"javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": 
false, "configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "True if grid data 
should be returned." },
     "majorDimension": { "kind": "parameter", "displayName": "Major Dimension", 
"group": "consumer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "enum": [ "ROWS", "COLUMNS", 
"DIMENSION_UNSPECIFIED" ], "deprecated": false, "secret": false, 
"defaultValue": "ROWS", "configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Specifies the major 
dimension th [...]
-    "maxResults": { "kind": "parameter", "displayName": "Max Results", 
"group": "consumer", "label": "", "required": false, "type": "integer", 
"javaType": "int", "deprecated": false, "secret": false, "defaultValue": "0", 
"configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Specify the maximum 
number of returned results. This will limit the number of rows in a returned 
value range da [...]
+    "maxResults": { "kind": "parameter", "displayName": "Max Results", 
"group": "consumer", "label": "", "required": false, "type": "integer", 
"javaType": "int", "deprecated": false, "secret": false, "configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Specify the maximum 
number of returned results. This will limit the number of rows in a returned 
value range data set or the number  [...]
     "range": { "kind": "parameter", "displayName": "Range", "group": 
"consumer", "label": "", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "secret": false, "configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Specifies the range of 
rows and columns in a sheet to get data from." },
-    "refreshToken": { "kind": "parameter", "displayName": "Refresh Token", 
"group": "consumer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "OAuth 2 refresh token. 
Using this, the Google Calendar component can obtain a new accessToken whenever 
the current o [...]
     "scopes": { "kind": "parameter", "displayName": "Scopes", "group": 
"consumer", "label": "", "required": false, "type": "array", "javaType": 
"java.util.List<java.lang.String>", "deprecated": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Specifies the level of 
permissions you want a sheets application to have to a user account. See 
https:\/\/develope [...]
     "sendEmptyMessageWhenIdle": { "kind": "parameter", "displayName": "Send 
Empty Message When Idle", "group": "consumer", "label": "consumer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": 
false, "defaultValue": false, "description": "If the polling consumer did not 
poll any files, you can enable this option to send an empty message (no body) 
instead." },
     "splitResults": { "kind": "parameter", "displayName": "Split Results", 
"group": "consumer", "label": "", "required": false, "type": "boolean", 
"javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": 
false, "configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "True if value range 
result should be split into rows or columns to process each of them 
individually. [...]
@@ -76,7 +73,10 @@
     "schedulerProperties": { "kind": "parameter", "displayName": "Scheduler 
Properties", "group": "scheduler", "label": "consumer,scheduler", "required": 
false, "type": "object", "javaType": "java.util.Map<java.lang.String, 
java.lang.Object>", "prefix": "scheduler.", "multiValue": true, "deprecated": 
false, "secret": false, "description": "To configure additional properties when 
using a custom scheduler or any of the Quartz, Spring based scheduler." },
     "startScheduler": { "kind": "parameter", "displayName": "Start Scheduler", 
"group": "scheduler", "label": "consumer,scheduler", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "secret": false, 
"defaultValue": "true", "description": "Whether the scheduler should be auto 
started." },
     "timeUnit": { "kind": "parameter", "displayName": "Time Unit", "group": 
"scheduler", "label": "consumer,scheduler", "required": false, "type": 
"object", "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", 
"MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], 
"deprecated": false, "secret": false, "defaultValue": "MILLISECONDS", 
"description": "Time unit for initialDelay and delay options." },
-    "useFixedDelay": { "kind": "parameter", "displayName": "Use Fixed Delay", 
"group": "scheduler", "label": "consumer,scheduler", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "secret": false, 
"defaultValue": "true", "description": "Controls if fixed delay or fixed rate 
is used. See ScheduledExecutorService in JDK for details." }
+    "useFixedDelay": { "kind": "parameter", "displayName": "Use Fixed Delay", 
"group": "scheduler", "label": "consumer,scheduler", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "secret": false, 
"defaultValue": "true", "description": "Controls if fixed delay or fixed rate 
is used. See ScheduledExecutorService in JDK for details." },
+    "accessToken": { "kind": "parameter", "displayName": "Access Token", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": true, 
"configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "OAuth 2 access token. 
This typically expires after an hour so refreshToken is recommended for long 
term usage." },
+    "clientSecret": { "kind": "parameter", "displayName": "Client Secret", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": true, 
"configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "Client secret of the 
sheets application" },
+    "refreshToken": { "kind": "parameter", "displayName": "Refresh Token", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": true, 
"configurationClass": 
"org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration",
 "configurationField": "configuration", "description": "OAuth 2 refresh token. 
Using this, the Google Calendar component can obtain a new accessToken whenever 
the cu [...]
   },
   "apis": {
     "data": { "consumerOnly": true, "producerOnly": false, "description": "The 
values collection of methods", "methods": { "append": { "description": "Appends 
values to a spreadsheet", "signatures": [ 
"com.google.api.services.sheets.v4.Sheets$Spreadsheets$Values$Append 
append(String spreadsheetId, String range, 
com.google.api.services.sheets.v4.model.ValueRange content)" ] }, "batchClear": 
{ "description": "Clears one or more ranges of values from a spreadsheet", 
"signatures": [ "com.goo [...]
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/twilio.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/twilio.json
index bc1817f..e35d0f9 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/twilio.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/twilio.json
@@ -23,10 +23,10 @@
     "lenientProperties": false
   },
   "componentProperties": {
+    "configuration": { "kind": "property", "displayName": "Configuration", 
"group": "common", "label": "", "required": false, "type": "object", 
"javaType": "org.apache.camel.component.twilio.TwilioConfiguration", 
"deprecated": false, "secret": false, "description": "To use the shared 
configuration" },
     "bridgeErrorHandler": { "kind": "property", "displayName": "Bridge Error 
Handler", "group": "consumer", "label": "consumer", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "secret": false, 
"defaultValue": false, "description": "Allows for bridging the consumer to the 
Camel routing Error Handler, which mean any exceptions occurred while the 
consumer is trying to pickup incoming messages, or the likes, will now be 
processed as a message and handled by [...]
     "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start 
Producer", "group": "producer", "label": "producer", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a producer may otherwise 
fail during starting and cause the r [...]
     "basicPropertyBinding": { "kind": "property", "displayName": "Basic 
Property Binding", "group": "advanced", "label": "advanced", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": true, "secret": false, 
"defaultValue": false, "description": "Whether the component should use basic 
property binding (Camel 2.x) or the newer property binding with additional 
capabilities" },
-    "configuration": { "kind": "property", "displayName": "Configuration", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": "org.apache.camel.component.twilio.TwilioConfiguration", 
"deprecated": false, "secret": false, "description": "To use the shared 
configuration" },
     "restClient": { "kind": "property", "displayName": "Rest Client", "group": 
"advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": "com.twilio.http.TwilioRestClient", "deprecated": false, "secret": 
false, "description": "To use the shared REST client" },
     "accountSid": { "kind": "property", "displayName": "Account Sid", "group": 
"security", "label": "common,security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": true, 
"description": "The account SID to use." },
     "password": { "kind": "property", "displayName": "Password", "group": 
"security", "label": "common,security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": true, 
"description": "Auth token for the account." },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/braintree-component.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/braintree-component.adoc
index ca98d51..d467ef4 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/braintree-component.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/braintree-component.adoc
@@ -70,13 +70,14 @@ braintree:apiName/methodName
 
 with the following path and query parameters:
 
-=== Path Parameters (1 parameters):
+=== Path Parameters (2 parameters):
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
 | *apiName* | *Required* What kind of operation to perform. There are 17 enums 
and the value can be one of: ADD_ON, ADDRESS, CLIENT_TOKEN, 
CREDIT_CARD_VERIFICATION, CUSTOMER, DISCOUNT, DISPUTE, DOCUMENT_UPLOAD, 
MERCHANT_ACCOUNT, PAYMENT_METHOD, PAYMENT_METHOD_NONCE, PLAN, REPORT, 
SETTLEMENT_BATCH_SUMMARY, SUBSCRIPTION, TRANSACTION, WEBHOOK_NOTIFICATION |  | 
BraintreeApiName
+| *methodName* | *Required* What sub operation to use for the selected 
operation |  | String
 |===
 
 
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 8029e6f..ad57b41 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
@@ -1194,6 +1194,13 @@ public class CamelCatalogTest {
         assertFalse(result.isSuccess());
         assertTrue(result.getUnknown().contains("unknown"));
 
+        // call/fetcher does not have from and to parameters
+        uri = "twilio:Call/Fetch?applicationSid=123&from=#555&to=#999";
+        result = catalog.validateEndpointProperties(uri);
+        assertFalse(result.isSuccess());
+        assertTrue(result.getUnknown().contains("from"));
+        assertTrue(result.getUnknown().contains("to"));
+
         uri = "zendesk:getTopicsByUser?user_id=123";
         result = catalog.validateEndpointProperties(uri);
         assertTrue(result.isSuccess());
diff --git 
a/components/camel-braintree/src/generated/resources/org/apache/camel/component/braintree/braintree.json
 
b/components/camel-braintree/src/generated/resources/org/apache/camel/component/braintree/braintree.json
index 5d70b9b..34a9327 100644
--- 
a/components/camel-braintree/src/generated/resources/org/apache/camel/component/braintree/braintree.json
+++ 
b/components/camel-braintree/src/generated/resources/org/apache/camel/component/braintree/braintree.json
@@ -29,6 +29,7 @@
   },
   "properties": {
     "apiName": { "kind": "path", "displayName": "Api Name", "group": 
"producer", "label": "", "required": true, "type": "object", "javaType": 
"org.apache.camel.component.braintree.internal.BraintreeApiName", "enum": [ 
"ADD_ON", "ADDRESS", "CLIENT_TOKEN", "CREDIT_CARD_VERIFICATION", "CUSTOMER", 
"DISCOUNT", "DISPUTE", "DOCUMENT_UPLOAD", "MERCHANT_ACCOUNT", "PAYMENT_METHOD", 
"PAYMENT_METHOD_NONCE", "PLAN", "REPORT", "SETTLEMENT_BATCH_SUMMARY", 
"SUBSCRIPTION", "TRANSACTION", "WEBHOOK_NOTIFIC [...]
+    "methodName": { "kind": "path", "displayName": "Method Name", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "secret": 
false, "configurationClass": 
"org.apache.camel.component.braintree.BraintreeConfiguration", 
"configurationField": "configuration", "description": "What sub operation to 
use for the selected operation" },
     "environment": { "kind": "parameter", "displayName": "Environment", 
"group": "producer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.braintree.BraintreeConfiguration", 
"configurationField": "configuration", "description": "The environment Either 
SANDBOX or PRODUCTION" },
     "inBody": { "kind": "parameter", "displayName": "In Body", "group": 
"producer", "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" },
     "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start 
Producer", "group": "producer", "label": "producer", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a producer may otherwise 
fail during starting and cause the  [...]
diff --git a/components/camel-braintree/src/main/docs/braintree-component.adoc 
b/components/camel-braintree/src/main/docs/braintree-component.adoc
index ca98d51..d467ef4 100644
--- a/components/camel-braintree/src/main/docs/braintree-component.adoc
+++ b/components/camel-braintree/src/main/docs/braintree-component.adoc
@@ -70,13 +70,14 @@ braintree:apiName/methodName
 
 with the following path and query parameters:
 
-=== Path Parameters (1 parameters):
+=== Path Parameters (2 parameters):
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
 | *apiName* | *Required* What kind of operation to perform. There are 17 enums 
and the value can be one of: ADD_ON, ADDRESS, CLIENT_TOKEN, 
CREDIT_CARD_VERIFICATION, CUSTOMER, DISCOUNT, DISPUTE, DOCUMENT_UPLOAD, 
MERCHANT_ACCOUNT, PAYMENT_METHOD, PAYMENT_METHOD_NONCE, PLAN, REPORT, 
SETTLEMENT_BATCH_SUMMARY, SUBSCRIPTION, TRANSACTION, WEBHOOK_NOTIFICATION |  | 
BraintreeApiName
+| *methodName* | *Required* What sub operation to use for the selected 
operation |  | String
 |===
 
 
diff --git 
a/components/camel-braintree/src/main/java/org/apache/camel/component/braintree/BraintreeConfiguration.java
 
b/components/camel-braintree/src/main/java/org/apache/camel/component/braintree/BraintreeConfiguration.java
index 07a49b3..d94b970 100644
--- 
a/components/camel-braintree/src/main/java/org/apache/camel/component/braintree/BraintreeConfiguration.java
+++ 
b/components/camel-braintree/src/main/java/org/apache/camel/component/braintree/BraintreeConfiguration.java
@@ -46,6 +46,7 @@ public class BraintreeConfiguration {
     @UriPath
     @Metadata(required = true)
     private BraintreeApiName apiName;
+    @UriPath
     @Metadata(required = true)
     private String methodName;
     @UriParam
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 58e72d3..407ea4f 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
@@ -42,6 +42,7 @@ import org.apache.camel.catalog.EndpointValidationResult;
 import org.apache.camel.catalog.JSonSchemaResolver;
 import org.apache.camel.catalog.LanguageValidationResult;
 import org.apache.camel.catalog.SuggestionStrategy;
+import org.apache.camel.tooling.model.ApiMethodModel;
 import org.apache.camel.tooling.model.ApiModel;
 import org.apache.camel.tooling.model.BaseModel;
 import org.apache.camel.tooling.model.BaseOptionModel;
@@ -176,9 +177,10 @@ public abstract class AbstractCamelCatalog {
 
         if (model.isApi()) {
             // TODO: combo of apiName/methodName
-            String[] qualifieres = 
StringHelper.splitWords(model.getApiSyntax());
-            String key = properties.get(qualifieres[0]);
-            Map<String, BaseOptionModel> apiProperties = 
extractApiProperties(model, key);
+            String[] apiSyntax = StringHelper.splitWords(model.getApiSyntax());
+            String key = properties.get(apiSyntax[0]);
+            String key2 = apiSyntax.length > 1 ? properties.get(apiSyntax[1]) 
: null;
+            Map<String, BaseOptionModel> apiProperties = 
extractApiProperties(model, key, key2);
             rows.putAll(apiProperties);
         }
 
@@ -548,12 +550,12 @@ public abstract class AbstractCamelCatalog {
 
         // is this an api component then there may be additional options
         if (model.isApi()) {
-            // TODO: combo of apiName/methodName
-            String[] qualifieres = StringHelper.splitWords(model.getSyntax());
-            int pos = word.indexOf(qualifieres[0]);
+            String[] apiSyntax = StringHelper.splitWords(model.getSyntax());
+            int pos = word.indexOf(apiSyntax[0]);
             if (pos != -1) {
                 String key = word2.size() > pos ? word2.get(pos) : null;
-                Map<String, BaseOptionModel> apiProperties = 
extractApiProperties(model, key);
+                // key2 should be null as its fine to get all the options for 
api name
+                Map<String, BaseOptionModel> apiProperties = 
extractApiProperties(model, key, null);
                 rows.putAll(apiProperties);
             }
         }
@@ -652,22 +654,60 @@ public abstract class AbstractCamelCatalog {
         return answer;
     }
 
-    private Map<String, BaseOptionModel> extractApiProperties(ComponentModel 
model, String key) {
+    private Map<String, BaseOptionModel> extractApiProperties(ComponentModel 
model, String key, String key2) {
         Map<String, BaseOptionModel> answer = new LinkedHashMap<>();
         if (key != null) {
             String matchKey = null;
             String dashKey = StringHelper.camelCaseToDash(key);
             String ecKey = StringHelper.asEnumConstantValue(key);
+            String dashKey2 = StringHelper.camelCaseToDash(key2);
+            String ecKey2 = StringHelper.asEnumConstantValue(key2);
             for (ApiModel am : model.getApiOptions()) {
                 String aKey = am.getName();
                 if (aKey.equalsIgnoreCase("DEFAULT") || 
aKey.equalsIgnoreCase(key) || aKey.equalsIgnoreCase(ecKey) || 
aKey.equalsIgnoreCase(dashKey)) {
-                    am.getMethods().forEach(m -> m.getOptions().forEach(o -> 
answer.put(o.getName(), o)));
+                    am.getMethods().stream()
+                            .filter(m -> {
+                                if (key2 == null) {
+                                    // no api method so match all
+                                    return true;
+                                }
+                                String name = m.getName();
+                                if (name.equalsIgnoreCase(key2) || 
name.equalsIgnoreCase(ecKey2) || name.equalsIgnoreCase(dashKey2)) {
+                                    return true;
+                                }
+                                // is there an alias then we need to compute 
the alias key and compare against the key2
+                                String key3 = apiMethodAlias(am, m);
+                                if (key3 != null) {
+                                    String dashKey3 = 
StringHelper.camelCaseToDash(key3);
+                                    String ecKey3 = 
StringHelper.asEnumConstantValue(key3);
+                                    if (key2.equalsIgnoreCase(key3) || 
ecKey2.equalsIgnoreCase(ecKey3) || dashKey2.equalsIgnoreCase(dashKey3)) {
+                                        return true;
+                                    }
+                                }
+                                return false;
+                            })
+                            .forEach(m -> m.getOptions()
+                                    .forEach(o -> answer.put(o.getName(), o)));
                 }
             }
         }
         return answer;
     }
 
+    private static String apiMethodAlias(ApiModel api, ApiMethodModel method) {
+        String name = method.getName();
+        for (String alias : api.getAliases()) {
+            int pos = alias.indexOf('=');
+            String pattern = alias.substring(0, pos);
+            String aliasMethod = alias.substring(pos + 1);
+            // match ignore case
+            if (Pattern.compile(pattern, 
Pattern.CASE_INSENSITIVE).matcher(name).matches()) {
+                return aliasMethod;
+            }
+        }
+        return null;
+    }
+
     public Map<String, String> endpointLenientProperties(String uri) throws 
URISyntaxException {
         // need to normalize uri first
 
diff --git 
a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
 
b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
index d1f402d..997964f 100644
--- 
a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
+++ 
b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
@@ -2957,6 +2957,9 @@ public class StaticEndpointBuilders {
      * PLAN, REPORT, SETTLEMENT_BATCH_SUMMARY, SUBSCRIPTION, TRANSACTION,
      * WEBHOOK_NOTIFICATION
      * 
+     * Path parameter: methodName (required)
+     * What sub operation to use for the selected operation
+     * 
      * @param path apiName/methodName
      */
     public static 
org.apache.camel.builder.endpoint.dsl.BraintreeEndpointBuilderFactory.BraintreeEndpointBuilder
 braintree(
@@ -2981,6 +2984,9 @@ public class StaticEndpointBuilders {
      * PLAN, REPORT, SETTLEMENT_BATCH_SUMMARY, SUBSCRIPTION, TRANSACTION,
      * WEBHOOK_NOTIFICATION
      * 
+     * Path parameter: methodName (required)
+     * What sub operation to use for the selected operation
+     * 
      * @param componentName to use a custom component name for the endpoint
      * instead of the default name
      * @param path apiName/methodName
diff --git 
a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/BraintreeEndpointBuilderFactory.java
 
b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/BraintreeEndpointBuilderFactory.java
index 5c122fb..9b70c39 100644
--- 
a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/BraintreeEndpointBuilderFactory.java
+++ 
b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/BraintreeEndpointBuilderFactory.java
@@ -347,6 +347,9 @@ public interface BraintreeEndpointBuilderFactory {
          * PAYMENT_METHOD_NONCE, PLAN, REPORT, SETTLEMENT_BATCH_SUMMARY,
          * SUBSCRIPTION, TRANSACTION, WEBHOOK_NOTIFICATION
          * 
+         * Path parameter: methodName (required)
+         * What sub operation to use for the selected operation
+         * 
          * @param path apiName/methodName
          */
         default BraintreeEndpointBuilder braintree(String path) {
@@ -370,6 +373,9 @@ public interface BraintreeEndpointBuilderFactory {
          * PAYMENT_METHOD_NONCE, PLAN, REPORT, SETTLEMENT_BATCH_SUMMARY,
          * SUBSCRIPTION, TRANSACTION, WEBHOOK_NOTIFICATION
          * 
+         * Path parameter: methodName (required)
+         * What sub operation to use for the selected operation
+         * 
          * @param componentName to use a custom component name for the endpoint
          * instead of the default name
          * @param path apiName/methodName
diff --git a/docs/components/modules/ROOT/pages/braintree-component.adoc 
b/docs/components/modules/ROOT/pages/braintree-component.adoc
index e947299..c2c7349 100644
--- a/docs/components/modules/ROOT/pages/braintree-component.adoc
+++ b/docs/components/modules/ROOT/pages/braintree-component.adoc
@@ -72,13 +72,14 @@ braintree:apiName/methodName
 
 with the following path and query parameters:
 
-=== Path Parameters (1 parameters):
+=== Path Parameters (2 parameters):
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
 | *apiName* | *Required* What kind of operation to perform. There are 17 enums 
and the value can be one of: ADD_ON, ADDRESS, CLIENT_TOKEN, 
CREDIT_CARD_VERIFICATION, CUSTOMER, DISCOUNT, DISPUTE, DOCUMENT_UPLOAD, 
MERCHANT_ACCOUNT, PAYMENT_METHOD, PAYMENT_METHOD_NONCE, PLAN, REPORT, 
SETTLEMENT_BATCH_SUMMARY, SUBSCRIPTION, TRANSACTION, WEBHOOK_NOTIFICATION |  | 
BraintreeApiName
+| *methodName* | *Required* What sub operation to use for the selected 
operation |  | String
 |===
 
 

Reply via email to