From 2ac93136a4723dea1626c1b0143f0ce24a8b85b9 Mon Sep 17 00:00:00 2001 From: George Gastaldi Date: Fri, 2 Aug 2013 11:17:39 -0300 Subject: [PATCH] FORGE-1077: Moved the forge-maven-plugin to furnace-maven-plugin --- maven-plugin/README.asciidoc | 52 +++++ maven-plugin/pom.xml | 98 +++++++++ .../maven/plugin/AddonInstallMojo.java | 78 +++++++ .../maven/plugin/ConfigureAsAddonMojo.java | 30 +++ .../furnace/maven/plugin/GenerateDOTMojo.java | 206 ++++++++++++++++++ .../maven/plugin/AddonInstallMojoTest.java | 38 ++++ .../src/test/resources/plugin-config.xml | 82 +++++++ pom.xml | 2 +- 8 files changed, 585 insertions(+), 1 deletion(-) create mode 100644 maven-plugin/README.asciidoc create mode 100644 maven-plugin/pom.xml create mode 100644 maven-plugin/src/main/java/org/jboss/forge/furnace/maven/plugin/AddonInstallMojo.java create mode 100644 maven-plugin/src/main/java/org/jboss/forge/furnace/maven/plugin/ConfigureAsAddonMojo.java create mode 100644 maven-plugin/src/main/java/org/jboss/forge/furnace/maven/plugin/GenerateDOTMojo.java create mode 100644 maven-plugin/src/test/java/org/jboss/forge/furnace/maven/plugin/AddonInstallMojoTest.java create mode 100644 maven-plugin/src/test/resources/plugin-config.xml diff --git a/maven-plugin/README.asciidoc b/maven-plugin/README.asciidoc new file mode 100644 index 00000000..ca786993 --- /dev/null +++ b/maven-plugin/README.asciidoc @@ -0,0 +1,52 @@ +== Furnace Maven Plugin project + +=== Summary + +The Furnace Maven Plugin provides a clean Maven integration with Furnace. +You can install addons into a specific repository during build time, thus avoiding the need to store addons JARs in your SCM. + +NOTE: due to https://issues.jboss.org/browse/FORGE-1034, this plugin only runs in Maven 3.1.0 + +=== Install + +Add the following to your pom.xml: + +[source,xml] +---- + + org.jboss.furnace + furnace-maven-plugin + ${version.forge} + + + deploy-addons + prepare-package + + addon-install + + false + + ${basedir}/addon-repository + + org.jboss.forge:addon-manager,${version.forge} + org.jboss.forge:maven,${version.forge} + org.jboss.forge:projects,${version.forge} + + + + + + + org.jboss.forge.furnace + furnace-manager-resolver-maven + ${version.forge} + + + +---- + +Where: + + version.forge + +is a maven property with the desired forge version (E.g. 2.0.0.Alpha10) diff --git a/maven-plugin/pom.xml b/maven-plugin/pom.xml new file mode 100644 index 00000000..b403025d --- /dev/null +++ b/maven-plugin/pom.xml @@ -0,0 +1,98 @@ + + 4.0.0 + + org.jboss.forge.furnace + furnace-parent + 2.0.0-SNAPSHOT + + furnace-maven-plugin + maven-plugin + Furnace - Maven Plugin + http://forge.jboss.org + + + 3.1 + + + + UTF-8 + 3.1.0 + + + + + + org.apache.maven + maven-plugin-api + ${version.maven} + provided + + + org.apache.maven.plugin-tools + maven-plugin-annotations + 3.2 + provided + + + org.apache.maven + maven-project + 3.0-alpha-2 + provided + + + + + org.jboss.forge.furnace + furnace + compile + + + org.jboss.forge.furnace + furnace-manager + compile + + + org.jboss.forge.furnace + furnace-manager-spi + compile + + + + + + + org.apache.maven.plugins + maven-plugin-plugin + + forge + + + + generated-helpmojo + + helpmojo + + + + mojo-descriptor + + descriptor + + + + + + + + + org.apache.maven.plugins + maven-plugin-plugin + + true + + + + + + diff --git a/maven-plugin/src/main/java/org/jboss/forge/furnace/maven/plugin/AddonInstallMojo.java b/maven-plugin/src/main/java/org/jboss/forge/furnace/maven/plugin/AddonInstallMojo.java new file mode 100644 index 00000000..c9ea3299 --- /dev/null +++ b/maven-plugin/src/main/java/org/jboss/forge/furnace/maven/plugin/AddonInstallMojo.java @@ -0,0 +1,78 @@ +/* + * Copyright 2013 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Eclipse Public License version 1.0, available at + * http://www.eclipse.org/legal/epl-v10.html + */ + +package org.jboss.forge.furnace.maven.plugin; + +import java.io.File; +import java.util.Iterator; +import java.util.ServiceLoader; + +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.jboss.forge.furnace.Furnace; +import org.jboss.forge.furnace.addons.AddonId; +import org.jboss.forge.furnace.impl.FurnaceImpl; +import org.jboss.forge.furnace.manager.AddonManager; +import org.jboss.forge.furnace.manager.impl.AddonManagerImpl; +import org.jboss.forge.furnace.manager.request.InstallRequest; +import org.jboss.forge.furnace.manager.spi.AddonDependencyResolver; +import org.jboss.forge.furnace.repositories.AddonRepository; +import org.jboss.forge.furnace.repositories.AddonRepositoryMode; + +/** + * Goal which installs addons to a specified directory + */ +@Mojo(name = "addon-install", defaultPhase = LifecyclePhase.PREPARE_PACKAGE, threadSafe = true) +public class AddonInstallMojo extends AbstractMojo +{ + + /** + * Addon repository file location + */ + @Parameter(property = "forge.repository", required = true) + private File addonRepository; + + /** + * Addon IDs to install + */ + @Parameter(property = "forge.addonIds", required = true) + private String[] addonIds; + + @Override + public void execute() throws MojoExecutionException, MojoFailureException + { + Furnace forge = new FurnaceImpl(); + if (!addonRepository.exists()) + { + addonRepository.mkdirs(); + } + AddonRepository repository = forge.addRepository(AddonRepositoryMode.MUTABLE, addonRepository); + Iterator it = ServiceLoader.load(AddonDependencyResolver.class).iterator(); + if (!it.hasNext()) + { + throw new MojoExecutionException( + "No AddonDependencyResolver implementation found. Please add one in the section of the forge-maven-plugin."); + } + AddonDependencyResolver addonResolver = it.next(); + AddonManager addonManager = new AddonManagerImpl(forge, addonResolver, false); + + for (String addonId : addonIds) + { + AddonId id = AddonId.fromCoordinates(addonId); + InstallRequest install = addonManager.install(id, repository); + if (!install.getActions().isEmpty()) + { + getLog().info("" + install); + install.perform(); + } + } + } +} diff --git a/maven-plugin/src/main/java/org/jboss/forge/furnace/maven/plugin/ConfigureAsAddonMojo.java b/maven-plugin/src/main/java/org/jboss/forge/furnace/maven/plugin/ConfigureAsAddonMojo.java new file mode 100644 index 00000000..50531dde --- /dev/null +++ b/maven-plugin/src/main/java/org/jboss/forge/furnace/maven/plugin/ConfigureAsAddonMojo.java @@ -0,0 +1,30 @@ +/* + * Copyright 2013 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Eclipse Public License version 1.0, available at + * http://www.eclipse.org/legal/epl-v10.html + */ + +package org.jboss.forge.furnace.maven.plugin; + +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.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.project.MavenProject; + +@Mojo(name = "addon", defaultPhase = LifecyclePhase.VALIDATE) +public class ConfigureAsAddonMojo extends AbstractMojo +{ + + @Component + MavenProject project; + + @Override + public void execute() throws MojoExecutionException, MojoFailureException + { + + } +} diff --git a/maven-plugin/src/main/java/org/jboss/forge/furnace/maven/plugin/GenerateDOTMojo.java b/maven-plugin/src/main/java/org/jboss/forge/furnace/maven/plugin/GenerateDOTMojo.java new file mode 100644 index 00000000..0aeb3a5c --- /dev/null +++ b/maven-plugin/src/main/java/org/jboss/forge/furnace/maven/plugin/GenerateDOTMojo.java @@ -0,0 +1,206 @@ +/* + * Copyright 2013 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Eclipse Public License version 1.0, available at + * http://www.eclipse.org/legal/epl-v10.html + */ + +package org.jboss.forge.furnace.maven.plugin; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Iterator; +import java.util.ServiceLoader; + +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.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.project.MavenProject; +import org.apache.maven.project.MavenProjectHelper; +import org.jboss.forge.furnace.addons.AddonId; +import org.jboss.forge.furnace.impl.graph.AddonDependencyEdge; +import org.jboss.forge.furnace.impl.graph.AddonDependencyEdgeNameProvider; +import org.jboss.forge.furnace.impl.graph.AddonVertex; +import org.jboss.forge.furnace.impl.graph.AddonVertexNameProvider; +import org.jboss.forge.furnace.manager.spi.AddonDependencyResolver; +import org.jboss.forge.furnace.manager.spi.AddonInfo; +import org.jboss.forge.furnace.repositories.AddonDependencyEntry; +import org.jgrapht.DirectedGraph; +import org.jgrapht.ext.DOTExporter; +import org.jgrapht.ext.IntegerNameProvider; +import org.jgrapht.graph.DefaultDirectedGraph; + +/** + * Generate a DOT file from the graph + */ +@Mojo(defaultPhase = LifecyclePhase.PREPARE_PACKAGE, name = "generate-dot", threadSafe = true) +public class GenerateDOTMojo extends AbstractMojo +{ + /** + * Output directoy + */ + @Parameter(defaultValue = "${project.build.outputDirectory}/META-INF/resources") + private String outputDirectory; + + /** + * The output filename. Default will be the addonId name (without the groupId) + */ + @Parameter + private String outputFileName; + + /** + * Include transitive addons + */ + @Parameter + private boolean includeTransitiveAddons; + + /** + * Addon IDs to install + */ + @Parameter + private String[] addonIds; + + /** + * Should the produced artifact be attached to the project? + */ + @Parameter + private boolean attach; + + /** + * Skip this execution ? + */ + @Parameter + private boolean skip; + + /** + * The current maven project + */ + @Component + private MavenProject mavenProject; + + /** + * Maven Project Helper + */ + @Component + private MavenProjectHelper projectHelper; + + @Override + public void execute() throws MojoExecutionException, MojoFailureException + { + if (skip) + { + getLog().info("Execution skipped."); + return; + } + Iterator it = ServiceLoader.load(AddonDependencyResolver.class).iterator(); + if (!it.hasNext()) + { + throw new MojoExecutionException( + "No AddonDependencyResolver implementation found. Please add one in the section of the forge-maven-plugin."); + } + AddonDependencyResolver addonResolver = it.next(); + if (addonIds == null || addonIds.length == 0) + { + // XXX + // if (!"forge-addon".equals(mavenProject.getArtifact().getClassifier())) + // { + // getLog().warn("No informed and current project is not a forge-addon. Skipping"); + // return; + // } + AddonId id = AddonId.from(mavenProject.getGroupId() + ":" + mavenProject.getArtifactId(), + mavenProject.getVersion()); + String fileName = outputFileName == null ? id.getName().substring(id.getName().indexOf(':') + 1) + "-" + + id.getVersion() + ".dot" : outputFileName; + File file = generateDOTFile(addonResolver, id, fileName); + if (attach && file.isFile()) + { + projectHelper.attachArtifact(mavenProject, "dot", file); + } + } + else + { + for (String addonId : addonIds) + { + AddonId id = AddonId.fromCoordinates(addonId); + String fileName = id.getName().substring(id.getName().indexOf(':') + 1) + "-" + + id.getVersion() + ".dot"; + generateDOTFile(addonResolver, id, fileName); + } + } + } + + /** + * Generates the DOT file for a given addonId + * + * @param addonResolver + * @param id + * @return generated file + */ + private File generateDOTFile(AddonDependencyResolver addonResolver, AddonId id, String fileName) + { + AddonInfo addonInfo = addonResolver.resolveAddonDependencyHierarchy(id); + File parent = new File(outputDirectory); + parent.mkdirs(); + File file = new File(parent, fileName); + getLog().info("Generating " + file); + toDOT(file, toGraph(addonInfo)); + return file; + } + + DirectedGraph toGraph(AddonInfo info) + { + DirectedGraph graph = new DefaultDirectedGraph( + AddonDependencyEdge.class); + AddonId addon = info.getAddon(); + AddonVertex rootVertex = new AddonVertex(addon.getName(), addon.getVersion()); + graph.addVertex(rootVertex); + for (AddonDependencyEntry entry : info.getDependencyEntries()) + { + AddonVertex depVertex = new AddonVertex(entry.getName(), entry.getVersionRange().getMax()); + graph.addVertex(depVertex); + graph.addEdge(rootVertex, depVertex, + new AddonDependencyEdge(entry.getVersionRange(), entry.isExported())); + } + if (includeTransitiveAddons) + { + // TODO + } + return graph; + } + + void toDOT(File file, DirectedGraph graph) + { + FileWriter fw = null; + try + { + DOTExporter exporter = new DOTExporter( + new IntegerNameProvider(), + new AddonVertexNameProvider(), + new AddonDependencyEdgeNameProvider()); + + fw = new FileWriter(file); + exporter.export(fw, graph); + fw.flush(); + } + catch (IOException e) + { + e.printStackTrace(); + } + finally + { + if (fw != null) + try + { + fw.close(); + } + catch (IOException ignored) + { + } + } + } +} \ No newline at end of file diff --git a/maven-plugin/src/test/java/org/jboss/forge/furnace/maven/plugin/AddonInstallMojoTest.java b/maven-plugin/src/test/java/org/jboss/forge/furnace/maven/plugin/AddonInstallMojoTest.java new file mode 100644 index 00000000..33ac4d36 --- /dev/null +++ b/maven-plugin/src/test/java/org/jboss/forge/furnace/maven/plugin/AddonInstallMojoTest.java @@ -0,0 +1,38 @@ +/* + * Copyright 2013 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Eclipse Public License version 1.0, available at + * http://www.eclipse.org/legal/epl-v10.html + */ + +package org.jboss.forge.furnace.maven.plugin; + +import org.junit.Test; + +public class AddonInstallMojoTest +{ + + // public static void main(String[] args) throws Exception + // { + // Furnace forge = new FurnaceImpl(); + // File addonRepository = File.createTempFile("furnace", "tmp"); + // AddonRepository repository = forge.addRepository(AddonRepositoryMode.MUTABLE, addonRepository); + // AddonDependencyResolver addonResolver = new MavenAddonDependencyResolver(); + // AddonManager addonManager = new AddonManagerImpl(forge, addonResolver, false); + // + // AddonId id = AddonId.fromCoordinates("org.jboss.forge.addon:addons,2.0.0-SNAPSHOT"); + // InstallRequest install = addonManager.install(id, repository); + // System.out.println(install); + // if (!install.getActions().isEmpty()) + // { + // install.perform(); + // } + // System.out.println(addonRepository); + // } + + @Test + public void testAddonInstall() throws Exception + { + } + +} diff --git a/maven-plugin/src/test/resources/plugin-config.xml b/maven-plugin/src/test/resources/plugin-config.xml new file mode 100644 index 00000000..9ff8fd98 --- /dev/null +++ b/maven-plugin/src/test/resources/plugin-config.xml @@ -0,0 +1,82 @@ + + + 4.0.0 + com.example.demo + demo + 1.0.0-SNAPSHOT + + 2.0.0-SNAPSHOT + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + + 1.6 + 1.6 + + + + org.jboss.forge.furnace + furnace-maven-plugin + ${version.forge} + + + deploy-addons + prepare-package + + addon-install + + false + + ${basedir}/addon-repository + + org.jboss.forge.addon:addons,${version.forge} + org.jboss.forge.addon:convert,${version.forge} + org.jboss.forge.addon:facets,${version.forge} + org.jboss.forge.addon:environment,${version.forge} + org.jboss.forge.addon:resources,${version.forge} + org.jboss.forge.addon:dependencies,${version.forge} + org.jboss.forge.addon:addon-manager,${version.forge} + org.jboss.forge.addon:maven,${version.forge} + org.jboss.forge.addon:projects,${version.forge} + org.jboss.forge.addon:ui,${version.forge} + org.jboss.forge.addon:ui-spi,${version.forge} + + + + + + + maven-clean-plugin + 2.5 + + + clean-build-libs + clean + + clean + + false + + + + ${basedir}/lib + false + + + ${basedir}/addon-repository + false + + + + + + + + + diff --git a/pom.xml b/pom.xml index 9942efa6..8316c5fe 100644 --- a/pom.xml +++ b/pom.xml @@ -74,7 +74,7 @@ se-tests manager test-harness - + maven-plugin