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/20 09:24:40 UTC
[camel-spring-boot] branch master updated: [CAMEL-14410] Switch to
camel 3.1.0-SNAPSHOT
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
The following commit(s) were added to refs/heads/master by this push:
new 20d6b1b [CAMEL-14410] Switch to camel 3.1.0-SNAPSHOT
20d6b1b is described below
commit 20d6b1b43a0ad838cd6b5c849dc24d4a90298b04
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Mon Jan 20 10:23:12 2020 +0100
[CAMEL-14410] Switch to camel 3.1.0-SNAPSHOT
---
pom.xml | 2 +-
.../pom.xml | 5 +
.../maven/AbstractSpringBootGenerator.java | 11 +-
.../maven/PrepareCatalogSpringBootMojo.java | 2 -
.../maven/SpringBootAutoConfigurationMojo.java | 245 ++++++-------
...pdateSpringBootAutoConfigurationReadmeMojo.java | 402 +++++++++++++++++++++
6 files changed, 529 insertions(+), 138 deletions(-)
diff --git a/pom.xml b/pom.xml
index c660115..d128e1e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -115,7 +115,7 @@
<spring-boot-version>2.2.3.RELEASE</spring-boot-version>
<!-- Camel target version -->
- <camel-version>3.0.0</camel-version>
+ <camel-version>3.1.0-SNAPSHOT</camel-version>
<!-- versions -->
<aether-version>1.0.2.v20150114</aether-version>
diff --git a/tooling/camel-spring-boot-generator-maven-plugin/pom.xml b/tooling/camel-spring-boot-generator-maven-plugin/pom.xml
index 515ac25..f8e4c5a 100644
--- a/tooling/camel-spring-boot-generator-maven-plugin/pom.xml
+++ b/tooling/camel-spring-boot-generator-maven-plugin/pom.xml
@@ -54,6 +54,11 @@
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
+ <artifactId>camel-tooling-util</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/AbstractSpringBootGenerator.java b/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/AbstractSpringBootGenerator.java
index b9a2bc1..8b5524c 100644
--- a/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/AbstractSpringBootGenerator.java
+++ b/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/AbstractSpringBootGenerator.java
@@ -17,35 +17,28 @@
package org.apache.camel.springboot.maven;
import java.io.File;
-import java.io.FileFilter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOError;
import java.io.IOException;
import java.io.InputStream;
-import java.util.Arrays;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import java.util.function.Supplier;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
+import org.apache.camel.tooling.util.PackageHelper;
import org.apache.commons.io.IOUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.plugins.annotations.ResolutionScope;
import org.apache.maven.project.MavenProject;
-import static org.apache.camel.maven.packaging.PackageHelper.loadText;
-
public abstract class AbstractSpringBootGenerator extends AbstractMojo {
/**
@@ -144,7 +137,7 @@ public abstract class AbstractSpringBootGenerator extends AbstractMojo {
protected static String loadJson(JarFile jar, JarEntry je) {
try (InputStream is = jar.getInputStream(je)) {
- return loadText(is);
+ return PackageHelper.loadText(is);
} catch (IOException e) {
throw new IOError(e);
}
diff --git a/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/PrepareCatalogSpringBootMojo.java b/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/PrepareCatalogSpringBootMojo.java
index d8b9fb4..0889287 100644
--- a/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/PrepareCatalogSpringBootMojo.java
+++ b/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/PrepareCatalogSpringBootMojo.java
@@ -37,8 +37,6 @@ import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
-import static org.apache.camel.maven.packaging.PackageHelper.loadText;
-
/**
* Prepares the Spring Boot provider camel catalog to include component it supports
*/
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 fb4f3bd..4436bde 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
@@ -45,7 +45,7 @@ import java.util.zip.ZipEntry;
import javax.annotation.Generated;
import javax.xml.bind.annotation.XmlTransient;
-import org.apache.camel.maven.packaging.JSonSchemaHelper;
+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;
@@ -55,14 +55,16 @@ 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.maven.packaging.srcgen.Annotation;
-import org.apache.camel.maven.packaging.srcgen.GenericType;
-import org.apache.camel.maven.packaging.srcgen.JavaClass;
-import org.apache.camel.maven.packaging.srcgen.Method;
-import org.apache.camel.maven.packaging.srcgen.Property;
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.util.PackageHelper;
+import org.apache.camel.tooling.util.srcgen.Annotation;
+import org.apache.camel.tooling.util.srcgen.GenericType;
+import org.apache.camel.tooling.util.srcgen.JavaClass;
+import org.apache.camel.tooling.util.srcgen.Method;
+import org.apache.camel.tooling.util.srcgen.Property;
import org.apache.commons.io.FileUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.plugin.MojoExecutionException;
@@ -89,15 +91,6 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
-import static org.apache.camel.maven.packaging.AbstractGeneratorMojo.updateResource;
-import static org.apache.camel.maven.packaging.JSonSchemaHelper.getPropertyDefaultValue;
-import static org.apache.camel.maven.packaging.JSonSchemaHelper.getPropertyDescriptionValue;
-import static org.apache.camel.maven.packaging.JSonSchemaHelper.getPropertyJavaType;
-import static org.apache.camel.maven.packaging.JSonSchemaHelper.getPropertyType;
-import static org.apache.camel.maven.packaging.JSonSchemaHelper.getSafeValue;
-import static org.apache.camel.maven.packaging.JSonSchemaHelper.parseJsonSchema;
-import static org.apache.camel.maven.packaging.PackageHelper.loadText;
-
/**
* Generate Spring Boot auto configuration files for Camel components and data
* formats.
@@ -918,11 +911,11 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
}
if (optionName != null) {
- javaType = getPropertyJavaType(rows, optionName);
- type = getPropertyType(rows, optionName);
- defaultValue = getPropertyDefaultValue(rows, optionName);
+ javaType = JSonSchemaHelper.getPropertyJavaType(rows, optionName);
+ type = JSonSchemaHelper.getPropertyType(rows, optionName);
+ defaultValue = JSonSchemaHelper.getPropertyDefaultValue(rows, optionName);
// favour description from the model
- description = getPropertyDescriptionValue(rows, optionName);
+ description = JSonSchemaHelper.getPropertyDescriptionValue(rows, optionName);
if (description != null) {
prop.getField().getJavaDoc().setFullText(description);
}
@@ -1883,56 +1876,56 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("component", json, false);
ComponentModel component = new ComponentModel();
- component.setScheme(getSafeValue("scheme", rows));
- component.setSyntax(getSafeValue("syntax", rows));
- component.setAlternativeSyntax(getSafeValue("alternativeSyntax", rows));
- component.setTitle(getSafeValue("title", rows));
- component.setDescription(getSafeValue("description", rows));
+ 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(getSafeValue("label", rows));
- component.setDeprecated(getSafeValue("deprecated", rows));
- component.setDeprecationNote(getSafeValue("deprecationNote", rows));
- component.setConsumerOnly(getSafeValue("consumerOnly", rows));
- component.setProducerOnly(getSafeValue("producerOnly", rows));
- component.setJavaType(getSafeValue("javaType", rows));
- component.setGroupId(getSafeValue("groupId", rows));
- component.setArtifactId(getSafeValue("artifactId", rows));
- component.setVersion(getSafeValue("version", 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(getSafeValue("name", row));
- option.setDisplayName(getSafeValue("displayName", row));
- option.setKind(getSafeValue("kind", row));
- option.setType(getSafeValue("type", row));
- option.setJavaType(getSafeValue("javaType", row));
- option.setDeprecated(getSafeValue("deprecated", row));
- option.setDeprecationNote(getSafeValue("deprecationNote", row));
- option.setDescription(getSafeValue("description", row));
- option.setDefaultValue(getSafeValue("defaultValue", row));
- option.setEnums(getSafeValue("enum", row));
+ 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(getSafeValue("name", row));
- option.setDisplayName(getSafeValue("displayName", row));
- option.setKind(getSafeValue("kind", row));
- option.setGroup(getSafeValue("group", row));
- option.setRequired(getSafeValue("required", row));
- option.setType(getSafeValue("type", row));
- option.setJavaType(getSafeValue("javaType", row));
- option.setEnums(getSafeValue("enum", row));
- option.setPrefix(getSafeValue("prefix", row));
- option.setMultiValue(getSafeValue("multiValue", row));
- option.setDeprecated(getSafeValue("deprecated", row));
- option.setDeprecationNote(getSafeValue("deprecationNote", row));
- option.setDefaultValue(getSafeValue("defaultValue", row));
- option.setDescription(getSafeValue("description", row));
- option.setEnumValues(getSafeValue("enum", row));
+ 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);
}
@@ -1943,32 +1936,32 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("dataformat", json, false);
DataFormatModel dataFormat = new DataFormatModel();
- dataFormat.setTitle(getSafeValue("title", rows));
- dataFormat.setName(getSafeValue("name", rows));
- dataFormat.setModelName(getSafeValue("modelName", rows));
- dataFormat.setDescription(getSafeValue("description", rows));
+ 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(getSafeValue("label", rows));
- dataFormat.setDeprecated(getSafeValue("deprecated", rows));
- dataFormat.setDeprecationNote(getSafeValue("deprecationNote", rows));
- dataFormat.setJavaType(getSafeValue("javaType", rows));
- dataFormat.setGroupId(getSafeValue("groupId", rows));
- dataFormat.setArtifactId(getSafeValue("artifactId", rows));
- dataFormat.setVersion(getSafeValue("version", 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(getSafeValue("name", row));
- option.setDisplayName(getSafeValue("displayName", row));
- option.setKind(getSafeValue("kind", row));
- option.setType(getSafeValue("type", row));
- option.setJavaType(getSafeValue("javaType", row));
- option.setDeprecated(getSafeValue("deprecated", row));
- option.setDeprecationNote(getSafeValue("deprecationNote", row));
- option.setDescription(getSafeValue("description", row));
- option.setDefaultValue(getSafeValue("defaultValue", row));
- option.setEnumValues(getSafeValue("enum", row));
+ 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);
}
@@ -1979,32 +1972,32 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("language", json, false);
LanguageModel language = new LanguageModel();
- language.setTitle(getSafeValue("title", rows));
- language.setName(getSafeValue("name", rows));
- language.setModelName(getSafeValue("modelName", rows));
- language.setDescription(getSafeValue("description", rows));
+ 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(getSafeValue("label", rows));
- language.setDeprecated(getSafeValue("deprecated", rows));
- language.setDeprecationNote(getSafeValue("deprecationNote", rows));
- language.setJavaType(getSafeValue("javaType", rows));
- language.setGroupId(getSafeValue("groupId", rows));
- language.setArtifactId(getSafeValue("artifactId", rows));
- language.setVersion(getSafeValue("version", 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(getSafeValue("name", row));
- option.setDisplayName(getSafeValue("displayName", row));
- option.setKind(getSafeValue("kind", row));
- option.setType(getSafeValue("type", row));
- option.setJavaType(getSafeValue("javaType", row));
- option.setDeprecated(getSafeValue("deprecated", row));
- option.setDeprecationNote(getSafeValue("deprecationNote", row));
- option.setDescription(getSafeValue("description", row));
- option.setDefaultValue(getSafeValue("defaultValue", row));
- option.setEnumValues(getSafeValue("enum", row));
+ 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);
}
@@ -2012,33 +2005,33 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
}
private OtherModel generateOtherModel(String json) {
- List<Map<String, String>> rows = parseJsonSchema("model", json, false);
+ List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("model", json, false);
OtherModel model = new OtherModel();
- model.setName(getSafeValue("name", rows));
- model.setTitle(getSafeValue("title", rows));
- model.setDescription(getSafeValue("description", rows));
- model.setJavaType(getSafeValue("javaType", rows));
- model.setLabel(getSafeValue("label", rows));
- model.setDeprecated(getSafeValue("deprecated", rows));
- model.setDeprecationNote(getSafeValue("deprecationNote", rows));
-
- rows = parseJsonSchema("properties", json, true);
+ 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(getSafeValue("name", row));
- option.setDisplayName(getSafeValue("displayName", row));
- option.setKind(getSafeValue("kind", row));
- option.setGroup(getSafeValue("group", row));
- option.setRequired(getSafeValue("required", row));
- option.setType(getSafeValue("type", row));
- option.setJavaType(getSafeValue("javaType", row));
- option.setEnums(getSafeValue("enum", row));
- option.setDeprecated(getSafeValue("deprecated", row));
- option.setDeprecationNote(getSafeValue("deprecationNote", row));
- option.setDefaultValue(getSafeValue("defaultValue", row));
- option.setDescription(getSafeValue("description", row));
- option.setEnums(getSafeValue("enums", row));
+ 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);
}
@@ -2089,12 +2082,12 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
try {
String header;
try (InputStream is = getClass().getClassLoader().getResourceAsStream("license-header-java.txt")) {
- header = loadText(is);
+ header = PackageHelper.loadText(is);
}
String code = header + source;
getLog().debug("Source code generated:\n" + code);
- updateResource(null, target.toPath(), code);
+ AbstractGeneratorMojo.updateResource(null, target.toPath(), code);
} catch (Exception e) {
throw new MojoFailureException("IOError with file " + target, e);
}
@@ -2158,7 +2151,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
// create new file
try {
InputStream is = getClass().getClassLoader().getResourceAsStream("license-header.txt");
- String header = loadText(is);
+ String header = PackageHelper.loadText(is);
String code = sb.toString();
// add empty new line after header
code = header + "\n" + code;
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
new file mode 100644
index 0000000..19c545c
--- /dev/null
+++ b/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/UpdateSpringBootAutoConfigurationReadmeMojo.java
@@ -0,0 +1,402 @@
+/*
+ * 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;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+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.tooling.util.Strings;
+import org.apache.camel.util.json.DeserializationException;
+import org.apache.camel.util.json.JsonArray;
+import org.apache.camel.util.json.JsonObject;
+import org.apache.camel.util.json.Jsoner;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.Component;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.project.MavenProject;
+import org.mvel2.templates.TemplateRuntime;
+import org.sonatype.plexus.build.incremental.BuildContext;
+
+import static org.apache.camel.tooling.util.PackageHelper.loadText;
+import static org.apache.camel.tooling.util.PackageHelper.writeText;
+
+/**
+ * For all the Camel components that has Spring Boot starter JAR, their documentation
+ * .adoc files in their component directory is updated to include spring boot auto configuration options.
+ */
+@Mojo(name = "update-spring-boot-auto-configuration-readme", threadSafe = true)
+public class UpdateSpringBootAutoConfigurationReadmeMojo extends AbstractMojo {
+
+ /**
+ * The maven project.
+ */
+ @Parameter(property = "project", required = true, readonly = true)
+ protected MavenProject project;
+
+ /**
+ * The project build directory
+ *
+ */
+ @Parameter(defaultValue = "${project.build.directory}")
+ protected File buildDir;
+
+ /**
+ * The documentation directory
+ *
+ */
+ @Parameter(defaultValue = "${basedir}/../../../../components/")
+ protected File componentsDir;
+
+ /**
+ * Whether to fail the build fast if any Warnings was detected.
+ */
+ @Parameter
+ protected Boolean failFast;
+
+ /**
+ * Whether to fail if an option has no documentation.
+ */
+ @Parameter
+ protected Boolean failOnMissingDescription;
+
+ /**
+ * build context to check changed files and mark them for refresh (used for
+ * m2e compatibility)
+ */
+ @Component
+ private BuildContext buildContext;
+
+ @Override
+ public void execute() throws MojoExecutionException, MojoFailureException {
+ try {
+ executeStarter(project.getBasedir());
+ } catch (Exception e) {
+ throw new MojoFailureException("Error processing spring-configuration-metadata.json", e);
+ }
+ }
+
+ private void executeStarter(File starter) throws Exception {
+ File jsonFile = new File(buildDir, "classes/META-INF/spring-configuration-metadata.json");
+
+ // only if there is components we should update the documentation files
+ if (jsonFile.exists()) {
+ getLog().debug("Processing Spring Boot auto-configuration file: " + jsonFile);
+ Object js = Jsoner.deserialize(new FileReader(jsonFile));
+ if (js != null) {
+ String name = starter.getName();
+
+ if (!isValidStarter(name)) {
+ return;
+ }
+
+ File compDir = getComponentsDir(name);
+
+ File[] docFiles;
+ File docFolder;
+ String componentName;
+ if ("camel-spring-boot".equals(name)) {
+ // special for camel-spring-boot where we also want to auto-generate the options in the adoc file
+ componentName = "spring-boot";
+ docFolder = new File(compDir, "/src/main/docs/");
+ docFiles = docFolder.listFiles(new ComponentDocFilter(componentName));
+ } else if ("camel-univocity-parsers-starter".equals(name)) {
+ // special for univocity-parsers
+ componentName = "univocity";
+ docFolder = new File(compDir, "camel-univocity-parsers/src/main/docs/");
+ docFiles = docFolder.listFiles(new ComponentDocFilter(componentName));
+ } else {
+ // skip camel- and -starter in the end
+ componentName = name.substring(6, name.length() - 8);
+ getLog().debug("Camel component: " + componentName);
+ docFolder = new File(compDir, "camel-" + componentName + "/src/main/docs/");
+ docFiles = docFolder.listFiles(new ComponentDocFilter(componentName));
+
+ // maybe its one of those component that has subfolders with -api and -component
+ if (docFiles == null || docFiles.length == 0) {
+ docFolder = new File(compDir, "camel-" + componentName + "/camel-" + componentName + "-component/src/main/docs/");
+ docFiles = docFolder.listFiles(new ComponentDocFilter(componentName));
+ }
+ }
+
+ if (docFiles != null && docFiles.length > 0) {
+ List<File> files = Arrays.asList(docFiles);
+
+ // find out if the JAR has a Camel component, dataformat, or language
+ boolean hasComponentDataFormatOrLanguage = files.stream().anyMatch(
+ f -> f.getName().endsWith("-component.adoc") || f.getName().endsWith("-dataformat.adoc") || f.getName().endsWith("-language.adoc"));
+
+ // if so then skip the root adoc file as its just a introduction to the others
+ if (hasComponentDataFormatOrLanguage) {
+ files = Arrays.stream(docFiles).filter(f -> !f.getName().equals(componentName + ".adoc")).collect(Collectors.toList());
+ }
+
+ if (files.size() == 1) {
+ List<SpringBootAutoConfigureOptionModel> models = parseSpringBootAutoConfigureModels(jsonFile, null);
+
+ // special for other kind of JARs that is not a regular Camel component,dataformat,language
+ boolean onlyOther = files.size() == 1 && !hasComponentDataFormatOrLanguage;
+ if (models.isEmpty() && onlyOther) {
+ // there are no spring-boot auto configuration for this other kind of JAR so lets just ignore this
+ return;
+ }
+ File docFile = files.get(0);
+
+ // check for missing description on options
+ boolean noDescription = false;
+ for (SpringBootAutoConfigureOptionModel o : models) {
+ if (Strings.isEmpty(o.getDescription())) {
+ noDescription = true;
+ getLog().warn("Option " + o.getName() + " has no description");
+ }
+ }
+ if (noDescription && isFailOnNoDescription()) {
+ throw new MojoExecutionException("Failed build due failOnMissingDescription=true");
+ }
+
+ String changed = templateAutoConfigurationOptions(models, componentName);
+ boolean updated = updateAutoConfigureOptions(docFile, changed);
+ if (updated) {
+ getLog().info("Updated doc file: " + docFile);
+ } else {
+ getLog().debug("No changes to doc file: " + docFile);
+ }
+ } else if (files.size() > 1) {
+ // when we have 2 or more files we need to filter the model options accordingly
+ for (File docFile : files) {
+ String docName = docFile.getName();
+ int pos = docName.lastIndexOf("-");
+ // spring-boot use lower cased keys
+ String prefix = pos > 0 ? docName.substring(0, pos).toLowerCase(Locale.US) : null;
+
+ List<SpringBootAutoConfigureOptionModel> models = parseSpringBootAutoConfigureModels(jsonFile, prefix);
+
+ // check for missing description on options
+ boolean noDescription = false;
+ for (SpringBootAutoConfigureOptionModel o : models) {
+ if (Strings.isEmpty(o.getDescription())) {
+ noDescription = true;
+ getLog().warn("Option " + o.getName() + " has no description");
+ }
+ }
+ if (noDescription && isFailOnNoDescription()) {
+ throw new MojoExecutionException("Failed build due failOnMissingDescription=true");
+ }
+
+ String changed = templateAutoConfigurationOptions(models, componentName);
+ boolean updated = updateAutoConfigureOptions(docFile, changed);
+ if (updated) {
+ getLog().info("Updated doc file: " + docFile);
+ } else {
+ getLog().debug("No changes to doc file: " + docFile);
+ }
+ }
+ }
+ } else {
+ getLog().warn("No component docs found in folder: " + docFolder);
+ if (isFailFast()) {
+ throw new MojoExecutionException("Failed build due failFast=true");
+ }
+ }
+ }
+ }
+ }
+
+ private File getComponentsDir(String name) {
+ if ("camel-spring-boot".equals(name)) {
+ // special for camel-spring-boot
+ return project.getBasedir();
+ } else {
+ return componentsDir;
+ }
+ }
+
+ private static final class ComponentDocFilter implements FileFilter {
+
+ private final String componentName;
+
+ public ComponentDocFilter(String componentName) {
+ this.componentName = asComponentName(componentName);
+ }
+
+ @Override
+ public boolean accept(File pathname) {
+ String name = pathname.getName();
+ return name.startsWith(componentName) && name.endsWith(".adoc");
+ }
+ }
+
+ private static String asComponentName(String componentName) {
+ if ("fastjson".equals(componentName)) {
+ return "json-fastjson";
+ } else if ("gson".equals(componentName)) {
+ return "json-gson";
+ } else if ("jackson".equals(componentName)) {
+ return "json-jackson";
+ } else if ("johnzon".equals(componentName)) {
+ return "json-johnzon";
+ } else if ("snakeyaml".equals(componentName)) {
+ return "yaml-snakeyaml";
+ } else if ("cassandraql".equals(componentName)) {
+ return "cql";
+ } else if ("josql".equals(componentName)) {
+ return "sql";
+ } else if ("juel".equals(componentName)) {
+ return "el";
+ } else if ("jsch".equals(componentName)) {
+ return "scp";
+ } else if ("printer".equals(componentName)) {
+ return "lpr";
+ } else if ("saxon".equals(componentName)) {
+ return "xquery";
+ } else if ("stringtemplate".equals(componentName)) {
+ return "string-template";
+ } else if ("tagsoup".equals(componentName)) {
+ return "tidyMarkup";
+ }
+ return componentName;
+ }
+
+ private static boolean isValidStarter(String name) {
+ // skip these
+ if ("camel-core-starter".equals(name)) {
+ return false;
+ }
+ return true;
+ }
+
+ private List<SpringBootAutoConfigureOptionModel> parseSpringBootAutoConfigureModels(File file, String include) throws IOException, DeserializationException {
+ getLog().debug("Parsing Spring Boot AutoConfigureModel using include: " + include);
+ List<SpringBootAutoConfigureOptionModel> answer = new ArrayList<>();
+
+ JsonObject obj = (JsonObject) Jsoner.deserialize(new FileReader(file));
+
+ JsonArray arr = obj.getCollection("properties");
+ if (arr != null && !arr.isEmpty()) {
+ arr.forEach(e -> {
+ JsonObject row = (JsonObject) e;
+ String name = row.getString("name");
+ String javaType = row.getString("type");
+ String desc = row.getStringOrDefault("description", "");
+ String defaultValue = row.getStringOrDefault("defaultValue", "");
+
+ // is the option deprecated then include that as well in the description
+ String deprecated = row.getStringOrDefault("deprecated", "");
+ String deprecationNote = row.getStringOrDefault("deprecationNote", "");
+ if ("true".equals(deprecated)) {
+ desc = "*Deprecated* " + desc;
+ if (!Strings.isEmpty(deprecationNote)) {
+ if (!desc.endsWith(".")) {
+ desc = desc + ". Deprecation note: " + deprecationNote;
+ } else {
+ desc = desc + " Deprecation note: " + deprecationNote;
+ }
+ }
+ }
+
+ // skip this special option and also if not matching the filter
+ boolean skip = name.endsWith("customizer.enabled") || include != null && !name.contains("." + include + ".");
+ if (!skip) {
+ SpringBootAutoConfigureOptionModel model = new SpringBootAutoConfigureOptionModel();
+ model.setName(name);
+ model.setJavaType(javaType);
+ model.setDefaultValue(defaultValue);
+ model.setDescription(desc);
+ answer.add(model);
+ }
+ });
+ }
+
+ return answer;
+ }
+
+ private boolean updateAutoConfigureOptions(File file, String changed) throws MojoExecutionException {
+ if (!file.exists()) {
+ return false;
+ }
+
+ try {
+ String text = loadText(new FileInputStream(file));
+
+ String existing = Strings.between(text, "// spring-boot-auto-configure options: START", "// spring-boot-auto-configure options: END");
+ if (existing != null) {
+ // remove leading line breaks etc
+ existing = existing.trim();
+ changed = changed.trim();
+ if (existing.equals(changed)) {
+ return false;
+ } else {
+ String before = Strings.before(text, "// spring-boot-auto-configure options: START");
+ String after = Strings.after(text, "// spring-boot-auto-configure options: END");
+ text = before + "// spring-boot-auto-configure options: START\n" + changed + "\n// spring-boot-auto-configure options: END" + after;
+ writeText(file, text);
+ return true;
+ }
+ } else {
+ getLog().warn("Cannot find markers in file " + file);
+ getLog().warn("Add the following markers");
+ getLog().warn("\t// spring-boot-auto-configure options: START");
+ getLog().warn("\t// spring-boot-auto-configure options: END");
+ if (isFailFast()) {
+ throw new MojoExecutionException("Failed build due failFast=true");
+ }
+ return false;
+ }
+ } catch (Exception e) {
+ throw new MojoExecutionException("Error reading file " + file + " Reason: " + e, e);
+ }
+ }
+
+ private String templateAutoConfigurationOptions(List<SpringBootAutoConfigureOptionModel> options, String componentName) throws MojoExecutionException {
+ SpringBootModel model = new SpringBootModel();
+ model.setGroupId(project.getGroupId());
+ model.setArtifactId("camel-" + componentName + "-starter");
+ model.setVersion(project.getVersion());
+ model.setOptions(options);
+
+ try {
+ String template = loadText(UpdateSpringBootAutoConfigurationReadmeMojo.class.getClassLoader().getResourceAsStream("spring-boot-auto-configure-options.mvel"));
+ String out = (String) TemplateRuntime.eval(template, model, Collections.singletonMap("util", MvelHelper.INSTANCE));
+ return out;
+ } catch (Exception e) {
+ throw new MojoExecutionException("Error processing mvel template. Reason: " + e, e);
+ }
+ }
+
+ private boolean isFailFast() {
+ return failFast != null && failFast;
+ }
+
+ private boolean isFailOnNoDescription() {
+ return failOnMissingDescription != null && failOnMissingDescription;
+ }
+
+}
\ No newline at end of file