You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2018/11/25 23:53:48 UTC

svn commit: r1847445 - in /jackrabbit/commons/filevault-package-maven-plugin/trunk: ./ src/main/java/org/apache/jackrabbit/filevault/maven/packaging/ src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/ src/test/resources/test-projects/def...

Author: tripod
Date: Sun Nov 25 23:53:48 2018
New Revision: 1847445

URL: http://svn.apache.org/viewvc?rev=1847445&view=rev
Log:
JCRVLT-279 fail for duplicate entries (closes #13)

Added:
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed/
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/expected-files-with-checksums.txt
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/jcr_root/
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/jcr_root/apps/
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/jcr_root/apps/install/
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/jcr_root/apps/install/.content.xml
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/jcr_root/apps/install/jcr-2.0.jar
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/pom.xml
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed/jcr_root/
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed/jcr_root/apps/
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed/jcr_root/apps/install/
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed/jcr_root/apps/install/.content.xml
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed/jcr_root/apps/install/jcr-2.0.jar
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed/pom.xml
Modified:
    jackrabbit/commons/filevault-package-maven-plugin/trunk/pom.xml
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/AbstractPackageMojo.java
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/GenerateMetadataMojo.java
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojo.java
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/DefaultProjectIT.java
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/ProjectBuilder.java
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/generic-unusal-jcrroot/expected-files.txt
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/generic-with-builtcd/expected-files.txt
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/generic/expected-files.txt
    jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/resource/expected-files.txt

Modified: jackrabbit/commons/filevault-package-maven-plugin/trunk/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/pom.xml?rev=1847445&r1=1847444&r2=1847445&view=diff
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/pom.xml (original)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/pom.xml Sun Nov 25 23:53:48 2018
@@ -153,7 +153,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-failsafe-plugin</artifactId>
-                <version>2.20.1</version>
+                <version>2.22.1</version>
                 <executions>
                     <execution>
                         <goals>
@@ -169,6 +169,17 @@
                 </executions>
             </plugin>
             <!-- ====================================================================== -->
+            <!-- S U R E F I R E   P L U G I N                                          -->
+            <!-- ====================================================================== -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.22.1</version>
+                <configuration>
+                    <trimStackTrace>false</trimStackTrace>
+                </configuration>
+            </plugin>
+            <!-- ====================================================================== -->
             <!-- S I T E   P L U G I N                                                  -->
             <!-- ====================================================================== -->
             <plugin>

Modified: jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/AbstractPackageMojo.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/AbstractPackageMojo.java?rev=1847445&r1=1847444&r2=1847445&view=diff
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/AbstractPackageMojo.java (original)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/AbstractPackageMojo.java Sun Nov 25 23:53:48 2018
@@ -48,6 +48,7 @@ public abstract class AbstractPackageMoj
 
     /**
      * Adds a path prefix to all resources useful for shallower source trees.
+     * This does not apply to files in {@link #workDirectory}.
      */
     @Parameter(property = "vault.prefix")
     String prefix = "";
@@ -62,8 +63,8 @@ public abstract class AbstractPackageMoj
     }
 
     /**
-     * The directory containing the content to be packaged up into the content
-     * package.
+     * The directory containing the metadata to be packaged up into the content package.
+     * Basically containing all files/folders being generated by goal "generate-metadata".
      */
     @Parameter(
             defaultValue = "${project.build.directory}/vault-work",

Modified: jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/GenerateMetadataMojo.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/GenerateMetadataMojo.java?rev=1847445&r1=1847444&r2=1847445&view=diff
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/GenerateMetadataMojo.java (original)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/GenerateMetadataMojo.java Sun Nov 25 23:53:48 2018
@@ -71,7 +71,9 @@ import aQute.bnd.header.Parameters;
 import aQute.bnd.osgi.Processor;
 
 /**
- * Maven goal which generates the metadata ending up in the package like {@code filter.xml}, {@code properties.xml} as well as the {@code MANIFEST.MF}.
+ * Maven goal which generates the metadata ending up in the package like {@code META-INF/MANIFEST.MF} as well as the
+ * files ending up in {@code META-INF/vault} like {@code filter.xml}, {@code properties.xml}, {@code config.xml} and
+ * {@code settings.xml}. Those files will be written to the directory given via parameter {@link #workDirectory}.
  * In addition performs some validations.
  */
 @Mojo(

Modified: jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojo.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojo.java?rev=1847445&r1=1847444&r2=1847445&view=diff
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojo.java (original)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojo.java Sun Nov 25 23:53:48 2018
@@ -17,7 +17,6 @@
 package org.apache.jackrabbit.filevault.maven.packaging;
 
 import java.io.File;
-import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -46,7 +45,10 @@ import org.apache.maven.plugins.annotati
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.plugins.annotations.ResolutionScope;
 import org.codehaus.plexus.archiver.ArchiveEntry;
+import org.codehaus.plexus.archiver.Archiver;
+import org.codehaus.plexus.archiver.ArchiverException;
 import org.codehaus.plexus.archiver.FileSet;
+import org.codehaus.plexus.archiver.ResourceIterator;
 import org.codehaus.plexus.util.AbstractScanner;
 import org.codehaus.plexus.util.DirectoryScanner;
 import org.codehaus.plexus.util.FileUtils;
@@ -109,6 +111,17 @@ public class VaultMojo extends AbstractP
     private boolean failOnUncoveredSourceFiles;
 
     /**
+     * Set to {@code false} to not fail the build in case of files/folders being added to the resulting 
+     * package more than once. Usually this indicates overlapping with embedded files or overlapping filter rules.
+     */
+    @Parameter(
+            property = "vault.failOnDuplicateEntries",
+            required = true,
+            defaultValue = "true"
+    )
+    private boolean failOnDuplicateEntries;
+
+    /**
      * The name of the generated package ZIP file without the ".zip" file
      * extension.
      */
@@ -139,9 +152,15 @@ public class VaultMojo extends AbstractP
     /**
      * The file name patterns to exclude in addition to the ones listed in
      * {@link AbstractScanner#DEFAULTEXCLUDES}. The format of each pattern is described in {@link DirectoryScanner}.
+     * The comparison is against the path relative to the according filter root.
+     * Since this is hardly predictable it is recommended to use only filename/directory name patterns here 
+     * but not take into account file system hierarchies!
+     * <p>
+     * Each value is either a regex pattern if enclosed within {@code %regex[} and {@code ]}, otherwise an 
+     * <a href="https://ant.apache.org/manual/dirtasks.html#patterns">Ant pattern</a>.
      */
     @Parameter(property = "vault.excludes",
-               defaultValue="**/.vlt,**/.vltignore,**/.DS_Store",
+               defaultValue="**/.vlt,**/.vltignore",
                required = true)
     private String[] excludes;
 
@@ -172,7 +191,7 @@ public class VaultMojo extends AbstractP
         }
         return fileSet(directory)
                 .prefixed(prefix)
-                .includeExclude(null, excludes.toArray(new String[excludes.size()]))
+                .includeExclude(null, excludes.toArray(new String[0]))
                 .includeEmptyDirs(true);
     }
 
@@ -180,14 +199,14 @@ public class VaultMojo extends AbstractP
      * Executes this mojo
      */
     @Override
-    public void execute() throws MojoExecutionException, MojoFailureException {
+    public void execute() throws MojoExecutionException {
         final File finalFile = new File(outputDirectory, finalName + PACKAGE_EXT);
 
         try {
             // find the meta-inf source directory
             File metaInfDirectory = getMetaInfDir();
             // find the source directory
-            File jcrSourceDirectory = null;
+            final File jcrSourceDirectory;
             if (builtContentDirectory != null) {
                 getLog().warn("The 'builtContentDirectory' is deprecated. Please use the new 'jcrRootSourceDirectory' instead.");
                 jcrSourceDirectory = builtContentDirectory;
@@ -203,18 +222,26 @@ public class VaultMojo extends AbstractP
             Map<String, File> embeddedFiles = getEmbeddedFilesMap();
 
             ContentPackageArchiver contentPackageArchiver = new ContentPackageArchiver();
+            if (failOnDuplicateEntries) {
+                contentPackageArchiver.setDuplicateBehavior(Archiver.DUPLICATES_FAIL);
+            }
             contentPackageArchiver.setIncludeEmptyDirs(true);
             if (metaInfDirectory != null) {
-                // ensure that generated filter.xml comes first
-                File filterXML = getFilterFile();
-                if (filterXML.exists()) {
-                    contentPackageArchiver.addFile(filterXML, "META-INF/vault/filter.xml");
-                }
-                contentPackageArchiver.addFileSet(createFileSet(metaInfDirectory, "META-INF/vault/"));
+                // first add the metadata from the metaInfDirectory (they should take precedence over the generated ones from workDirectory, 
+                // except for the filter.xml, which should always come from the work directory)
+                contentPackageArchiver.addFileSet(createFileSet(metaInfDirectory, "META-INF/vault/", Collections.singletonList("filter.xml")));
             }
-            contentPackageArchiver.addFileSet(createFileSet(workDirectory, "", Collections.singletonList("META-INF/MANIFEST.MF")));
-            contentPackageArchiver.addFileSet(createFileSet(workDirectory, "", null));
-
+            // then add all files from the workDirectory (they might overlap with the ones from metaInfDirectory, therefore only add the non-conflicting ones)
+            Collection<File> workDirectoryFilesNotYetExistingInArchive = getUncoveredFiles(workDirectory, "", contentPackageArchiver.getFiles().keySet(), Collections.singletonList("META-INF/MANIFEST.MF"));
+            for (File workDirectoryFile : workDirectoryFilesNotYetExistingInArchive) {
+                contentPackageArchiver.addFile(workDirectoryFile, workDirectory.toPath().relativize(workDirectoryFile.toPath()).toString());
+            }
+            
+            // add embedded files
+            for (Map.Entry<String, File> entry : embeddedFiles.entrySet()) {
+                contentPackageArchiver.addFile(entry.getValue(), entry.getKey());
+            }
+            
             // include content from build only if it exists
             if (jcrSourceDirectory != null && jcrSourceDirectory.exists()) {
                 // See GRANITE-16348
@@ -241,23 +268,58 @@ public class VaultMojo extends AbstractP
                             continue;
                         }
 
+                        boolean isFilterRootDirectory = true;
                         File rootDirectory = new File(jcrSourceDirectory, relPath);
 
                         // traverse the ancestors until we find a existing directory (see CQ-4204625)
                         while ((!rootDirectory.exists() || !rootDirectory.isDirectory())
-                                && !jcrSourceDirectory.equals(rootDirectory)) {
+                                && !jcrSourceDirectory.equals(rootDirectory) && !fullCoverage.isFile()) {
                             rootDirectory = rootDirectory.getParentFile();
                             relPath = StringUtils.chomp(relPath, "/");
+                            fullCoverage = new File(rootDirectory, relPath + ".xml");
+                            isFilterRootDirectory = false;
                         }
 
-                        if (!jcrSourceDirectory.equals(rootDirectory)) {
+                        // either parent node was covered by a full coverage aggregate
+                        if (fullCoverage.isFile()) {
+                            rootPath = FileUtils.normalize(JCR_ROOT + prefix + relPath + ".xml");
+                            contentPackageArchiver.addFile(fullCoverage, rootPath);
+                        } else {
+                            // or a simple folder containing a ".content.xml"
                             rootPath = FileUtils.normalize(JCR_ROOT + prefix + relPath);
-                            contentPackageArchiver.addFileSet(createFileSet(rootDirectory, rootPath + "/"));
+                            // is the folder the filter root?
+                            if (isFilterRootDirectory) {
+                                // then just include the full folder
+                                contentPackageArchiver.addFileSet(createFileSet(rootDirectory, rootPath + "/"));
+                            } else {
+                                // otherwise, make sure to not add child directories which are not direct ancestors of the filter roots
+                                contentPackageArchiver.addFileSet(createFileSet(rootDirectory, rootPath + "/",
+                                        Collections.singletonList("%regex[^(?!\\.content\\.xml).*]")));
+                            }
                         }
                     }
                 }
-                
-                Collection<File> uncoveredFiles = getUncoveredFiles(jcrSourceDirectory, prefix, contentPackageArchiver.getFiles().keySet());
+
+                // check for for duplicates in the content package
+                if (failOnDuplicateEntries) {
+                    try {
+                        for (ResourceIterator iter = contentPackageArchiver.getResources(); iter.hasNext();) {
+                            iter.next();
+                        }
+                    } catch (ArchiverException e) {
+                        // this is most probably a duplicate exception
+                        // since there is no dedicated exception check if the message starts with "Duplicate file"
+                        if (e.getMessage() != null && e.getMessage().startsWith("Duplicate file")) {
+                            throw new MojoFailureException("Found duplicate files in content package, most probably you have overlapping filter roots " +
+                                    "or you embed a file which is already there in 'jcrRootSourceDirectory'. For details check the nested exception!", e);
+                        } else {
+                            throw e;
+                        }
+                    }
+                }
+
+                // check for uncovered files
+                Collection<File> uncoveredFiles = getUncoveredFiles(jcrSourceDirectory, JCR_ROOT + prefix, contentPackageArchiver.getFiles().keySet(), null);
                 if (!uncoveredFiles.isEmpty()) {
                     for (File uncoveredFile : uncoveredFiles) {
                         getLog().warn("File " + uncoveredFile + " not covered by a filter rule and therefore not contained in the resulting package");
@@ -268,10 +330,6 @@ public class VaultMojo extends AbstractP
                 }
             }
 
-            for (Map.Entry<String, File> entry : embeddedFiles.entrySet()) {
-                contentPackageArchiver.addFile(entry.getValue(), entry.getKey());
-            }
-
             //NPR-14102 - Automated check for index definition
             if (!allowIndexDefinitions) {
                 FileValidator fileValidator = new FileValidator();
@@ -312,13 +370,26 @@ public class VaultMojo extends AbstractP
         }
     }
 
-    private Collection<File> getUncoveredFiles(final File sourceDirectory, final String prefix, final Collection<String> entryNames) throws IOException {
+    /**
+     * 
+     * @param sourceDirectory
+     * @param prefix
+     * @param entryNames
+     * @param additionalExcludes
+     * @return the absolute file names in the source directory which are not already listed in {@code entryNames}.
+     */
+    private Collection<File> getUncoveredFiles(final File sourceDirectory, final String prefix, final Collection<String> entryNames,
+                                               List<String> additionalExcludes) {
         /*
          *  similar method as in {@link org.codehaus.plexus.components.io.resources.PlexusIoFileResourceCollection#getResources();}
          */
         DirectoryScanner scanner = new DirectoryScanner();
         scanner.setBasedir(sourceDirectory);
-        scanner.setExcludes(excludes);
+        List<String> excludes = new LinkedList<>(Arrays.asList(this.excludes));
+        if (additionalExcludes != null) {
+            excludes.addAll(additionalExcludes);
+        }
+        scanner.setExcludes(excludes.toArray(new String[0]));
         scanner.addDefaultExcludes();
         scanner.scan();
         return getUncoveredFiles(sourceDirectory, scanner.getIncludedFiles(), prefix, entryNames);
@@ -327,14 +398,14 @@ public class VaultMojo extends AbstractP
     private Collection<File> getUncoveredFiles(final File sourceDirectory, final String[] relativeSourceFileNames, final String prefix, final Collection<String> entryNames) {
         Collection<File> uncoveredFiles = new ArrayList<>();
         for (String relativeSourceFileName : relativeSourceFileNames) {
-            if (!entryNames.contains(JCR_ROOT + prefix + relativeSourceFileName)) {
+            if (!entryNames.contains(prefix + relativeSourceFileName)) {
                 uncoveredFiles.add(new File(sourceDirectory, relativeSourceFileName));
             }
         }
         return uncoveredFiles;
     }
     
-    private MavenArchiveConfiguration getMavenArchiveConfiguration(File manifestFile) throws IOException {
+    private MavenArchiveConfiguration getMavenArchiveConfiguration(File manifestFile) {
         if (archive == null) {
             archive = new MavenArchiveConfiguration();
 

Modified: jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/DefaultProjectIT.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/DefaultProjectIT.java?rev=1847445&r1=1847444&r2=1847445&view=diff
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/DefaultProjectIT.java (original)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/DefaultProjectIT.java Sun Nov 25 23:53:48 2018
@@ -98,5 +98,19 @@ public class DefaultProjectIT {
                 .verifyExpectedManifest();
     }
 
+    @Test
+    public void overwritten_embed() throws Exception {
+        new ProjectBuilder()
+                .setTestProjectDir(TEST_PROJECT_NAME + "overwritten-embed")
+                .setBuildExpectedToFail(true)
+                .build();
+    }
 
+    @Test
+    public void overwritten_embed_not_failing() throws Exception {
+        new ProjectBuilder()
+                .setTestProjectDir(TEST_PROJECT_NAME + "overwritten-embed-not-failing")
+                .build()
+                .verifyExpectedFilesChecksum();
+    }
 }

Modified: jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/ProjectBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/ProjectBuilder.java?rev=1847445&r1=1847444&r2=1847445&view=diff
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/ProjectBuilder.java (original)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/ProjectBuilder.java Sun Nov 25 23:53:48 2018
@@ -57,6 +57,7 @@ import static org.junit.Assert.assertFal
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 /**
  * Helper class to build and verify a maven project.
@@ -93,6 +94,8 @@ public class ProjectBuilder {
     private File expectedManifestFile;
 
     private File expectedFilterFile;
+    
+    private File expectedFilesWithChecksumsFile;
 
     private File logTxtFile;
 
@@ -152,6 +155,7 @@ public class ProjectBuilder {
         this.expectedOrderFile = new File(testProjectDir, "expected-file-order.txt");
         this.expectedManifestFile = new File(testProjectDir, "expected-manifest.txt");
         this.expectedFilterFile = new File(testProjectDir, "expected-filter.xml");
+        this.expectedFilesWithChecksumsFile = new File(testProjectDir, "expected-files-with-checksums.txt");
         this.logTxtFile = new File(testProjectDir, "log.txt");
         return this;
     }
@@ -290,6 +294,26 @@ public class ProjectBuilder {
         return this;
     }
 
+    public ProjectBuilder verifyExpectedFilesChecksum() throws IOException {
+        List<String> expectedEntriesWithChecksums = Files.readAllLines(expectedFilesWithChecksumsFile.toPath(), StandardCharsets.UTF_8);
+        for (String expectedEntryWithChecksum : expectedEntriesWithChecksums) {
+            // split name and checksum
+            String[] parts = expectedEntryWithChecksum.split(" ", 2);
+            final String name = parts[0];
+            // the second part must be a hexadecimal CRC32 checksum
+            final long expectedChecksum = Long.parseLong(parts[1], 16);
+            try (JarFile jar = new JarFile(testPackageFile)) {
+                JarEntry entry = jar.getJarEntry(name);
+                if (entry == null) {
+                    fail("Could not find entry with name " + name + " in package " + testPackageFile);
+                }
+                long actualChecksum = entry.getCrc();
+                assertEquals("Checksum of entry with name " + name + " is not equal to the expected value", expectedChecksum, actualChecksum);
+            }
+        }
+        return this;
+    }
+    
     public ProjectBuilder verifyExpectedFilesOrder() throws IOException {
         List<String> expectedEntriesInOrder= Files.readAllLines(expectedOrderFile.toPath(), StandardCharsets.UTF_8);
         assertThat("Order of entries within package", pkgZipEntries, Matchers.containsInRelativeOrder(expectedEntriesInOrder.toArray()));

Modified: jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/generic-unusal-jcrroot/expected-files.txt
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/generic-unusal-jcrroot/expected-files.txt?rev=1847445&r1=1847444&r2=1847445&view=diff
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/generic-unusal-jcrroot/expected-files.txt (original)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/generic-unusal-jcrroot/expected-files.txt Sun Nov 25 23:53:48 2018
@@ -24,9 +24,6 @@ jcr_root/etc/designs/some-thirdparty-lib
 jcr_root/etc/cloudservices/
 jcr_root/etc/cloudservices/ooyala/
 jcr_root/etc/cloudservices/ooyala/.content.xml
-jcr_root/etc/cloudservices/.content.xml
-jcr_root/apps/wcm/.content.xml
-jcr_root/apps/wcm/core/.content.xml
 META-INF/maven/
 META-INF/maven/org.apache.jackrabbit.filevault/
 META-INF/maven/org.apache.jackrabbit.filevault/package-plugin-test-pkg/

Modified: jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/generic-with-builtcd/expected-files.txt
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/generic-with-builtcd/expected-files.txt?rev=1847445&r1=1847444&r2=1847445&view=diff
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/generic-with-builtcd/expected-files.txt (original)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/generic-with-builtcd/expected-files.txt Sun Nov 25 23:53:48 2018
@@ -24,9 +24,6 @@ jcr_root/etc/designs/some-thirdparty-lib
 jcr_root/etc/cloudservices/
 jcr_root/etc/cloudservices/ooyala/
 jcr_root/etc/cloudservices/ooyala/.content.xml
-jcr_root/etc/cloudservices/.content.xml
-jcr_root/apps/wcm/.content.xml
-jcr_root/apps/wcm/core/.content.xml
 META-INF/maven/
 META-INF/maven/org.apache.jackrabbit.filevault/
 META-INF/maven/org.apache.jackrabbit.filevault/package-plugin-test-pkg/

Modified: jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/generic/expected-files.txt
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/generic/expected-files.txt?rev=1847445&r1=1847444&r2=1847445&view=diff
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/generic/expected-files.txt (original)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/generic/expected-files.txt Sun Nov 25 23:53:48 2018
@@ -19,15 +19,12 @@ jcr_root/apps/
 jcr_root/apps/install/
 jcr_root/apps/install/org.apache.jackrabbit.vault-3.1.40.jar
 jcr_root/apps/wcm/
-jcr_root/apps/wcm/.content.xml
 jcr_root/apps/wcm/core/
-jcr_root/apps/wcm/core/.content.xml
 jcr_root/apps/wcm/core/content/
 jcr_root/apps/wcm/core/content/.content.xml
 jcr_root/apps/wcm/core/content/siteadmin.xml
 jcr_root/etc/
 jcr_root/etc/cloudservices/
-jcr_root/etc/cloudservices/.content.xml
 jcr_root/etc/cloudservices/ooyala/
 jcr_root/etc/cloudservices/ooyala/.content.xml
 jcr_root/etc/designs/

Added: jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/expected-files-with-checksums.txt
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/expected-files-with-checksums.txt?rev=1847445&view=auto
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/expected-files-with-checksums.txt (added)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/expected-files-with-checksums.txt Sun Nov 25 23:53:48 2018
@@ -0,0 +1 @@
+jcr_root/apps/install/jcr-2.0.jar ec7a5d12
\ No newline at end of file

Added: jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/jcr_root/apps/install/.content.xml
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/jcr_root/apps/install/.content.xml?rev=1847445&view=auto
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/jcr_root/apps/install/.content.xml (added)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/jcr_root/apps/install/.content.xml Sun Nov 25 23:53:48 2018
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  -->
+
+<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0"
+    jcr:primaryType="sling:Folder"/>

Added: jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/jcr_root/apps/install/jcr-2.0.jar
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/jcr_root/apps/install/jcr-2.0.jar?rev=1847445&view=auto
==============================================================================
    (empty)

Added: jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/pom.xml?rev=1847445&view=auto
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/pom.xml (added)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed-not-failing/pom.xml Sun Nov 25 23:53:48 2018
@@ -0,0 +1,72 @@
+<!--
+  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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!-- ====================================================================== -->
+    <!-- P R O J E C T  D E S C R I P T I O N                                   -->
+    <!-- ====================================================================== -->
+    <groupId>org.apache.jackrabbit.filevault</groupId>
+    <artifactId>package-plugin-test-pkg</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <packaging>content-package</packaging>
+    <name>Packaging test</name>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.jackrabbit</groupId>
+                <artifactId>filevault-package-maven-plugin</artifactId>
+                <version>${plugin.version}</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <filters>
+                        <filter>
+                            <root>/apps/install</root>
+                        </filter>
+                    </filters>
+                    <embeddeds>
+                        <embedded>
+                            <groupId>javax.jcr</groupId>
+                            <artifactId>jcr</artifactId>
+                        </embedded>
+                        <embedded>
+                            <groupId>org.apache.jackrabbit.vault</groupId>
+                            <artifactId>org.apache.jackrabbit.vault</artifactId>
+                        </embedded>
+                    </embeddeds>
+                    <embeddedTarget>/apps/install</embeddedTarget>
+                    <failOnDuplicateEntries>false</failOnDuplicateEntries>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+    <dependencies>
+        <dependency>
+            <groupId>javax.jcr</groupId>
+            <artifactId>jcr</artifactId>
+            <version>2.0</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit.vault</groupId>
+            <artifactId>org.apache.jackrabbit.vault</artifactId>
+            <version>3.1.40</version>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+</project>

Added: jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed/jcr_root/apps/install/.content.xml
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed/jcr_root/apps/install/.content.xml?rev=1847445&view=auto
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed/jcr_root/apps/install/.content.xml (added)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed/jcr_root/apps/install/.content.xml Sun Nov 25 23:53:48 2018
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  -->
+
+<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0"
+    jcr:primaryType="sling:Folder"/>

Added: jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed/jcr_root/apps/install/jcr-2.0.jar
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed/jcr_root/apps/install/jcr-2.0.jar?rev=1847445&view=auto
==============================================================================
    (empty)

Added: jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed/pom.xml?rev=1847445&view=auto
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed/pom.xml (added)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/overwritten-embed/pom.xml Sun Nov 25 23:53:48 2018
@@ -0,0 +1,71 @@
+<!--
+  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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!-- ====================================================================== -->
+    <!-- P R O J E C T  D E S C R I P T I O N                                   -->
+    <!-- ====================================================================== -->
+    <groupId>org.apache.jackrabbit.filevault</groupId>
+    <artifactId>package-plugin-test-pkg</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <packaging>content-package</packaging>
+    <name>Packaging test</name>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.jackrabbit</groupId>
+                <artifactId>filevault-package-maven-plugin</artifactId>
+                <version>${plugin.version}</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <filters>
+                        <filter>
+                            <root>/apps/install</root>
+                        </filter>
+                    </filters>
+                    <embeddeds>
+                        <embedded>
+                            <groupId>javax.jcr</groupId>
+                            <artifactId>jcr</artifactId>
+                        </embedded>
+                        <embedded>
+                            <groupId>org.apache.jackrabbit.vault</groupId>
+                            <artifactId>org.apache.jackrabbit.vault</artifactId>
+                        </embedded>
+                    </embeddeds>
+                    <embeddedTarget>/apps/install</embeddedTarget>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+    <dependencies>
+        <dependency>
+            <groupId>javax.jcr</groupId>
+            <artifactId>jcr</artifactId>
+            <version>2.0</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit.vault</groupId>
+            <artifactId>org.apache.jackrabbit.vault</artifactId>
+            <version>3.1.40</version>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+</project>

Modified: jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/resource/expected-files.txt
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/resource/expected-files.txt?rev=1847445&r1=1847444&r2=1847445&view=diff
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/resource/expected-files.txt (original)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/default-test-projects/resource/expected-files.txt Sun Nov 25 23:53:48 2018
@@ -24,9 +24,6 @@ jcr_root/etc/designs/some-thirdparty-lib
 jcr_root/etc/cloudservices/
 jcr_root/etc/cloudservices/ooyala/
 jcr_root/etc/cloudservices/ooyala/.content.xml
-jcr_root/etc/cloudservices/.content.xml
-jcr_root/apps/wcm/.content.xml
-jcr_root/apps/wcm/core/.content.xml
 META-INF/maven/
 META-INF/maven/org.apache.jackrabbit.filevault/
 META-INF/maven/org.apache.jackrabbit.filevault/package-plugin-test-pkg/