CAMEL-10774: Generate other.properties for Camel artifacts which is not a component, dataformat or language
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/41200e25 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/41200e25 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/41200e25 Branch: refs/heads/master Commit: 41200e2514d846653861b2ac827fce478aae49d5 Parents: 7cff099 Author: Claus Ibsen <davscl...@apache.org> Authored: Fri Feb 3 16:23:50 2017 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Fri Feb 3 20:31:28 2017 +0100 ---------------------------------------------------------------------- .../camel/maven/packaging/PackageOtherMojo.java | 170 +++++++++++++++++++ .../maven/packaging/PrepareComponentMojo.java | 12 +- 2 files changed, 181 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/41200e25/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageOtherMojo.java ---------------------------------------------------------------------- diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageOtherMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageOtherMojo.java new file mode 100644 index 0000000..f061947 --- /dev/null +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageOtherMojo.java @@ -0,0 +1,170 @@ +/** + * 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.maven.packaging; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Collections; +import java.util.Properties; + +import org.apache.maven.model.Resource; +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugin.logging.Log; +import org.apache.maven.project.MavenProject; +import org.apache.maven.project.MavenProjectHelper; +import org.sonatype.plexus.build.incremental.BuildContext; + +/** + * Analyses the Camel plugins in a project and generates extra descriptor information for easier auto-discovery in Camel. + * + * @goal generate-others-list + */ +public class PackageOtherMojo extends AbstractMojo { + + /** + * The maven project. + * + * @parameter property="project" + * @required + * @readonly + */ + protected MavenProject project; + + /** + * The output directory for generated components file + * + * @parameter default-value="${project.build.directory}/generated/camel/others" + */ + protected File otherOutDir; + + /** + * Maven ProjectHelper. + * + * @component + * @readonly + */ + private MavenProjectHelper projectHelper; + + /** + * build context to check changed files and mark them for refresh (used for + * m2e compatibility) + * + * @component + * @readonly + */ + private BuildContext buildContext; + + /** + * Execute goal. + * + * @throws MojoExecutionException execution of the main class or one of the + * threads it generated failed. + * @throws MojoFailureException something bad happened... + */ + public void execute() throws MojoExecutionException, MojoFailureException { + prepareOthers(getLog(), project, projectHelper, otherOutDir, buildContext); + } + + public static void prepareOthers(Log log, MavenProject project, MavenProjectHelper projectHelper, + File otherOutDir, BuildContext buildContext) throws MojoExecutionException { + + // are there any components, data formats or languages? + for (Resource r : project.getBuild().getResources()) { + File f = new File(r.getDirectory()); + if (!f.exists()) { + f = new File(project.getBasedir(), r.getDirectory()); + } + File comp = new File(f, "META-INF/services/org/apache/camel/component"); + if (comp.exists() && comp.isDirectory()) { + return; + } + File df = new File(f, "META-INF/services/org/apache/camel/dataformat"); + if (df.exists() && df.isDirectory()) { + return; + } + File lan = new File(f, "META-INF/services/org/apache/camel/language"); + if (lan.exists() && lan.isDirectory()) { + return; + } + } + + // okay none of those then this is a other kind of artifact + + // first we need to setup the output directory because the next check + // can stop the build before the end and eclipse always needs to know about that directory + if (projectHelper != null) { + projectHelper.addResource(project, otherOutDir.getPath(), Collections.singletonList("**/other.properties"), Collections.emptyList()); + } + + if (!PackageHelper.haveResourcesChanged(log, project, buildContext, "META-INF/services/org/apache/camel/component") + && !PackageHelper.haveResourcesChanged(log, project, buildContext, "META-INF/services/org/apache/camel/dataformat") + && !PackageHelper.haveResourcesChanged(log, project, buildContext, "META-INF/services/org/apache/camel/language")) { + return; + } + + File camelMetaDir = new File(otherOutDir, "META-INF/services/org/apache/camel/"); + + Properties properties = new Properties(); + properties.put("groupId", project.getGroupId()); + properties.put("artifactId", project.getArtifactId()); + properties.put("version", project.getVersion()); + properties.put("projectName", project.getName()); + if (project.getDescription() != null) { + properties.put("projectDescription", project.getDescription()); + } + + camelMetaDir.mkdirs(); + File outFile = new File(camelMetaDir, "other.properties"); + + // check if the existing file has the same content, and if so then leave it as is so we do not write any changes + // which can cause a re-compile of all the source code + if (outFile.exists()) { + try { + Properties existing = new Properties(); + + InputStream is = new FileInputStream(outFile); + existing.load(is); + is.close(); + + // are the content the same? + if (existing.equals(properties)) { + log.debug("No changes detected"); + return; + } + } catch (IOException e) { + // ignore + } + } + + try { + OutputStream os = buildContext.newFileOutputStream(outFile); + properties.store(os, "Generated by camel-package-maven-plugin"); + os.close(); + + log.info("Generated " + outFile); + + } catch (IOException e) { + throw new MojoExecutionException("Failed to write properties to " + outFile + ". Reason: " + e, e); + } + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/41200e25/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareComponentMojo.java ---------------------------------------------------------------------- diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareComponentMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareComponentMojo.java index c71f77b..7d5c8ed 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareComponentMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareComponentMojo.java @@ -28,6 +28,7 @@ import org.sonatype.plexus.build.incremental.BuildContext; import static org.apache.camel.maven.packaging.PackageComponentMojo.prepareComponent; import static org.apache.camel.maven.packaging.PackageDataFormatMojo.prepareDataFormat; import static org.apache.camel.maven.packaging.PackageLanguageMojo.prepareLanguage; +import static org.apache.camel.maven.packaging.PackageOtherMojo.prepareOthers; /** * Prepares a Camel component analyzing if the maven module contains Camel @@ -35,6 +36,7 @@ import static org.apache.camel.maven.packaging.PackageLanguageMojo.prepareLangua * <li>components</li> * <li>dataformats</li> * <li>languages</li> + * <li>others</li> * </ul> * And for each of those generates extra descriptors and schema files for easier auto-discovery in Camel and tooling. * @@ -73,7 +75,14 @@ public class PrepareComponentMojo extends AbstractMojo { protected File languageOutDir; /** - * The output directory for generated languages file + * The output directory for generated others file + * + * @parameter default-value="${project.build.directory}/generated/camel/others" + */ + protected File otherOutDir; + + /** + * The output directory for generated schema file * * @parameter default-value="${project.build.directory}/classes" */ @@ -107,6 +116,7 @@ public class PrepareComponentMojo extends AbstractMojo { prepareComponent(getLog(), project, projectHelper, componentOutDir, buildContext); prepareDataFormat(getLog(), project, projectHelper, dataFormatOutDir, schemaOutDir, buildContext); prepareLanguage(getLog(), project, projectHelper, languageOutDir, schemaOutDir, buildContext); + prepareOthers(getLog(), project, projectHelper, otherOutDir, buildContext); } }