You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by gn...@apache.org on 2020/01/29 09:04:51 UTC

[camel-spring-boot] 01/02: [CAMEL-14437] Fix the spring boot starters generation

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

gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-spring-boot.git

commit fef900c3b3aeb5f4667ff7f0f8e3dd2bb39c9407
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Wed Jan 29 10:03:13 2020 +0100

    [CAMEL-14437] Fix the spring boot starters generation
---
 tooling/camel-spring-boot-dependencies/pom.xml     |  10 +
 .../pom.xml                                        |   5 +
 .../maven/SpringBootAutoConfigurationMojo.java     | 331 ++++++---------------
 ...pdateSpringBootAutoConfigurationReadmeMojo.java |   4 +-
 .../model/SpringBootAutoConfigureOptionModel.java  |  93 ++++++
 .../springboot/maven/model/SpringBootModel.java    |  60 ++++
 6 files changed, 264 insertions(+), 239 deletions(-)

diff --git a/tooling/camel-spring-boot-dependencies/pom.xml b/tooling/camel-spring-boot-dependencies/pom.xml
index 8c942cc..4850215 100644
--- a/tooling/camel-spring-boot-dependencies/pom.xml
+++ b/tooling/camel-spring-boot-dependencies/pom.xml
@@ -1797,6 +1797,11 @@
         <version>${project.version}</version>
       </dependency>
       <dependency>
+        <groupId>org.apache.camel.springboot</groupId>
+        <artifactId>target</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
         <groupId>org.apache.camel.tests</groupId>
         <artifactId>org.apache.camel.tests.mock-javamail_1.7</artifactId>
         <version>3.1.0-SNAPSHOT</version>
@@ -3475,6 +3480,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-tooling-model</artifactId>
+        <version>3.1.0-SNAPSHOT</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-tooling-util</artifactId>
         <version>3.1.0-SNAPSHOT</version>
       </dependency>
diff --git a/tooling/camel-spring-boot-generator-maven-plugin/pom.xml b/tooling/camel-spring-boot-generator-maven-plugin/pom.xml
index 208d253..a5e677e 100644
--- a/tooling/camel-spring-boot-generator-maven-plugin/pom.xml
+++ b/tooling/camel-spring-boot-generator-maven-plugin/pom.xml
@@ -59,6 +59,11 @@
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
+            <artifactId>camel-tooling-model</artifactId>
+            <version>${camel-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
             <artifactId>bom-generator-maven-plugin</artifactId>
             <version>${camel-version}</version>
         </dependency>
diff --git a/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/SpringBootAutoConfigurationMojo.java b/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/SpringBootAutoConfigurationMojo.java
index 4436bde..a202cdd 100644
--- a/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/SpringBootAutoConfigurationMojo.java
+++ b/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/SpringBootAutoConfigurationMojo.java
@@ -25,6 +25,7 @@ import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -46,19 +47,19 @@ import javax.annotation.Generated;
 import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.maven.packaging.AbstractGeneratorMojo;
-import org.apache.camel.maven.packaging.model.ComponentModel;
-import org.apache.camel.maven.packaging.model.ComponentOptionModel;
-import org.apache.camel.maven.packaging.model.DataFormatModel;
-import org.apache.camel.maven.packaging.model.DataFormatOptionModel;
-import org.apache.camel.maven.packaging.model.EndpointOptionModel;
-import org.apache.camel.maven.packaging.model.LanguageModel;
-import org.apache.camel.maven.packaging.model.LanguageOptionModel;
-import org.apache.camel.maven.packaging.model.OtherModel;
-import org.apache.camel.maven.packaging.model.OtherOptionModel;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriPath;
-import org.apache.camel.tooling.util.JSonSchemaHelper;
+import org.apache.camel.tooling.model.ComponentModel;
+import org.apache.camel.tooling.model.ComponentModel.ComponentOptionModel;
+import org.apache.camel.tooling.model.ComponentModel.EndpointOptionModel;
+import org.apache.camel.tooling.model.DataFormatModel;
+import org.apache.camel.tooling.model.DataFormatModel.DataFormatOptionModel;
+import org.apache.camel.tooling.model.EipModel;
+import org.apache.camel.tooling.model.EipModel.EipOptionModel;
+import org.apache.camel.tooling.model.JsonMapper;
+import org.apache.camel.tooling.model.LanguageModel;
+import org.apache.camel.tooling.model.LanguageModel.LanguageOptionModel;
 import org.apache.camel.tooling.util.PackageHelper;
 import org.apache.camel.tooling.util.srcgen.Annotation;
 import org.apache.camel.tooling.util.srcgen.GenericType;
@@ -202,92 +203,92 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
         // Hystrix
         json = loadModelJson(files, "hystrixConfiguration");
         if (json != null) {
-            OtherModel model = generateOtherModel(json);
+            EipModel model = JsonMapper.generateEipModel(json);
 
             int pos = model.getJavaType().lastIndexOf(".");
             String pkg = model.getJavaType().substring(0, pos) + ".springboot";
 
             // Generate properties, auto-configuration for camel-core-starter
-            createOtherModelConfigurationSource(pkg, model, "camel.hystrix", true);
+            createEipModelConfigurationSource(pkg, model, "camel.hystrix", true);
         }
 
         // Resilience4j
         json = loadModelJson(files, "resilience4jConfiguration");
         if (json != null) {
-            OtherModel model = generateOtherModel(json);
+            EipModel model = JsonMapper.generateEipModel(json);
 
             int pos = model.getJavaType().lastIndexOf(".");
             String pkg = model.getJavaType().substring(0, pos) + ".springboot";
 
             // Generate properties, auto-configuration for camel-core-starter
-            createOtherModelConfigurationSource(pkg, model, "camel.resilience4j", true);
+            createEipModelConfigurationSource(pkg, model, "camel.resilience4j", true);
         }
 
         // Consul
         json = loadModelJson(files, "consulServiceDiscovery");
         if (json != null) {
-            OtherModel model = generateOtherModel(json);
+            EipModel model = JsonMapper.generateEipModel(json);
 
             int pos = model.getJavaType().lastIndexOf(".");
             String pkg = model.getJavaType().substring(0, pos) + ".springboot";
 
             // Generate properties, auto-configuration for camel-core-starter
-            createOtherModelConfigurationSource(pkg, model, "camel.cloud.consul.service-discovery", true);
+            createEipModelConfigurationSource(pkg, model, "camel.cloud.consul.service-discovery", true);
         }
 
         // DNS
         json = loadModelJson(files, "dnsServiceDiscovery");
         if (json != null) {
-            OtherModel model = generateOtherModel(json);
+            EipModel model = JsonMapper.generateEipModel(json);
 
             int pos = model.getJavaType().lastIndexOf(".");
             String pkg = model.getJavaType().substring(0, pos) + ".springboot";
 
             // Generate properties, auto-configuration for camel-core-starter
-            createOtherModelConfigurationSource(pkg, model, "camel.cloud.dns.service-discovery", true);
+            createEipModelConfigurationSource(pkg, model, "camel.cloud.dns.service-discovery", true);
         }
 
         // Etcd
         json = loadModelJson(files, "etcdServiceDiscovery");
         if (json != null) {
-            OtherModel model = generateOtherModel(json);
+            EipModel model = JsonMapper.generateEipModel(json);
 
             int pos = model.getJavaType().lastIndexOf(".");
             String pkg = model.getJavaType().substring(0, pos) + ".springboot";
 
             // Generate properties, auto-configuration for camel-core-starter
-            createOtherModelConfigurationSource(pkg, model, "camel.cloud.etcd.service-discovery", true);
+            createEipModelConfigurationSource(pkg, model, "camel.cloud.etcd.service-discovery", true);
         }
 
         // Kubernetes
         json = loadModelJson(files, "kubernetesServiceDiscovery");
         if (json != null) {
-            OtherModel model = generateOtherModel(json);
+            EipModel model = JsonMapper.generateEipModel(json);
 
             int pos = model.getJavaType().lastIndexOf(".");
             String pkg = model.getJavaType().substring(0, pos) + ".springboot";
 
             // Generate properties, auto-configuration happens in
             // camel-kubernetes-starter
-            createOtherModelConfigurationSource(pkg, model, "camel.cloud.kubernetes.service-discovery", true);
+            createEipModelConfigurationSource(pkg, model, "camel.cloud.kubernetes.service-discovery", true);
         }
 
         // Ribbon
         json = loadModelJson(files, "ribbonLoadBalancer");
         if (json != null) {
-            OtherModel model = generateOtherModel(json);
+            EipModel model = JsonMapper.generateEipModel(json);
 
             int pos = model.getJavaType().lastIndexOf(".");
             String pkg = model.getJavaType().substring(0, pos) + ".springboot";
 
             // Generate properties, auto-configuration for camel-core-starter
-            createOtherModelConfigurationSource(pkg, model, "camel.cloud.ribbon.load-balancer", true);
+            createEipModelConfigurationSource(pkg, model, "camel.cloud.ribbon.load-balancer", true);
         }
 
         // Rest
         json = loadModelJson(files, "restConfiguration");
         if (json != null) {
-            OtherModel model = generateOtherModel(json);
+            EipModel model = JsonMapper.generateEipModel(json);
 
             int pos = model.getJavaType().lastIndexOf(".");
             String pkg = model.getJavaType().substring(0, pos) + ".springboot";
@@ -298,7 +299,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
         }
     }
 
-    private void createOtherModelConfigurationSource(String packageName, OtherModel model, String propertiesPrefix, boolean generatedNestedConfig) throws MojoFailureException {
+    private void createEipModelConfigurationSource(String packageName, EipModel model, String propertiesPrefix, boolean generatedNestedConfig) throws MojoFailureException {
         final int pos = model.getJavaType().lastIndexOf(".");
         final String commonName = model.getJavaType().substring(pos + 1) + (generatedNestedConfig ? "Common" : "Properties");
         final String configName = model.getJavaType().substring(pos + 1) + (generatedNestedConfig ? "Properties" : null);
@@ -315,7 +316,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
         commonClass.getJavaDoc().setFullText(doc);
         commonClass.addAnnotation(Generated.class).setStringValue("value", SpringBootAutoConfigurationMojo.class.getName());
 
-        for (OtherOptionModel option : model.getOptions()) {
+        for (EipOptionModel option : model.getOptions()) {
             String type = option.getJavaType();
             String name = option.getName();
 
@@ -333,16 +334,17 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
             if (!Strings.isBlank(option.getDescription())) {
                 prop.getField().getJavaDoc().setFullText(option.getDescription());
             }
-            if (!Strings.isBlank(option.getDefaultValue())) {
+            if (!isBlank(option.getDefaultValue())) {
                 if ("java.lang.String".equals(type)) {
-                    prop.getField().setStringInitializer(option.getDefaultValue());
+                    prop.getField().setStringInitializer(option.getDefaultValue().toString());
                 } else if ("long".equals(type) || "java.lang.Long".equals(type)) {
                     // the value should be a Long number
                     String value = option.getDefaultValue() + "L";
                     prop.getField().setLiteralInitializer(value);
-                } else if ("integer".equals(option.getType()) || "boolean".equals(option.getType())) {
-                    prop.getField().setLiteralInitializer(option.getDefaultValue());
-                } else if (!Strings.isBlank(option.getEnums())) {
+                } else if ("integer".equals(option.getType()) || "java.lang.Integer".equals(option.getJavaType())
+                        || "boolean".equals(option.getType()) || "java.lang.Boolean".equals(option.getJavaType())) {
+                    prop.getField().setLiteralInitializer(option.getDefaultValue().toString());
+                } else if (!isBlank(option.getEnums())) {
                     String enumShortName = type.substring(type.lastIndexOf(".") + 1);
                     prop.getField().setLiteralInitializer(enumShortName + "." + option.getDefaultValue());
                     commonClass.addImport(model.getJavaType());
@@ -395,7 +397,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
         }
     }
 
-    private void createRestConfigurationSource(String packageName, OtherModel model, String propertiesPrefix) throws MojoFailureException {
+    private void createRestConfigurationSource(String packageName, EipModel model, String propertiesPrefix) throws MojoFailureException {
         final int pos = model.getJavaType().lastIndexOf(".");
         final String className = model.getJavaType().substring(pos + 1) + "Properties";
 
@@ -414,7 +416,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
         }
         javaClass.getJavaDoc().setFullText(doc);
 
-        for (OtherOptionModel option : model.getOptions()) {
+        for (EipOptionModel option : model.getOptions()) {
             String type = option.getJavaType();
             String name = option.getName();
 
@@ -439,16 +441,17 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
             if (!Strings.isBlank(option.getDescription())) {
                 prop.getField().getJavaDoc().setFullText(option.getDescription());
             }
-            if (!Strings.isBlank(option.getDefaultValue())) {
+            if (!isBlank(option.getDefaultValue())) {
                 if ("java.lang.String".equals(type)) {
-                    prop.getField().setStringInitializer(option.getDefaultValue());
+                    prop.getField().setStringInitializer(option.getDefaultValue().toString());
                 } else if ("long".equals(type) || "java.lang.Long".equals(type)) {
                     // the value should be a Long number
                     String value = option.getDefaultValue() + "L";
                     prop.getField().setLiteralInitializer(value);
-                } else if ("integer".equals(option.getType()) || "boolean".equals(option.getType())) {
-                    prop.getField().setLiteralInitializer(option.getDefaultValue());
-                } else if (!Strings.isBlank(option.getEnums())) {
+                } else if ("integer".equals(option.getType()) || "java.lang.Integer".equals(option.getJavaType())
+                        || "boolean".equals(option.getType()) || "java.lang.Boolean".equals(option.getJavaType())) {
+                    prop.getField().setLiteralInitializer(option.getDefaultValue().toString());
+                } else if (!isBlank(option.getEnums())) {
                     String enumShortName = type.substring(type.lastIndexOf(".") + 1);
                     prop.getField().setLiteralInitializer(enumShortName + "." + option.getDefaultValue());
                     javaClass.addImport(model.getJavaType());
@@ -460,7 +463,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
         writeSourceIfChanged(javaClass, fileName, true);
     }
 
-    private void createRestModuleAutoConfigurationSource(String packageName, OtherModel model) throws MojoFailureException {
+    private void createRestModuleAutoConfigurationSource(String packageName, EipModel model) throws MojoFailureException {
         final JavaClass javaClass = new JavaClass(getProjectClassLoader());
         final int pos = model.getJavaType().lastIndexOf(".");
         final String name = model.getJavaType().substring(pos + 1) + "AutoConfiguration";
@@ -540,7 +543,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
             for (String componentName : componentNames) {
                 String json = loadComponentJson(jsonFiles, componentName);
                 if (json != null) {
-                    ComponentModel model = generateComponentModel(componentName, json);
+                    ComponentModel model = JsonMapper.generateComponentModel(json);
                     allModels.add(model);
                 }
             }
@@ -583,7 +586,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
             for (String dataFormatName : dataFormatNames) {
                 String json = loadDataFormatJson(jsonFiles, dataFormatName);
                 if (json != null) {
-                    DataFormatModel model = generateDataFormatModel(dataFormatName, json);
+                    DataFormatModel model = JsonMapper.generateDataFormatModel(json);
                     allModels.add(model);
                 }
             }
@@ -627,7 +630,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
             for (String languageName : languageNames) {
                 String json = loadLanguageJson(jsonFiles, languageName);
                 if (json != null) {
-                    LanguageModel model = generateLanguageModel(languageName, json);
+                    LanguageModel model = JsonMapper.generateLanguageModel(json);
                     allModels.add(model);
                 }
             }
@@ -718,7 +721,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
             // and therefore there is no problem, eg
             // camel.component.jdbc.data-source = myDataSource
             // where the type would have been javax.sql.DataSource
-            boolean complex = isComplexType(option) && !isNestedProperty && Strings.isBlank(option.getEnums());
+            boolean complex = isComplexType(option) && !isNestedProperty && isBlank(option.getEnums());
             if (complex) {
                 // force to use a string type
                 type = "java.lang.String";
@@ -731,14 +734,14 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
 
             Property prop = javaClass.addProperty(type, option.getName());
             if (ADD_NESTED_CONFIGURATION_PROPERTY) {
-                if (!type.endsWith(INNER_TYPE_SUFFIX) && type.indexOf('[') == -1 && INCLUDE_INNER_PATTERN.matcher(type).matches() && Strings.isBlank(option.getEnums())
+                if (!type.endsWith(INNER_TYPE_SUFFIX) && type.indexOf('[') == -1 && INCLUDE_INNER_PATTERN.matcher(type).matches() && isBlank(option.getEnums())
                     && (javaClassSource == null || (javaClassSource.isClass() && !javaClassSource.isAbstract()))) {
                     // add nested configuration annotation for complex
                     // properties
                     prop.getField().addAnnotation(NestedConfigurationProperty.class);
                 }
             }
-            if ("true".equals(option.getDeprecated())) {
+            if (option.isDeprecated()) {
                 prop.getField().addAnnotation(Deprecated.class);
                 prop.getAccessor().addAnnotation(Deprecated.class);
                 prop.getMutator().addAnnotation(Deprecated.class);
@@ -756,16 +759,17 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
                 }
                 prop.getField().getJavaDoc().setFullText(desc);
             }
-            if (!Strings.isBlank(option.getDefaultValue())) {
+            if (!isBlank(option.getDefaultValue())) {
                 if ("java.lang.String".equals(option.getJavaType())) {
-                    prop.getField().setStringInitializer(option.getDefaultValue());
+                    prop.getField().setStringInitializer(option.getDefaultValue().toString());
                 } else if ("long".equals(option.getJavaType()) || "java.lang.Long".equals(option.getJavaType())) {
                     // the value should be a Long number
                     String value = option.getDefaultValue() + "L";
                     prop.getField().setLiteralInitializer(value);
-                } else if ("integer".equals(option.getType()) || "boolean".equals(option.getType())) {
-                    prop.getField().setLiteralInitializer(option.getDefaultValue());
-                } else if (!Strings.isBlank(option.getEnums())) {
+                } else if ("integer".equals(option.getType()) || "java.lang.Integer".equals(option.getJavaType())
+                        || "boolean".equals(option.getType()) || "java.lang.Boolean".equals(option.getJavaType())) {
+                    prop.getField().setLiteralInitializer(option.getDefaultValue().toString());
+                } else if (!isBlank(option.getEnums())) {
                     String enumShortName = type.substring(type.lastIndexOf(".") + 1);
                     prop.getField().setLiteralInitializer(enumShortName + "." + option.getDefaultValue());
                     javaClass.addImport(model.getJavaType());
@@ -779,6 +783,16 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
         writeSourceIfChanged(javaClass, fileName, true);
     }
 
+    private boolean isBlank(Object value) {
+        if (value instanceof String) {
+            return "".equals(value);
+        } else if (value instanceof Collection) {
+            return ((Collection) value).isEmpty();
+        } else {
+            return value == null;
+        }
+    }
+
     private void createComponentConfigurationSourceInnerClass(JavaClass javaClass, Set<JavaClass> nestedTypes, ComponentModel model) throws MojoFailureException {
         // add inner classes for nested AutoConfiguration options
         for (JavaClass nestedType : nestedTypes) {
@@ -895,9 +909,10 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
                     fileName = fileName.replace('.', '/');
                     File jsonFile = new File(classesDir, fileName + "/" + model.getScheme() + ".json");
                     if (jsonFile.isFile() && jsonFile.exists()) {
+                        /*
                         try {
                             String json = FileUtils.readFileToString(jsonFile, StandardCharsets.UTF_8);
-                            List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("properties", json, true);
+                            ComponentModel model = JsonMapper.generateComponentModel(json);
 
                             // grab name from annotation
                             String optionName;
@@ -911,6 +926,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
                             }
 
                             if (optionName != null) {
+                                model.get
                                 javaType = JSonSchemaHelper.getPropertyJavaType(rows, optionName);
                                 type = JSonSchemaHelper.getPropertyType(rows, optionName);
                                 defaultValue = JSonSchemaHelper.getPropertyDefaultValue(rows, optionName);
@@ -923,6 +939,8 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
                         } catch (IOException e) {
                             // ignore
                         }
+                        */
+                        throw new UnsupportedOperationException();
                     }
 
                     if (!Strings.isBlank(defaultValue)) {
@@ -1000,7 +1018,8 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
         return properties;
     }
 
-    private String asLiteralDefault(GenericType type, String defaultValue) {
+    private String asLiteralDefault(GenericType type, Object dv) {
+        String defaultValue = dv != null ? dv.toString() : null;
         if (defaultValue != null && !defaultValue.isEmpty()) {
             if (type.getRawClass() == String.class) {
                 return Annotation.quote(defaultValue);
@@ -1299,11 +1318,12 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
         javaClass.addAnnotation(Generated.class).setStringValue("value", SpringBootAutoConfigurationMojo.class.getName());
         javaClass.addAnnotation("org.springframework.boot.context.properties.ConfigurationProperties").setStringValue("prefix", prefix);
 
-        for (DataFormatOptionModel option : model.getDataFormatOptions()) {
+        for (DataFormatOptionModel option : model.getOptions()) {
             // skip option with name id in data format as we do not need that
             if ("id".equals(option.getName())) {
                 continue;
             }
+            Object defaultValue = option.getDefaultValue();
             String type = option.getJavaType();
             type = getSimpleJavaType(type);
 
@@ -1311,6 +1331,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
             if ("org.apache.camel.model.dataformat.BindyType".equals(option.getJavaType())) {
                 // force to use a string type
                 type = "java.lang.String";
+                defaultValue = null;
             } else if (option.getJavaType().contains("org.apache.camel.model.dataformat")) {
                 // skip options that are from the model as they are not possible to configure anyway
                 continue;
@@ -1325,14 +1346,14 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
             // and therefore there is no problem, eg
             // camel.component.jdbc.data-source = myDataSource
             // where the type would have been javax.sql.DataSource
-            boolean complex = isComplexType(option) && Strings.isBlank(option.getEnumValues());
+            boolean complex = isComplexType(option) && isBlank(option.getEnums());
             if (complex) {
                 // force to use a string type
                 type = "java.lang.String";
             }
 
             Property prop = javaClass.addProperty(type, option.getName());
-            if ("true".equals(option.getDeprecated())) {
+            if (option.isDeprecated()) {
                 prop.getField().addAnnotation(Deprecated.class);
                 prop.getAccessor().addAnnotation(Deprecated.class);
                 prop.getMutator().addAnnotation(Deprecated.class);
@@ -1350,18 +1371,19 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
                 }
                 prop.getField().getJavaDoc().setFullText(desc);
             }
-            if (!Strings.isBlank(option.getDefaultValue())) {
+            if (!isBlank(defaultValue)) {
                 if ("java.lang.String".equals(option.getJavaType())) {
-                    prop.getField().setStringInitializer(option.getDefaultValue());
+                    prop.getField().setStringInitializer(defaultValue.toString());
                 } else if ("long".equals(option.getJavaType()) || "java.lang.Long".equals(option.getJavaType())) {
                     // the value should be a Long number
-                    String value = option.getDefaultValue() + "L";
+                    String value = defaultValue + "L";
                     prop.getField().setLiteralInitializer(value);
-                } else if ("integer".equals(option.getType()) || "boolean".equals(option.getType())) {
-                    prop.getField().setLiteralInitializer(option.getDefaultValue());
-                } else if (!Strings.isBlank(option.getEnumValues())) {
+                } else if ("integer".equals(option.getType()) || "java.lang.Integer".equals(option.getJavaType())
+                        || "boolean".equals(option.getType()) || "java.lang.Boolean".equals(option.getJavaType())) {
+                    prop.getField().setLiteralInitializer(defaultValue.toString());
+                } else if (!isBlank(option.getEnums())) {
                     String enumShortName = type.substring(type.lastIndexOf(".") + 1);
-                    prop.getField().setLiteralInitializer(enumShortName + "." + option.getDefaultValue());
+                    prop.getField().setLiteralInitializer(enumShortName + "." + defaultValue);
                     javaClass.addImport(model.getJavaType());
                 }
             }
@@ -1400,7 +1422,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
         javaClass.addAnnotation(Generated.class).setStringValue("value", SpringBootAutoConfigurationMojo.class.getName());
         javaClass.addAnnotation("org.springframework.boot.context.properties.ConfigurationProperties").setStringValue("prefix", prefix);
 
-        for (LanguageOptionModel option : model.getLanguageOptions()) {
+        for (LanguageOptionModel option : model.getOptions()) {
             // skip option with name id, or expression in language as we do not
             // need that and skip resultType as they are not global options
             if ("id".equals(option.getName()) || "expression".equals(option.getName()) || "resultType".equals(option.getName())) {
@@ -1448,14 +1470,14 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
             // and therefore there is no problem, eg
             // camel.component.jdbc.data-source = myDataSource
             // where the type would have been javax.sql.DataSource
-            boolean complex = isComplexType(option) && Strings.isBlank(option.getEnumValues());
+            boolean complex = isComplexType(option) && isBlank(option.getEnums());
             if (complex) {
                 // force to use a string type
                 type = "java.lang.String";
             }
 
             Property prop = javaClass.addProperty(type, option.getName());
-            if ("true".equals(option.getDeprecated())) {
+            if (option.isDeprecated()) {
                 prop.getField().addAnnotation(Deprecated.class);
                 prop.getAccessor().addAnnotation(Deprecated.class);
                 prop.getMutator().addAnnotation(Deprecated.class);
@@ -1473,16 +1495,17 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
                 }
                 prop.getField().getJavaDoc().setFullText(desc);
             }
-            if (!Strings.isBlank(option.getDefaultValue())) {
+            if (!isBlank(option.getDefaultValue())) {
                 if ("java.lang.String".equals(option.getJavaType())) {
-                    prop.getField().setStringInitializer(option.getDefaultValue());
+                    prop.getField().setStringInitializer(option.getDefaultValue().toString());
                 } else if ("long".equals(option.getJavaType()) || "java.lang.Long".equals(option.getJavaType())) {
                     // the value should be a Long number
                     String value = option.getDefaultValue() + "L";
                     prop.getField().setLiteralInitializer(value);
-                } else if ("integer".equals(option.getType()) || "boolean".equals(option.getType())) {
-                    prop.getField().setLiteralInitializer(option.getDefaultValue());
-                } else if (!Strings.isBlank(option.getEnumValues())) {
+                } else if ("integer".equals(option.getType()) || "java.lang.Integer".equals(option.getJavaType())
+                        || "boolean".equals(option.getType()) || "java.lang.Boolean".equals(option.getJavaType())) {
+                    prop.getField().setLiteralInitializer(option.getDefaultValue().toString());
+                } else if (isBlank(option.getEnums())) {
                     String enumShortName = type.substring(type.lastIndexOf(".") + 1);
                     prop.getField().setLiteralInitializer(enumShortName + "." + option.getDefaultValue());
                     javaClass.addImport(model.getJavaType());
@@ -1872,172 +1895,6 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
         // do nothing, as imports are sorted automatically when displayed
     }
 
-    private static ComponentModel generateComponentModel(String componentName, String json) {
-        List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("component", json, false);
-
-        ComponentModel component = new ComponentModel();
-        component.setScheme(JSonSchemaHelper.getSafeValue("scheme", rows));
-        component.setSyntax(JSonSchemaHelper.getSafeValue("syntax", rows));
-        component.setAlternativeSyntax(JSonSchemaHelper.getSafeValue("alternativeSyntax", rows));
-        component.setTitle(JSonSchemaHelper.getSafeValue("title", rows));
-        component.setDescription(JSonSchemaHelper.getSafeValue("description", rows));
-        component.setFirstVersion(JSonSchemaHelper.getSafeValue("firstVersion", rows));
-        component.setLabel(JSonSchemaHelper.getSafeValue("label", rows));
-        component.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", rows));
-        component.setDeprecationNote(JSonSchemaHelper.getSafeValue("deprecationNote", rows));
-        component.setConsumerOnly(JSonSchemaHelper.getSafeValue("consumerOnly", rows));
-        component.setProducerOnly(JSonSchemaHelper.getSafeValue("producerOnly", rows));
-        component.setJavaType(JSonSchemaHelper.getSafeValue("javaType", rows));
-        component.setGroupId(JSonSchemaHelper.getSafeValue("groupId", rows));
-        component.setArtifactId(JSonSchemaHelper.getSafeValue("artifactId", rows));
-        component.setVersion(JSonSchemaHelper.getSafeValue("version", rows));
-
-        rows = JSonSchemaHelper.parseJsonSchema("componentProperties", json, true);
-        for (Map<String, String> row : rows) {
-            ComponentOptionModel option = new ComponentOptionModel();
-            option.setName(JSonSchemaHelper.getSafeValue("name", row));
-            option.setDisplayName(JSonSchemaHelper.getSafeValue("displayName", row));
-            option.setKind(JSonSchemaHelper.getSafeValue("kind", row));
-            option.setType(JSonSchemaHelper.getSafeValue("type", row));
-            option.setJavaType(JSonSchemaHelper.getSafeValue("javaType", row));
-            option.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", row));
-            option.setDeprecationNote(JSonSchemaHelper.getSafeValue("deprecationNote", row));
-            option.setDescription(JSonSchemaHelper.getSafeValue("description", row));
-            option.setDefaultValue(JSonSchemaHelper.getSafeValue("defaultValue", row));
-            option.setEnums(JSonSchemaHelper.getSafeValue("enum", row));
-            component.addComponentOption(option);
-        }
-
-        rows = JSonSchemaHelper.parseJsonSchema("properties", json, true);
-        for (Map<String, String> row : rows) {
-            EndpointOptionModel option = new EndpointOptionModel();
-            option.setName(JSonSchemaHelper.getSafeValue("name", row));
-            option.setDisplayName(JSonSchemaHelper.getSafeValue("displayName", row));
-            option.setKind(JSonSchemaHelper.getSafeValue("kind", row));
-            option.setGroup(JSonSchemaHelper.getSafeValue("group", row));
-            option.setRequired(JSonSchemaHelper.getSafeValue("required", row));
-            option.setType(JSonSchemaHelper.getSafeValue("type", row));
-            option.setJavaType(JSonSchemaHelper.getSafeValue("javaType", row));
-            option.setEnums(JSonSchemaHelper.getSafeValue("enum", row));
-            option.setPrefix(JSonSchemaHelper.getSafeValue("prefix", row));
-            option.setMultiValue(JSonSchemaHelper.getSafeValue("multiValue", row));
-            option.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", row));
-            option.setDeprecationNote(JSonSchemaHelper.getSafeValue("deprecationNote", row));
-            option.setDefaultValue(JSonSchemaHelper.getSafeValue("defaultValue", row));
-            option.setDescription(JSonSchemaHelper.getSafeValue("description", row));
-            option.setEnumValues(JSonSchemaHelper.getSafeValue("enum", row));
-            component.addEndpointOption(option);
-        }
-
-        return component;
-    }
-
-    private static DataFormatModel generateDataFormatModel(String dataFormatName, String json) {
-        List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("dataformat", json, false);
-
-        DataFormatModel dataFormat = new DataFormatModel();
-        dataFormat.setTitle(JSonSchemaHelper.getSafeValue("title", rows));
-        dataFormat.setName(JSonSchemaHelper.getSafeValue("name", rows));
-        dataFormat.setModelName(JSonSchemaHelper.getSafeValue("modelName", rows));
-        dataFormat.setDescription(JSonSchemaHelper.getSafeValue("description", rows));
-        dataFormat.setFirstVersion(JSonSchemaHelper.getSafeValue("firstVersion", rows));
-        dataFormat.setLabel(JSonSchemaHelper.getSafeValue("label", rows));
-        dataFormat.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", rows));
-        dataFormat.setDeprecationNote(JSonSchemaHelper.getSafeValue("deprecationNote", rows));
-        dataFormat.setJavaType(JSonSchemaHelper.getSafeValue("javaType", rows));
-        dataFormat.setGroupId(JSonSchemaHelper.getSafeValue("groupId", rows));
-        dataFormat.setArtifactId(JSonSchemaHelper.getSafeValue("artifactId", rows));
-        dataFormat.setVersion(JSonSchemaHelper.getSafeValue("version", rows));
-
-        rows = JSonSchemaHelper.parseJsonSchema("properties", json, true);
-        for (Map<String, String> row : rows) {
-            DataFormatOptionModel option = new DataFormatOptionModel();
-            option.setName(JSonSchemaHelper.getSafeValue("name", row));
-            option.setDisplayName(JSonSchemaHelper.getSafeValue("displayName", row));
-            option.setKind(JSonSchemaHelper.getSafeValue("kind", row));
-            option.setType(JSonSchemaHelper.getSafeValue("type", row));
-            option.setJavaType(JSonSchemaHelper.getSafeValue("javaType", row));
-            option.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", row));
-            option.setDeprecationNote(JSonSchemaHelper.getSafeValue("deprecationNote", row));
-            option.setDescription(JSonSchemaHelper.getSafeValue("description", row));
-            option.setDefaultValue(JSonSchemaHelper.getSafeValue("defaultValue", row));
-            option.setEnumValues(JSonSchemaHelper.getSafeValue("enum", row));
-            dataFormat.addDataFormatOption(option);
-        }
-
-        return dataFormat;
-    }
-
-    private static LanguageModel generateLanguageModel(String languageName, String json) {
-        List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("language", json, false);
-
-        LanguageModel language = new LanguageModel();
-        language.setTitle(JSonSchemaHelper.getSafeValue("title", rows));
-        language.setName(JSonSchemaHelper.getSafeValue("name", rows));
-        language.setModelName(JSonSchemaHelper.getSafeValue("modelName", rows));
-        language.setDescription(JSonSchemaHelper.getSafeValue("description", rows));
-        language.setFirstVersion(JSonSchemaHelper.getSafeValue("firstVersion", rows));
-        language.setLabel(JSonSchemaHelper.getSafeValue("label", rows));
-        language.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", rows));
-        language.setDeprecationNote(JSonSchemaHelper.getSafeValue("deprecationNote", rows));
-        language.setJavaType(JSonSchemaHelper.getSafeValue("javaType", rows));
-        language.setGroupId(JSonSchemaHelper.getSafeValue("groupId", rows));
-        language.setArtifactId(JSonSchemaHelper.getSafeValue("artifactId", rows));
-        language.setVersion(JSonSchemaHelper.getSafeValue("version", rows));
-
-        rows = JSonSchemaHelper.parseJsonSchema("properties", json, true);
-        for (Map<String, String> row : rows) {
-            LanguageOptionModel option = new LanguageOptionModel();
-            option.setName(JSonSchemaHelper.getSafeValue("name", row));
-            option.setDisplayName(JSonSchemaHelper.getSafeValue("displayName", row));
-            option.setKind(JSonSchemaHelper.getSafeValue("kind", row));
-            option.setType(JSonSchemaHelper.getSafeValue("type", row));
-            option.setJavaType(JSonSchemaHelper.getSafeValue("javaType", row));
-            option.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", row));
-            option.setDeprecationNote(JSonSchemaHelper.getSafeValue("deprecationNote", row));
-            option.setDescription(JSonSchemaHelper.getSafeValue("description", row));
-            option.setDefaultValue(JSonSchemaHelper.getSafeValue("defaultValue", row));
-            option.setEnumValues(JSonSchemaHelper.getSafeValue("enum", row));
-            language.addLanguageOption(option);
-        }
-
-        return language;
-    }
-
-    private OtherModel generateOtherModel(String json) {
-        List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("model", json, false);
-
-        OtherModel model = new OtherModel();
-        model.setName(JSonSchemaHelper.getSafeValue("name", rows));
-        model.setTitle(JSonSchemaHelper.getSafeValue("title", rows));
-        model.setDescription(JSonSchemaHelper.getSafeValue("description", rows));
-        model.setJavaType(JSonSchemaHelper.getSafeValue("javaType", rows));
-        model.setLabel(JSonSchemaHelper.getSafeValue("label", rows));
-        model.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", rows));
-        model.setDeprecationNote(JSonSchemaHelper.getSafeValue("deprecationNote", rows));
-
-        rows = JSonSchemaHelper.parseJsonSchema("properties", json, true);
-        for (Map<String, String> row : rows) {
-            OtherOptionModel option = new OtherOptionModel();
-            option.setName(JSonSchemaHelper.getSafeValue("name", row));
-            option.setDisplayName(JSonSchemaHelper.getSafeValue("displayName", row));
-            option.setKind(JSonSchemaHelper.getSafeValue("kind", row));
-            option.setGroup(JSonSchemaHelper.getSafeValue("group", row));
-            option.setRequired(JSonSchemaHelper.getSafeValue("required", row));
-            option.setType(JSonSchemaHelper.getSafeValue("type", row));
-            option.setJavaType(JSonSchemaHelper.getSafeValue("javaType", row));
-            option.setEnums(JSonSchemaHelper.getSafeValue("enum", row));
-            option.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", row));
-            option.setDeprecationNote(JSonSchemaHelper.getSafeValue("deprecationNote", row));
-            option.setDefaultValue(JSonSchemaHelper.getSafeValue("defaultValue", row));
-            option.setDescription(JSonSchemaHelper.getSafeValue("description", row));
-            option.setEnums(JSonSchemaHelper.getSafeValue("enums", row));
-
-            model.addOptionModel(option);
-        }
-
-        return model;
-    }
 
     private void findComponentNames(Set<String> componentNames) {
         componentJar.stream()
diff --git a/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/UpdateSpringBootAutoConfigurationReadmeMojo.java b/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/UpdateSpringBootAutoConfigurationReadmeMojo.java
index 19c545c..b6993d6 100644
--- a/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/UpdateSpringBootAutoConfigurationReadmeMojo.java
+++ b/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/UpdateSpringBootAutoConfigurationReadmeMojo.java
@@ -29,8 +29,8 @@ import java.util.Locale;
 import java.util.stream.Collectors;
 
 import org.apache.camel.maven.packaging.MvelHelper;
-import org.apache.camel.maven.packaging.model.SpringBootAutoConfigureOptionModel;
-import org.apache.camel.maven.packaging.model.SpringBootModel;
+import org.apache.camel.springboot.maven.model.SpringBootAutoConfigureOptionModel;
+import org.apache.camel.springboot.maven.model.SpringBootModel;
 import org.apache.camel.tooling.util.Strings;
 import org.apache.camel.util.json.DeserializationException;
 import org.apache.camel.util.json.JsonArray;
diff --git a/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/model/SpringBootAutoConfigureOptionModel.java b/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/model/SpringBootAutoConfigureOptionModel.java
new file mode 100644
index 0000000..ce62133
--- /dev/null
+++ b/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/model/SpringBootAutoConfigureOptionModel.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.springboot.maven.model;
+
+import org.apache.camel.tooling.util.Strings;
+
+import static org.apache.camel.tooling.util.Strings.wrapCamelCaseWords;
+
+public class SpringBootAutoConfigureOptionModel {
+
+    private String name;
+    private String javaType;
+    private String defaultValue;
+    private String description;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getJavaType() {
+        return javaType;
+    }
+
+    public void setJavaType(String javaType) {
+        this.javaType = javaType;
+    }
+
+    public String getDefaultValue() {
+        return defaultValue;
+    }
+
+    public void setDefaultValue(String defaultValue) {
+        this.defaultValue = defaultValue;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getShortJavaType() {
+        return Strings.getClassShortName(javaType);
+    }
+
+    @Deprecated
+    public String getShortJavaType(int watermark) {
+
+        String text = Strings.getClassShortName(javaType);
+
+        // if its some kind of custom java object then lets wrap it as its long
+        if (!javaType.startsWith("java.")) {
+            text = wrapCamelCaseWords(text, watermark, " ");
+        }
+
+        return text;
+    }
+
+    public String getShortDefaultValue(int watermark) {
+        if (defaultValue == null || defaultValue.isEmpty()) {
+            return "";
+        }
+        String text = defaultValue;
+        if (text.endsWith("<T>")) {
+            text = text.substring(0, text.length() - 3);
+        } else if (text.endsWith("<T>>")) {
+            text = text.substring(0, text.length() - 4);
+        }
+
+        return text;
+    }
+
+}
diff --git a/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/model/SpringBootModel.java b/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/model/SpringBootModel.java
new file mode 100644
index 0000000..6c83d5c
--- /dev/null
+++ b/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/model/SpringBootModel.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.springboot.maven.model;
+
+import java.util.List;
+
+public class SpringBootModel {
+
+    private String groupId;
+    private String artifactId;
+    private String version;
+
+    private List<SpringBootAutoConfigureOptionModel> options;
+
+    public String getGroupId() {
+        return groupId;
+    }
+
+    public void setGroupId(String groupId) {
+        this.groupId = groupId;
+    }
+
+    public String getArtifactId() {
+        return artifactId;
+    }
+
+    public void setArtifactId(String artifactId) {
+        this.artifactId = artifactId;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public List<SpringBootAutoConfigureOptionModel> getOptions() {
+        return options;
+    }
+
+    public void setOptions(List<SpringBootAutoConfigureOptionModel> options) {
+        this.options = options;
+    }
+}