This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit ff5e96dcad12066885035d24a56da1a89d35a8f5
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Fri Jan 21 15:35:58 2022 +0100

    CAMEL-17531: endpoint should have multiValueOptions source code generated 
to uri factory
---
 .../org/apache/camel/spi/EndpointUriFactory.java   |  7 ++++-
 .../packaging/EndpointUriFactoryGenerator.java     | 36 ++++++++++++++++++++++
 2 files changed, 42 insertions(+), 1 deletion(-)

diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/EndpointUriFactory.java 
b/core/camel-api/src/main/java/org/apache/camel/spi/EndpointUriFactory.java
index 35530e6..19e632c 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/EndpointUriFactory.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/EndpointUriFactory.java
@@ -62,11 +62,16 @@ public interface EndpointUriFactory extends 
CamelContextAware {
     Set<String> propertyNames();
 
     /**
-     * Returns the names of the secret properties this endpoin supports.
+     * Returns the names of the secret properties this endpoint supports.
      */
     Set<String> secretPropertyNames();
 
     /**
+     * Returns the prefixes of the multi-valued properties this endpoint 
supports.
+     */
+    Set<String> multiValuePrefixes();
+
+    /**
      * Whether the endpoint is lenient or not.
      *
      * @see Endpoint#isLenientProperties()
diff --git 
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointUriFactoryGenerator.java
 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointUriFactoryGenerator.java
index b1f2662..245787c 100644
--- 
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointUriFactoryGenerator.java
+++ 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointUriFactoryGenerator.java
@@ -61,9 +61,11 @@ public final class EndpointUriFactoryGenerator {
         w.write("\n");
         w.write("    private static final Set<String> PROPERTY_NAMES;\n");
         w.write("    private static final Set<String> 
SECRET_PROPERTY_NAMES;\n");
+        w.write("    private static final Set<String> 
MULTI_VALUE_PREFIXES;\n");
         w.write("    static {\n");
         w.write(generatePropertyNames(model));
         w.write(generateSecretPropertyNames(model));
+        w.write(generateMultiValuePrefixes(model));
         w.write("    }\n");
         w.write("\n");
         w.write("    @Override\n");
@@ -106,6 +108,11 @@ public final class EndpointUriFactoryGenerator {
         w.write("    }\n");
         w.write("\n");
         w.write("    @Override\n");
+        w.write("    public Set<String> multiValuePrefixes() {\n");
+        w.write("        return MULTI_VALUE_PREFIXES;\n");
+        w.write("    }\n");
+        w.write("\n");
+        w.write("    @Override\n");
         w.write("    public boolean isLenientProperties() {\n");
         w.write("        return " + model.isLenientProperties() + ";\n");
         w.write("    }\n");
@@ -169,6 +176,35 @@ public final class EndpointUriFactoryGenerator {
         return sb.toString();
     }
 
+    private static String generateMultiValuePrefixes(ComponentModel model) {
+        Set<String> prefixes = new HashSet<>();
+        model.getEndpointOptions().stream()
+                .filter(ComponentModel.EndpointOptionModel::isMultiValue)
+                .map(ComponentModel.EndpointOptionModel::getPrefix)
+                .forEach(prefixes::add);
+
+        // gather all the option names from the api (they can be duplicated as 
the same name
+        // can be used by multiple methods)
+        model.getApiOptions().stream()
+                .flatMap(a -> a.getMethods().stream())
+                .flatMap(m -> m.getOptions().stream())
+                .filter(ComponentModel.ApiOptionModel::isMultiValue)
+                .map(ComponentModel.ApiOptionModel::getPrefix)
+                .forEach(prefixes::add);
+
+        if (prefixes.isEmpty()) {
+            return "        MULTI_VALUE_PREFIXES = Collections.emptySet();\n";
+        }
+
+        StringBuilder sb = new StringBuilder();
+        sb.append("        Set<String> prefixes = new 
HashSet<>(").append(prefixes.size()).append(");\n");
+        for (String property : prefixes) {
+            sb.append("        
prefixes.add(\"").append(property).append("\");\n");
+        }
+        sb.append("        MULTI_VALUE_PREFIXES = 
Collections.unmodifiableSet(prefixes);\n");
+        return sb.toString();
+    }
+
     private static String alternativeSchemes(ComponentModel model) {
         StringBuilder sb = new StringBuilder();
         if (model.getAlternativeSchemes() != null) {

Reply via email to