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();
 

Reply via email to