You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2020/09/25 18:45:01 UTC

[camel] 04/16: CAMEL-15567: components - Generate source code for creating endpoint uri via a map of properties. WIP

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 <cl...@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();