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"));
+ }
}