This is an automated email from the ASF dual-hosted git repository. orpiske pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
commit e3473d93c3bb7e24b2a0046cc3bc231230821bf6 Author: Otavio R. Piske <angusyo...@gmail.com> AuthorDate: Sat Jan 8 17:53:16 2022 -0300 (chores) camel-package-maven-plugin: additional updates to make it slightly faster --- .../packaging/AbstractGenerateConfigurerMojo.java | 7 +- .../packaging/EndpointSchemaGeneratorMojo.java | 23 ++- .../packaging/EndpointUriFactoryGenerator.java | 2 - .../packaging/PropertyConfigurerGenerator.java | 203 +++++++++++---------- 4 files changed, 122 insertions(+), 113 deletions(-) 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 21affac..2846049 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 @@ -432,11 +432,8 @@ public abstract class AbstractGenerateConfigurerMojo extends AbstractGeneratorMo String pfqn = fqn; String psn = "org.apache.camel.support.component.PropertyConfigurerSupport"; - StringWriter sw = new StringWriter(); - PropertyConfigurerGenerator.generatePropertyConfigurer(pn, cn, en, pfqn, psn, - false, false, extended, bootstrap, options, null, sw); - - String source = sw.toString(); + String source = PropertyConfigurerGenerator.generatePropertyConfigurer(pn, cn, en, pfqn, psn, + false, false, extended, bootstrap, options, null); String fileName = pn.replace('.', '/') + "/" + cn + ".java"; outputDir.mkdirs(); 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 dbec27f..db6b4d3 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 @@ -32,6 +32,8 @@ import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.time.Duration; +import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -179,7 +181,9 @@ public class EndpointSchemaGeneratorMojo extends AbstractGeneratorMojo { } } - private void processSchemas(Map<Class, ComponentModel> models, Class<?> classElement, UriEndpoint uriEndpoint, String label, String[] schemes, String[] titles, String[] extendsSchemes) { + private void processSchemas( + Map<Class, ComponentModel> models, Class<?> classElement, UriEndpoint uriEndpoint, String label, String[] schemes, + String[] titles, String[] extendsSchemes) { for (int i = 0; i < schemes.length; i++) { final String alias = schemes[i]; final String extendsAlias = i < extendsSchemes.length ? extendsSchemes[i] : extendsSchemes[0]; @@ -1327,11 +1331,20 @@ public class EndpointSchemaGeneratorMojo extends AbstractGeneratorMojo { String pfqn, String psn, String scheme, boolean hasSuper, boolean component, Collection<? extends BaseOptionModel> options, ComponentModel model) { - try (Writer w = new StringWriter()) { + Instant start = Instant.now(); + try { boolean extended = model.isApi(); // if the component is api then the generated configurer should be an extended configurer - PropertyConfigurerGenerator.generatePropertyConfigurer(pn, cn, en, pfqn, psn, hasSuper, component, extended, false, - options, model, w); - updateResource(sourcesOutputDir.toPath(), fqn.replace('.', '/') + ".java", w.toString()); + String source = PropertyConfigurerGenerator.generatePropertyConfigurer(pn, cn, en, pfqn, psn, hasSuper, component, + extended, false, + options, model); + + Instant end = Instant.now(); + + Duration duration = Duration.between(start, end); + + getLog().info("Generated code 1 in: " + duration.toMillis()); + + updateResource(sourcesOutputDir.toPath(), fqn.replace('.', '/') + ".java", source); } 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 cd4e95b..24e2aa8 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 @@ -16,8 +16,6 @@ */ package org.apache.camel.maven.packaging; -import java.io.IOException; -import java.io.Writer; import java.util.HashSet; import java.util.Set; import java.util.StringJoiner; 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 5f6f005..b0a3257 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 @@ -16,8 +16,6 @@ */ 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.LinkedHashSet; @@ -32,38 +30,38 @@ public final class PropertyConfigurerGenerator { private PropertyConfigurerGenerator() { } - public static void generatePropertyConfigurer( + public static String generatePropertyConfigurer( String pn, String cn, String en, String pfqn, String psn, boolean hasSuper, boolean component, boolean extended, boolean bootstrap, - Collection<? extends BaseOptionModel> options, ComponentModel model, Writer w) - throws IOException { + Collection<? extends BaseOptionModel> options, ComponentModel model) { - 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.spi.ExtendedPropertyConfigurerGetter;\n"); - w.write("import org.apache.camel.spi.PropertyConfigurerGetter;\n"); - w.write("import org.apache.camel.spi.ConfigurerStrategy;\n"); - w.write("import org.apache.camel.spi.GeneratedPropertyConfigurer;\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 GeneratedPropertyConfigurer"); + StringBuilder w = new StringBuilder(); + + w.append("/* ").append(AbstractGeneratorMojo.GENERATED_MSG + " */\n"); + w.append("package ").append(pn).append(";\n"); + w.append('\n'); + w.append("import java.util.Map;\n"); + w.append("\n"); + w.append("import org.apache.camel.CamelContext;\n"); + w.append("import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;\n"); + w.append("import org.apache.camel.spi.PropertyConfigurerGetter;\n"); + w.append("import org.apache.camel.spi.ConfigurerStrategy;\n"); + w.append("import org.apache.camel.spi.GeneratedPropertyConfigurer;\n"); + w.append("import org.apache.camel.util.CaseInsensitiveMap;\n"); + w.append("import ").append(pfqn).append(";\n"); + w.append('\n'); + w.append("/**\n"); + w.append(" * ").append(AbstractGeneratorMojo.GENERATED_MSG).append('\n'); + w.append(" */\n"); + w.append("@SuppressWarnings(\"unchecked\")\n"); + w.append("public class ").append(cn).append(" extends ").append(psn).append(" implements GeneratedPropertyConfigurer"); if (extended) { - w.write(", ExtendedPropertyConfigurerGetter"); + w.append(", ExtendedPropertyConfigurerGetter"); } else { - w.write(", PropertyConfigurerGetter"); + w.append(", PropertyConfigurerGetter"); } - w.write(" {\n"); - w.write("\n"); + w.append(" {\n"); + w.append('\n'); // sort options A..Z so they always have same order if (!options.isEmpty()) { @@ -74,13 +72,13 @@ public final class PropertyConfigurerGenerator { if (extended) { if (model != null || !hasSuper) { // static block for all options which is immutable information - w.write(" private static final Map<String, Object> ALL_OPTIONS;\n"); + w.append(" private static final Map<String, Object> ALL_OPTIONS;\n"); if (model != null) { - w.write(generateAllOptions(cn, bootstrap, component, model)); + w.append(generateAllOptions(cn, bootstrap, component, model)); } else { - w.write(generateAllOptions(cn, bootstrap, options)); + w.append(generateAllOptions(cn, bootstrap, options)); } - w.write("\n"); + w.append('\n'); } } @@ -89,48 +87,49 @@ public final class PropertyConfigurerGenerator { // if its a component configurer then configuration classes are optional and we need // to generate a method that can lazy create a new configuration if it was null for (BaseOptionModel bo : findConfigurations(options)) { - w.write(createGetOrCreateConfiguration(en, bo.getConfigurationClass(), + w.append(createGetOrCreateConfiguration(en, bo.getConfigurationClass(), bo.getConfigurationField())); - w.write("\n"); + w.append('\n'); } } - w.write(" @Override\n"); - w.write(" public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {\n"); + w.append(" @Override\n"); + w.append( + " public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {\n"); if (!options.isEmpty()) { - w.write(" " + en + " target = (" + en + ") obj;\n"); - w.write(" switch (ignoreCase ? name.toLowerCase() : name) {\n"); + w.append(" ").append(en).append(" target = (").append(en).append(") obj;\n"); + w.append(" switch (ignoreCase ? name.toLowerCase() : name) {\n"); for (BaseOptionModel option : options) { String getOrSet = option.getName(); getOrSet = Character.toUpperCase(getOrSet.charAt(0)) + getOrSet.substring(1); String setterLambda = setterLambda(getOrSet, option.getJavaType(), option.getSetterMethod(), option.getConfigurationField(), component, option.getType()); if (!option.getName().toLowerCase().equals(option.getName())) { - w.write(String.format(" case \"%s\":\n", option.getName().toLowerCase())); + w.append(String.format(" case \"%s\":\n", option.getName().toLowerCase())); } - w.write(String.format(" case \"%s\": %s; return true;\n", option.getName(), setterLambda)); + w.append(String.format(" case \"%s\": %s; return true;\n", option.getName(), setterLambda)); } if (hasSuper) { - w.write(" default: return super.configure(camelContext, obj, name, value, ignoreCase);\n"); + w.append(" default: return super.configure(camelContext, obj, name, value, ignoreCase);\n"); } else { - w.write(" default: return false;\n"); + w.append(" default: return false;\n"); } - w.write(" }\n"); + w.append(" }\n"); } else { - w.write(" return false;\n"); + w.append(" return false;\n"); } - w.write(" }\n"); + w.append(" }\n"); if (extended) { // generate method that returns all the options - w.write("\n"); - w.write(" @Override\n"); - w.write(" public Map<String, Object> getAllOptions(Object target) {\n"); + w.append('\n'); + w.append(" @Override\n"); + w.append(" public Map<String, Object> getAllOptions(Object target) {\n"); if (model != null || !hasSuper) { - w.write(" return ALL_OPTIONS;\n"); - w.write(" }\n"); + w.append(" return ALL_OPTIONS;\n"); + w.append(" }\n"); } else { - w.write(" Map<String, Object> answer = super.getAllOptions(target);\n"); + w.append(" Map<String, Object> answer = super.getAllOptions(target);\n"); if (!options.isEmpty()) { for (BaseOptionModel option : options) { // type may contain generics so remove those @@ -139,42 +138,42 @@ public final class PropertyConfigurerGenerator { type = type.substring(0, type.indexOf('<')); } type = type.replace('$', '.'); - w.write(String.format(" answer.put(\"%s\", %s.class);\n", option.getName(), type)); + w.append(String.format(" answer.put(\"%s\", %s.class);\n", option.getName(), type)); } - w.write(" return answer;\n"); - w.write(" }\n"); + w.append(" return answer;\n"); + w.append(" }\n"); } } } if (bootstrap && extended) { - w.write("\n"); - w.write(" public static void clearBootstrapConfigurers() {\n"); - w.write(" ALL_OPTIONS.clear();\n"); - w.write(" }\n"); + w.append('\n'); + w.append(" public static void clearBootstrapConfigurers() {\n"); + w.append(" ALL_OPTIONS.clear();\n"); + w.append(" }\n"); } // generate method for autowired if (options.stream().anyMatch(BaseOptionModel::isAutowired)) { - w.write("\n"); - w.write(" @Override\n"); - w.write(" public String[] getAutowiredNames() {\n"); + w.append('\n'); + w.append(" @Override\n"); + w.append(" public String[] getAutowiredNames() {\n"); String names = options.stream() .filter(BaseOptionModel::isAutowired) .map(BaseOptionModel::getName) .map(PropertyConfigurerGenerator::quote) .collect(Collectors.joining(",")); - w.write(" return new String[]{"); - w.write(names); - w.write("};\n"); - w.write(" }\n"); + w.append(" return new String[]{"); + w.append(names); + w.append("};\n"); + w.append(" }\n"); } // generate method for getting a property type - w.write("\n"); - w.write(" @Override\n"); - w.write(" public Class<?> getOptionType(String name, boolean ignoreCase) {\n"); + w.append('\n'); + w.append(" @Override\n"); + w.append(" public Class<?> getOptionType(String name, boolean ignoreCase) {\n"); if (!options.isEmpty()) { - w.write(" switch (ignoreCase ? name.toLowerCase() : name) {\n"); + w.append(" switch (ignoreCase ? name.toLowerCase() : name) {\n"); for (BaseOptionModel option : options) { // type may contain generics so remove those String type = option.getJavaType(); @@ -183,84 +182,86 @@ public final class PropertyConfigurerGenerator { } type = type.replace('$', '.'); if (!option.getName().toLowerCase().equals(option.getName())) { - w.write(String.format(" case \"%s\":\n", option.getName().toLowerCase())); + w.append(String.format(" case \"%s\":\n", option.getName().toLowerCase())); } - w.write(String.format(" case \"%s\": return %s.class;\n", option.getName(), type)); + w.append(String.format(" case \"%s\": return %s.class;\n", option.getName(), type)); } if (hasSuper) { - w.write(" default: return super.getOptionType(name, ignoreCase);\n"); + w.append(" default: return super.getOptionType(name, ignoreCase);\n"); } else { - w.write(" default: return null;\n"); + w.append(" default: return null;\n"); } - w.write(" }\n"); + w.append(" }\n"); } else { - w.write(" return null;\n"); + w.append(" return null;\n"); } - w.write(" }\n"); + w.append(" }\n"); // generate method for getting a property - w.write("\n"); - w.write(" @Override\n"); - w.write(" public Object getOptionValue(Object obj, String name, boolean ignoreCase) {\n"); + w.append('\n'); + w.append(" @Override\n"); + w.append(" public Object getOptionValue(Object obj, String name, boolean ignoreCase) {\n"); if (!options.isEmpty()) { - w.write(" " + en + " target = (" + en + ") obj;\n"); - w.write(" switch (ignoreCase ? name.toLowerCase() : name) {\n"); + w.append(" ").append(en).append(" target = (").append(en).append(") obj;\n"); + w.append(" switch (ignoreCase ? name.toLowerCase() : name) {\n"); for (BaseOptionModel option : options) { String getOrSet = option.getName(); getOrSet = Character.toUpperCase(getOrSet.charAt(0)) + getOrSet.substring(1); String getterLambda = getterLambda(getOrSet, option.getJavaType(), option.getGetterMethod(), option.getConfigurationField(), component); if (!option.getName().toLowerCase().equals(option.getName())) { - w.write(String.format(" case \"%s\":\n", option.getName().toLowerCase())); + w.append(String.format(" case \"%s\":\n", option.getName().toLowerCase())); } - w.write(String.format(" case \"%s\": return %s;\n", option.getName(), getterLambda)); + w.append(String.format(" case \"%s\": return %s;\n", option.getName(), getterLambda)); } if (hasSuper) { - w.write(" default: return super.getOptionValue(obj, name, ignoreCase);\n"); + w.append(" default: return super.getOptionValue(obj, name, ignoreCase);\n"); } else { - w.write(" default: return null;\n"); + w.append(" default: return null;\n"); } - w.write(" }\n"); + w.append(" }\n"); } else { - w.write(" return null;\n"); + w.append(" return null;\n"); } - w.write(" }\n"); + w.append(" }\n"); // nested type was stored in extra as we use BaseOptionModel to hold the option data boolean hasNestedTypes = options.stream().map(BaseOptionModel::getNestedType).anyMatch(s -> s != null && !s.trim().isEmpty()); if (hasNestedTypes) { - w.write("\n"); - w.write(" @Override\n"); - w.write(" public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {\n"); + w.append('\n'); + w.append(" @Override\n"); + w.append(" public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {\n"); if (!options.isEmpty()) { - w.write(" switch (ignoreCase ? name.toLowerCase() : name) {\n"); + w.append(" switch (ignoreCase ? name.toLowerCase() : name) {\n"); for (BaseOptionModel option : options) { String nestedType = option.getNestedType(); if (nestedType != null && !nestedType.isEmpty()) { nestedType = nestedType.replace('$', '.'); if (!option.getName().toLowerCase().equals(option.getName())) { - w.write(String.format(" case \"%s\":\n", option.getName().toLowerCase())); + w.append(String.format(" case \"%s\":\n", option.getName().toLowerCase())); } - w.write(String.format(" case \"%s\": return %s.class;\n", option.getName(), nestedType)); + w.append(String.format(" case \"%s\": return %s.class;\n", option.getName(), nestedType)); } } if (hasSuper) { - w.write(" default: return super.getCollectionValueType(target, name, ignoreCase);\n"); + w.append(" default: return super.getCollectionValueType(target, name, ignoreCase);\n"); } else { - w.write(" default: return null;\n"); + w.append(" default: return null;\n"); } - w.write(" }\n"); + w.append(" }\n"); } else { - w.write(" return null;\n"); + w.append(" return null;\n"); } - w.write(" }\n"); + w.append(" }\n"); } } - w.write("}\n"); - w.write("\n"); + w.append("}\n"); + w.append('\n'); + + return w.toString(); } private static String generateAllOptions(String className, boolean bootstrap, boolean component, ComponentModel model) {