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 <gno...@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)));