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) {