This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch uri-assembler in repository https://gitbox.apache.org/repos/asf/camel.git
commit 07b9d7f96df2e53359642f6bce96bec0819817ca Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Fri Sep 25 09:44:17 2020 +0200 CAMEL-15567: components - Generate source code for creating endpoint uri via a map of properties. WIP --- .../component/ahc/AhcEndpointUriAssembler.java | 12 ++++++--- .../org/apache/camel/spi/EndpointUriAssembler.java | 2 +- .../camel/impl/engine/AbstractCamelContext.java | 3 +-- .../impl/CamelCatalogEndpointUriAssembler.java | 7 +++-- .../catalog/CustomEndpointUriAssemblerTest.java | 11 ++++---- ...untimeCamelCatalogEndpointUriAssemblerTest.java | 4 +-- .../component/EndpointUriAssemblerSupport.java | 21 +++++++++------ .../packaging/EndpointUriAssemblerGenerator.java | 31 ++++++++++------------ .../GenerateUriEndpointAssemblerMojo.java | 8 +++--- 9 files changed, 54 insertions(+), 45 deletions(-) diff --git a/components/camel-ahc/src/generated/java/org/apache/camel/component/ahc/AhcEndpointUriAssembler.java b/components/camel-ahc/src/generated/java/org/apache/camel/component/ahc/AhcEndpointUriAssembler.java index 751a18a..3e3d8ae 100644 --- a/components/camel-ahc/src/generated/java/org/apache/camel/component/ahc/AhcEndpointUriAssembler.java +++ b/components/camel-ahc/src/generated/java/org/apache/camel/component/ahc/AhcEndpointUriAssembler.java @@ -6,17 +6,21 @@ import java.util.Map; import org.apache.camel.CamelContext; import org.apache.camel.spi.EndpointUriAssembler; -import org.apache.camel.component.ahc.AhcComponent; /** * Generated by camel build tools - do NOT edit this file! */ -@SuppressWarnings("unchecked") public class AhcEndpointUriAssembler extends org.apache.camel.support.component.EndpointUriAssemblerSupport implements EndpointUriAssembler { + private static final String SYNTAX = "ahc:httpUri"; + @Override - public String buildUri(CamelContext camelContext, String scheme, Map<String, String> parameters) throws URISyntaxException { - return null; + public String buildUri(CamelContext camelContext, String scheme, Map<String, Object> parameters) throws URISyntaxException { + String uri = SYNTAX; + + uri = buildPathParameter(camelContext, SYNTAX, uri, "httpUri", null, true, parameters); + uri = buildQueryParameters(camelContext, uri, parameters); + return uri; } } diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/EndpointUriAssembler.java b/core/camel-api/src/main/java/org/apache/camel/spi/EndpointUriAssembler.java index 27ba83f..c1ed600 100644 --- a/core/camel-api/src/main/java/org/apache/camel/spi/EndpointUriAssembler.java +++ b/core/camel-api/src/main/java/org/apache/camel/spi/EndpointUriAssembler.java @@ -36,6 +36,6 @@ public interface EndpointUriAssembler { * @param parameters endpoint options * @return the constructed endpoint uri */ - String buildUri(CamelContext camelContext, String scheme, Map<String, String> parameters) throws URISyntaxException; + String buildUri(CamelContext camelContext, String scheme, Map<String, Object> parameters) throws URISyntaxException; } diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java index cdab0f2..dd810cb 100644 --- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java +++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java @@ -4243,8 +4243,7 @@ public abstract class AbstractCamelContext extends BaseService return new BaseServiceResolver<>(RuntimeCamelCatalog.ENDPOINT_URI_ASSEMBLER_FACTORY, EndpointUriAssembler.class) .resolve(getCamelContextReference()) .orElseThrow(() -> new IllegalArgumentException( - "Cannot find RuntimeCamelCatalog on classpath. " - + "Add camel-core-catalog to classpath.")); + "Cannot find RuntimeCamelCatalog on classpath. Add camel-core-catalog to classpath.")); } public enum Initialization { diff --git a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/CamelCatalogEndpointUriAssembler.java b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/CamelCatalogEndpointUriAssembler.java index 153671e..7245b8d 100644 --- a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/CamelCatalogEndpointUriAssembler.java +++ b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/CamelCatalogEndpointUriAssembler.java @@ -1,6 +1,7 @@ package org.apache.camel.catalog.impl; import java.net.URISyntaxException; +import java.util.LinkedHashMap; import java.util.Map; import org.apache.camel.CamelContext; @@ -19,9 +20,11 @@ import static org.apache.camel.catalog.RuntimeCamelCatalog.ENDPOINT_URI_ASSEMBLE public class CamelCatalogEndpointUriAssembler implements EndpointUriAssembler { @Override - public String buildUri(CamelContext camelContext, String scheme, Map<String, String> parameters) { + public String buildUri(CamelContext camelContext, String scheme, Map<String, Object> parameters) { try { - return camelContext.adapt(ExtendedCamelContext.class).getRuntimeCamelCatalog().asEndpointUri(scheme, parameters, + Map<String, String> copy = new LinkedHashMap<>(); + parameters.forEach((k, v) -> copy.put(k, v != null ? v.toString() : null)); + return camelContext.adapt(ExtendedCamelContext.class).getRuntimeCamelCatalog().asEndpointUri(scheme, copy, false); } catch (URISyntaxException e) { throw RuntimeCamelException.wrapRuntimeException(e); diff --git a/core/camel-core/src/test/java/org/apache/camel/catalog/CustomEndpointUriAssemblerTest.java b/core/camel-core/src/test/java/org/apache/camel/catalog/CustomEndpointUriAssemblerTest.java index e92fe0d..f5097da 100644 --- a/core/camel-core/src/test/java/org/apache/camel/catalog/CustomEndpointUriAssemblerTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/catalog/CustomEndpointUriAssemblerTest.java @@ -34,9 +34,9 @@ public class CustomEndpointUriAssemblerTest extends ContextTestSupport { public void testCustomAssemble() throws Exception { EndpointUriAssembler assembler = new MyAssembler(); - Map<String, String> params = new HashMap<>(); + Map<String, Object> params = new HashMap<>(); params.put("timerName", "foo"); - params.put("period", "123"); + params.put("period", 123); params.put("repeatCount", "5"); String uri = assembler.buildUri(context, "timer", params); @@ -47,9 +47,9 @@ public class CustomEndpointUriAssemblerTest extends ContextTestSupport { public void testCustomAssembleUnsorted() throws Exception { EndpointUriAssembler assembler = new MyAssembler(); - Map<String, String> params = new LinkedHashMap<>(); + Map<String, Object> params = new LinkedHashMap<>(); params.put("timerName", "foo"); - params.put("repeatCount", "5"); + params.put("repeatCount", 5); params.put("period", "123"); String uri = assembler.buildUri(context, "timer", params); @@ -61,7 +61,8 @@ public class CustomEndpointUriAssemblerTest extends ContextTestSupport { private static final String SYNTAX = "timer:timerName"; @Override - public String buildUri(CamelContext camelContext, String scheme, Map<String, String> parameters) throws URISyntaxException { + public String buildUri(CamelContext camelContext, String scheme, Map<String, Object> parameters) + throws URISyntaxException { // begin from syntax String uri = SYNTAX; diff --git a/core/camel-core/src/test/java/org/apache/camel/catalog/RuntimeCamelCatalogEndpointUriAssemblerTest.java b/core/camel-core/src/test/java/org/apache/camel/catalog/RuntimeCamelCatalogEndpointUriAssemblerTest.java index fbf620b..a3cf85b 100644 --- a/core/camel-core/src/test/java/org/apache/camel/catalog/RuntimeCamelCatalogEndpointUriAssemblerTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/catalog/RuntimeCamelCatalogEndpointUriAssemblerTest.java @@ -32,7 +32,7 @@ public class RuntimeCamelCatalogEndpointUriAssemblerTest extends ContextTestSupp public void testLookupAssemble() throws Exception { EndpointUriAssembler assembler = context.adapt(ExtendedCamelContext.class).getEndpointUriAssembler("timer"); - Map<String, String> params = new HashMap<>(); + Map<String, Object> params = new HashMap<>(); params.put("timerName", "foo"); params.put("period", "123"); params.put("repeatCount", "5"); @@ -45,7 +45,7 @@ public class RuntimeCamelCatalogEndpointUriAssemblerTest extends ContextTestSupp public void testRuntimeAssemble() throws Exception { EndpointUriAssembler assembler = new CamelCatalogEndpointUriAssembler(); - Map<String, String> params = new HashMap<>(); + Map<String, Object> params = new HashMap<>(); params.put("timerName", "foo"); params.put("period", "123"); params.put("repeatCount", "5"); diff --git a/core/camel-support/src/main/java/org/apache/camel/support/component/EndpointUriAssemblerSupport.java b/core/camel-support/src/main/java/org/apache/camel/support/component/EndpointUriAssemblerSupport.java index b74fbae..14a8aa0 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/component/EndpointUriAssemblerSupport.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/component/EndpointUriAssemblerSupport.java @@ -30,23 +30,28 @@ import org.apache.camel.util.URISupport; */ public abstract class EndpointUriAssemblerSupport { - protected String buildPathParameter(CamelContext camelContext, String syntax, String uri, String name, String defaultValue, boolean required, Map<String, String> parameters) { - String obj = parameters.remove(name); - if (ObjectHelper.isEmpty(obj)) { - obj = defaultValue; + protected String buildPathParameter( + CamelContext camelContext, String syntax, String uri, String name, Object defaultValue, boolean required, + Map<String, Object> parameters) { + Object obj = parameters.remove(name); + if (ObjectHelper.isEmpty(obj) && defaultValue != null) { + obj = camelContext.getTypeConverter().convertTo(String.class, defaultValue); } if (ObjectHelper.isEmpty(obj) && required) { - throw new IllegalArgumentException("Option " + name + " is required when creating endpoint uri with syntax " + syntax); + throw new IllegalArgumentException( + "Option " + name + " is required when creating endpoint uri with syntax " + syntax); } if (ObjectHelper.isNotEmpty(obj)) { - uri = uri.replace(name, obj); + String str = camelContext.getTypeConverter().convertTo(String.class, obj); + uri = uri.replace(name, str); } return uri; } - protected String buildQueryParameters(CamelContext camelContext, String uri, Map<String, String> parameters) throws URISyntaxException { + protected String buildQueryParameters(CamelContext camelContext, String uri, Map<String, Object> parameters) + throws URISyntaxException { // we want sorted parameters - Map map = new TreeMap(parameters); + Map<String, Object> map = new TreeMap<>(parameters); String query = URISupport.createQueryString(map); if (ObjectHelper.isNotEmpty(query)) { uri = uri + "?" + query; diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointUriAssemblerGenerator.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointUriAssemblerGenerator.java index c097e03..01b2e38 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointUriAssemblerGenerator.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointUriAssemblerGenerator.java @@ -18,11 +18,9 @@ package org.apache.camel.maven.packaging; import java.io.IOException; import java.io.Writer; -import java.util.Collection; -import java.util.Comparator; -import java.util.stream.Collectors; import org.apache.camel.tooling.model.BaseOptionModel; +import org.apache.camel.tooling.model.ComponentModel; public final class EndpointUriAssemblerGenerator { @@ -31,8 +29,7 @@ public final class EndpointUriAssemblerGenerator { public static void generateEndpointUriAssembler( String pn, String cn, String en, - String pfqn, String psn, - Collection<? extends BaseOptionModel> options, Writer w) + String pfqn, String psn, ComponentModel model, Writer w) throws IOException { w.write("/* " + AbstractGeneratorMojo.GENERATED_MSG + " */\n"); @@ -43,25 +40,25 @@ public final class EndpointUriAssemblerGenerator { w.write("\n"); w.write("import org.apache.camel.CamelContext;\n"); w.write("import org.apache.camel.spi.EndpointUriAssembler;\n"); - w.write("import " + pfqn + ";\n"); w.write("\n"); w.write("/**\n"); w.write(" * " + AbstractGeneratorMojo.GENERATED_MSG + "\n"); w.write(" */\n"); - w.write("@SuppressWarnings(\"unchecked\")\n"); - w.write("public class " + cn + " extends " + psn - + " implements EndpointUriAssembler {\n"); - - // sort options A..Z so they always have same order - options = options.stream().sorted(Comparator.comparing(BaseOptionModel::getName)).collect(Collectors.toList()); - - // generate API that returns all the options + w.write("public class " + cn + " extends " + psn + " implements EndpointUriAssembler {\n"); + w.write("\n"); + w.write(" private static final String SYNTAX = \"" + model.getSyntax() + "\";\n"); w.write("\n"); w.write(" @Override\n"); - w.write(" public String buildUri(CamelContext camelContext, String scheme, Map<String, String> parameters) throws URISyntaxException {\n"); - w.write(" return null;\n"); + w.write(" public String buildUri(CamelContext camelContext, String scheme, Map<String, Object> parameters) throws URISyntaxException {\n"); + w.write(" String uri = SYNTAX;\n"); + w.write("\n"); + for (BaseOptionModel option : model.getEndpointPathOptions()) { + w.write(" uri = buildPathParameter(camelContext, SYNTAX, uri, \"" + option.getName() + "\", " + + option.getDefaultValue() + ", " + option.isRequired() + ", parameters);\n"); + } + w.write(" uri = buildQueryParameters(camelContext, uri, parameters);\n"); + w.write(" return uri;\n"); w.write(" }\n"); - w.write("}\n"); w.write("\n"); } diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateUriEndpointAssemblerMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateUriEndpointAssemblerMojo.java index 431f2d7..f6d0301 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateUriEndpointAssemblerMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateUriEndpointAssemblerMojo.java @@ -128,10 +128,10 @@ public class GenerateUriEndpointAssemblerMojo extends AbstractGeneratorMojo { } protected void createEndpointUrlAssembler(ComponentModel model) throws IOException { - getLog().info("Generating endpoint-uri-assembler: " + model.getScheme()); + getLog().debug("Generating endpoint-uri-assembler: " + model.getScheme()); String fqn = model.getJavaType(); - generateEndpointUriAssembler(fqn, fqn, model.getEndpointOptions(), sourcesOutputDir); + generateEndpointUriAssembler(fqn, fqn, model, sourcesOutputDir); int pos = fqn.lastIndexOf('.'); String pn = fqn.substring(0, pos); @@ -159,7 +159,7 @@ public class GenerateUriEndpointAssemblerMojo extends AbstractGeneratorMojo { @Deprecated private void generateEndpointUriAssembler( - String fqn, String targetFqn, List<ComponentModel.EndpointOptionModel> options, File outputDir) + String fqn, String targetFqn, ComponentModel model, File outputDir) throws IOException { int pos = targetFqn.lastIndexOf('.'); @@ -172,7 +172,7 @@ public class GenerateUriEndpointAssemblerMojo extends AbstractGeneratorMojo { String psn = "org.apache.camel.support.component.EndpointUriAssemblerSupport"; StringWriter sw = new StringWriter(); - EndpointUriAssemblerGenerator.generateEndpointUriAssembler(pn, cn, en, pfqn, psn, options, sw); + EndpointUriAssemblerGenerator.generateEndpointUriAssembler(pn, cn, en, pfqn, psn, model, sw); String source = sw.toString();