From 9849c92e80b75ec40a18683e94c17017aed95531 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Wed, 27 Feb 2013 18:09:20 +0100 Subject: [PATCH] SHRINKRES-62 MavenImporter should support shrinkwrap filtering --- .../src/it/jar-sample/pom-b.xml | 61 ++++++++++ impl-maven-archive/src/it/jar-sample/pom.xml | 12 ++ .../src/main/resources/file.toExclude | 0 .../src/it/war-sample/pom-b.xml | 105 ++++++++++++++++++ impl-maven-archive/src/it/war-sample/pom.xml | 9 ++ .../src/main/webapp/file.packagingToExclude | 0 .../war-sample/src/main/webapp/file.toExclude | 0 .../src/main/webapp/file.warSourceToExclude | 0 .../packaging/AbstractCompilingProcessor.java | 62 +++++++++++ .../packaging/JarPackagingProcessor.java | 56 +++++++++- .../packaging/WarPackagingProcessor.java | 49 +++++++- .../maven/archive/importer/AssertArchive.java | 18 +++ .../importer/JarMavenImporterTestCase.java | 38 ++++++- .../importer/WarMavenImporterTestCase.java | 40 ++++++- pom.xml | 2 +- 15 files changed, 442 insertions(+), 10 deletions(-) create mode 100644 impl-maven-archive/src/it/jar-sample/pom-b.xml create mode 100644 impl-maven-archive/src/it/jar-sample/src/main/resources/file.toExclude create mode 100644 impl-maven-archive/src/it/war-sample/pom-b.xml create mode 100644 impl-maven-archive/src/it/war-sample/src/main/webapp/file.packagingToExclude create mode 100644 impl-maven-archive/src/it/war-sample/src/main/webapp/file.toExclude create mode 100644 impl-maven-archive/src/it/war-sample/src/main/webapp/file.warSourceToExclude create mode 100644 impl-maven-archive/src/test/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/importer/AssertArchive.java diff --git a/impl-maven-archive/src/it/jar-sample/pom-b.xml b/impl-maven-archive/src/it/jar-sample/pom-b.xml new file mode 100644 index 000000000..04ca071ea --- /dev/null +++ b/impl-maven-archive/src/it/jar-sample/pom-b.xml @@ -0,0 +1,61 @@ + + + + + 4.0.0 + + + org.jboss.shrinkwrap.resolver.test + shrinkwrap-resolver-impl-maven-test-jar-sample + 1.0.0 + jar + ShrinkWrap Resolver Maven Archie Implementation Tests: Jar Sample + + + + + commons-codec + commons-codec + 1.7 + + + + junit + junit + test + 4.10 + + + + org.jboss.spec + jboss-javaee-web-6.0 + 3.0.2.Final + provided + pom + + + + xalan + xalan + + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.3.2 + + + **/*.toExclude + + + + + + + diff --git a/impl-maven-archive/src/it/jar-sample/pom.xml b/impl-maven-archive/src/it/jar-sample/pom.xml index 4bde2b6b4..1612041c1 100644 --- a/impl-maven-archive/src/it/jar-sample/pom.xml +++ b/impl-maven-archive/src/it/jar-sample/pom.xml @@ -44,6 +44,18 @@ + + + org.apache.maven.plugins + maven-jar-plugin + 2.3.2 + + + **/*.toExclude + + + + diff --git a/impl-maven-archive/src/it/jar-sample/src/main/resources/file.toExclude b/impl-maven-archive/src/it/jar-sample/src/main/resources/file.toExclude new file mode 100644 index 000000000..e69de29bb diff --git a/impl-maven-archive/src/it/war-sample/pom-b.xml b/impl-maven-archive/src/it/war-sample/pom-b.xml new file mode 100644 index 000000000..a2e81974e --- /dev/null +++ b/impl-maven-archive/src/it/war-sample/pom-b.xml @@ -0,0 +1,105 @@ + + + + + 4.0.0 + + + org.jboss.shrinkwrap.resolver.test + shrinkwrap-resolver-impl-maven-test-war-sample + 1.0.0 + war + ShrinkWrap Resolver Maven Archive Implementation Tests: War Sample + + + + + commons-codec + commons-codec + 1.7 + + + + + org.slf4j + slf4j-api + 1.6.1 + provided + + + + org.jboss.spec + jboss-javaee-web-6.0 + 3.0.2.Final + provided + pom + + + + xalan + xalan + + + + + + junit + junit + test + 4.10 + + + + + + war-sample + + + + org.apache.maven.plugins + maven-war-plugin + 2.1.1 + + + + org.slf4j + + + + **/*.packagingToExclude + + + **/*.warSourceToExclude + + + **/*.toExclude + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + false + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + default-test + integration-test + + test + + + + + + + + diff --git a/impl-maven-archive/src/it/war-sample/pom.xml b/impl-maven-archive/src/it/war-sample/pom.xml index 3262e3395..96c2c6db2 100644 --- a/impl-maven-archive/src/it/war-sample/pom.xml +++ b/impl-maven-archive/src/it/war-sample/pom.xml @@ -66,6 +66,15 @@ org.slf4j + + **/*.packagingToExclude + + + **/*.warSourceToExclude + + + **/*.toExclude + diff --git a/impl-maven-archive/src/it/war-sample/src/main/webapp/file.packagingToExclude b/impl-maven-archive/src/it/war-sample/src/main/webapp/file.packagingToExclude new file mode 100644 index 000000000..e69de29bb diff --git a/impl-maven-archive/src/it/war-sample/src/main/webapp/file.toExclude b/impl-maven-archive/src/it/war-sample/src/main/webapp/file.toExclude new file mode 100644 index 000000000..e69de29bb diff --git a/impl-maven-archive/src/it/war-sample/src/main/webapp/file.warSourceToExclude b/impl-maven-archive/src/it/war-sample/src/main/webapp/file.warSourceToExclude new file mode 100644 index 000000000..e69de29bb diff --git a/impl-maven-archive/src/main/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/packaging/AbstractCompilingProcessor.java b/impl-maven-archive/src/main/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/packaging/AbstractCompilingProcessor.java index a73b64626..5b3035a71 100644 --- a/impl-maven-archive/src/main/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/packaging/AbstractCompilingProcessor.java +++ b/impl-maven-archive/src/main/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/packaging/AbstractCompilingProcessor.java @@ -17,8 +17,10 @@ package org.jboss.shrinkwrap.resolver.impl.maven.archive.packaging; import java.io.File; +import java.util.ArrayList; import java.util.Collection; import java.util.Map; +import java.util.StringTokenizer; import java.util.logging.Level; import java.util.logging.Logger; @@ -27,6 +29,7 @@ import org.codehaus.plexus.compiler.CompilerMessage; import org.codehaus.plexus.compiler.CompilerResult; import org.codehaus.plexus.compiler.javac.JavacCompiler; +import org.codehaus.plexus.util.DirectoryScanner; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.resolver.api.maven.MavenResolvedArtifact; import org.jboss.shrinkwrap.resolver.api.maven.MavenWorkingSession; @@ -53,8 +56,20 @@ public abstract class AbstractCompilingProcessor warConfiguration, ArrayList excludes, String configurationKey) { + final Object packagingExcludes = warConfiguration.get(configurationKey); + if (packagingExcludes != null) { + final StringTokenizer tokenizer = new StringTokenizer(packagingExcludes.toString(), ","); + while (tokenizer.hasMoreElements()) { + excludes.add(tokenizer.nextToken()); + } + } + } + protected PackagingProcessor configure(MavenWorkingSession session) { this.session = session; return this; @@ -151,4 +166,51 @@ private static MavenImporterException constructCompilationException(CompilerResu } + protected String[] getExcludes(Map configuration) { + final ArrayList excludes = new ArrayList(); + addTokenized(configuration, excludes, "excludes"); + return excludes.toArray(new String[excludes.size()]); + } + + protected String[] getIncludes(Map configuration) { + final ArrayList excludes = new ArrayList(); + addTokenized(configuration, excludes, "includes"); + return excludes.toArray(new String[excludes.size()]); + } + + /** + * Returns the file to copy. If the includes are null or empty, the + * default includes are used. + * + * @param baseDir the base directory to start from + * @param includes the includes + * @param excludes the excludes + * @return the files to copy + */ + protected String[] getFilesToIncludes(File baseDir, String[] includes, String[] excludes) { + final DirectoryScanner scanner = new DirectoryScanner(); + scanner.setBasedir(baseDir); + + if (excludes != null) { + scanner.setExcludes(excludes); + } + scanner.addDefaultExcludes(); + + if (includes != null && includes.length > 0) { + scanner.setIncludes(includes); + } else { + scanner.setIncludes(DEFAULT_INCLUDES); + } + + scanner.scan(); + + final String[] includedFiles = scanner.getIncludedFiles(); + for (int i = 0; i < includedFiles.length; i++) { + includedFiles[i] = "/" + includedFiles[i]; + } + return includedFiles; + + } + + } diff --git a/impl-maven-archive/src/main/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/packaging/JarPackagingProcessor.java b/impl-maven-archive/src/main/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/packaging/JarPackagingProcessor.java index 88918a76d..9978a91fe 100644 --- a/impl-maven-archive/src/main/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/packaging/JarPackagingProcessor.java +++ b/impl-maven-archive/src/main/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/packaging/JarPackagingProcessor.java @@ -17,7 +17,11 @@ package org.jboss.shrinkwrap.resolver.impl.maven.archive.packaging; import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import org.codehaus.plexus.util.AbstractScanner; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.importer.ExplodedImporter; @@ -75,8 +79,18 @@ public JarPackagingProcessor importBuildOutput(MavenResolutionStrategy strategy) archive = archive.merge(classes); } + final Map jarConfiguration = pomFile.getPluginConfiguration(MAVEN_WAR_PLUGIN_KEY); // add resources - for (File resource : pomFile.getProjectResources()) { + final ListFilter listFilter = new ListFilter(); + final String[] includes = getIncludes(jarConfiguration); + listFilter.setExcludes(getExcludes(jarConfiguration)); + listFilter.addDefaultExcludes(); + if (includes == null || includes.length == 0) { + listFilter.setIncludes(DEFAULT_INCLUDES); + } else { + listFilter.setIncludes(includes); + } + for (File resource : listFilter.scan(pomFile.getProjectResources(), pomFile.getBaseDirectory())) { archive.addAsResource(resource); } @@ -88,4 +102,44 @@ public JavaArchive getResultingArchive() { return archive; } + private class ListFilter extends AbstractScanner { + public List scan(Iterable newfiles, File root) { + setupDefaultFilters(); + + final List includedFiles = new ArrayList(); + final int rootPathLength = root.getAbsolutePath().length(); + + for (File file : newfiles) { + String name = file.getAbsolutePath().substring(rootPathLength + 1); + if (file.isFile()) { + if (isIncluded(name)) { + if (!isExcluded(name)) { + includedFiles.add(file); + } + } + } + } + return includedFiles; + } + + @Override + public void scan() { + throw new UnsupportedOperationException(); + } + + @Override + public String[] getIncludedFiles() { + throw new UnsupportedOperationException(); + } + + @Override + public String[] getIncludedDirectories() { + throw new UnsupportedOperationException(); + } + + @Override + public File getBasedir() { + throw new UnsupportedOperationException(); + } + } } diff --git a/impl-maven-archive/src/main/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/packaging/WarPackagingProcessor.java b/impl-maven-archive/src/main/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/packaging/WarPackagingProcessor.java index 77c4ad2fa..de4a24276 100644 --- a/impl-maven-archive/src/main/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/packaging/WarPackagingProcessor.java +++ b/impl-maven-archive/src/main/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/packaging/WarPackagingProcessor.java @@ -17,10 +17,16 @@ package org.jboss.shrinkwrap.resolver.impl.maven.archive.packaging; import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.Map; import org.jboss.shrinkwrap.api.Archive; +import org.jboss.shrinkwrap.api.ArchivePath; +import org.jboss.shrinkwrap.api.Filter; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.importer.ExplodedImporter; import org.jboss.shrinkwrap.api.spec.JavaArchive; @@ -93,7 +99,7 @@ public WarPackagingProcessor importBuildOutput(MavenResolutionStrategy strategy) // add war content Map warConfiguration = pomFile.getPluginConfiguration(MAVEN_WAR_PLUGIN_KEY); - File warSourceDirectory = null; + File warSourceDirectory; if (warConfiguration.isEmpty() || !warConfiguration.containsKey("warSourceDirectory")) { warSourceDirectory = new File(pomFile.getBaseDirectory(), "src/main/webapp"); } @@ -103,7 +109,7 @@ public WarPackagingProcessor importBuildOutput(MavenResolutionStrategy strategy) if (Validate.isReadable(warSourceDirectory)) { WebArchive webapp = ShrinkWrap.create(ExplodedImporter.class, "webapp.war") - .importDirectory(warSourceDirectory) + .importDirectory(warSourceDirectory, createFilter(warConfiguration, warSourceDirectory)) .as(WebArchive.class); archive = archive.merge(webapp); @@ -118,4 +124,43 @@ public WarPackagingProcessor importBuildOutput(MavenResolutionStrategy strategy) return this; } + + protected Filter createFilter(Map warConfiguration, File warSourceDirectory) { + final String[] includes = getIncludes(warConfiguration); + final String[] excludes = getExcludes(warConfiguration); + final List filesToIncludes = Arrays.asList(getFilesToIncludes(warSourceDirectory, includes, excludes)); + return new Filter() { + @Override + public boolean include(ArchivePath archivePath) { + final String stringifiedPath = archivePath.get(); + if (filesToIncludes.contains(stringifiedPath)) { + return true; + } + for (String fileToInclude : filesToIncludes) { + if (fileToInclude.startsWith(stringifiedPath)) { + return true; + } + } + return false; + } + }; + } + + @Override + protected String[] getExcludes(Map configuration) { + final ArrayList excludes = new ArrayList(); + Collections.addAll(excludes, super.getExcludes(configuration)); + addTokenized(configuration, excludes, "packagingExcludes"); + addTokenized(configuration, excludes, "warSourceExcludes"); + return excludes.toArray(new String[excludes.size()]); + } + + @Override + protected String[] getIncludes(Map configuration) { + final ArrayList includes = new ArrayList(); + Collections.addAll(includes, super.getIncludes(configuration)); + addTokenized(configuration, includes, "packagingIncludes"); + addTokenized(configuration, includes, "warSourceIncludes"); + return includes.toArray(new String[includes.size()]); + } } diff --git a/impl-maven-archive/src/test/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/importer/AssertArchive.java b/impl-maven-archive/src/test/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/importer/AssertArchive.java new file mode 100644 index 000000000..15b4077eb --- /dev/null +++ b/impl-maven-archive/src/test/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/importer/AssertArchive.java @@ -0,0 +1,18 @@ +package org.jboss.shrinkwrap.resolver.impl.maven.archive.importer; + +import junit.framework.Assert; +import org.jboss.shrinkwrap.api.Archive; + +public final class AssertArchive { + + private AssertArchive() { + } + + public static void assertContains(Archive archive, String path) { + Assert.assertTrue(path + " should be included in archive " + archive.toString(true), archive.contains(path)); + } + + public static void assertNotContains(Archive archive, String path) { + Assert.assertFalse(path + " should NOT be included in archive " + archive.toString(true), archive.contains(path)); + } +} diff --git a/impl-maven-archive/src/test/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/importer/JarMavenImporterTestCase.java b/impl-maven-archive/src/test/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/importer/JarMavenImporterTestCase.java index 699b0cdfa..5f50fb5f3 100644 --- a/impl-maven-archive/src/test/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/importer/JarMavenImporterTestCase.java +++ b/impl-maven-archive/src/test/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/importer/JarMavenImporterTestCase.java @@ -16,8 +16,10 @@ */ package org.jboss.shrinkwrap.resolver.impl.maven.archive.importer; +import junit.framework.Assert; +import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ShrinkWrap; -import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.jboss.shrinkwrap.api.spec.WebArchive; import org.jboss.shrinkwrap.resolver.api.maven.archive.importer.MavenImporter; import org.junit.Test; @@ -31,10 +33,38 @@ public class JarMavenImporterTestCase { @Test public void importJar() { - JavaArchive war = ShrinkWrap.create(MavenImporter.class).loadPomFromFile("src/it/jar-sample/pom.xml") + // When + final Archive archive = doImport("src/it/jar-sample/pom.xml"); + + // Then + AssertArchive.assertContains(archive, "main.properties"); + AssertArchive.assertNotContains(archive, "file.toExclude"); + Assert.assertEquals(5, archive.getContent().size()); + } + + @Test + public void importWarWithIncludes() { + // When + final Archive archive = doImport("src/it/jar-sample/pom-b.xml"); + + // Then + AssertArchive.assertNotContains(archive, "main.properties"); + AssertArchive.assertContains(archive, "file.toExclude"); + Assert.assertEquals(5, archive.getContent().size()); + } + + private Archive doImport(String pomFile) { + // When + WebArchive archive = ShrinkWrap.create(MavenImporter.class).loadPomFromFile(pomFile) .importBuildOutput() - .as(JavaArchive.class); + .as(WebArchive.class); + + // Then + AssertArchive.assertNotContains(archive, ".svn"); + AssertArchive.assertNotContains(archive, "WEB-INF/.svn"); - System.out.println(war.toString(true)); + return archive; } + + } diff --git a/impl-maven-archive/src/test/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/importer/WarMavenImporterTestCase.java b/impl-maven-archive/src/test/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/importer/WarMavenImporterTestCase.java index 8b253b953..19acb6e7c 100644 --- a/impl-maven-archive/src/test/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/importer/WarMavenImporterTestCase.java +++ b/impl-maven-archive/src/test/java/org/jboss/shrinkwrap/resolver/impl/maven/archive/importer/WarMavenImporterTestCase.java @@ -16,6 +16,7 @@ */ package org.jboss.shrinkwrap.resolver.impl.maven.archive.importer; +import junit.framework.Assert; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.jboss.shrinkwrap.resolver.api.maven.archive.importer.MavenImporter; @@ -31,10 +32,45 @@ public class WarMavenImporterTestCase { @Test public void importWar() { - WebArchive war = ShrinkWrap.create(MavenImporter.class).loadPomFromFile("src/it/war-sample/pom.xml") +// When + final WebArchive archive = doImport("src/it/war-sample/pom.xml"); + +// Then + AssertArchive.assertContains(archive, "WEB-INF/web.xml"); + AssertArchive.assertNotContains(archive, "file.toExclude"); + AssertArchive.assertNotContains(archive, "file.packagingToExclude"); + AssertArchive.assertNotContains(archive, "file.warSourceToExclude"); + Assert.assertEquals(10, archive.getContent().size()); + } + + @Test + public void importWarWithIncludes() { +// When + final WebArchive archive = doImport("src/it/war-sample/pom-b.xml"); + +// Then + AssertArchive.assertNotContains(archive, "WEB-INF/web.xml"); + AssertArchive.assertContains(archive, "file.toExclude"); + AssertArchive.assertContains(archive, "file.packagingToExclude"); + AssertArchive.assertContains(archive, "file.warSourceToExclude"); + Assert.assertEquals(12, archive.getContent().size()); + } + + private WebArchive doImport(String pomFile) { +// When + WebArchive archive = ShrinkWrap.create(MavenImporter.class).loadPomFromFile(pomFile) .importBuildOutput() .as(WebArchive.class); - System.out.println(war.toString(true)); +// Then + AssertArchive.assertNotContains(archive, ".svn"); + AssertArchive.assertNotContains(archive, "WEB-INF/.svn"); + + AssertArchive.assertContains(archive, "WEB-INF/lib/commons-codec-1.7.jar"); + AssertArchive.assertContains(archive, "WEB-INF/classes/test/nested/NestedWarClass.class"); + AssertArchive.assertContains(archive, "WEB-INF/classes/test/WarClass.class"); + AssertArchive.assertContains(archive, "WEB-INF/classes/main.properties"); + + return archive; } } diff --git a/pom.xml b/pom.xml index 7f55c2792..10644b648 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ 4.8.2 3.0-beta-3 - 1.0.0 + 1.1.1 3.0.4