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 2020/06/24 15:47:44 UTC

[jackrabbit-filevault] 01/01: JCRVLT-446 make test locale agnostic

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

kwin pushed a commit to branch bugfix/JCRVLT-446-make-tests-locale-agnostic
in repository https://gitbox.apache.org/repos/asf/jackrabbit-filevault.git

commit 0a6bdec7e105a0ac314af653898fa6f682a1ade2
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Wed Jun 24 17:47:26 2020 +0200

    JCRVLT-446 make test locale agnostic
    
    reuse the same DocumentBuilderFactory for all validators
---
 .../spi/impl/AdvancedFilterValidator.java          | 32 +++++----------
 .../spi/impl/AdvancedFilterValidatorFactory.java   | 45 +++++++++++++++++++++-
 .../spi/impl/AdvancedFilterValidatorTest.java      | 19 ++++++++-
 3 files changed, 72 insertions(+), 24 deletions(-)

diff --git a/vault-validation/src/main/java/org/apache/jackrabbit/vault/validation/spi/impl/AdvancedFilterValidator.java b/vault-validation/src/main/java/org/apache/jackrabbit/vault/validation/spi/impl/AdvancedFilterValidator.java
index d8c97ae..2f79fef 100644
--- a/vault-validation/src/main/java/org/apache/jackrabbit/vault/validation/spi/impl/AdvancedFilterValidator.java
+++ b/vault-validation/src/main/java/org/apache/jackrabbit/vault/validation/spi/impl/AdvancedFilterValidator.java
@@ -63,7 +63,6 @@ import org.apache.jackrabbit.vault.validation.spi.FilterValidator;
 import org.apache.jackrabbit.vault.validation.spi.GenericMetaInfDataValidator;
 import org.apache.jackrabbit.vault.validation.spi.JcrPathValidator;
 import org.apache.jackrabbit.vault.validation.spi.NodeContext;
-import org.apache.jackrabbit.vault.validation.spi.NodePathValidator;
 import org.apache.jackrabbit.vault.validation.spi.ValidationMessage;
 import org.apache.jackrabbit.vault.validation.spi.ValidationMessageSeverity;
 import org.jetbrains.annotations.NotNull;
@@ -86,6 +85,7 @@ public final class AdvancedFilterValidator implements GenericMetaInfDataValidato
     
     static final Path FILTER_XML_PATH = Paths.get(Constants.VAULT_DIR, Constants.FILTER_XML);
 
+    private final DocumentBuilderFactory factory;
     private final boolean isSubPackage;
     private final Collection<String> validRoots;
     private final @NotNull ValidationMessageSeverity defaultSeverity;
@@ -98,7 +98,8 @@ public final class AdvancedFilterValidator implements GenericMetaInfDataValidato
     private final Collection<String> danglingNodePaths;
     private final Map<PathFilterSet, List<Entry<PathFilter>>> orphanedFilterSets;
 
-    public AdvancedFilterValidator(@NotNull ValidationMessageSeverity defaultSeverity, @NotNull ValidationMessageSeverity severityForUncoveredAncestorNodes, @NotNull ValidationMessageSeverity severityForUncoveredFilterRootAncestors, @NotNull ValidationMessageSeverity severityForOrphanedFilterEntries, boolean isSubPackage, @NotNull Collection<PackageInfo> dependenciesMetaInfo, @NotNull WorkspaceFilter filter, @NotNull Collection<String> validRoots) {
+    public AdvancedFilterValidator(@NotNull DocumentBuilderFactory factory, @NotNull ValidationMessageSeverity defaultSeverity, @NotNull ValidationMessageSeverity severityForUncoveredAncestorNodes, @NotNull ValidationMessageSeverity severityForUncoveredFilterRootAncestors, @NotNull ValidationMessageSeverity severityForOrphanedFilterEntries, boolean isSubPackage, @NotNull Collection<PackageInfo> dependenciesMetaInfo, @NotNull WorkspaceFilter filter, @NotNull Collection<String> validRoots) {
+        this.factory = factory;
         this.isSubPackage = isSubPackage;
         this.filterValidators = new HashMap<>();
         this.defaultSeverity = defaultSeverity;
@@ -319,21 +320,9 @@ public final class AdvancedFilterValidator implements GenericMetaInfDataValidato
     }
 
     @Override
-    public Collection<ValidationMessage> validateMetaInfData(@NotNull InputStream input, @NotNull Path filePath) throws IOException {
-        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-        factory.setNamespaceAware(true);
-        try (InputStream xsdInput = getClass().getResourceAsStream("/filter.xsd")) {
-            SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
-
-            // load a WXS schema, represented by a Schema instance
-            Source schemaFile = new StreamSource(xsdInput);
-            Schema schema = schemaFactory.newSchema(schemaFile);
-            factory.setSchema(schema);
-            Collection<ValidationMessage> messages = new LinkedList<>();
-            if (xsdInput == null) {
-                throw new IllegalStateException("Can not load filter.xsd");
-            }
-            factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+    public Collection<ValidationMessage> validateMetaInfData(@NotNull InputStream input, @NotNull Path filePath, @NotNull Path basePath) throws IOException {
+        Collection<ValidationMessage> messages = new LinkedList<>();
+        try {    
             DocumentBuilder parser = factory.newDocumentBuilder();
             ValidationMessageErrorHandler errorHandler = new ValidationMessageErrorHandler(defaultSeverity);
             parser.setErrorHandler(errorHandler);
@@ -352,15 +341,14 @@ public final class AdvancedFilterValidator implements GenericMetaInfDataValidato
                         messages.addAll(ValidationViolation.wrapMessages(entry.getKey(), filterValidatorMessages, null, null, null, 0, 0));
                     }
                 }
-            } catch (ConfigurationException | PatternSyntaxException e) { // TODO: remove PatternSyntaxException once
-                                                                          // https://issues.apache.org/jira/browse/JCRVLT-368 is fixed
+            } catch (ConfigurationException e) {
                 messages.add(new ValidationMessage(defaultSeverity, MESSAGE_INVALID_FILTER_XML, e));
             }
             return messages;
-        } catch (SAXException e) {
-            throw new IOException("Could not parse input as xml", e);
         } catch (ParserConfigurationException e) {
-            throw new IllegalStateException("Could not instantiate DOM parser", e);
+            throw new IllegalStateException("Could not create parser from factory", e);
+        } catch (SAXException e) {
+            throw new IllegalStateException("Could not parse filter.xml", e);
         }
     }
 
diff --git a/vault-validation/src/main/java/org/apache/jackrabbit/vault/validation/spi/impl/AdvancedFilterValidatorFactory.java b/vault-validation/src/main/java/org/apache/jackrabbit/vault/validation/spi/impl/AdvancedFilterValidatorFactory.java
index d0835e3..9172fb6 100644
--- a/vault-validation/src/main/java/org/apache/jackrabbit/vault/validation/spi/impl/AdvancedFilterValidatorFactory.java
+++ b/vault-validation/src/main/java/org/apache/jackrabbit/vault/validation/spi/impl/AdvancedFilterValidatorFactory.java
@@ -16,12 +16,23 @@
  */
 package org.apache.jackrabbit.vault.validation.spi.impl;
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.LinkedList;
+import java.util.Locale;
 import java.util.Set;
 
+import javax.xml.XMLConstants;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Source;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+
 import org.apache.jackrabbit.vault.packaging.PackageType;
 import org.apache.jackrabbit.vault.validation.spi.ValidationContext;
 import org.apache.jackrabbit.vault.validation.spi.ValidationMessageSeverity;
@@ -32,6 +43,7 @@ import org.jetbrains.annotations.NotNull;
 import org.kohsuke.MetaInfServices;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.xml.sax.SAXException;
 
 @MetaInfServices
 public final class AdvancedFilterValidatorFactory implements ValidatorFactory {
@@ -49,11 +61,42 @@ public final class AdvancedFilterValidatorFactory implements ValidatorFactory {
     static final ValidationMessageSeverity DEFAULT_SEVERITY_FOR_ORPHANED_FILTER_RULES = ValidationMessageSeverity.INFO;
     static final Collection<String> DEFAULT_VALID_ROOTS = new LinkedList<>(Arrays.asList("/","/libs","/apps","/etc","/var","/tmp","/content","/etc/packages"));
 
+    @NotNull private final DocumentBuilderFactory factory;
     /**
      * the default logger
      */
     private static final Logger log = LoggerFactory.getLogger(AdvancedFilterValidatorFactory.class);
 
+    public AdvancedFilterValidatorFactory() throws IOException {
+        factory = createFilterXsdAwareDocumentBuilder(null);
+    }
+
+    static @NotNull DocumentBuilderFactory createFilterXsdAwareDocumentBuilder(Locale locale) throws IOException {
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        factory.setNamespaceAware(true);
+        try (InputStream xsdInput = AdvancedFilterValidatorFactory.class.getResourceAsStream("/filter.xsd")) {
+            SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+
+            // load a WXS schema, represented by a Schema instance
+            Source schemaFile = new StreamSource(xsdInput);
+            Schema schema = schemaFactory.newSchema(schemaFile);
+            factory.setSchema(schema);
+            if (xsdInput == null) {
+                throw new IllegalStateException("Can not load filter.xsd");
+            }
+            factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+            // optionally adjust locale, https://stackoverflow.com/a/18745978
+            if (locale != null) {
+                factory.setAttribute("http://apache.org/xml/properties/locale", locale);
+            }
+        } catch (SAXException e) {
+            throw new IOException("Could not parse input as xml", e);
+        } catch (ParserConfigurationException e) {
+            throw new IllegalStateException("Could not instantiate DOM parser", e);
+        }
+        return factory;
+    }
+    
     @Override
     public Validator createValidator(@NotNull ValidationContext context, @NotNull ValidatorSettings settings) {
         final ValidationMessageSeverity severityForUncoveredAncestorNode;
@@ -92,7 +135,7 @@ public final class AdvancedFilterValidatorFactory implements ValidatorFactory {
         } else {
             validRoots.addAll(DEFAULT_VALID_ROOTS);
         }
-        return new AdvancedFilterValidator(settings.getDefaultSeverity(), severityForUncoveredAncestorNode, severityForUncoveredFilterRootAncestors, severityForOrphanedFilterRules, context.getContainerValidationContext() != null, context.getDependenciesPackageInfo(), context.getFilter(), validRoots);
+        return new AdvancedFilterValidator(factory, settings.getDefaultSeverity(), severityForUncoveredAncestorNode, severityForUncoveredFilterRootAncestors, severityForOrphanedFilterRules, context.getContainerValidationContext() != null, context.getDependenciesPackageInfo(), context.getFilter(), validRoots);
     }
 
     @Override
diff --git a/vault-validation/src/test/java/org/apache/jackrabbit/vault/validation/spi/impl/AdvancedFilterValidatorTest.java b/vault-validation/src/test/java/org/apache/jackrabbit/vault/validation/spi/impl/AdvancedFilterValidatorTest.java
index 8dececf..172eddc 100644
--- a/vault-validation/src/test/java/org/apache/jackrabbit/vault/validation/spi/impl/AdvancedFilterValidatorTest.java
+++ b/vault-validation/src/test/java/org/apache/jackrabbit/vault/validation/spi/impl/AdvancedFilterValidatorTest.java
@@ -25,9 +25,11 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 
 import javax.jcr.PropertyType;
+import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
 import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
@@ -83,12 +85,15 @@ public class AdvancedFilterValidatorTest {
     private Collection<PackageInfo> dependenciesMetaInfo;
 
     private Collection<String> validRoots;
+    
+    private DocumentBuilderFactory factory;
 
     @Before
-    public void setUp() {
+    public void setUp() throws IOException {
         dependenciesMetaInfo = new LinkedList<>();
         validRoots = new LinkedList<>();
         validRoots.addAll(AdvancedFilterValidatorFactory.DEFAULT_VALID_ROOTS);
+        factory = AdvancedFilterValidatorFactory.createFilterXsdAwareDocumentBuilder(Locale.US);
     }
 
     private NodeContext getStandardNodeContext(String nodePath) {
@@ -110,6 +115,7 @@ public class AdvancedFilterValidatorTest {
             filter.load(input);
 
             validator = new AdvancedFilterValidator(
+                    factory,
                     ValidationMessageSeverity.WARN,
                     AdvancedFilterValidatorFactory.DEFAULT_SEVERITY_FOR_UNCOVERED_ANCESTOR_NODES,
                     ValidationMessageSeverity.ERROR,
@@ -145,6 +151,7 @@ public class AdvancedFilterValidatorTest {
             filter.load(input);
         }
         validator = new AdvancedFilterValidator(
+                factory,
                 ValidationMessageSeverity.WARN,
                 AdvancedFilterValidatorFactory.DEFAULT_SEVERITY_FOR_UNCOVERED_ANCESTOR_NODES,
                 ValidationMessageSeverity.ERROR,
@@ -167,6 +174,7 @@ public class AdvancedFilterValidatorTest {
             filter.load(input);
         }
         validator = new AdvancedFilterValidator(
+                factory,
                 ValidationMessageSeverity.WARN,
                 AdvancedFilterValidatorFactory.DEFAULT_SEVERITY_FOR_UNCOVERED_ANCESTOR_NODES,
                 ValidationMessageSeverity.ERROR,
@@ -208,6 +216,7 @@ public class AdvancedFilterValidatorTest {
             filter.load(input);
         }
         validator = new AdvancedFilterValidator(
+                factory,
                 ValidationMessageSeverity.ERROR,
                 AdvancedFilterValidatorFactory.DEFAULT_SEVERITY_FOR_UNCOVERED_ANCESTOR_NODES,
                 ValidationMessageSeverity.ERROR,
@@ -227,6 +236,7 @@ public class AdvancedFilterValidatorTest {
 
         // default severity ERROR
         validator = new AdvancedFilterValidator(
+                factory,
                 ValidationMessageSeverity.ERROR,
                 ValidationMessageSeverity.ERROR,
                 ValidationMessageSeverity.ERROR,
@@ -244,6 +254,7 @@ public class AdvancedFilterValidatorTest {
         validRoots.add("/someroot");
         // default severity ERROR
         validator = new AdvancedFilterValidator(
+                factory,
                 ValidationMessageSeverity.ERROR,
                 ValidationMessageSeverity.WARN,
                 ValidationMessageSeverity.ERROR,
@@ -271,6 +282,7 @@ public class AdvancedFilterValidatorTest {
         validRoots.add("/customroot");
         dependenciesMetaInfo.add(new DefaultPackageInfo(PackageId.fromString("group:dependency1"), dependencyFilter, PackageType.APPLICATION));
         validator = new AdvancedFilterValidator(
+                factory,
                 ValidationMessageSeverity.ERROR,
                 ValidationMessageSeverity.ERROR,
                 ValidationMessageSeverity.ERROR,
@@ -296,6 +308,7 @@ public class AdvancedFilterValidatorTest {
             filter.load(input);
         }
         validator = new AdvancedFilterValidator(
+                factory,
                 ValidationMessageSeverity.INFO,
                 AdvancedFilterValidatorFactory.DEFAULT_SEVERITY_FOR_UNCOVERED_ANCESTOR_NODES,
                 ValidationMessageSeverity.ERROR,
@@ -324,6 +337,7 @@ public class AdvancedFilterValidatorTest {
             filter.load(input);
         }
         validator = new AdvancedFilterValidator(
+                factory,
                 ValidationMessageSeverity.INFO,
                 AdvancedFilterValidatorFactory.DEFAULT_SEVERITY_FOR_UNCOVERED_ANCESTOR_NODES,
                 ValidationMessageSeverity.INFO,
@@ -344,6 +358,7 @@ public class AdvancedFilterValidatorTest {
         try (InputStream input = this.getClass()
                 .getResourceAsStream("/invalid-package/META-INF/vault/filter.xml")) {
             validator = new AdvancedFilterValidator(
+                    factory,
                     ValidationMessageSeverity.WARN,
                     AdvancedFilterValidatorFactory.DEFAULT_SEVERITY_FOR_UNCOVERED_ANCESTOR_NODES,
                     ValidationMessageSeverity.ERROR,
@@ -370,6 +385,7 @@ public class AdvancedFilterValidatorTest {
     public void testFilterWithNonMatchingRegex() throws URISyntaxException, IOException, SAXException,
             ParserConfigurationException, ConfigurationException {
         validator = new AdvancedFilterValidator(
+                factory,
                 ValidationMessageSeverity.WARN,
                 AdvancedFilterValidatorFactory.DEFAULT_SEVERITY_FOR_UNCOVERED_ANCESTOR_NODES,
                 ValidationMessageSeverity.ERROR,
@@ -417,6 +433,7 @@ public class AdvancedFilterValidatorTest {
             filter.load(input);
         }
         validator = new AdvancedFilterValidator(
+                factory,
                 ValidationMessageSeverity.WARN,
                 AdvancedFilterValidatorFactory.DEFAULT_SEVERITY_FOR_UNCOVERED_ANCESTOR_NODES,
                 ValidationMessageSeverity.ERROR,