From 72231250ed81e10d66bfe70701e64fa5fe50f712 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Wed, 15 Jun 2016 23:09:44 +0200 Subject: Publish --- vespa-application-maven-plugin/.gitignore | 2 + vespa-application-maven-plugin/OWNERS | 1 + vespa-application-maven-plugin/pom.xml | 89 ++++++++++++++++ .../container/plugin/mojo/ApplicationMojo.java | 116 +++++++++++++++++++++ .../yahoo/container/plugin/mojo/Compression.java | 68 ++++++++++++ 5 files changed, 276 insertions(+) create mode 100644 vespa-application-maven-plugin/.gitignore create mode 100644 vespa-application-maven-plugin/OWNERS create mode 100644 vespa-application-maven-plugin/pom.xml create mode 100644 vespa-application-maven-plugin/src/main/java/com/yahoo/container/plugin/mojo/ApplicationMojo.java create mode 100644 vespa-application-maven-plugin/src/main/java/com/yahoo/container/plugin/mojo/Compression.java (limited to 'vespa-application-maven-plugin') diff --git a/vespa-application-maven-plugin/.gitignore b/vespa-application-maven-plugin/.gitignore new file mode 100644 index 00000000000..12251442258 --- /dev/null +++ b/vespa-application-maven-plugin/.gitignore @@ -0,0 +1,2 @@ +/target +/pom.xml.build diff --git a/vespa-application-maven-plugin/OWNERS b/vespa-application-maven-plugin/OWNERS new file mode 100644 index 00000000000..3b2ba1ede81 --- /dev/null +++ b/vespa-application-maven-plugin/OWNERS @@ -0,0 +1 @@ +gjoranv diff --git a/vespa-application-maven-plugin/pom.xml b/vespa-application-maven-plugin/pom.xml new file mode 100644 index 00000000000..1ad7a335d47 --- /dev/null +++ b/vespa-application-maven-plugin/pom.xml @@ -0,0 +1,89 @@ + + + + 4.0.0 + + com.yahoo.vespa + parent + 6-SNAPSHOT + ../parent/pom.xml + + vespa-application-maven-plugin + 6-SNAPSHOT + maven-plugin + Maven Plugin for assembling a vespa application package + + 2.2.0 + + + + org.apache.maven + maven-plugin-api + + + org.apache.maven.plugin-tools + maven-plugin-annotations + + + org.apache.maven + maven-model + + + org.apache.maven + maven-artifact + + + junit + junit + test + + + org.apache.maven.plugins + maven-jar-plugin + + + org.scala-lang + scala-library + + + commons-io + commons-io + + + + + + org.scala-tools + maven-scala-plugin + + + + add-source + compile + testCompile + + + + + + -unchecked + -deprecation + -explaintypes + + + + + org.apache.maven.plugins + maven-surefire-plugin + + once + + + + org.apache.maven.plugins + maven-plugin-plugin + + + + diff --git a/vespa-application-maven-plugin/src/main/java/com/yahoo/container/plugin/mojo/ApplicationMojo.java b/vespa-application-maven-plugin/src/main/java/com/yahoo/container/plugin/mojo/ApplicationMojo.java new file mode 100644 index 00000000000..4fdb0f17319 --- /dev/null +++ b/vespa-application-maven-plugin/src/main/java/com/yahoo/container/plugin/mojo/ApplicationMojo.java @@ -0,0 +1,116 @@ +// Copyright 2016 Yahoo Inc. 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.commons.io.FileUtils; +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 java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FilenameFilter; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/** + * @author tonytv + */ +@Mojo(name = "packageApplication", defaultPhase = LifecyclePhase.PACKAGE) +public class ApplicationMojo extends AbstractMojo { + + @Component + protected MavenProject project; + + @Parameter(defaultValue = "src/main/application") + private String sourceDir; + + @Parameter(defaultValue = "target/application") + private String destinationDir; + + @Override + public void execute() throws MojoExecutionException, MojoFailureException { + File applicationPackage = new File(project.getBasedir(), sourceDir); + File applicationDestination = new File(project.getBasedir(), destinationDir); + copyApplicationPackage(applicationPackage, applicationDestination); + + File componentsDir = createComponentsDir(applicationDestination); + copyModuleBundles(project.getBasedir(), componentsDir); + copyBundlesForSubModules(componentsDir); + + try { + Compression.zipDirectory(applicationDestination); + } catch (Exception e) { + throw new MojoExecutionException("Failed zipping application.", e); + } + } + + private void copyBundlesForSubModules(File componentsDir) throws MojoExecutionException { + List modules = emptyListIfNull(project.getModules()); + for (String module : modules) { + File moduleDir = new File(project.getBasedir(), module); + if (moduleDir.exists()) { + copyModuleBundles(moduleDir, componentsDir); + } + } + } + + private File createComponentsDir(File applicationDestination) throws MojoExecutionException { + File componentsDir = new File(applicationDestination, "components"); + componentsDir.mkdir(); + if (!componentsDir.exists() || !componentsDir.isDirectory()) { + throw new MojoExecutionException("Failed creating components directory (" + componentsDir + ")"); + } + return componentsDir; + } + + private void copyApplicationPackage(File applicationPackage, File applicationDestination) throws MojoExecutionException { + if (applicationPackage.exists()) { + try { + FileUtils.copyDirectory(applicationPackage, applicationDestination); + } catch (IOException e) { + throw new MojoExecutionException("Failed copying applicationPackage", e); + } + } + } + + private void copyModuleBundles(File moduleDir, File componentsDir) throws MojoExecutionException { + File moduleTargetDir = new File(moduleDir, "target"); + if (moduleTargetDir.exists()) { + File[] bundles = moduleTargetDir.listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.endsWith("-deploy.jar") || name.endsWith("-jar-with-dependencies.jar"); + } + }); + + for (File bundle : bundles) { + try { + copyFile(bundle, new File(componentsDir, bundle.getName())); + } catch (IOException e) { + throw new MojoExecutionException("Failed copying bundle " + bundle, e); + } + } + } + } + + private void copyFile(File source, File destination) throws IOException { + try (FileInputStream sourceStream = new FileInputStream(source); + FileOutputStream destinationStream = new FileOutputStream(destination)) { + Compression.copyBytes(sourceStream, destinationStream); + } + } + + @SuppressWarnings("unchecked") + private List emptyListIfNull(List modules) { + return modules == null ? + Collections.emptyList(): + modules; + } +} diff --git a/vespa-application-maven-plugin/src/main/java/com/yahoo/container/plugin/mojo/Compression.java b/vespa-application-maven-plugin/src/main/java/com/yahoo/container/plugin/mojo/Compression.java new file mode 100644 index 00000000000..0880b567343 --- /dev/null +++ b/vespa-application-maven-plugin/src/main/java/com/yahoo/container/plugin/mojo/Compression.java @@ -0,0 +1,68 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.container.plugin.mojo; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * @author tonytv + */ +public class Compression { + static public void zipDirectory(File dir) throws Exception { + FileOutputStream zipFile = new FileOutputStream(new File(dir.getParent(), dir.getName() + ".zip")); + ZipOutputStream zipOutputStream = new ZipOutputStream(zipFile); + try { + addDirectory(zipOutputStream, dir.getName(), dir, ""); + } finally { + zipOutputStream.close(); + } + } + + private static void addDirectory(ZipOutputStream zipOutputStream, String zipTopLevelDir, File baseDir, String relativePath) throws IOException { + File currentDir = new File(baseDir, relativePath); + + for (File child : currentDir.listFiles()) { + if (child.isDirectory()) { + addDirectory(zipOutputStream, zipTopLevelDir, baseDir, composePath(relativePath, child.getName())); + } else { + addFile(zipOutputStream, zipTopLevelDir, relativePath, child); + } + } + } + + private static void addFile(ZipOutputStream zipOutputStream, String zipTopLevelDir, String relativePath, File child) throws IOException { + ZipEntry entry = new ZipEntry(composePath(zipTopLevelDir, composePath(relativePath, child.getName()))); + zipOutputStream.putNextEntry(entry); + try { + FileInputStream fileInput = new FileInputStream(child); + try { + copyBytes(fileInput, zipOutputStream); + } finally { + fileInput.close(); + } + } finally { + zipOutputStream.closeEntry(); + } + } + + public static void copyBytes(InputStream input, OutputStream output) throws IOException { + byte[] b = new byte[1024]; + int numRead = 0; + + while((numRead = input.read(b)) != -1) { + output.write(b, 0, numRead); + } + } + + private static String composePath(String relativePath, String subDir) { + return relativePath.isEmpty() ? + subDir : + relativePath + File.separator + subDir; + } +} -- cgit v1.2.3