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 905c23ac3d9d97118ff97d22288a71b669f9fbe0
Author: Otavio Rodolfo Piske <[email protected]>
AuthorDate: Thu Feb 10 18:09:37 2022 +0100

    (chores) camel-maven-package-plugin: refactoring
    
    Break a few large methods EndpointDslMojo in smaller pieces for easier 
maintenance and future optimization
---
 .../camel/maven/packaging/EndpointDslMojo.java     | 559 +++++++++++----------
 1 file changed, 303 insertions(+), 256 deletions(-)

diff --git 
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointDslMojo.java
 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointDslMojo.java
index a495ea8..b63f506 100644
--- 
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointDslMojo.java
+++ 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointDslMojo.java
@@ -229,25 +229,9 @@ public class EndpointDslMojo extends AbstractGeneratorMojo 
{
         String componentClassName = model.getJavaType();
         String builderName = getEndpointName(componentClassName);
 
-        final JavaClass javaClass = new JavaClass(getProjectClassLoader());
-        javaClass.setPackage(componentsFactoriesPackageName);
-        javaClass.setName(builderName + "Factory");
-        javaClass.setClass(false);
-        javaClass.addImport("java.util.*");
-        javaClass.addImport("java.util.concurrent.*");
-        javaClass.addImport("java.util.function.*");
-        javaClass.addImport("java.util.stream.*");
-        
javaClass.addImport("org.apache.camel.builder.EndpointConsumerBuilder");
-        
javaClass.addImport("org.apache.camel.builder.EndpointProducerBuilder");
-        
javaClass.addImport("org.apache.camel.builder.endpoint.AbstractEndpointBuilder");
+        final JavaClass javaClass = createJavaClass(builderName);
 
-        boolean hasAdvanced = false;
-        for (EndpointOptionModel option : model.getEndpointOptions()) {
-            if (option.getLabel() != null && 
option.getLabel().contains("advanced")) {
-                hasAdvanced = true;
-                break;
-            }
-        }
+        boolean hasAdvanced = hasAdvancedCheck(model);
 
         JavaClass consumerClass = null;
         JavaClass advancedConsumerClass = null;
@@ -268,9 +252,11 @@ public class EndpointDslMojo extends AbstractGeneratorMojo 
{
                 generateDummyClass(advancedConsumerClass.getCanonicalName());
                 advancedConsumerClass.getJavaDoc()
                         .setText("Advanced builder for endpoint consumers for 
the " + model.getTitle() + " component.");
+
                 
consumerClass.addMethod().setName("advanced").setReturnType(loadClass(advancedConsumerClass.getCanonicalName()))
                         .setDefault()
                         .setBody("return (Advanced" + consumerName + ") 
this;");
+
                 
advancedConsumerClass.addMethod().setName("basic").setReturnType(loadClass(consumerClass.getCanonicalName()))
                         .setDefault()
                         .setBody("return (" + consumerName + ") this;");
@@ -346,162 +332,7 @@ public class EndpointDslMojo extends 
AbstractGeneratorMojo {
 
         javaClass.addAnnotation(Generated.class).setStringValue("value", 
EndpointDslMojo.class.getName());
 
-        for (EndpointOptionModel option : model.getEndpointOptions()) {
-
-            // skip all @UriPath parameters as the endpoint DSL is for query
-            // parameters
-            if ("path".equals(option.getKind())) {
-                continue;
-            }
-
-            List<JavaClass> targets = new ArrayList<>();
-            String label = option.getLabel() != null ? option.getLabel() : "";
-            if (label != null) {
-                if (label.contains("producer")) {
-                    if (label.contains("advanced")) {
-                        targets.add(advancedProducerClass != null ? 
advancedProducerClass : advancedBuilderClass);
-                    } else {
-                        targets.add(producerClass != null ? producerClass : 
builderClass);
-                    }
-                } else if (label.contains("consumer")) {
-                    if (label.contains("advanced")) {
-                        targets.add(advancedConsumerClass != null ? 
advancedConsumerClass : advancedBuilderClass);
-                    } else {
-                        targets.add(consumerClass != null ? consumerClass : 
builderClass);
-                    }
-                } else {
-                    if (label.contains("advanced")) {
-                        targets.add(advancedConsumerClass);
-                        targets.add(advancedProducerClass);
-                        targets.add(advancedBuilderClass);
-                    } else {
-                        targets.add(consumerClass);
-                        targets.add(producerClass);
-                        targets.add(builderClass);
-                    }
-                }
-            }
-
-            for (JavaClass target : targets) {
-                if (target == null) {
-                    continue;
-                }
-
-                // basic description
-                String baseDesc = option.getDescription();
-                if (!Strings.isEmpty(baseDesc)) {
-                    // must xml encode description as in some rare cases it 
contains & chars which is invalid javadoc
-                    baseDesc = JavadocHelper.xmlEncode(baseDesc);
-
-                    if (!baseDesc.endsWith(".")) {
-                        baseDesc += ".";
-                    }
-                    baseDesc += "\n";
-                    baseDesc += "@@REPLACE_ME@@";
-                    if (option.isMultiValue()) {
-                        baseDesc += "\nThe option is multivalued, and you can 
use the " + option.getName()
-                                    + "(String, Object) method to add a value 
(call the method multiple times to set more values).";
-                    }
-                    baseDesc += "\n";
-                    // the Endpoint DSL currently requires to provide the 
entire
-                    // context-path and not as individual options
-                    // so lets only mark query parameters that are required as
-                    // required
-                    if ("parameter".equals(option.getKind()) && 
option.isRequired()) {
-                        baseDesc += "\nRequired: true";
-                    }
-                    // include default value (if any)
-                    if (option.getDefaultValue() != null) {
-                        // must xml encode default value so its valid as 
javadoc
-                        String value = 
JavadocHelper.xmlEncode(option.getDefaultValue().toString());
-                        baseDesc += "\nDefault: " + value;
-                    }
-                    baseDesc += "\nGroup: " + option.getGroup();
-                }
-
-                boolean multiValued = option.isMultiValue();
-                if (multiValued) {
-                    // multi value option that takes one value
-                    String desc = baseDesc.replace("@@REPLACE_ME@@",
-                            "\nThe option is a: <code>" + 
option.getJavaType().replace("<", "&lt;").replace(">", "&gt;")
-                                                                     + 
"</code> type.");
-                    desc = JavadocHelper.xmlEncode(desc);
-
-                    Method fluent = 
target.addMethod().setDefault().setName(option.getName())
-                            .setReturnType(new 
GenericType(loadClass(target.getCanonicalName())))
-                            .addParameter(new GenericType(String.class), "key")
-                            .addParameter(new GenericType(Object.class), 
"value")
-                            .setBody("doSetMultiValueProperty(\"" + 
option.getName() + "\", \"" + option.getPrefix()
-                                     + "\" + key, value);",
-                                    "return this;\n");
-                    if (option.isDeprecated()) {
-                        fluent.addAnnotation(Deprecated.class);
-                    }
-
-                    String text = desc;
-                    text += "\n\n@param key the option key";
-                    text += "\n@param value the option value";
-                    text += "\n@return the dsl builder\n";
-                    fluent.getJavaDoc().setText(text);
-                    // add multi value method that takes a Map
-                    fluent = 
target.addMethod().setDefault().setName(option.getName())
-                            .setReturnType(new 
GenericType(loadClass(target.getCanonicalName())))
-                            .addParameter(new GenericType(Map.class), "values")
-                            .setBody("doSetMultiValueProperties(\"" + 
option.getName() + "\", \"" + option.getPrefix()
-                                     + "\", values);",
-                                    "return this;\n");
-                    if (option.isDeprecated()) {
-                        fluent.addAnnotation(Deprecated.class);
-                    }
-                    text = desc;
-                    text += "\n\n@param values the values";
-                    text += "\n@return the dsl builder\n";
-                    fluent.getJavaDoc().setText(text);
-                } else {
-                    // regular option
-                    String desc = baseDesc.replace("@@REPLACE_ME@@",
-                            "\nThe option is a: <code>" + 
option.getJavaType().replace("<", "&lt;").replace(">", "&gt;")
-                                                                     + 
"</code> type.");
-                    desc = JavadocHelper.xmlEncode(desc);
-
-                    Method fluent = 
target.addMethod().setDefault().setName(option.getName())
-                            .setReturnType(new 
GenericType(loadClass(target.getCanonicalName())))
-                            .addParameter(optionJavaType(option), 
option.getName())
-                            .setBody("doSetProperty(\"" + option.getName() + 
"\", " + option.getName() + ");",
-                                    "return this;\n");
-                    if (option.isDeprecated()) {
-                        fluent.addAnnotation(Deprecated.class);
-                    }
-                    String text = desc;
-                    text += "\n\n@param " + option.getName() + " the value to 
set";
-                    text += "\n@return the dsl builder\n";
-                    fluent.getJavaDoc().setText(text);
-
-                    if (!"String".equals(optionJavaType(option))) {
-                        // regular option by String parameter variant
-                        desc = baseDesc.replace("@@REPLACE_ME@@",
-                                "\nThe option will be converted to a <code>"
-                                                                  + 
option.getJavaType().replace("<", "&lt;").replace(">",
-                                                                          
"&gt;")
-                                                                  + "</code> 
type.");
-                        desc = JavadocHelper.xmlEncode(desc);
-
-                        fluent = 
target.addMethod().setDefault().setName(option.getName())
-                                .setReturnType(new 
GenericType(loadClass(target.getCanonicalName())))
-                                .addParameter(new GenericType(String.class), 
option.getName())
-                                .setBody("doSetProperty(\"" + option.getName() 
+ "\", " + option.getName() + ");",
-                                        "return this;\n");
-                        if (option.isDeprecated()) {
-                            fluent.addAnnotation(Deprecated.class);
-                        }
-                        text = desc;
-                        text += "\n\n@param " + option.getName() + " the value 
to set";
-                        text += "\n@return the dsl builder\n";
-                        fluent.getJavaDoc().setText(text);
-                    }
-                }
-            }
-        }
+        processEndpoints(model, consumerClass, advancedConsumerClass, 
producerClass, advancedProducerClass, builderClass, advancedBuilderClass);
 
         javaClass.removeImport("T");
 
@@ -523,118 +354,334 @@ public class EndpointDslMojo extends 
AbstractGeneratorMojo {
         }
 
         if (aliases.size() == 1) {
-            String desc = getMainDescription(model);
-            String methodName = camelCaseLower(model.getScheme());
-            method = dslClass.addMethod().setStatic().setName(methodName)
-                    .addParameter(String.class, "path")
-                    .setReturnType(new 
GenericType(loadClass(builderClass.getCanonicalName())))
-                    .setDefault()
-                    .setBodyF("return %s.%s(%s);", javaClass.getName(), 
"endpointBuilder",
-                            "\"" + model.getScheme() + "\", path");
-            String javaDoc = desc;
-            javaDoc += "\n\n@param path " + pathParameterJavaDoc(model);
-            javaDoc += "\n@return the dsl builder\n";
-            method.getJavaDoc().setText(javaDoc);
-            if (model.isDeprecated()) {
-                method.addAnnotation(Deprecated.class);
-            }
+            processAliases(model, staticBuilders, javaClass, builderClass, 
dslClass);
+        } else {
+            processMasterScheme(aliases, staticBuilders, javaClass, 
builderClass, dslClass);
+        }
+
+        return writeSourceIfChanged(javaClass, 
componentsFactoriesPackageName.replace('.', '/'), builderName + "Factory.java",
+                false);
+    }
 
-            // copy method for the static builders (which allows to use the 
endpoint-dsl from outside EndpointRouteBuilder)
-            method = method.copy();
-            method.setPublic().setStatic();
-            method.setReturnType(builderClass.getCanonicalName().replace('$', 
'.'));
-            method.setBodyF("return %s.%s(%s);", javaClass.getCanonicalName(), 
"endpointBuilder",
-                    "\"" + model.getScheme() + "\", path");
-            staticBuilders.add(method);
+    private void processMasterScheme(List<ComponentModel> aliases, 
List<Method> staticBuilders, JavaClass javaClass, JavaClass builderClass, 
JavaClass dslClass) {
+        Method method;
+        // we only want the first alias (master scheme) as static builders
+        boolean firstAlias = true;
 
+        for (ComponentModel componentModel : aliases) {
+            String desc = getMainDescription(componentModel);
+            String methodName = camelCaseLower(componentModel.getScheme());
             method = dslClass.addMethod().setStatic().setName(methodName)
-                    .addParameter(String.class, "componentName")
                     .addParameter(String.class, "path")
                     .setReturnType(new 
GenericType(loadClass(builderClass.getCanonicalName())))
                     .setDefault()
-                    .setBodyF("return %s.%s(%s);", javaClass.getName(), 
"endpointBuilder", "componentName, path");
-            javaDoc = desc;
-            javaDoc += "\n\n@param componentName to use a custom component 
name for the endpoint instead of the default name";
-            javaDoc += "\n@param path " + pathParameterJavaDoc(model);
+                    .setBodyF("return %s.%s(%s);", javaClass.getName(), 
"endpointBuilder",
+                            "\"" + componentModel.getScheme() + "\", path");
+            String javaDoc = desc;
+            javaDoc += "\n\n@param path " + 
pathParameterJavaDoc(componentModel);
             javaDoc += "\n@return the dsl builder\n";
             method.getJavaDoc().setText(javaDoc);
-            if (model.isDeprecated()) {
+            if (componentModel.isDeprecated()) {
                 method.addAnnotation(Deprecated.class);
             }
 
-            // copy method for the static builders (which allows to use the 
endpoint-dsl from outside EndpointRouteBuilder)
-            method = method.copy();
-            method.setPublic().setStatic();
-            method.setReturnType(builderClass.getCanonicalName().replace('$', 
'.'));
-            method.setBodyF("return %s.%s(%s);", javaClass.getCanonicalName(), 
"endpointBuilder", "componentName, path");
-            staticBuilders.add(method);
-        } else {
             // we only want the first alias (master scheme) as static builders
-            boolean firstAlias = true;
+            if (firstAlias) {
+                // copy method for the static builders (which allows to use 
the endpoint-dsl from outside EndpointRouteBuilder)
+                method = method.copy();
+                method.setPublic().setStatic();
+                
method.setReturnType(builderClass.getCanonicalName().replace('$', '.'));
+                method.setBodyF("return %s.%s(%s);", 
javaClass.getCanonicalName(), "endpointBuilder",
+                        "\"" + componentModel.getScheme() + "\", path");
+                staticBuilders.add(method);
+            }
 
-            for (ComponentModel componentModel : aliases) {
-                String desc = getMainDescription(componentModel);
-                String methodName = camelCaseLower(componentModel.getScheme());
+            // we only want first alias for variation with custom component 
name
+            if (firstAlias) {
                 method = dslClass.addMethod().setStatic().setName(methodName)
+                        .addParameter(String.class, "componentName")
                         .addParameter(String.class, "path")
                         .setReturnType(new 
GenericType(loadClass(builderClass.getCanonicalName())))
                         .setDefault()
-                        .setBodyF("return %s.%s(%s);", javaClass.getName(), 
"endpointBuilder",
-                                "\"" + componentModel.getScheme() + "\", 
path");
-                String javaDoc = desc;
-                javaDoc += "\n\n@param path " + 
pathParameterJavaDoc(componentModel);
+                        .setBodyF("return %s.%s(%s);", javaClass.getName(), 
"endpointBuilder", "componentName, path");
+                javaDoc = desc;
+                javaDoc += "\n\n@param componentName to use a custom component 
name for the endpoint instead of the default name";
+                javaDoc += "\n@param path " + 
pathParameterJavaDoc(componentModel);
                 javaDoc += "\n@return the dsl builder\n";
                 method.getJavaDoc().setText(javaDoc);
                 if (componentModel.isDeprecated()) {
                     method.addAnnotation(Deprecated.class);
                 }
+            }
 
-                // we only want the first alias (master scheme) as static 
builders
-                if (firstAlias) {
-                    // copy method for the static builders (which allows to 
use the endpoint-dsl from outside EndpointRouteBuilder)
-                    method = method.copy();
-                    method.setPublic().setStatic();
-                    
method.setReturnType(builderClass.getCanonicalName().replace('$', '.'));
-                    method.setBodyF("return %s.%s(%s);", 
javaClass.getCanonicalName(), "endpointBuilder",
-                            "\"" + componentModel.getScheme() + "\", path");
-                    staticBuilders.add(method);
-                }
+            // we only want the first alias (master scheme) as static builders
+            if (firstAlias) {
+                // copy method for the static builders (which allows to use 
the endpoint-dsl from outside EndpointRouteBuilder)
+                method = method.copy();
+                method.setPublic().setStatic();
+                
method.setReturnType(builderClass.getCanonicalName().replace('$', '.'));
+                method.setBodyF("return %s.%s(%s);", 
javaClass.getCanonicalName(), "endpointBuilder",
+                        "componentName, path");
+                staticBuilders.add(method);
+            }
 
-                // we only want first alias for variation with custom 
component name
-                if (firstAlias) {
-                    method = 
dslClass.addMethod().setStatic().setName(methodName)
-                            .addParameter(String.class, "componentName")
-                            .addParameter(String.class, "path")
-                            .setReturnType(new 
GenericType(loadClass(builderClass.getCanonicalName())))
-                            .setDefault()
-                            .setBodyF("return %s.%s(%s);", 
javaClass.getName(), "endpointBuilder", "componentName, path");
-                    javaDoc = desc;
-                    javaDoc += "\n\n@param componentName to use a custom 
component name for the endpoint instead of the default name";
-                    javaDoc += "\n@param path " + 
pathParameterJavaDoc(componentModel);
-                    javaDoc += "\n@return the dsl builder\n";
-                    method.getJavaDoc().setText(javaDoc);
-                    if (componentModel.isDeprecated()) {
-                        method.addAnnotation(Deprecated.class);
-                    }
-                }
+            firstAlias = false;
+        }
+    }
 
-                // we only want the first alias (master scheme) as static 
builders
-                if (firstAlias) {
-                    // copy method for the static builders (which allows to 
use the endpoint-dsl from outside EndpointRouteBuilder)
-                    method = method.copy();
-                    method.setPublic().setStatic();
-                    
method.setReturnType(builderClass.getCanonicalName().replace('$', '.'));
-                    method.setBodyF("return %s.%s(%s);", 
javaClass.getCanonicalName(), "endpointBuilder",
-                            "componentName, path");
-                    staticBuilders.add(method);
+    private void processAliases(ComponentModel model, List<Method> 
staticBuilders, JavaClass javaClass, JavaClass builderClass, JavaClass 
dslClass) {
+        Method method;
+        String desc = getMainDescription(model);
+        String methodName = camelCaseLower(model.getScheme());
+        method = dslClass.addMethod().setStatic().setName(methodName)
+                .addParameter(String.class, "path")
+                .setReturnType(new 
GenericType(loadClass(builderClass.getCanonicalName())))
+                .setDefault()
+                .setBodyF("return %s.%s(%s);", javaClass.getName(), 
"endpointBuilder",
+                        "\"" + model.getScheme() + "\", path");
+        String javaDoc = desc;
+        javaDoc += "\n\n@param path " + pathParameterJavaDoc(model);
+        javaDoc += "\n@return the dsl builder\n";
+        method.getJavaDoc().setText(javaDoc);
+        if (model.isDeprecated()) {
+            method.addAnnotation(Deprecated.class);
+        }
+
+        // copy method for the static builders (which allows to use the 
endpoint-dsl from outside EndpointRouteBuilder)
+        method = method.copy();
+        method.setPublic().setStatic();
+        method.setReturnType(builderClass.getCanonicalName().replace('$', 
'.'));
+        method.setBodyF("return %s.%s(%s);", javaClass.getCanonicalName(), 
"endpointBuilder",
+                "\"" + model.getScheme() + "\", path");
+        staticBuilders.add(method);
+
+        method = dslClass.addMethod().setStatic().setName(methodName)
+                .addParameter(String.class, "componentName")
+                .addParameter(String.class, "path")
+                .setReturnType(new 
GenericType(loadClass(builderClass.getCanonicalName())))
+                .setDefault()
+                .setBodyF("return %s.%s(%s);", javaClass.getName(), 
"endpointBuilder", "componentName, path");
+        javaDoc = desc;
+        javaDoc += "\n\n@param componentName to use a custom component name 
for the endpoint instead of the default name";
+        javaDoc += "\n@param path " + pathParameterJavaDoc(model);
+        javaDoc += "\n@return the dsl builder\n";
+        method.getJavaDoc().setText(javaDoc);
+        if (model.isDeprecated()) {
+            method.addAnnotation(Deprecated.class);
+        }
+
+        // copy method for the static builders (which allows to use the 
endpoint-dsl from outside EndpointRouteBuilder)
+        method = method.copy();
+        method.setPublic().setStatic();
+        method.setReturnType(builderClass.getCanonicalName().replace('$', 
'.'));
+        method.setBodyF("return %s.%s(%s);", javaClass.getCanonicalName(), 
"endpointBuilder", "componentName, path");
+        staticBuilders.add(method);
+    }
+
+    private void processEndpoints(ComponentModel model, JavaClass 
consumerClass, JavaClass advancedConsumerClass, JavaClass producerClass, 
JavaClass advancedProducerClass, JavaClass builderClass, JavaClass 
advancedBuilderClass) {
+        for (EndpointOptionModel option : model.getEndpointOptions()) {
+
+            // skip all @UriPath parameters as the endpoint DSL is for query
+            // parameters
+            if ("path".equals(option.getKind())) {
+                continue;
+            }
+
+            List<JavaClass> targets = evalTargetsToProcess(consumerClass, 
advancedConsumerClass, producerClass, advancedProducerClass, builderClass, 
advancedBuilderClass, option);
+
+            for (JavaClass target : targets) {
+                processTarget(option, target);
+            }
+        }
+    }
+
+    private void processTarget(EndpointOptionModel option, JavaClass target) {
+        if (target == null) {
+            return;
+        }
+
+        // basic description
+        String baseDesc = option.getDescription();
+        if (!Strings.isEmpty(baseDesc)) {
+            baseDesc = createBaseDesc(option, baseDesc);
+        }
+
+        boolean multiValued = option.isMultiValue();
+        if (multiValued) {
+            createMultivaluedDesc(option, target, baseDesc);
+        } else {
+            // regular option
+            createRegularDesc(option, target, baseDesc);
+        }
+    }
+
+    private void createRegularDesc(EndpointOptionModel option, JavaClass 
target, String baseDesc) {
+        String desc = baseDesc.replace("@@REPLACE_ME@@",
+                "\nThe option is a: <code>" + 
option.getJavaType().replace("<", "&lt;").replace(">", "&gt;")
+                                                         + "</code> type.");
+        desc = JavadocHelper.xmlEncode(desc);
+
+        Method fluent = 
target.addMethod().setDefault().setName(option.getName())
+                .setReturnType(new 
GenericType(loadClass(target.getCanonicalName())))
+                .addParameter(optionJavaType(option), option.getName())
+                .setBody("doSetProperty(\"" + option.getName() + "\", " + 
option.getName() + ");",
+                        "return this;\n");
+        if (option.isDeprecated()) {
+            fluent.addAnnotation(Deprecated.class);
+        }
+        String text = desc;
+        text += "\n\n@param " + option.getName() + " the value to set";
+        text += "\n@return the dsl builder\n";
+        fluent.getJavaDoc().setText(text);
+
+        if (!"String".equals(optionJavaType(option))) {
+            // regular option by String parameter variant
+            desc = baseDesc.replace("@@REPLACE_ME@@",
+                    "\nThe option will be converted to a <code>"
+                                                      + 
option.getJavaType().replace("<", "&lt;").replace(">",
+                                                              "&gt;")
+                                                      + "</code> type.");
+            desc = JavadocHelper.xmlEncode(desc);
+
+            fluent = target.addMethod().setDefault().setName(option.getName())
+                    .setReturnType(new 
GenericType(loadClass(target.getCanonicalName())))
+                    .addParameter(new GenericType(String.class), 
option.getName())
+                    .setBody("doSetProperty(\"" + option.getName() + "\", " + 
option.getName() + ");",
+                            "return this;\n");
+            if (option.isDeprecated()) {
+                fluent.addAnnotation(Deprecated.class);
+            }
+            text = desc;
+            text += "\n\n@param " + option.getName() + " the value to set";
+            text += "\n@return the dsl builder\n";
+            fluent.getJavaDoc().setText(text);
+        }
+    }
+
+    private void createMultivaluedDesc(EndpointOptionModel option, JavaClass 
target, String baseDesc) {
+        // multi value option that takes one value
+        String desc = baseDesc.replace("@@REPLACE_ME@@",
+                "\nThe option is a: <code>" + 
option.getJavaType().replace("<", "&lt;").replace(">", "&gt;")
+                                                         + "</code> type.");
+        desc = JavadocHelper.xmlEncode(desc);
+
+        Method fluent = 
target.addMethod().setDefault().setName(option.getName())
+                .setReturnType(new 
GenericType(loadClass(target.getCanonicalName())))
+                .addParameter(new GenericType(String.class), "key")
+                .addParameter(new GenericType(Object.class), "value")
+                .setBody("doSetMultiValueProperty(\"" + option.getName() + 
"\", \"" + option.getPrefix()
+                         + "\" + key, value);",
+                        "return this;\n");
+        if (option.isDeprecated()) {
+            fluent.addAnnotation(Deprecated.class);
+        }
+
+        String text = desc;
+        text += "\n\n@param key the option key";
+        text += "\n@param value the option value";
+        text += "\n@return the dsl builder\n";
+        fluent.getJavaDoc().setText(text);
+        // add multi value method that takes a Map
+        fluent = target.addMethod().setDefault().setName(option.getName())
+                .setReturnType(new 
GenericType(loadClass(target.getCanonicalName())))
+                .addParameter(new GenericType(Map.class), "values")
+                .setBody("doSetMultiValueProperties(\"" + option.getName() + 
"\", \"" + option.getPrefix()
+                         + "\", values);",
+                        "return this;\n");
+        if (option.isDeprecated()) {
+            fluent.addAnnotation(Deprecated.class);
+        }
+        text = desc;
+        text += "\n\n@param values the values";
+        text += "\n@return the dsl builder\n";
+        fluent.getJavaDoc().setText(text);
+    }
+
+    private String createBaseDesc(EndpointOptionModel option, String baseDesc) 
{
+        // must xml encode description as in some rare cases it contains & 
chars which is invalid javadoc
+        baseDesc = JavadocHelper.xmlEncode(baseDesc);
+
+        if (!baseDesc.endsWith(".")) {
+            baseDesc += ".";
+        }
+        baseDesc += "\n";
+        baseDesc += "@@REPLACE_ME@@";
+        if (option.isMultiValue()) {
+            baseDesc += "\nThe option is multivalued, and you can use the " + 
option.getName()
+                        + "(String, Object) method to add a value (call the 
method multiple times to set more values).";
+        }
+        baseDesc += "\n";
+        // the Endpoint DSL currently requires to provide the entire
+        // context-path and not as individual options
+        // so lets only mark query parameters that are required as
+        // required
+        if ("parameter".equals(option.getKind()) && option.isRequired()) {
+            baseDesc += "\nRequired: true";
+        }
+        // include default value (if any)
+        if (option.getDefaultValue() != null) {
+            // must xml encode default value so its valid as javadoc
+            String value = 
JavadocHelper.xmlEncode(option.getDefaultValue().toString());
+            baseDesc += "\nDefault: " + value;
+        }
+        baseDesc += "\nGroup: " + option.getGroup();
+        return baseDesc;
+    }
+
+    private List<JavaClass> evalTargetsToProcess(JavaClass consumerClass, 
JavaClass advancedConsumerClass, JavaClass producerClass, JavaClass 
advancedProducerClass, JavaClass builderClass, JavaClass advancedBuilderClass, 
EndpointOptionModel option) {
+        List<JavaClass> targets = new ArrayList<>();
+        String label = option.getLabel() != null ? option.getLabel() : "";
+        if (label != null) {
+            if (label.contains("producer")) {
+                if (label.contains("advanced")) {
+                    targets.add(advancedProducerClass != null ? 
advancedProducerClass : advancedBuilderClass);
+                } else {
+                    targets.add(producerClass != null ? producerClass : 
builderClass);
+                }
+            } else if (label.contains("consumer")) {
+                if (label.contains("advanced")) {
+                    targets.add(advancedConsumerClass != null ? 
advancedConsumerClass : advancedBuilderClass);
+                } else {
+                    targets.add(consumerClass != null ? consumerClass : 
builderClass);
+                }
+            } else {
+                if (label.contains("advanced")) {
+                    targets.add(advancedConsumerClass);
+                    targets.add(advancedProducerClass);
+                    targets.add(advancedBuilderClass);
+                } else {
+                    targets.add(consumerClass);
+                    targets.add(producerClass);
+                    targets.add(builderClass);
                 }
+            }
+        }
+        return targets;
+    }
 
-                firstAlias = false;
+    private boolean hasAdvancedCheck(ComponentModel model) {
+        for (EndpointOptionModel option : model.getEndpointOptions()) {
+            if (option.getLabel() != null && 
option.getLabel().contains("advanced")) {
+                return true;
             }
         }
 
-        return writeSourceIfChanged(javaClass, 
componentsFactoriesPackageName.replace('.', '/'), builderName + "Factory.java",
-                false);
+        return false;
+    }
+
+    private JavaClass createJavaClass(String builderName) {
+        final JavaClass javaClass = new JavaClass(getProjectClassLoader());
+        javaClass.setPackage(componentsFactoriesPackageName);
+        javaClass.setName(builderName + "Factory");
+        javaClass.setClass(false);
+        javaClass.addImport("java.util.*");
+        javaClass.addImport("java.util.concurrent.*");
+        javaClass.addImport("java.util.function.*");
+        javaClass.addImport("java.util.stream.*");
+        
javaClass.addImport("org.apache.camel.builder.EndpointConsumerBuilder");
+        
javaClass.addImport("org.apache.camel.builder.EndpointProducerBuilder");
+        
javaClass.addImport("org.apache.camel.builder.endpoint.AbstractEndpointBuilder");
+        return javaClass;
     }
 
     private static String optionJavaType(EndpointOptionModel option) {

Reply via email to