This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch on-header in repository https://gitbox.apache.org/repos/asf/camel.git
commit 30688cc45b26646e8c01b2f62af78c7867a0eeff Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Thu Feb 4 13:55:57 2021 +0100 CAMEL-16102: Source code generate @InvokeOnHeader for reflection free --- ...inispanRemoteProducerInvokeOnHeaderFactory.java | 27 +++++++++++++ ...nent.infinispan.remote.InfinispanRemoteProducer | 2 + .../apache/camel/spi/InvokeOnHeaderStrategy.java | 3 +- .../packaging/GenerateInvokeOnHeaderMojo.java | 46 +++++++++++++++------- 4 files changed, 62 insertions(+), 16 deletions(-) diff --git a/components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteProducerInvokeOnHeaderFactory.java b/components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteProducerInvokeOnHeaderFactory.java new file mode 100644 index 0000000..ff5b63b --- /dev/null +++ b/components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteProducerInvokeOnHeaderFactory.java @@ -0,0 +1,27 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.infinispan.remote; + +import org.apache.camel.Exchange; +import org.apache.camel.spi.InvokeOnHeaderStrategy; +import org.apache.camel.component.infinispan.remote.InfinispanRemoteProducer; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class InfinispanRemoteProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy { + + @Override + public Object invoke(Object obj, String key, Exchange exchange) throws Exception { + org.apache.camel.component.infinispan.remote.InfinispanRemoteProducer target = (org.apache.camel.component.infinispan.remote.InfinispanRemoteProducer) obj; + switch (key) { + case "query": + case "QUERY": target.onQuery(exchange.getMessage()); return null; + case "stats": + case "STATS": target.onStats(exchange.getMessage()); return null; + default: return null; + } + } + +} + diff --git a/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.infinispan.remote.InfinispanRemoteProducer b/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.infinispan.remote.InfinispanRemoteProducer new file mode 100644 index 0000000..9273df4 --- /dev/null +++ b/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.infinispan.remote.InfinispanRemoteProducer @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.infinispan.remote.InfinispanRemoteProducer.InfinispanRemoteProducerInvokeOnHeaderFactory diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/InvokeOnHeaderStrategy.java b/core/camel-api/src/main/java/org/apache/camel/spi/InvokeOnHeaderStrategy.java index 2f11c57..1c1965f 100644 --- a/core/camel-api/src/main/java/org/apache/camel/spi/InvokeOnHeaderStrategy.java +++ b/core/camel-api/src/main/java/org/apache/camel/spi/InvokeOnHeaderStrategy.java @@ -28,10 +28,11 @@ public interface InvokeOnHeaderStrategy { /** * Invoke the method based on the header key * + * @param target the target such as HeaderSelectorProducer * @param key the header key * @param exchange the exchange * @return option response from invoking the method, or <tt>null</tt> if the method is void * @throws Exception is thrown if error invoking the method. */ - Object invoke(String key, Exchange exchange) throws Exception; + Object invoke(Object target, String key, Exchange exchange) throws Exception; } diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateInvokeOnHeaderMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateInvokeOnHeaderMojo.java index b0143ae..bfb9909 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateInvokeOnHeaderMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateInvokeOnHeaderMojo.java @@ -41,6 +41,7 @@ import org.jboss.jandex.AnnotationInstance; import org.jboss.jandex.DotName; import org.jboss.jandex.Index; import org.jboss.jandex.IndexReader; +import org.jboss.jandex.Type; /** * Abstract class for @InvokeOnHeader/@InvokeOnHeaders factory generator. @@ -67,6 +68,7 @@ public class GenerateInvokeOnHeaderMojo extends AbstractGeneratorMojo { private static class InvokeOnHeaderModel { private String key; private String methodName; + private boolean isVoid; public String getKey() { return key; @@ -83,6 +85,14 @@ public class GenerateInvokeOnHeaderMojo extends AbstractGeneratorMojo { public void setMethodName(String methodName) { this.methodName = methodName; } + + public boolean isVoid() { + return isVoid; + } + + public void setVoid(boolean aVoid) { + isVoid = aVoid; + } } public GenerateInvokeOnHeaderMojo() { @@ -117,10 +127,12 @@ public class GenerateInvokeOnHeaderMojo extends AbstractGeneratorMojo { String currentClass = a.target().asMethod().declaringClass().name().toString(); String value = a.value().asString(); String methodName = a.target().asMethod().name(); + boolean isVoid = Type.Kind.VOID == a.target().asMethod().returnType().kind(); Set<InvokeOnHeaderModel> set = classes.computeIfAbsent(currentClass, k -> new HashSet<>()); InvokeOnHeaderModel model = new InvokeOnHeaderModel(); model.setKey(value); model.setMethodName(methodName); + model.setVoid(isVoid); set.add(model); }); @@ -134,16 +146,15 @@ public class GenerateInvokeOnHeaderMojo extends AbstractGeneratorMojo { } protected void createInvokeOnHeaderFactory(String fqn, Set<InvokeOnHeaderModel> models) throws IOException { - generateInvokeOnHeaderFactory(fqn, models, sourcesOutputDir); + String tfqn = generateInvokeOnHeaderFactory(fqn, models, sourcesOutputDir); updateResource(resourcesOutputDir.toPath(), "META-INF/services/org/apache/camel/invoke-on-header/" + fqn, - "# " + GENERATED_MSG + NL + "class=" + fqn + NL); + "# " + GENERATED_MSG + NL + "class=" + tfqn + NL); } @Deprecated - private void generateInvokeOnHeaderFactory( - String fqn, Set<InvokeOnHeaderModel> models, File outputDir) - throws IOException { + private String generateInvokeOnHeaderFactory( + String fqn, Set<InvokeOnHeaderModel> models, File outputDir) { int pos = fqn.lastIndexOf('.'); String pn = fqn.substring(0, pos); @@ -163,6 +174,7 @@ public class GenerateInvokeOnHeaderMojo extends AbstractGeneratorMojo { if (updated) { getLog().info("Updated " + fileName); } + return pfqn + "." + cn; } private void generateInvokeOnHeaderSource( @@ -170,19 +182,15 @@ public class GenerateInvokeOnHeaderMojo extends AbstractGeneratorMojo { w.write("/* " + AbstractGeneratorMojo.GENERATED_MSG + " */\n"); w.write("package " + pn + ";\n"); w.write("\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.Exchange;\n"); w.write("import org.apache.camel.spi.InvokeOnHeaderStrategy;\n"); - w.write("import org.apache.camel.util.CaseInsensitiveMap;\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 InvokeOnHeaderStrategy"); + w.write("public class " + cn + " implements InvokeOnHeaderStrategy"); w.write(" {\n"); w.write("\n"); @@ -192,18 +200,26 @@ public class GenerateInvokeOnHeaderMojo extends AbstractGeneratorMojo { } w.write(" @Override\n"); - w.write(" public Object invoke(String key, Exchange exchange) {\n"); + w.write(" public Object invoke(Object obj, String key, Exchange exchange) throws Exception {\n"); + w.write(" " + en + " target = (" + en + ") obj;\n"); if (!models.isEmpty()) { - w.write(" switch (name) {\n"); + w.write(" switch (key) {\n"); for (InvokeOnHeaderModel option : models) { - String invoke = option.getMethodName() + "(exchange.getMessage());"; + String invoke = "target." + option.getMethodName() + "(exchange.getMessage())"; if (!option.getKey().toLowerCase().equals(option.getKey())) { w.write(String.format(" case \"%s\":\n", option.getKey().toLowerCase())); } - w.write(String.format(" case \"%s\": return %s;\n", option.getKey(), invoke)); + if (option.isVoid()) { + w.write(String.format(" case \"%s\": %s; return null;\n", option.getKey(), invoke)); + } else { + w.write(String.format(" case \"%s\": return %s;\n", option.getKey(), invoke)); + } } + w.write(" default: return null;\n"); + w.write(" }\n"); } w.write(" }\n"); + w.write("\n"); w.write("}\n"); w.write("\n");