JCRVLT-442 always validate ".content.xml" files first
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 a0d5c17..0666b82 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
@@ -18,6 +18,7 @@
 
 import java.io.IOException;
 import java.util.Collection;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.Locale;
@@ -30,6 +31,7 @@
 import org.apache.jackrabbit.vault.packaging.Dependency;
 import org.apache.jackrabbit.vault.packaging.PackageId;
 import org.apache.jackrabbit.vault.packaging.PackageInfo;
+import org.apache.jackrabbit.vault.util.Constants;
 import org.apache.jackrabbit.vault.validation.ValidationExecutorFactory;
 import org.apache.jackrabbit.vault.validation.spi.ValidationMessageSeverity;
 import org.apache.jackrabbit.vault.validation.spi.impl.AdvancedFilterValidatorFactory;
@@ -332,4 +334,19 @@
         }
         return validatorSettingsById;
     }
+
+    /** 
+     * Comparator on file names which makes sure that the {@code .content.xml} files come first. 
+     */
+    static final class DotContentXmlFirstComparator implements Comparator<String> {
+        @Override
+        public int compare(String s1, String s2) {
+            if (Constants.DOT_CONTENT_XML.equals(s1)) {
+                return -1;
+            } else if (Constants.DOT_CONTENT_XML.equals(s2)) {
+                return 1;
+            }
+            return 0;
+        }
+    }
 }
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 b892eee..875d144 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
@@ -22,6 +22,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.file.Paths;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -201,8 +202,10 @@
         scanner.addDefaultExcludes();
         scanner.scan();
         getLog().info("Scanning baseDir '" + baseDir + "'...");
-        for (String relativeFile : scanner.getIncludedFiles()) {
-            validateFile(executor, baseDir, isMetaInf, relativeFile);
+        List<String> sortedFileNames = Arrays.asList(scanner.getIncludedFiles());
+        sortedFileNames.sort(new DotContentXmlFirstComparator());
+        for (String fileName : sortedFileNames) {
+            validateFile(executor, baseDir, isMetaInf, fileName);
         }
         for (String relativeFile : scanner.getIncludedDirectories()) {
             validateFolder(executor, baseDir, isMetaInf, relativeFile);
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 408df2d..a7a78f5 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
@@ -21,7 +21,9 @@
 import java.io.InputStream;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Comparator;
 import java.util.LinkedList;
 import java.util.List;
 import javax.xml.parsers.ParserConfigurationException;
@@ -45,7 +47,6 @@
 import org.jetbrains.annotations.Nullable;
 import org.xml.sax.SAXException;
 
-
 /**
  * Validates a package (and optionally in addition all attached packages with the given classifiers) with all registered validators.
  * @see <a href="https://jackrabbit.apache.org/filevault-package-maven-plugin/validators.html">Validators</a>
@@ -132,7 +133,11 @@
 
     private void validateEntry(Archive archive, Archive.Entry entry, Path entryPath, Path packagePath, ArchiveValidationContextImpl context,
             ValidationExecutor executor) throws IOException, SAXException, ParserConfigurationException {
-        for (Archive.Entry childEntry : entry.getChildren()) {
+        // sort children to make sure that .content.xml comes first!
+        List<Archive.Entry> sortedEntryList = new ArrayList<Archive.Entry>(entry.getChildren());
+        sortedEntryList.sort(Comparator.comparing(Archive.Entry::getName, new DotContentXmlFirstComparator()));
+        
+        for (Archive.Entry childEntry : sortedEntryList) {
             if (childEntry.isDirectory()) {
                 validateInputStream(null, entryPath.resolve(childEntry.getName()), packagePath, context, executor);
                 validateEntry(archive, childEntry, entryPath.resolve(childEntry.getName()), packagePath, context, executor);
diff --git a/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/AbstractValidateMojoTest.java b/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/AbstractValidateMojoTest.java
index 83bc8d1..0cabf0a 100644
--- a/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/AbstractValidateMojoTest.java
+++ b/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/AbstractValidateMojoTest.java
@@ -16,8 +16,11 @@
  */
 package org.apache.jackrabbit.filevault.maven.packaging;
 
+import static org.junit.Assert.assertThat;
+
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.jackrabbit.vault.packaging.Dependency;
@@ -75,4 +78,11 @@
         expectedValidatorSettings.clear();
         Assert.assertThat(actualValidatorSettings, Matchers.equalTo(expectedValidatorSettings));
     }
+
+    @Test
+    public void testDotContentXmlFirstComparator() {
+        List<String> list = Arrays.asList("someEntryA", ".content.xml", "someEntryB", ".content.xml");
+        list.sort(new AbstractValidateMojo.DotContentXmlFirstComparator());
+        assertThat(list, Matchers.contains(".content.xml", ".content.xml", "someEntryA", "someEntryB"));
+    }
 }