You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by kw...@apache.org on 2021/06/11 06:41:17 UTC

[jackrabbit-filevault-package-maven-plugin] branch master updated: JCRVLT-528 order files correctly for validation (#55)

This is an automated email from the ASF dual-hosted git repository.

kwin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jackrabbit-filevault-package-maven-plugin.git


The following commit(s) were added to refs/heads/master by this push:
     new 3200b28  JCRVLT-528 order files correctly for validation (#55)
3200b28 is described below

commit 3200b28cbb5c96fb13103323ff29749b6cf33324
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Fri Jun 11 08:41:10 2021 +0200

    JCRVLT-528 order files correctly for validation (#55)
    
    * JCRVLT-528 order files correctly for validation
    
    (parent folder and .content.xml must come first)
    Switch to NIO Files in some more places
    correctly indicate incremental validation runs
---
 pom.xml                                            |   2 +-
 .../maven/packaging/AbstractValidateMojo.java      |  13 +-
 .../maven/packaging/ValidateFilesMojo.java         | 145 ++++++++++++++++-----
 .../maven/packaging/ValidatePackageMojo.java       |  14 +-
 .../impl/context/DirectoryValidationContext.java   |   8 +-
 .../maven/packaging/ValidateFilesMojoTest.java     |  53 ++++++++
 .../maven/packaging/it/ValidateFilesIT.java        |   2 +-
 7 files changed, 193 insertions(+), 44 deletions(-)

diff --git a/pom.xml b/pom.xml
index 37c9834..1ca6023 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,7 +24,7 @@
         <groupId>org.apache.jackrabbit.vault</groupId>
         <artifactId>parent</artifactId>
         <relativePath />
-        <version>3.5.0</version>
+        <version>3.5.1-SNAPSHOT</version>
     </parent>
 
     <!-- ====================================================================== -->
diff --git a/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/AbstractValidateMojo.java b/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/AbstractValidateMojo.java
index a6cb1bd..8c6376d 100644
--- a/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/AbstractValidateMojo.java
+++ b/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/AbstractValidateMojo.java
@@ -19,6 +19,7 @@ package org.apache.jackrabbit.filevault.maven.packaging;
 import java.io.File;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
 import java.util.Collection;
 import java.util.Comparator;
 import java.util.HashMap;
@@ -182,8 +183,8 @@ public abstract class AbstractValidateMojo extends AbstractMojo {
      */
     public static final Artifact IGNORE_ARTIFACT = new DefaultArtifact("ignore", "ignore", "1.0", "", "", "", null);
 
-    protected String getProjectRelativeFilePath(File file) {
-        return "'" + project.getBasedir().toPath().relativize(file.toPath()).toString() + "'";
+    protected String getProjectRelativeFilePath(Path file) {
+        return "'" + project.getBasedir().toPath().relativize(file).toString() + "'";
     }
 
     public AbstractValidateMojo() {
@@ -378,17 +379,19 @@ public abstract class AbstractValidateMojo extends AbstractMojo {
     }
 
     /** 
-     * Comparator on file names which makes sure that the {@code .content.xml} files come first. 
+     * Comparator on file names (excluding paths) which makes sure that the files named {@code .content.xml} come first. Other file names are ordered lexicographically. 
      */
     static final class DotContentXmlFirstComparator implements Comparator<String> {
         @Override
         public int compare(String s1, String s2) {
-            if (Constants.DOT_CONTENT_XML.equals(s1)) {
+            if (Constants.DOT_CONTENT_XML.equals(s1) && Constants.DOT_CONTENT_XML.equals(s2)) {
+                return 0;
+            } else if (Constants.DOT_CONTENT_XML.equals(s1)) {
                 return -1;
             } else if (Constants.DOT_CONTENT_XML.equals(s2)) {
                 return 1;
             }
-            return 0;
+            return s1.compareTo(s2);
         }
     }
 }
diff --git a/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/ValidateFilesMojo.java b/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/ValidateFilesMojo.java
index 3b12903..f5d4e53 100644
--- a/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/ValidateFilesMojo.java
+++ b/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/ValidateFilesMojo.java
@@ -17,15 +17,22 @@
 package org.apache.jackrabbit.filevault.maven.packaging;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
+import java.util.NavigableSet;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.jackrabbit.filevault.maven.packaging.validator.impl.context.DirectoryValidationContext;
@@ -177,20 +184,20 @@ public class ValidateFilesMojo extends AbstractValidateMojo {
                 metaInfRootDirectory = metaInfoVaultSourceDirectory.getParentFile();
             }
             File generatedMetaInfRootDirectory = new File(workDirectory, Constants.META_INF);
-            getLog().info("Validate files in generatedMetaInfRootDirectory " + getProjectRelativeFilePath(generatedMetaInfRootDirectory) + " and metaInfRootDir " + getProjectRelativeFilePath(generatedMetaInfRootDirectory));
-            ValidationContext context = new DirectoryValidationContext(generatedMetaInfRootDirectory, metaInfRootDirectory, resolver, getLog());
+            getLog().info("Validate files in generatedMetaInfRootDirectory " + getProjectRelativeFilePath(generatedMetaInfRootDirectory.toPath()) + " and metaInfRootDir " + getProjectRelativeFilePath(generatedMetaInfRootDirectory.toPath()));
+            ValidationContext context = new DirectoryValidationContext(buildContext.isIncremental(), generatedMetaInfRootDirectory, metaInfRootDirectory, resolver, getLog());
             ValidationExecutor executor = validationExecutorFactory.createValidationExecutor(context, false, false, getValidatorSettingsForPackage(context.getProperties().getId(), false));
             if (executor == null) {
                 throw new MojoExecutionException("No registered validators found!");
             }
             validationHelper.printUsedValidators(getLog(), executor, context, true);
             if (metaInfRootDirectory != null) {
-                validateDirectory(validationHelper, executor, metaInfRootDirectory, true);
+                validateDirectoryRecursively(validationHelper, executor, metaInfRootDirectory.toPath(), true);
             }
-            validateDirectory(validationHelper, executor, generatedMetaInfRootDirectory, true);
+            validateDirectoryRecursively(validationHelper, executor, generatedMetaInfRootDirectory.toPath(), true);
             File jcrSourceDirectory = AbstractSourceAndMetadataPackageMojo.getJcrSourceDirectory(jcrRootSourceDirectory, builtContentDirectory, getLog());
             if (jcrSourceDirectory != null) {
-                validateDirectory(validationHelper, executor, jcrSourceDirectory, false);
+                validateDirectoryRecursively(validationHelper, executor, jcrSourceDirectory.toPath(), false);
             }
             validationHelper.printMessages(executor.done(), getLog(), buildContext, project.getBasedir().toPath());
         } catch (IOException | ConfigurationException e) {
@@ -199,29 +206,79 @@ public class ValidateFilesMojo extends AbstractValidateMojo {
         validationHelper.failBuildInCaseOfViolations(failOnValidationWarnings);
     }
 
-    private void validateDirectory(ValidationHelper validationHelper, ValidationExecutor executor, File baseDir, boolean isMetaInf) {
-        Scanner scanner = buildContext.newScanner(baseDir);
+    private void validateDirectoryRecursively(ValidationHelper validationHelper, ValidationExecutor executor, Path baseDir, boolean isMetaInf) {
+        Scanner scanner = buildContext.newScanner(baseDir.toFile());
         // make sure filtering does work equally as within the package goal
         scanner.setExcludes(excludes);
         scanner.addDefaultExcludes();
         scanner.scan();
         getLog().info("Scanning baseDir " + getProjectRelativeFilePath(baseDir) + "...");
-        List<String> sortedFileNames = Arrays.asList(scanner.getIncludedFiles());
-        sortedFileNames.sort(new DotContentXmlFirstComparator());
-        for (String fileName : sortedFileNames) {
-            validateFile(validationHelper, executor, baseDir, isMetaInf, fileName);
-        }
-        for (String relativeFile : scanner.getIncludedDirectories()) {
-            validateFolder(validationHelper, executor, baseDir, isMetaInf, relativeFile);
+        SortedSet<Path> sortedFileAndFolderNames = sortAndEnrichFilesAndFolders(baseDir, scanner.getIncludedFiles(), scanner.getIncludedDirectories());
+        
+        for (Path fileOrFolder : sortedFileAndFolderNames) {
+            getLog().debug("Scanning path " + getProjectRelativeFilePath(baseDir.resolve(fileOrFolder)) + "...");
+            if (Files.isDirectory(baseDir.resolve(fileOrFolder))) {
+                validateFolder(validationHelper, executor, baseDir, isMetaInf, fileOrFolder);
+            } else {
+                validateFile(validationHelper, executor, baseDir, isMetaInf, fileOrFolder);
+            }
         }
     }
 
+    /**
+     * Sorts the given files and directories with {@link ParentAndDotContentXmlFirstComparator}.
+     * In addition adds all potentially relevant (parent) node definitions. 
+     * That is
+     * <ul>
+     * <li>sibling {@code .content.xml} files</li>
+     * <li>{@code .content.xml} below {@code .dir} suffixed folders</li>
+     * <li>parent folders</li>
+     * </ul>
+     * @param baseDir
+     * @param files
+     * @param directories
+     * @return the sorted set of files/folders
+     */
+    static SortedSet<Path> sortAndEnrichFilesAndFolders(Path baseDir, String[] files, String[] directories) {
+        // first sort by segments
+        NavigableSet<Path> paths = new TreeSet<>(new ParentAndDotContentXmlFirstComparator());
+        for (String file : files) {
+            paths.add(Paths.get(file));
+        }
+        for (String directory : directories) {
+            paths.add(Paths.get(directory));
+        }
+        // start with longest path first
+        Iterator<Path> pathIterator = paths.descendingIterator();
+        Set<Path> additionalPaths = new HashSet<>();
+        while (pathIterator.hasNext()) {
+            Path path = pathIterator.next();
+            // add in addition all potentially relevant parent node definitions
+            Path parent = path.getParent();
+            if (parent != null) {
+                if (!paths.contains(parent) && !additionalPaths.contains(parent) && Files.isDirectory(baseDir.resolve(parent))) {
+                    additionalPaths.add(parent);
+                }
+                Path parentContentXml = parent.resolve(Constants.DOT_CONTENT_XML);
+                if (!paths.contains(parentContentXml) && !additionalPaths.contains(parentContentXml) && Files.exists(baseDir.resolve(parentContentXml))) {
+                    additionalPaths.add(parentContentXml);
+                }
+                // and the node definition for https://jackrabbit.apache.org/filevault/vaultfs.html#Extended_File_aggregates
+                Path extendedFileAggregateContentXml = parent.resolve(path.getFileName().toString() + ".dir").resolve(Constants.DOT_CONTENT_XML);
+                if (!paths.contains(extendedFileAggregateContentXml) && !additionalPaths.contains(extendedFileAggregateContentXml) && Files.exists(baseDir.resolve(extendedFileAggregateContentXml))) {
+                    additionalPaths.add(parentContentXml);
+                }
+            }
+        }
+        paths.addAll(additionalPaths);
+        return paths;
+    }
 
-    private void validateFile(ValidationHelper validationHelper, ValidationExecutor executor, File baseDir, boolean isMetaInf, String relativeFile) {
-        File absoluteFile = new File(baseDir, relativeFile);
-        validationHelper.clearPreviousValidationMessages(buildContext, absoluteFile);
+    private void validateFile(ValidationHelper validationHelper, ValidationExecutor executor, Path baseDir, boolean isMetaInf, Path relativeFile) {
+        Path absoluteFile = baseDir.resolve(relativeFile);
+        validationHelper.clearPreviousValidationMessages(buildContext, absoluteFile.toFile());
         getLog().debug("Validating file " + getProjectRelativeFilePath(absoluteFile) + "...");
-        try (InputStream input = new FileInputStream(absoluteFile)) {
+        try (InputStream input = Files.newInputStream(absoluteFile)) {
             validateInputStream(validationHelper, executor, input, baseDir, isMetaInf, relativeFile);
         } catch (FileNotFoundException e) {
             getLog().error("Could not find file " + getProjectRelativeFilePath(absoluteFile), e);
@@ -230,23 +287,23 @@ public class ValidateFilesMojo extends AbstractValidateMojo {
         }
     }
     
-    private void validateFolder(ValidationHelper validationHelper, ValidationExecutor executor, File baseDir, boolean isMetaInf, String relativeFile) {
-        File absoluteFile = new File(baseDir, relativeFile);
-        validationHelper.clearPreviousValidationMessages(buildContext, absoluteFile);
-        getLog().debug("Validating folder " + getProjectRelativeFilePath(absoluteFile) + "...");
+    private void validateFolder(ValidationHelper validationHelper, ValidationExecutor executor, Path baseDir, boolean isMetaInf, Path relativeFolder) {
+        Path absoluteFolder = baseDir.resolve(relativeFolder);
+        validationHelper.clearPreviousValidationMessages(buildContext, absoluteFolder.toFile());
+        getLog().debug("Validating folder " + getProjectRelativeFilePath(absoluteFolder) + "...");
         try {
-            validateInputStream(validationHelper, executor, null, baseDir, isMetaInf, relativeFile);
+            validateInputStream(validationHelper, executor, null, baseDir, isMetaInf, relativeFolder);
         } catch (IOException e) {
-            getLog().error("Could not validate folder " + getProjectRelativeFilePath(absoluteFile), e);
+            getLog().error("Could not validate folder " + getProjectRelativeFilePath(absoluteFolder), e);
         }
     }
     
-    private void validateInputStream(ValidationHelper validationHelper, ValidationExecutor executor, InputStream input, File baseDir, boolean isMetaInf, String relativeFile) throws IOException {
+    private void validateInputStream(ValidationHelper validationHelper, ValidationExecutor executor, InputStream input, Path baseDir, boolean isMetaInf, Path relativeFile) throws IOException {
         final Collection<ValidationViolation> messages;
         if (isMetaInf) {
-            messages = executor.validateMetaInf(input, Paths.get(relativeFile), baseDir.toPath());
+            messages = executor.validateMetaInf(input, relativeFile, baseDir);
         } else {
-            messages = executor.validateJcrRoot(input, Paths.get(relativeFile), baseDir.toPath());
+            messages = executor.validateJcrRoot(input, relativeFile, baseDir);
         }
         validationHelper.printMessages(messages, getLog(), buildContext, project.getBasedir().toPath());
     }
@@ -300,4 +357,34 @@ public class ValidateFilesMojo extends AbstractValidateMojo {
         }
         return false;
     }
+    
+
+    /** 
+     * Comparator on paths which makes sure that the parent folders come first, then a file in the parent folder called {@code .content.xml} 
+     * and then all other subfolders/files ordered lexicographically. 
+     */
+    static final class ParentAndDotContentXmlFirstComparator implements Comparator<Path> {
+        private final DotContentXmlFirstComparator dotXmlFirstComparator;
+        
+        
+        public ParentAndDotContentXmlFirstComparator() {
+            super();
+            this.dotXmlFirstComparator = new DotContentXmlFirstComparator();
+        }
+
+        @Override
+        public int compare(Path s1, Path s2) {
+            if (s1.getNameCount() < s2.getNameCount()) {
+                return -1;
+            } else if (s1.getNameCount() > s2.getNameCount()) {
+                return 1;
+            } else {
+                if (s1.getParent() != null && s1.getParent().equals(s2.getParent())) {
+                    return dotXmlFirstComparator.compare(s1.getFileName().toString(), s2.getFileName().toString());
+                } else {
+                    return s1.compareTo(s2);
+                }
+            }
+        }
+    }
 }
diff --git a/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/ValidatePackageMojo.java b/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/ValidatePackageMojo.java
index 811dadb..ebe93ba 100644
--- a/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/ValidatePackageMojo.java
+++ b/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/ValidatePackageMojo.java
@@ -85,14 +85,14 @@ public class ValidatePackageMojo extends AbstractValidateMojo {
         try {
             boolean foundPackage = false;
             if (packageFile != null && !packageFile.toString().isEmpty() && !packageFile.isDirectory()) {
-                validatePackage(validationHelper, packageFile);
+                validatePackage(validationHelper, packageFile.toPath());
                 foundPackage = true;
             } 
             if (!attachedArtifacts.isEmpty()) {
                 for (Artifact attached : attachedArtifacts) {
                     // validate attached artifacts with given classifiers
                     if (classifiers.contains(attached.getClassifier())) {
-                        validatePackage(validationHelper, attached.getFile());
+                        validatePackage(validationHelper, attached.getFile().toPath());
                         foundPackage = true;
                     }
                 }
@@ -106,19 +106,19 @@ public class ValidatePackageMojo extends AbstractValidateMojo {
         }
     }
 
-    private void validatePackage(ValidationHelper validationHelper, File file) throws IOException, ParserConfigurationException, SAXException, MojoExecutionException {
+    private void validatePackage(ValidationHelper validationHelper, Path file) throws IOException, ParserConfigurationException, SAXException, MojoExecutionException {
         getLog().info("Start validating package " + getProjectRelativeFilePath(file) + "...");
 
         // open file to extract the meta data for the validation context
         ArchiveValidationContextImpl context;
         ValidationExecutor executor;
-        try (Archive archive = new ZipArchive(file)) {
+        try (Archive archive = new ZipArchive(file.toFile())) {
             archive.open(true);
-            context = new ArchiveValidationContextImpl(archive, file.toPath(), resolver, getLog());
+            context = new ArchiveValidationContextImpl(archive, file, resolver, getLog());
             executor = validationExecutorFactory.createValidationExecutor(context, false, enforceRecursiveSubpackageValidation, getValidatorSettingsForPackage(context.getProperties().getId(), false));
             if (executor != null) {
                 validationHelper.printUsedValidators(getLog(), executor, context, true);
-                validateArchive(validationHelper, archive, file.toPath(), context, executor);
+                validateArchive(validationHelper, archive, file, context, executor);
             } else {
                 throw new MojoExecutionException("No registered validators found!");
             }
@@ -135,7 +135,7 @@ public class ValidatePackageMojo extends AbstractValidateMojo {
     private void validateEntry(ValidationHelper validationHelper, Archive archive, Archive.Entry entry, Path entryPath, Path packagePath, ArchiveValidationContextImpl context,
             ValidationExecutor executor) throws IOException, SAXException, ParserConfigurationException {
         // sort children to make sure that .content.xml comes first!
-        List<Archive.Entry> sortedEntryList = new ArrayList<Archive.Entry>(entry.getChildren());
+        List<Archive.Entry> sortedEntryList = new ArrayList<>(entry.getChildren());
         sortedEntryList.sort(Comparator.comparing(Archive.Entry::getName, new DotContentXmlFirstComparator()));
         
         for (Archive.Entry childEntry : sortedEntryList) {
diff --git a/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/validator/impl/context/DirectoryValidationContext.java b/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/validator/impl/context/DirectoryValidationContext.java
index ebc84a9..a9bb159 100644
--- a/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/validator/impl/context/DirectoryValidationContext.java
+++ b/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/validator/impl/context/DirectoryValidationContext.java
@@ -48,10 +48,11 @@ public class DirectoryValidationContext implements ValidationContext {
     private final PackageProperties properties;
     private final DefaultWorkspaceFilter filter;
     private List<PackageInfo> resolvedDependencies;
+    private final boolean isIncremental;
     
     private static final Path RELATIVE_PROPERTIES_XML_PATH = Paths.get(Constants.VAULT_DIR, Constants.PROPERTIES_XML);
 
-    public DirectoryValidationContext(@NotNull final File generatedMetaInfRootDirectory, final File metaInfRootDirectory, DependencyResolver resolver, @NotNull final Log log) throws IOException, ConfigurationException {
+    public DirectoryValidationContext(boolean isIncremental, @NotNull final File generatedMetaInfRootDirectory, final File metaInfRootDirectory, DependencyResolver resolver, @NotNull final Log log) throws IOException, ConfigurationException {
         Path propertiesPath = null;
         if (!Constants.META_INF.equals(generatedMetaInfRootDirectory.getName())) {
             throw new IllegalArgumentException("The workDir must end with 'META-INF' but is '" + generatedMetaInfRootDirectory+"'");
@@ -82,6 +83,7 @@ public class DirectoryValidationContext implements ValidationContext {
         filter.load(filterFile);
         
         this.resolvedDependencies = resolver.resolve(getProperties().getDependencies(), getProperties().getDependenciesLocations(), log);
+        this.isIncremental = isIncremental;
     }
 
     @Override
@@ -109,4 +111,8 @@ public class DirectoryValidationContext implements ValidationContext {
         return resolvedDependencies;
     }
 
+    @Override
+    public boolean isIncremental() {
+        return isIncremental;
+    }
 }
diff --git a/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/ValidateFilesMojoTest.java b/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/ValidateFilesMojoTest.java
new file mode 100644
index 0000000..7d97df9
--- /dev/null
+++ b/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/ValidateFilesMojoTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.
+ */
+package org.apache.jackrabbit.filevault.maven.packaging;
+
+import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ValidateFilesMojoTest {
+
+    @Test
+    public void testSortAndEnrichFilesAndFolders() {
+        SortedSet<Path> expectedPaths = new TreeSet<>();
+        expectedPaths.add(Paths.get("apps"));
+        expectedPaths.add(Paths.get("apps", ".content.xml"));
+        expectedPaths.add(Paths.get("apps", "file"));
+        expectedPaths.add(Paths.get("apps", "huhu"));
+        expectedPaths.add(Paths.get("apps", "test"));
+        expectedPaths.add(Paths.get("apps", "test", ".content.xml"));
+        expectedPaths.add(Paths.get("apps", "test", "huhu"));
+        Assert.assertEquals(expectedPaths, ValidateFilesMojo.sortAndEnrichFilesAndFolders(Paths.get("base"), new String[] { 
+                "apps" + File.separatorChar + "huhu",
+                "apps" + File.separatorChar + "file",
+                "apps" + File.separatorChar + "test" + File.separatorChar + "huhu", 
+                "apps" + File.separatorChar + "test" + File.separatorChar + ".content.xml",
+                "apps" + File.separatorChar + "test" + File.separatorChar + ".content.xml", // add the same value two times to check that equality (derived from comparator) works correctly
+                "apps" + File.separatorChar + ".content.xml",
+            }, 
+            new String[]{ 
+                    "apps",
+                    "apps" + File.separatorChar + "test"
+            }));
+    }
+}
diff --git a/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/ValidateFilesIT.java b/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/ValidateFilesIT.java
index 0dbe2f0..c5d4c6c 100644
--- a/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/ValidateFilesIT.java
+++ b/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/ValidateFilesIT.java
@@ -32,7 +32,7 @@ public class ValidateFilesIT {
                 .setTestGoals("clean", "process-classes") // make sure the validate-files mojo is not skipped
                 .setBuildExpectedToFail(true)
                 .build()
-                .verifyExpectedLogLines(Paths.get("target","vault-work","META-INF","vault","filter.xml").toString());
+                .verifyExpectedLogLines(Paths.get("src","main","content", "META-INF","vault","filter.xml").toString());
     }
 
     @Test