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 6e668189bffcf459d74034ddf88895bb096c08ae Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Fri Sep 25 14:22:26 2020 +0200 CAMEL-15567: components - Generate source code for creating endpoint uri via a map of properties. WIP --- .../org/apache/camel/spi/EndpointUriAssembler.java | 13 ++--- .../impl/engine/DefaultAssemblerResolver.java | 2 + .../catalog/CustomEndpointUriAssemblerTest.java | 67 +++++++++++++--------- ...untimeCamelCatalogEndpointUriAssemblerTest.java | 2 +- .../component/log/LogEndpointUriAssemblerTest.java | 2 +- .../component/EndpointUriAssemblerSupport.java | 17 +++++- .../packaging/EndpointUriAssemblerGenerator.java | 7 +-- 7 files changed, 66 insertions(+), 44 deletions(-) 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 427d526..8480eeb 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 @@ -19,12 +19,12 @@ package org.apache.camel.spi; import java.net.URISyntaxException; import java.util.Map; -import org.apache.camel.CamelContext; +import org.apache.camel.CamelContextAware; /** * To assemble an endpoint uri String from a map of parameters. */ -public interface EndpointUriAssembler { +public interface EndpointUriAssembler extends CamelContextAware { /** * Checks whether this assembler supports the given component name @@ -34,11 +34,10 @@ public interface EndpointUriAssembler { /** * Assembles an endpoint uri for the given component name with the given parameters. * - * @param camelContext the Camel context - * @param scheme the component name - * @param parameters endpoint options - * @return the constructed endpoint uri + * @param scheme the component name + * @param parameters endpoint options + * @return the constructed endpoint uri */ - String buildUri(CamelContext camelContext, String scheme, Map<String, Object> parameters) throws URISyntaxException; + String buildUri(String scheme, Map<String, Object> parameters) throws URISyntaxException; } diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultAssemblerResolver.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultAssemblerResolver.java index c8ffea6..9737fef 100644 --- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultAssemblerResolver.java +++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultAssemblerResolver.java @@ -71,6 +71,7 @@ public class DefaultAssemblerResolver extends ServiceSupport implements CamelCon Set<EndpointUriAssembler> assemblers = context.getRegistry().findByType(EndpointUriAssembler.class); answer = assemblers.stream().filter(a -> a.isEnabled(name)).findFirst().orElse(null); if (answer != null) { + answer.setCamelContext(context); cache.put(name, answer); return answer; } @@ -96,6 +97,7 @@ public class DefaultAssemblerResolver extends ServiceSupport implements CamelCon // create the assembler if (EndpointUriAssembler.class.isAssignableFrom(type)) { answer = (EndpointUriAssembler) context.getInjector().newInstance(type, false); + answer.setCamelContext(context); cache.put(name, answer); return answer; } else { 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 d0bb0ff..ffd65af 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 @@ -21,7 +21,6 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; -import org.apache.camel.CamelContext; import org.apache.camel.ContextTestSupport; import org.apache.camel.ExtendedCamelContext; import org.apache.camel.spi.EndpointUriAssembler; @@ -34,6 +33,7 @@ public class CustomEndpointUriAssemblerTest extends ContextTestSupport { @Test public void testCustomAssemble() throws Exception { EndpointUriAssembler assembler = new MyAssembler(); + assembler.setCamelContext(context); Map<String, Object> params = new HashMap<>(); params.put("name", "foo"); @@ -41,13 +41,14 @@ public class CustomEndpointUriAssemblerTest extends ContextTestSupport { params.put("port", 4444); params.put("verbose", true); - String uri = assembler.buildUri(context, "acme", params); + String uri = assembler.buildUri("acme", params); Assertions.assertEquals("acme:foo:4444?amount=123&verbose=true", uri); } @Test public void testCustomAssembleRegistry() throws Exception { - context.getRegistry().bind("myAssembler", new MyAssembler()); + EndpointUriAssembler assembler = new MyAssembler(); + context.getRegistry().bind("myAssembler", assembler); Map<String, Object> params = new HashMap<>(); params.put("name", "foo"); @@ -55,14 +56,15 @@ public class CustomEndpointUriAssemblerTest extends ContextTestSupport { params.put("port", 4444); params.put("verbose", true); - EndpointUriAssembler assembler = context.adapt(ExtendedCamelContext.class).getEndpointUriAssembler("acme"); - String uri = assembler.buildUri(context, "acme", params); + assembler = context.adapt(ExtendedCamelContext.class).getEndpointUriAssembler("acme"); + String uri = assembler.buildUri("acme", params); Assertions.assertEquals("acme:foo:4444?amount=123&verbose=true", uri); } @Test public void testCustomAssembleUnsorted() throws Exception { EndpointUriAssembler assembler = new MyAssembler(); + assembler.setCamelContext(context); Map<String, Object> params = new LinkedHashMap<>(); params.put("name", "foo"); @@ -70,13 +72,14 @@ public class CustomEndpointUriAssemblerTest extends ContextTestSupport { params.put("port", 4444); params.put("amount", "123"); - String uri = assembler.buildUri(context, "acme", params); + String uri = assembler.buildUri("acme", params); Assertions.assertEquals("acme:foo:4444?amount=123&verbose=false", uri); } @Test public void testCustomAssembleNoMandatory() throws Exception { EndpointUriAssembler assembler = new MyAssembler(); + assembler.setCamelContext(context); Map<String, Object> params = new LinkedHashMap<>(); params.put("verbose", false); @@ -84,7 +87,7 @@ public class CustomEndpointUriAssemblerTest extends ContextTestSupport { params.put("amount", "123"); try { - assembler.buildUri(context, "acme", params); + assembler.buildUri("acme", params); Assertions.fail(); } catch (IllegalArgumentException e) { Assertions.assertEquals("Option name is required when creating endpoint uri with syntax acme:name:port", @@ -95,19 +98,21 @@ public class CustomEndpointUriAssemblerTest extends ContextTestSupport { @Test public void testCustomAssembleDefault() throws Exception { EndpointUriAssembler assembler = new MyAssembler(); + assembler.setCamelContext(context); Map<String, Object> params = new LinkedHashMap<>(); params.put("name", "bar"); params.put("verbose", false); params.put("amount", "123"); - String uri = assembler.buildUri(context, "acme", params); + String uri = assembler.buildUri("acme", params); Assertions.assertEquals("acme:bar?amount=123&verbose=false", uri); } @Test public void testCustomAssembleComplex() throws Exception { EndpointUriAssembler assembler = new MySecondAssembler(); + assembler.setCamelContext(context); Map<String, Object> params = new LinkedHashMap<>(); params.put("name", "bar"); @@ -115,13 +120,14 @@ public class CustomEndpointUriAssemblerTest extends ContextTestSupport { params.put("verbose", true); params.put("amount", "123"); - String uri = assembler.buildUri(context, "acme2", params); + String uri = assembler.buildUri("acme2", params); Assertions.assertEquals("acme2:bar/moes?amount=123&verbose=true", uri); } @Test public void testCustomAssembleComplexPort() throws Exception { EndpointUriAssembler assembler = new MySecondAssembler(); + assembler.setCamelContext(context); Map<String, Object> params = new LinkedHashMap<>(); params.put("name", "bar"); @@ -130,13 +136,14 @@ public class CustomEndpointUriAssemblerTest extends ContextTestSupport { params.put("verbose", true); params.put("amount", "123"); - String uri = assembler.buildUri(context, "acme2", params); + String uri = assembler.buildUri("acme2", params); Assertions.assertEquals("acme2:bar/moes:4444?amount=123&verbose=true", uri); } @Test public void testCustomAssembleComplexNoPath() throws Exception { EndpointUriAssembler assembler = new MySecondAssembler(); + assembler.setCamelContext(context); Map<String, Object> params = new LinkedHashMap<>(); params.put("name", "bar"); @@ -144,58 +151,62 @@ public class CustomEndpointUriAssemblerTest extends ContextTestSupport { params.put("verbose", true); params.put("amount", "123"); - String uri = assembler.buildUri(context, "acme2", params); + String uri = assembler.buildUri("acme2", params); Assertions.assertEquals("acme2:bar:4444?amount=123&verbose=true", uri); } @Test public void testCustomAssembleComplexNoPathNoPort() throws Exception { EndpointUriAssembler assembler = new MySecondAssembler(); + assembler.setCamelContext(context); Map<String, Object> params = new LinkedHashMap<>(); params.put("name", "bar"); params.put("verbose", true); params.put("amount", "123"); - String uri = assembler.buildUri(context, "acme2", params); + String uri = assembler.buildUri("acme2", params); Assertions.assertEquals("acme2:bar?amount=123&verbose=true", uri); } @Test public void testJms() throws Exception { EndpointUriAssembler assembler = new MyJmsAssembler(); + assembler.setCamelContext(context); Map<String, Object> params = new LinkedHashMap<>(); params.put("destinationName", "foo"); params.put("destinationType", "topic"); params.put("deliveryPersistent", true); - String uri = assembler.buildUri(context, "jms2", params); + String uri = assembler.buildUri("jms2", params); Assertions.assertEquals("jms2:topic:foo?deliveryPersistent=true", uri); } @Test public void testJmsMatchDefault() throws Exception { EndpointUriAssembler assembler = new MyJmsAssembler(); + assembler.setCamelContext(context); Map<String, Object> params = new LinkedHashMap<>(); params.put("destinationName", "foo"); params.put("destinationType", "queue"); params.put("deliveryPersistent", true); - String uri = assembler.buildUri(context, "jms2", params); + String uri = assembler.buildUri("jms2", params); Assertions.assertEquals("jms2:queue:foo?deliveryPersistent=true", uri); } @Test public void testJmsNoDefault() throws Exception { EndpointUriAssembler assembler = new MyJmsAssembler(); + assembler.setCamelContext(context); Map<String, Object> params = new LinkedHashMap<>(); params.put("destinationName", "foo"); params.put("deliveryPersistent", true); - String uri = assembler.buildUri(context, "jms2", params); + String uri = assembler.buildUri("jms2", params); Assertions.assertEquals("jms2:foo?deliveryPersistent=true", uri); } @@ -209,16 +220,16 @@ public class CustomEndpointUriAssemblerTest extends ContextTestSupport { } @Override - public String buildUri(CamelContext camelContext, String scheme, Map<String, Object> parameters) + public String buildUri(String scheme, Map<String, Object> parameters) throws URISyntaxException { // begin from syntax String uri = SYNTAX; // append path parameters - uri = buildPathParameter(camelContext, SYNTAX, uri, "name", null, true, parameters); - uri = buildPathParameter(camelContext, SYNTAX, uri, "port", 8080, false, parameters); + uri = buildPathParameter(SYNTAX, uri, "name", null, true, parameters); + uri = buildPathParameter(SYNTAX, uri, "port", 8080, false, parameters); // append remainder parameters - uri = buildQueryParameters(camelContext, uri, parameters); + uri = buildQueryParameters(uri, parameters); return uri; } @@ -235,17 +246,17 @@ public class CustomEndpointUriAssemblerTest extends ContextTestSupport { } @Override - public String buildUri(CamelContext camelContext, String scheme, Map<String, Object> parameters) + public String buildUri(String scheme, Map<String, Object> parameters) throws URISyntaxException { // begin from syntax String uri = SYNTAX; // append path parameters - uri = buildPathParameter(camelContext, SYNTAX, uri, "name", null, true, parameters); - uri = buildPathParameter(camelContext, SYNTAX, uri, "path", null, false, parameters); - uri = buildPathParameter(camelContext, SYNTAX, uri, "port", 8080, false, parameters); + uri = buildPathParameter(SYNTAX, uri, "name", null, true, parameters); + uri = buildPathParameter(SYNTAX, uri, "path", null, false, parameters); + uri = buildPathParameter(SYNTAX, uri, "port", 8080, false, parameters); // append remainder parameters - uri = buildQueryParameters(camelContext, uri, parameters); + uri = buildQueryParameters(uri, parameters); return uri; } @@ -262,13 +273,13 @@ public class CustomEndpointUriAssemblerTest extends ContextTestSupport { } @Override - public String buildUri(CamelContext camelContext, String scheme, Map<String, Object> parameters) + public String buildUri(String scheme, Map<String, Object> parameters) throws URISyntaxException { String uri = SYNTAX; - uri = buildPathParameter(camelContext, SYNTAX, uri, "destinationType", "queue", false, parameters); - uri = buildPathParameter(camelContext, SYNTAX, uri, "destinationName", null, true, parameters); - uri = buildQueryParameters(camelContext, uri, parameters); + uri = buildPathParameter(SYNTAX, uri, "destinationType", "queue", false, parameters); + uri = buildPathParameter(SYNTAX, uri, "destinationName", null, true, parameters); + uri = buildQueryParameters(uri, parameters); return uri; } 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 f52d4a7..683b626 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 @@ -36,7 +36,7 @@ public class RuntimeCamelCatalogEndpointUriAssemblerTest extends ContextTestSupp params.put("period", "123"); params.put("repeatCount", "5"); - String uri = assembler.buildUri(context, "timer", params); + String uri = assembler.buildUri("timer", params); Assertions.assertEquals("timer:foo?period=123&repeatCount=5", uri); } diff --git a/core/camel-core/src/test/java/org/apache/camel/component/log/LogEndpointUriAssemblerTest.java b/core/camel-core/src/test/java/org/apache/camel/component/log/LogEndpointUriAssemblerTest.java index f8115fd..528f0bb 100644 --- a/core/camel-core/src/test/java/org/apache/camel/component/log/LogEndpointUriAssemblerTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/component/log/LogEndpointUriAssemblerTest.java @@ -25,7 +25,7 @@ public class LogEndpointUriAssemblerTest extends ContextTestSupport { boolean generated = assembler instanceof LogEndpointUriAssembler; Assertions.assertTrue(generated); - String uri = assembler.buildUri(context, "log", params); + String uri = assembler.buildUri("log", params); Assertions.assertEquals("log:foo?groupSize=123&logMask=true&showExchangePattern=false", uri); } } 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 cfcb0d5..1a3ec4d 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 @@ -21,6 +21,7 @@ import java.util.Map; import java.util.TreeMap; import org.apache.camel.CamelContext; +import org.apache.camel.CamelContextAware; import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.URISupport; @@ -28,10 +29,20 @@ import org.apache.camel.util.URISupport; * Base class used by Camel Package Maven Plugin when it generates source code for fast endpoint uri assembler via * {@link org.apache.camel.spi.EndpointUriAssembler}. */ -public abstract class EndpointUriAssemblerSupport { +public abstract class EndpointUriAssemblerSupport implements CamelContextAware { + + protected CamelContext camelContext; + + public CamelContext getCamelContext() { + return camelContext; + } + + public void setCamelContext(CamelContext camelContext) { + this.camelContext = camelContext; + } protected String buildPathParameter( - CamelContext camelContext, String syntax, String uri, String name, Object defaultValue, boolean required, + 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 && required) { @@ -62,7 +73,7 @@ public abstract class EndpointUriAssemblerSupport { return uri; } - protected String buildQueryParameters(CamelContext camelContext, String uri, Map<String, Object> parameters) + protected String buildQueryParameters(String uri, Map<String, Object> parameters) throws URISyntaxException { // we want sorted parameters Map<String, Object> map = new TreeMap<>(parameters); 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 90e8f0b..8aa7bc9 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 @@ -40,7 +40,6 @@ public final class EndpointUriAssemblerGenerator { w.write("import java.util.HashMap;\n"); w.write("import java.util.Map;\n"); w.write("\n"); - w.write("import org.apache.camel.CamelContext;\n"); w.write("import org.apache.camel.spi.EndpointUriAssembler;\n"); w.write("\n"); w.write("/**\n"); @@ -70,17 +69,17 @@ public final class EndpointUriAssemblerGenerator { w.write(" }\n"); w.write("\n"); w.write(" @Override\n"); - w.write(" public String buildUri(CamelContext camelContext, String scheme, Map<String, Object> parameters) throws URISyntaxException {\n"); + w.write(" public String buildUri(String scheme, Map<String, Object> parameters) throws URISyntaxException {\n"); w.write(" String syntax = scheme + BASE;\n"); w.write(" String uri = syntax;\n"); w.write("\n"); w.write(" Map<String, Object> copy = new HashMap<>(parameters);\n"); w.write("\n"); for (BaseOptionModel option : model.getEndpointPathOptions()) { - w.write(" uri = buildPathParameter(camelContext, syntax, uri, \"" + option.getName() + "\", " + w.write(" uri = buildPathParameter(syntax, uri, \"" + option.getName() + "\", " + defaultValue(option) + ", " + option.isRequired() + ", copy);\n"); } - w.write(" uri = buildQueryParameters(camelContext, uri, copy);\n"); + w.write(" uri = buildQueryParameters(uri, copy);\n"); w.write(" return uri;\n"); w.write(" }\n"); w.write("}\n");