This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit a855f993e400a17972126026c9dba4a1010b5b22 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Mon Sep 28 06:58:10 2020 +0200 CAMEL-15579: Optimize generated configurer to use static block for getAllOptions --- .../apache/camel/tooling/model/Comparators.java | 4 + .../packaging/AbstractGenerateConfigurerMojo.java | 2 +- .../maven/packaging/AbstractGeneratorMojo.java | 2 +- .../packaging/EndpointSchemaGeneratorMojo.java | 9 ++- .../packaging/EndpointUriFactoryGenerator.java | 1 - .../packaging/PropertyConfigurerGenerator.java | 93 ++++++++++++++++++---- 6 files changed, 89 insertions(+), 22 deletions(-) diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/Comparators.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/Comparators.java index 8879c4c..0adc40d 100644 --- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/Comparators.java +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/Comparators.java @@ -30,4 +30,8 @@ public final class Comparators { public static Comparator<ApiMethodModel> apiMethodModelModelComparator() { return (o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName()); } + + public static Comparator<ComponentModel.ApiOptionModel> apiOptionModelComparator() { + return (o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName()); + } } diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGenerateConfigurerMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGenerateConfigurerMojo.java index 4ad7875..449f1e4 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGenerateConfigurerMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGenerateConfigurerMojo.java @@ -383,7 +383,7 @@ public abstract class AbstractGenerateConfigurerMojo extends AbstractGeneratorMo StringWriter sw = new StringWriter(); PropertyConfigurerGenerator.generatePropertyConfigurer(pn, cn, en, pfqn, psn, - false, false, options, sw); + false, false, options, null, sw); String source = sw.toString(); diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGeneratorMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGeneratorMojo.java index 5bca3e3..75c8c2a 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGeneratorMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGeneratorMojo.java @@ -172,7 +172,7 @@ public abstract class AbstractGeneratorMojo extends AbstractMojo { } catch (ClassNotFoundException e) { int dotIndex = loadClassName.lastIndexOf('.'); if (dotIndex == -1) { - throw new IllegalArgumentException(org); + throw new NoClassDefFoundError(org); } else { loadClassName = loadClassName.substring(0, dotIndex) + "$" + loadClassName.substring(dotIndex + 1); } diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointSchemaGeneratorMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointSchemaGeneratorMojo.java index 7dc9603..c6ffe06 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointSchemaGeneratorMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointSchemaGeneratorMojo.java @@ -443,7 +443,7 @@ public class EndpointSchemaGeneratorMojo extends AbstractGeneratorMojo { generatePropertyConfigurer(packageName, className, fqClassName, componentClassName, pfqn, psn, componentModel.getScheme() + "-component", hasSuper, true, - options); + options, componentModel); } private void generateEndpointConfigurer( @@ -492,7 +492,7 @@ public class EndpointSchemaGeneratorMojo extends AbstractGeneratorMojo { generatePropertyConfigurer(packageName, className, fqClassName, endpointClassName, pfqn, psn, componentModel.getScheme() + "-endpoint", hasSuper, false, - options); + options, componentModel); } protected ComponentModel findComponentProperties( @@ -1216,10 +1216,11 @@ public class EndpointSchemaGeneratorMojo extends AbstractGeneratorMojo { protected void generatePropertyConfigurer( String pn, String cn, String fqn, String en, String pfqn, String psn, String scheme, boolean hasSuper, boolean component, - Collection<? extends BaseOptionModel> options) { + Collection<? extends BaseOptionModel> options, ComponentModel model) { try (Writer w = new StringWriter()) { - PropertyConfigurerGenerator.generatePropertyConfigurer(pn, cn, en, pfqn, psn, hasSuper, component, options, w); + PropertyConfigurerGenerator.generatePropertyConfigurer(pn, cn, en, pfqn, psn, hasSuper, component, options, model, + w); updateResource(sourcesOutputDir.toPath(), fqn.replace('.', '/') + ".java", w.toString()); } catch (Exception e) { throw new RuntimeException("Unable to generate source code file: " + fqn + ": " + e.getMessage(), e); diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointUriFactoryGenerator.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointUriFactoryGenerator.java index e35bfb7..3103aa3 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointUriFactoryGenerator.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointUriFactoryGenerator.java @@ -61,7 +61,6 @@ public final class EndpointUriFactoryGenerator { w.write(" private static final Set<String> PROPERTY_NAMES;\n"); w.write(generatePropertyNames(model)); w.write("\n"); - w.write("\n"); w.write(" @Override\n"); w.write(" public boolean isEnabled(String scheme) {\n"); if (alternative == null) { diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PropertyConfigurerGenerator.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PropertyConfigurerGenerator.java index c9d0fee..0c53345 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PropertyConfigurerGenerator.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PropertyConfigurerGenerator.java @@ -22,9 +22,12 @@ import java.util.Collection; import java.util.Comparator; import java.util.LinkedHashSet; import java.util.Set; +import java.util.TreeSet; import java.util.stream.Collectors; import org.apache.camel.tooling.model.BaseOptionModel; +import org.apache.camel.tooling.model.Comparators; +import org.apache.camel.tooling.model.ComponentModel; public final class PropertyConfigurerGenerator { @@ -34,7 +37,7 @@ public final class PropertyConfigurerGenerator { public static void generatePropertyConfigurer( String pn, String cn, String en, String pfqn, String psn, boolean hasSuper, boolean component, - Collection<? extends BaseOptionModel> options, Writer w) + Collection<? extends BaseOptionModel> options, ComponentModel model, Writer w) throws IOException { w.write("/* " + AbstractGeneratorMojo.GENERATED_MSG + " */\n"); @@ -55,6 +58,15 @@ public final class PropertyConfigurerGenerator { w.write("public class " + cn + " extends " + psn + " implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {\n"); w.write("\n"); + + // if from component model then we can not optimize this and use a static block + if (model != null) { + // static block for all options which is immutable information + w.write(" private static final Map<String, Object> ALL_OPTIONS;\n"); + w.write(generateAllOptions(component, model)); + w.write("\n"); + } + if (!options.isEmpty() || !hasSuper) { // sort options A..Z so they always have same order @@ -98,23 +110,28 @@ public final class PropertyConfigurerGenerator { w.write("\n"); w.write(" @Override\n"); w.write(" public Map<String, Object> getAllOptions(Object target) {\n"); - if (hasSuper) { - w.write(" Map<String, Object> answer = super.getAllOptions(target);\n"); + if (model != null) { + w.write(" return ALL_OPTIONS;\n"); + w.write(" }\n"); } else { - w.write(" Map<String, Object> answer = new CaseInsensitiveMap();\n"); - } - if (!options.isEmpty() || !hasSuper) { - for (BaseOptionModel option : options) { - // type may contain generics so remove those - String type = option.getJavaType(); - if (type.indexOf('<') != -1) { - type = type.substring(0, type.indexOf('<')); + if (hasSuper) { + w.write(" Map<String, Object> answer = super.getAllOptions(target);\n"); + } else { + w.write(" Map<String, Object> answer = new CaseInsensitiveMap();\n"); + } + if (!options.isEmpty() || !hasSuper) { + for (BaseOptionModel option : options) { + // type may contain generics so remove those + String type = option.getJavaType(); + if (type.indexOf('<') != -1) { + type = type.substring(0, type.indexOf('<')); + } + type = type.replace('$', '.'); + w.write(String.format(" answer.put(\"%s\", %s.class);\n", option.getName(), type)); } - type = type.replace('$', '.'); - w.write(String.format(" answer.put(\"%s\", %s.class);\n", option.getName(), type)); + w.write(" return answer;\n"); + w.write(" }\n"); } - w.write(" return answer;\n"); - w.write(" }\n"); } // generate API for getting a property @@ -177,6 +194,52 @@ public final class PropertyConfigurerGenerator { w.write("\n"); } + private static String generateAllOptions(boolean component, ComponentModel model) { + // use sorted set so the code is always generated the same way + Set<ComponentModel.ApiOptionModel> apis + = new TreeSet<>(Comparators.apiOptionModelComparator()); + if (!component && model.isApi()) { + // gather all the option names from the api (they can be duplicated as the same name can be used by multiple methods) + model.getApiOptions().forEach(a -> a.getMethods().forEach(m -> apis.addAll(m.getOptions()))); + } + StringBuilder sb = new StringBuilder(); + sb.append(" static {\n"); + sb.append(" Map<String, Object> map = new CaseInsensitiveMap();\n"); + if (component) { + for (ComponentModel.ComponentOptionModel option : model.getComponentOptions()) { + // type may contain generics so remove those + String type = option.getJavaType(); + if (type.indexOf('<') != -1) { + type = type.substring(0, type.indexOf('<')); + } + type = type.replace('$', '.'); + sb.append(String.format(" map.put(\"%s\", %s.class);\n", option.getName(), type)); + } + } else { + for (ComponentModel.EndpointOptionModel option : model.getEndpointOptions()) { + // type may contain generics so remove those + String type = option.getJavaType(); + if (type.indexOf('<') != -1) { + type = type.substring(0, type.indexOf('<')); + } + type = type.replace('$', '.'); + sb.append(String.format(" map.put(\"%s\", %s.class);\n", option.getName(), type)); + } + for (ComponentModel.ApiOptionModel apiOption : apis) { + // type may contain generics so remove those + String type = apiOption.getJavaType(); + if (type.indexOf('<') != -1) { + type = type.substring(0, type.indexOf('<')); + } + type = type.replace('$', '.'); + sb.append(String.format(" map.put(\"%s\", %s.class);\n", apiOption.getName(), type)); + } + } + sb.append(" ALL_OPTIONS = map;\n"); + sb.append(" }\n"); + return sb.toString(); + } + private static Set<BaseOptionModel> findConfigurations(Collection<? extends BaseOptionModel> options) { final Set<String> found = new LinkedHashSet<>(); final Set<BaseOptionModel> answer = new LinkedHashSet<>();