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)));