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 2022/06/26 13:10:58 UTC

[camel] 01/02: CAMEL-18229: camel-maven-plugin - GenerateConfigurer to support builder pattern

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit ac1c9c1e289fa824a6a334c89da92b60b86023a4
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sun Jun 26 14:53:53 2022 +0200

    CAMEL-18229: camel-maven-plugin - GenerateConfigurer to support builder pattern
---
 .../packaging/AbstractGenerateConfigurerMojo.java  | 45 ++++++++++++++++++----
 .../packaging/PropertyConfigurerGenerator.java     | 14 ++++---
 2 files changed, 45 insertions(+), 14 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 13da6783601..3d428cd3b53 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
@@ -73,6 +73,18 @@ public abstract class AbstractGenerateConfigurerMojo extends AbstractGeneratorMo
     @Parameter(defaultValue = "true")
     protected boolean discoverClasses = true;
 
+    /**
+     * Whether to also allow using fluent builder style as configurer (getXXX and withXXX style).
+     */
+    @Parameter(defaultValue = "false")
+    protected boolean allowBuilderPattern;
+
+    /**
+     * Whether to skip deprecated methods.
+     */
+    @Parameter(defaultValue = "false")
+    protected boolean skipDeprecated;
+
     @Component
     private ArtifactFactory artifactFactory;
 
@@ -80,7 +92,9 @@ public abstract class AbstractGenerateConfigurerMojo extends AbstractGeneratorMo
 
     public static class ConfigurerOption extends BaseOptionModel {
 
-        public ConfigurerOption(String name, Class type, String getter) {
+        private boolean builderMethod;
+
+        public ConfigurerOption(String name, Class type, String getter, boolean builderMethod) {
             // we just use name, type
             setName(name);
             if (byte[].class == type) {
@@ -97,8 +111,12 @@ public abstract class AbstractGenerateConfigurerMojo extends AbstractGeneratorMo
                 setJavaType(type.getName());
             }
             setGetterMethod(getter);
+            this.builderMethod = builderMethod;
         }
 
+        public boolean isBuilderMethod() {
+            return builderMethod;
+        }
     }
 
     public AbstractGenerateConfigurerMojo() {
@@ -325,12 +343,21 @@ public abstract class AbstractGenerateConfigurerMojo extends AbstractGeneratorMo
         Class clazz = projectClassLoader.loadClass(fqn);
         // find all public setters
         doWithMethods(clazz, m -> {
+            boolean deprecated = m.isAnnotationPresent(Deprecated.class);
+            if (skipDeprecated && deprecated) {
+                return;
+            }
+
             boolean setter = m.getName().length() >= 4 && m.getName().startsWith("set")
                     && Character.isUpperCase(m.getName().charAt(3));
             setter &= Modifier.isPublic(m.getModifiers()) && m.getParameterCount() == 1;
             setter &= filterSetter(m);
-            if (setter) {
-                String getter = "get" + Character.toUpperCase(m.getName().charAt(3)) + m.getName().substring(4);
+            boolean builder = allowBuilderPattern && m.getName().length() >= 5 && m.getName().startsWith("with")
+                    && Character.isUpperCase(m.getName().charAt(4));
+            builder &= Modifier.isPublic(m.getModifiers()) && m.getParameterCount() == 1;
+            builder &= filterSetter(m);
+            if (setter || builder) {
+                String getter = "get" + (builder ? Character.toUpperCase(m.getName().charAt(4)) + m.getName().substring(5) : Character.toUpperCase(m.getName().charAt(3)) + m.getName().substring(4));
                 Class type = m.getParameterTypes()[0];
                 if (boolean.class == type || Boolean.class == type) {
                     try {
@@ -343,9 +370,11 @@ public abstract class AbstractGenerateConfigurerMojo extends AbstractGeneratorMo
                 }
 
                 ConfigurerOption option = null;
-                String t = Character.toUpperCase(m.getName().charAt(3)) + m.getName().substring(3 + 1);
+                String t = builder
+                        ? Character.toUpperCase(m.getName().charAt(4)) + m.getName().substring(4 + 1)
+                        : Character.toUpperCase(m.getName().charAt(3)) + m.getName().substring(3 + 1);
                 if (names.add(t)) {
-                    option = new ConfigurerOption(t, type, getter);
+                    option = new ConfigurerOption(t, type, getter, builder);
                     answer.add(option);
                 } else {
                     boolean replace = false;
@@ -357,7 +386,7 @@ public abstract class AbstractGenerateConfigurerMojo extends AbstractGeneratorMo
                     }
                     if (replace) {
                         answer.removeIf(o -> o.getName().equals(t));
-                        option = new ConfigurerOption(t, type, getter);
+                        option = new ConfigurerOption(t, type, getter, builder);
                         answer.add(option);
                     }
                 }
@@ -378,8 +407,8 @@ public abstract class AbstractGenerateConfigurerMojo extends AbstractGeneratorMo
                         }
                         desc = desc.replace('$', '.');
                         desc = desc.trim();
-                        // skip if the type is generic or a wildcard
-                        if (!desc.isEmpty() && desc.indexOf('?') == -1 && !desc.contains(" extends ")) {
+                        // skip if the type is generic, or a wildcard (a single letter is regarded as unknown)
+                        if (desc.length() > 1 && desc.indexOf('?') == -1 && !desc.contains(" extends ")) {
                             option.setNestedType(desc);
                         }
                     }
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 9b0e10466c3..32851a42695 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
@@ -102,8 +102,10 @@ public final class PropertyConfigurerGenerator {
                 for (BaseOptionModel option : options) {
                     String getOrSet = option.getName();
                     getOrSet = Character.toUpperCase(getOrSet.charAt(0)) + getOrSet.substring(1);
+                    boolean builder = option instanceof AbstractGenerateConfigurerMojo.ConfigurerOption
+                            && ((AbstractGenerateConfigurerMojo.ConfigurerOption) option).isBuilderMethod();
                     String setterLambda = setterLambda(getOrSet, option.getJavaType(), option.getSetterMethod(),
-                            option.getConfigurationField(), component, option.getType());
+                            option.getConfigurationField(), component, option.getType(), builder);
                     if (!option.getName().toLowerCase().equals(option.getName())) {
                         w.append(String.format("        case \"%s\":\n", option.getName().toLowerCase()));
                     }
@@ -337,26 +339,26 @@ public final class PropertyConfigurerGenerator {
 
     private static String setterLambda(
             String getOrSet, String type, String setterMethod, String configurationField, boolean component,
-            String optionKind) {
+            String optionKind, boolean builder) {
         // type may contain generics so remove those
         if (type.indexOf('<') != -1) {
             type = type.substring(0, type.indexOf('<'));
         }
         type = type.replace('$', '.');
+        String prefix = builder ? "with" : "set";
         if (configurationField != null) {
             if (component) {
                 String methodName
                         = "getOrCreate" + Character.toUpperCase(configurationField.charAt(0)) + configurationField.substring(1);
-                getOrSet = methodName + "(target).set" + getOrSet;
+                getOrSet = methodName + "(target)." + prefix + getOrSet;
             } else {
                 getOrSet = "target.get" + Character.toUpperCase(configurationField.charAt(0)) + configurationField.substring(1)
-                           + "().set" + getOrSet;
+                           + "()." + prefix + getOrSet;
             }
         } else {
-            getOrSet = "target.set" + getOrSet;
+            getOrSet = "target." + prefix + getOrSet;
         }
 
-        // target.setGroupSize(property(camelContext, java.lang.Integer.class, value))
         String rv;
         if ("duration".equals(optionKind) && "long".equals(type)) {
             rv = "property(camelContext, java.time.Duration.class, value).toMillis()";