From 9ef4dd059567e7ba2108e50fd0c851178982006c Mon Sep 17 00:00:00 2001 From: Bjørn Christian Seime Date: Wed, 24 Jun 2020 13:49:56 +0200 Subject: Implement goal for assembling test bundles Introduce an abstract class containing behaviour that is shared with existing bundle assemble goal. Add abstract --- .../plugin/mojo/AbstractAssembleBundleMojo.java | 96 ++++++++++++++++++ .../plugin/mojo/AssembleContainerPluginMojo.java | 107 +++------------------ .../plugin/mojo/AssembleTestBundleMojo.java | 38 ++++++++ 3 files changed, 147 insertions(+), 94 deletions(-) create mode 100644 bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/AbstractAssembleBundleMojo.java create mode 100644 bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/AssembleTestBundleMojo.java (limited to 'bundle-plugin/src') diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/AbstractAssembleBundleMojo.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/AbstractAssembleBundleMojo.java new file mode 100644 index 00000000000..622cb9a49b0 --- /dev/null +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/AbstractAssembleBundleMojo.java @@ -0,0 +1,96 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.container.plugin.mojo; + +import com.yahoo.container.plugin.util.Files; +import com.yahoo.container.plugin.util.JarFiles; +import org.apache.maven.archiver.MavenArchiveConfiguration; +import org.apache.maven.archiver.MavenArchiver; +import org.apache.maven.artifact.Artifact; +import org.apache.maven.execution.MavenSession; +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.project.MavenProject; +import org.codehaus.plexus.archiver.jar.JarArchiver; + +import java.io.File; +import java.nio.channels.Channels; +import java.nio.file.Path; +import java.util.Collection; +import java.util.Enumeration; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.zip.ZipEntry; + +/** + * @author bjorncs + */ +abstract class AbstractAssembleBundleMojo extends AbstractMojo { + + @Parameter(defaultValue = "${project}") + MavenProject project; + + @Parameter(defaultValue = "${session}", readonly = true, required = true) + MavenSession session; + + @Parameter + MavenArchiveConfiguration archiveConfiguration = new MavenArchiveConfiguration(); + + void addDirectory(JarArchiver jarArchiver, Path directory) { + if (java.nio.file.Files.isDirectory(directory)) { + jarArchiver.addDirectory(directory.toFile()); + } + } + + void createArchive(JarArchiver jarArchiver, Path jarFile, Path manifestFile) throws MojoExecutionException { + archiveConfiguration.setForced(true); // force recreating the archive + archiveConfiguration.setManifestFile(manifestFile.toFile()); + MavenArchiver mavenArchiver = new MavenArchiver(); + mavenArchiver.setArchiver(jarArchiver); + mavenArchiver.setOutputFile(jarFile.toFile()); + try { + mavenArchiver.createArchive(session, project, archiveConfiguration); + } catch (Exception e) { + throw new MojoExecutionException("Error creating archive " + jarFile.toFile().getName(), e); + } + } + + void addArtifacts(JarArchiver jarArchiver, Collection artifacts) { + for (Artifact artifact : artifacts) { + if ("jar".equals(artifact.getType())) { + jarArchiver.addFile(artifact.getFile(), "dependencies/" + artifact.getFile().getName()); + copyConfigDefinitions(artifact.getFile(), jarArchiver); + } else { + getLog().warn("Unknown artifact type " + artifact.getType()); + } + } + } + + private void copyConfigDefinitions(File file, JarArchiver jarArchiver) { + JarFiles.withJarFile(file, jarFile -> { + for (Enumeration entries = jarFile.entries(); entries.hasMoreElements();) { + JarEntry entry = entries.nextElement(); + String name = entry.getName(); + if (name.startsWith("configdefinitions/") && name.endsWith(".def")) { + copyConfigDefinition(jarFile, entry, jarArchiver); + } + } + return null; + }); + } + + private void copyConfigDefinition(JarFile jarFile, ZipEntry entry, JarArchiver jarArchiver) { + JarFiles.withInputStream(jarFile, entry, input -> { + String defPath = entry.getName().replace("/", File.separator); + File destinationFile = new File(project.getBuild().getOutputDirectory(), defPath); + destinationFile.getParentFile().mkdirs(); + + Files.withFileOutputStream(destinationFile, output -> { + output.getChannel().transferFrom(Channels.newChannel(input), 0, Long.MAX_VALUE); + return null; + }); + jarArchiver.addFile(destinationFile, entry.getName()); + return null; + }); + } +} diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/AssembleContainerPluginMojo.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/AssembleContainerPluginMojo.java index 13d73d58a97..bed7610e82f 100644 --- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/AssembleContainerPluginMojo.java +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/AssembleContainerPluginMojo.java @@ -1,53 +1,36 @@ // Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.container.plugin.mojo; -import com.yahoo.container.plugin.util.Files; -import com.yahoo.container.plugin.util.JarFiles; -import org.apache.maven.archiver.MavenArchiveConfiguration; -import org.apache.maven.archiver.MavenArchiver; -import org.apache.maven.execution.MavenSession; import org.apache.maven.model.Build; -import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.annotations.Component; 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.codehaus.plexus.archiver.jar.JarArchiver; import java.io.File; -import java.nio.channels.Channels; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.EnumMap; -import java.util.Enumeration; import java.util.Map; -import java.util.jar.JarEntry; import java.util.jar.JarFile; -import java.util.zip.ZipEntry; /** * @author Tony Vaagenes - * @author ollivir + * @author Olli Virtanen + * @author bjorncs */ @Mojo(name = "assemble-container-plugin", requiresDependencyResolution = ResolutionScope.COMPILE, threadSafe = true) -public class AssembleContainerPluginMojo extends AbstractMojo { +public class AssembleContainerPluginMojo extends AbstractAssembleBundleMojo { private static enum Dependencies { WITH, WITHOUT } - @Parameter(defaultValue = "${project}") - private MavenProject project = null; - @Component private MavenProjectHelper projectHelper; - @Parameter(defaultValue = "${session}", readonly = true, required = true) - private MavenSession session = null; - - @Parameter - private MavenArchiveConfiguration archiveConfiguration = new MavenArchiveConfiguration(); - @Parameter(alias = "UseCommonAssemblyIds", defaultValue = "false") private boolean useCommonAssemblyIds = false; @@ -74,19 +57,17 @@ public class AssembleContainerPluginMojo extends AbstractMojo { jarFiles.put(dep, jarFileInBuildDirectory(build().getFinalName(), suffix)); }); - // force recreating the archive - archiveConfiguration.setForced(true); - archiveConfiguration.setManifestFile(new File(new File(build().getOutputDirectory()), JarFile.MANIFEST_NAME)); + Path manifestFile = Paths.get(build().getOutputDirectory(), JarFile.MANIFEST_NAME); JarArchiver jarWithoutDependencies = new JarArchiver(); - addClassesDirectory(jarWithoutDependencies); - createArchive(jarFiles.get(Dependencies.WITHOUT), jarWithoutDependencies); + addDirectory(jarWithoutDependencies, Paths.get(build().getOutputDirectory())); + createArchive(jarWithoutDependencies, jarFiles.get(Dependencies.WITHOUT).toPath(), manifestFile); project.getArtifact().setFile(jarFiles.get(Dependencies.WITHOUT)); JarArchiver jarWithDependencies = new JarArchiver(); - addClassesDirectory(jarWithDependencies); - addDependencies(jarWithDependencies); - createArchive(jarFiles.get(Dependencies.WITH), jarWithDependencies); + addDirectory(jarWithDependencies, Paths.get(build().getOutputDirectory())); + addArtifacts(jarWithDependencies, Artifacts.getArtifactsToInclude(project)); + createArchive(jarWithDependencies, jarFiles.get(Dependencies.WITH).toPath(), manifestFile); if (attachBundleArtifact) { projectHelper.attachArtifact(project, @@ -96,68 +77,6 @@ public class AssembleContainerPluginMojo extends AbstractMojo { } } - private File jarFileInBuildDirectory(String name, String suffix) { - return new File(build().getDirectory(), name + suffix); - } - - private void addClassesDirectory(JarArchiver jarArchiver) { - File classesDirectory = new File(build().getOutputDirectory()); - if (classesDirectory.isDirectory()) { - jarArchiver.addDirectory(classesDirectory); - } - } - - private void createArchive(File jarFile, JarArchiver jarArchiver) throws MojoExecutionException { - MavenArchiver mavenArchiver = new MavenArchiver(); - mavenArchiver.setArchiver(jarArchiver); - mavenArchiver.setOutputFile(jarFile); - try { - mavenArchiver.createArchive(session, project, archiveConfiguration); - } catch (Exception e) { - throw new MojoExecutionException("Error creating archive " + jarFile.getName(), e); - } - } - - private void addDependencies(JarArchiver jarArchiver) { - Artifacts.getArtifactsToInclude(project).forEach(artifact -> { - if ("jar".equals(artifact.getType())) { - jarArchiver.addFile(artifact.getFile(), "dependencies/" + artifact.getFile().getName()); - copyConfigDefinitions(artifact.getFile(), jarArchiver); - } else { - getLog().warn("Unkown artifact type " + artifact.getType()); - } - }); - } - - private void copyConfigDefinitions(File file, JarArchiver jarArchiver) { - JarFiles.withJarFile(file, jarFile -> { - for (Enumeration entries = jarFile.entries(); entries.hasMoreElements();) { - JarEntry entry = entries.nextElement(); - String name = entry.getName(); - if (name.startsWith("configdefinitions/") && name.endsWith(".def")) { - copyConfigDefinition(jarFile, entry, jarArchiver); - } - } - return null; - }); - } - - private void copyConfigDefinition(JarFile jarFile, ZipEntry entry, JarArchiver jarArchiver) { - JarFiles.withInputStream(jarFile, entry, input -> { - String defPath = entry.getName().replace("/", File.separator); - File destinationFile = new File(build().getOutputDirectory(), defPath); - destinationFile.getParentFile().mkdirs(); - - Files.withFileOutputStream(destinationFile, output -> { - output.getChannel().transferFrom(Channels.newChannel(input), 0, Long.MAX_VALUE); - return null; - }); - jarArchiver.addFile(destinationFile, entry.getName()); - return null; - }); - } - - private Build build() { - return project.getBuild(); - } + private File jarFileInBuildDirectory(String name, String suffix) { return new File(build().getDirectory(), name + suffix); } + private Build build() { return project.getBuild(); } } diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/AssembleTestBundleMojo.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/AssembleTestBundleMojo.java new file mode 100644 index 00000000000..ab827275f53 --- /dev/null +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/AssembleTestBundleMojo.java @@ -0,0 +1,38 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.container.plugin.mojo; + +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.plugins.annotations.ResolutionScope; +import org.codehaus.plexus.archiver.jar.JarArchiver; + +import java.nio.file.Path; +import java.nio.file.Paths; + +import static com.yahoo.container.plugin.mojo.TestBundleUtils.archiveFile; +import static com.yahoo.container.plugin.mojo.TestBundleUtils.manifestFile; + +/** + * @author bjorncs + */ +@Mojo(name = "assemble-test-bundle", requiresDependencyResolution = ResolutionScope.TEST, threadSafe = true) +public class AssembleTestBundleMojo extends AbstractAssembleBundleMojo { + + @Parameter + private String testProvidedArtifacts; + + @Override + public void execute() throws MojoExecutionException { + Artifacts.ArtifactSet artifacts = Artifacts.getArtifacts(project, true, testProvidedArtifacts); + JarArchiver archiver = new JarArchiver(); + addDirectory(archiver, Paths.get(project.getBuild().getOutputDirectory())); + addDirectory(archiver, Paths.get(project.getBuild().getTestOutputDirectory())); + addArtifacts(archiver, artifacts.getJarArtifactsToInclude()); + Path archiveFile = archiveFile(project); + createArchive(archiver, archiveFile, manifestFile(project)); + project.getArtifact().setFile(archiveFile.toFile()); + } + + +} -- cgit v1.2.3