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/03/03 06:32:17 UTC
[camel] 01/18: [CAMEL-14628] Make sure the project can build after
removing all generated sources
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.git
commit 669b8acf36a5d2e559e86fed2a86a99dcfc45cfa
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Mon Mar 2 08:26:45 2020 +0100
[CAMEL-14628] Make sure the project can build after removing all generated sources
---
components/pom.xml | 12 +++
core/camel-base/pom.xml | 4 +
core/camel-endpointdsl/pom.xml | 23 ++++++
core/camel-main/pom.xml | 2 -
core/camel-xml-io/pom.xml | 16 ++++
core/pom.xml | 12 +++
.../camel/maven/packaging/EndpointDslMojo.java | 96 +++++++++++++++-------
.../maven/packaging/PrepareCamelMainMojo.java | 31 +++----
.../TypeConverterLoaderGeneratorMojo.java | 3 +
.../component/ComponentsDslMetadataRegistry.java | 7 +-
10 files changed, 157 insertions(+), 49 deletions(-)
diff --git a/components/pom.xml b/components/pom.xml
index e52f56e..490bbde 100644
--- a/components/pom.xml
+++ b/components/pom.xml
@@ -406,6 +406,18 @@
</executions>
</plugin>
<plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>recompile</id>
+ <goals>
+ <goal>compile</goal>
+ </goals>
+ <phase>process-classes</phase>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
diff --git a/core/camel-base/pom.xml b/core/camel-base/pom.xml
index d2db70b..6546846 100644
--- a/core/camel-base/pom.xml
+++ b/core/camel-base/pom.xml
@@ -33,6 +33,10 @@
<name>Camel :: Base</name>
<description>The Base Camel Framework</description>
+ <properties>
+ <camel-prepare-component>true</camel-prepare-component>
+ </properties>
+
<dependencies>
<!-- required dependencies by camel-base -->
diff --git a/core/camel-endpointdsl/pom.xml b/core/camel-endpointdsl/pom.xml
index 7dbfff9..f4c521e 100644
--- a/core/camel-endpointdsl/pom.xml
+++ b/core/camel-endpointdsl/pom.xml
@@ -111,4 +111,27 @@
</dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <!-- The non generated code depends on the generated code,
+ so skip the first compilation phase -->
+ <artifactId>maven-compiler-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>default-compile</id>
+ <phase>none</phase>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+ <repositories>
+ <repository>
+ <id>atlassian-public</id>
+ <url>https://packages.atlassian.com/maven-external</url>
+ </repository>
+ </repositories>
+
</project>
diff --git a/core/camel-main/pom.xml b/core/camel-main/pom.xml
index cfbde14..62e2c42 100644
--- a/core/camel-main/pom.xml
+++ b/core/camel-main/pom.xml
@@ -34,8 +34,6 @@
<properties>
<firstVersion>3.0</firstVersion>
<label>core</label>
-
- <camel-generate-main>true</camel-generate-main>
</properties>
diff --git a/core/camel-xml-io/pom.xml b/core/camel-xml-io/pom.xml
index a18175f..59cf830 100644
--- a/core/camel-xml-io/pom.xml
+++ b/core/camel-xml-io/pom.xml
@@ -55,4 +55,20 @@
</dependency>
</dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <!-- The non generated code depends on the generated code,
+ so skip the first compilation phase -->
+ <artifactId>maven-compiler-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>default-compile</id>
+ <phase>none</phase>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
</project>
diff --git a/core/pom.xml b/core/pom.xml
index f6599a6..6832277 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -77,6 +77,18 @@
</executions>
</plugin>
<plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>recompile</id>
+ <goals>
+ <goal>compile</goal>
+ </goals>
+ <phase>process-classes</phase>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
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 ba85056..d62283e 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
@@ -38,6 +38,7 @@ import java.util.stream.Collectors;
import javax.annotation.Generated;
+import org.apache.camel.maven.packaging.dsl.component.ComponentsDslMetadataRegistry;
import org.apache.camel.maven.packaging.generics.GenericsUtil;
import org.apache.camel.spi.UriEndpoint;
import org.apache.camel.spi.UriParam;
@@ -52,7 +53,6 @@ import org.apache.camel.tooling.util.srcgen.GenericType;
import org.apache.camel.tooling.util.srcgen.GenericType.BoundType;
import org.apache.camel.tooling.util.srcgen.JavaClass;
import org.apache.camel.tooling.util.srcgen.Method;
-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;
@@ -63,6 +63,8 @@ import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectHelper;
import org.sonatype.plexus.build.incremental.BuildContext;
+import static org.apache.camel.tooling.util.PackageHelper.findCamelDirectory;
+
/**
* Generate Endpoint DSL source files for Components.
*/
@@ -120,12 +122,27 @@ public class EndpointDslMojo extends AbstractGeneratorMojo {
@Parameter(defaultValue = "true")
protected boolean generateEndpointBuilders;
- @Parameter(defaultValue = "${camel-generate-endpoint-dsl}")
+ @Parameter(defaultValue = "true")
protected boolean generateEndpointDsl;
- @Parameter(defaultValue = "${project.basedir}/src/generated/java")
+ /**
+ * The output directory
+ */
+ @Parameter
protected File sourcesOutputDir;
+ /**
+ * Component Metadata file
+ */
+ @Parameter
+ protected File componentsMetadata;
+
+ /**
+ * Components DSL Metadata
+ */
+ @Parameter
+ protected File outputResourcesDir;
+
DynamicClassLoader projectClassLoader;
@Override
@@ -136,23 +153,28 @@ public class EndpointDslMojo extends AbstractGeneratorMojo {
componentsFactoriesPackageName = "org.apache.camel.builder.endpoint.dsl";
generateEndpointBuilderFactory = true;
generateEndpointBuilders = true;
- generateEndpointDsl = Boolean.parseBoolean(project.getProperties().getProperty("camel-generate-endpoint-dsl", "false"));
- sourcesOutputDir = new File(project.getBasedir(), "src/generated/java");
super.execute(project, projectHelper, buildContext);
}
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
- if (!generateEndpointDsl) {
- return;
- }
-
try {
projectClassLoader = DynamicClassLoader.createDynamicClassLoader(project.getTestClasspathElements());
} catch (org.apache.maven.artifact.DependencyResolutionRequiredException e) {
throw new RuntimeException(e.getMessage(), e);
}
+ Path root = findCamelDirectory(baseDir, "core/camel-endpointdsl").toPath();
+ if (sourcesOutputDir == null) {
+ sourcesOutputDir = root.resolve("src/generated/java").toFile();
+ }
+ if (outputResourcesDir == null) {
+ outputResourcesDir = root.resolve("src/generated/resources").toFile();
+ }
+ if (componentsMetadata == null) {
+ componentsMetadata = outputResourcesDir.toPath().resolve("metadata.json").toFile();
+ }
+
Map<File, Supplier<String>> files;
try {
@@ -164,23 +186,6 @@ public class EndpointDslMojo extends AbstractGeneratorMojo {
// generate component endpoint DSL files and write them
executeComponent(files);
-
- if (generateEndpointBuilderFactory || generateEndpointBuilders) {
- getLog().info("Load components EndpointFactories");
- List<File> endpointFactories = loadAllComponentsDslEndpointFactoriesAsFile();
-
- if (generateEndpointBuilderFactory) {
- getLog().info("Regenerate EndpointBuilderFactory");
- // make sure EndpointBuilderFactory is synced
- synchronizeEndpointBuilderFactoryInterface(endpointFactories);
- }
-
- if (generateEndpointBuilders) {
- getLog().info("Regenerate EndpointBuilders");
- // make sure EndpointBuilders is synced
- synchronizeEndpointBuildersInterface(endpointFactories);
- }
- }
}
private static String loadJson(File file) {
@@ -223,20 +228,49 @@ public class EndpointDslMojo extends AbstractGeneratorMojo {
overrideComponentName = model.getArtifactId().replace("camel-", "");
}
- createEndpointDsl(componentsFactoriesPackageName, model, compModels, overrideComponentName);
+ createEndpointDsl(model, compModels, overrideComponentName);
}
}
}
+ private void createEndpointDsl(ComponentModel model, List<ComponentModel> aliases, String overrideComponentName) throws MojoFailureException {
+
+ doCreateEndpointDsl(model, aliases, overrideComponentName);
+
+ // Update components metadata
+ getLog().info("Load components EndpointFactories");
+ List<File> endpointFactories = loadAllComponentsDslEndpointFactoriesAsFile();
+
+ getLog().info("Regenerate EndpointBuilderFactory");
+ // make sure EndpointBuilderFactory is synced
+ synchronizeEndpointBuilderFactoryInterface(endpointFactories);
+
+ getLog().info("Regenerate EndpointBuilders");
+ // make sure EndpointBuilders is synced
+ synchronizeEndpointBuildersInterface(endpointFactories);
+ }
+
+ private ComponentsDslMetadataRegistry syncAndUpdateComponentsMetadataRegistry(final ComponentModel componentModel, final String className) {
+ final ComponentsDslMetadataRegistry componentsDslMetadataRegistry =
+ new ComponentsDslMetadataRegistry(sourcesOutputDir.toPath()
+ .resolve(componentsFactoriesPackageName.replace('.', '/')).toFile(),
+ componentsMetadata);
+ componentsDslMetadataRegistry.addComponentToMetadataAndSyncMetadataFile(componentModel, className);
+
+ getLog().info("Update components metadata with " + className);
+
+ return componentsDslMetadataRegistry;
+ }
+
@SuppressWarnings("checkstyle:methodlength")
- private void createEndpointDsl(String packageName, ComponentModel model, List<ComponentModel> aliases, String overrideComponentName) throws MojoFailureException {
+ private void doCreateEndpointDsl(ComponentModel model, List<ComponentModel> aliases, String overrideComponentName) throws MojoFailureException {
String componentClassName = model.getJavaType();
String builderName = getEndpointName(componentClassName);
Class<?> realComponentClass = loadClass(componentClassName);
Class<?> realEndpointClass = loadClass(findEndpointClassName(componentClassName));
final JavaClass javaClass = new JavaClass(getProjectClassLoader());
- javaClass.setPackage(packageName);
+ javaClass.setPackage(componentsFactoriesPackageName);
javaClass.setName(builderName + "Factory");
javaClass.setClass(false);
javaClass.addImport("org.apache.camel.builder.EndpointConsumerBuilder");
@@ -333,7 +367,7 @@ public class EndpointDslMojo extends AbstractGeneratorMojo {
advancedBuilderClass.addMethod().setName("basic").setReturnType(loadClass(builderClass.getCanonicalName())).setDefault().setBody("return (" + builderName + ") this;");
}
- generateDummyClass(packageName + ".T");
+ generateDummyClass(componentsFactoriesPackageName + ".T");
String doc = GENERATED_MSG;
if (!Strings.isEmpty(model.getDescription())) {
@@ -514,7 +548,7 @@ public class EndpointDslMojo extends AbstractGeneratorMojo {
dslClass.addMethod(method.copy()).setDefault().setBodyF("return %s.%s(%s);", javaClass.getName(), method.getName(), String.join(",", method.getParametersNames()));
}
- writeSourceIfChanged(javaClass, packageName.replace('.', '/'), builderName + "Factory.java", false);
+ writeSourceIfChanged(javaClass, componentsFactoriesPackageName.replace('.', '/'), builderName + "Factory.java", false);
}
private void synchronizeEndpointBuilderFactoryInterface(List<File> factories) throws MojoFailureException {
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainMojo.java
index e34b2f1..ff24376 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainMojo.java
@@ -27,16 +27,20 @@ import org.apache.camel.tooling.model.JsonMapper;
import org.apache.camel.tooling.model.MainModel;
import org.apache.camel.tooling.model.MainModel.MainGroupModel;
import org.apache.camel.tooling.util.JavadocHelper;
+import org.apache.camel.tooling.util.PackageHelper;
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 org.apache.maven.project.MavenProjectHelper;
import org.jboss.forge.roaster.Roaster;
import org.jboss.forge.roaster.model.source.FieldSource;
import org.jboss.forge.roaster.model.source.JavaClassSource;
import org.jboss.forge.roaster.model.source.MethodSource;
+import org.sonatype.plexus.build.incremental.BuildContext;
/**
* Prepares camel-main by generating Camel Main configuration metadata for
@@ -48,19 +52,10 @@ public class PrepareCamelMainMojo extends AbstractGeneratorMojo {
/**
* The output directory for generated spring boot tooling file
*/
- @Parameter(readonly = true, defaultValue = "${project.basedir}/src/generated/resources")
+ @Parameter(defaultValue = "${project.basedir}/src/generated/resources")
protected File outFolder;
/**
- * The build directory
- */
- @Parameter(readonly = true, defaultValue = "${project.build.directory}/")
- protected File buildDir;
-
- @Parameter(defaultValue = "${camel-generate-main}")
- protected boolean generateMain;
-
- /**
* Parses the Camel Main configuration java source file.
*/
public static List<MainModel.MainOptionModel> parseConfigurationSource(String fileName) throws IOException {
@@ -147,16 +142,21 @@ public class PrepareCamelMainMojo extends AbstractGeneratorMojo {
}
@Override
+ public void execute(MavenProject project, MavenProjectHelper projectHelper, BuildContext buildContext) throws MojoFailureException, MojoExecutionException {
+ outFolder = new File(project.getBasedir(), "src/generated/resources");
+ super.execute(project, projectHelper, buildContext);
+ }
+
+ @Override
public void execute() throws MojoExecutionException, MojoFailureException {
- if (!generateMain) {
+ // scan for configuration files
+ File[] files = new File(project.getBasedir(), "src/main/java/org/apache/camel/main").listFiles(f -> f.isFile() && f.getName().endsWith("Properties.java"));
+ if (files == null || files.length == 0) {
return;
}
final List<MainModel.MainOptionModel> data = new ArrayList<>();
- // scan for configuration files
- File[] files = new File(project.getBasedir(), "src/main/java/org/apache/camel/main").listFiles(f -> f.isFile() && f.getName().endsWith("Properties.java"));
-
for (File file : files) {
getLog().info("Parsing Camel Main configuration file: " + file);
try {
@@ -181,7 +181,8 @@ public class PrepareCamelMainMojo extends AbstractGeneratorMojo {
}
// include additional rest configuration from camel-api
- File restConfig = new File(buildDir, "../../camel-api/src/main/java/org/apache/camel/spi/RestConfiguration.java");
+ File camelApiDir = PackageHelper.findCamelDirectory(project.getBasedir(), "core/camel-api");
+ File restConfig = new File(camelApiDir, "src/main/java/org/apache/camel/spi/RestConfiguration.java");
try {
List<MainModel.MainOptionModel> model = parseConfigurationSource(restConfig);
model.forEach(m -> m.setName("camel.rest." + m.getName()));
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/TypeConverterLoaderGeneratorMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/TypeConverterLoaderGeneratorMojo.java
index a538e4b..9772155 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/TypeConverterLoaderGeneratorMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/TypeConverterLoaderGeneratorMojo.java
@@ -70,6 +70,9 @@ public class TypeConverterLoaderGeneratorMojo extends AbstractGeneratorMojo {
if (resourcesOutputDir == null) {
resourcesOutputDir = new File(project.getBasedir(), "src/generated/resources");
}
+ if (!classesDirectory.isDirectory()) {
+ return;
+ }
if ("pom".equals(project.getPackaging())) {
return;
}
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/dsl/component/ComponentsDslMetadataRegistry.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/dsl/component/ComponentsDslMetadataRegistry.java
index 8e1efd2..8527cce 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/dsl/component/ComponentsDslMetadataRegistry.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/dsl/component/ComponentsDslMetadataRegistry.java
@@ -52,7 +52,12 @@ public class ComponentsDslMetadataRegistry {
}
private Map<String, ComponentModel> loadMetadataFileIntoMap(final File metadataFile) {
- String json = loadJson(metadataFile);
+ String json;
+ if (metadataFile.isFile()) {
+ json = loadJson(metadataFile);
+ } else {
+ json = "{ }";
+ }
JsonObject jsonObject = JsonMapper.deserialize(json);
Map<String, ComponentModel> models = new TreeMap<>();
jsonObject.forEach((jsonKey, jsonValue) -> models.put(jsonKey, loadModel((JsonObject) jsonValue)));