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,