diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index f088435..ef39ded 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -39,7 +39,7 @@ cache:
java-11:
extends: .java
- image: maven:3-eclipse-temurin-11-alpine
+ image: $CI_REGISTRY_IMAGE/maven:3-eclipse-temurin-11-alpine
needs: [ ]
script:
- mvn $MAVEN_CLI_OPTS $BUILD_PROPS $CI_JOB_TIMESTAMP install
@@ -56,27 +56,23 @@ java-11:
java-11-openj9:
extends: .java_extended
- image: maven:3-jdk-11-openj9
+ image: $CI_REGISTRY_IMAGE/maven:3-jdk-11-openj9
java-17:
extends: .java
- image: maven:3-eclipse-temurin-17-alpine
+ image: $CI_REGISTRY_IMAGE/maven:3-eclipse-temurin-17-alpine
java-21:
extends: .java
- image: maven:3-eclipse-temurin-21-alpine
+ image: $CI_REGISTRY_IMAGE/maven:3-eclipse-temurin-21-alpine
java-24:
extends: .java_extended
- image: maven:3-eclipse-temurin-24-alpine
+ image: $CI_REGISTRY_IMAGE/maven:3-eclipse-temurin-24-alpine
-java-25:
- extends: .java
- image: maven:3-eclipse-temurin-25-alpine
-
deploy:
stage: deploy
- image: maven:3-eclipse-temurin-11-alpine
+ image: $CI_REGISTRY_IMAGE/maven:3-eclipse-temurin-11-alpine
needs:
- job: java-11
script:
@@ -110,7 +106,7 @@ create-build-image:
owasp-check:
extends: .java
- image: maven:3-eclipse-temurin-11-alpine
+ image: $CI_REGISTRY_IMAGE/maven:3-eclipse-temurin-11-alpine
needs: [ ]
script:
- mvn $MAVEN_CLI_OPTS $BUILD_PROPS $CI_JOB_TIMESTAMP validate -Powasp-check
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ef56bf3..5611067 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,15 +5,7 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-
-## Unreleased
-
-
-## 1.6.0 - 2025-11-07
-
-### Added
-
-- (CORE) [GitHub #127](https://github.com/itplr-kosit/validator/issues/127) New API method `Result.getCustomFailedAsserts()` to access failed asserts with custom error levels
+## 1.6.0
### Fixed
@@ -23,13 +15,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- (CORE) Migration from javax to jakarta xml bind
- (DOC) [GitHub PR#132](https://github.com/itplr-kosit/validator/pull/132) Updated the link to the example Validator scenario configuration
-- (BUILD) Support for *building and compilation* is restricted to the following Java versions:
- - Java 11: any version ≥ 11.0.23
- - Java 12 to 16 will not work
- - Java 17: any version ≥ 17.0.11
- - Java 18 to 20 will not work
- - Any version from Java 21 onwards will work
- - The reason for this is the usage of the `-proc:full` compiler parameter which in turn is needed for Lombok usage in JDK 23+.
### Removed
diff --git a/README.md b/README.md
index a363a7d..9b22700 100644
--- a/README.md
+++ b/README.md
@@ -74,12 +74,12 @@ The [CLI documentation](./docs/cli.md) shows further configuration options.
The Validator can also be used in own Java Applications via the API. An example use of the API as follows:
```java
-URL scenarios = this.getClass().getClassLoader().getResource("scenarios.xml");
-Configuration config = Configuration.load(scenarios.toURI()).build(ProcessorProvider.getProcessor());
-Check validator = new DefaultCheck(config);
-
+Path scenarios = Paths.get("scenarios.xml");
+Configuration config = Configuration.load(scenarios.toUri());
Input document = InputFactory.read(testDocument);
-Result report = validator.checkInput(document);
+
+Check validator = new DefaultCheck(config);
+Result validationResult = validator.checkInput(document);
// examine the result here
```
@@ -139,8 +139,8 @@ To use the standalone version with Maven coordinates, add the respective classif
This section describes the next steps planned in the Validator development.
-* Version 1.5.x is frozen - no maintainance, no support
-* Version 1.6.x - no feature development, but maintainance and best-effort support
+* Release version 1.6.0 based on Java 11 and using Jakarta 4.x. - Autumn 2025
+ * Drop support of version 1.5.x when version 1.6 is released
* Develop version 2.0.0 which will include major API incompatibilities - Winter 2025
* Rework scenarios.xml
* Rework report output engine
@@ -156,4 +156,4 @@ We are thankful to numerous third-party [contributors](https://github.com/itplr-
## License
-The Validator is licensed under the [Apache 2.0 license](https://www.apache.org/licenses/LICENSE-2.0).
\ No newline at end of file
+The Validator is licensed under the [Apache 2.0 license](https://www.apache.org/licenses/LICENSE-2.0).
diff --git a/pom.xml b/pom.xml
index 5d04818..953d5a6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
org.kosit
validator
- 1.6.1-SNAPSHOT
+ 1.6.0-SNAPSHOT
KoSIT XML Validator against XSD and Schematron based on defined scenarios.
@@ -15,7 +15,7 @@
fabian.buettner
Fabian Büttner
KoSIT
- https://xoev.de/
+ https://xeinkauf.de/
renzo.kottmann
@@ -44,13 +44,13 @@
0.8.13
4.0.2
4.0.5
- 1.18.42
+ 1.18.38
4.11.0
- 12.1.8
+ 10.0.4
5.5.5
12.8
2.0.17
- 4.0.11
+ 4.0.9
@@ -239,19 +239,8 @@
-
- [3.6.3,)
+ [3.3.9,)
-
-
- [11.0.23,12),[17.0.11,18),[21,)
-
@@ -262,13 +251,9 @@
maven-compiler-plugin
3.14.0
- 11
+ 11
+ 11
UTF-8
-
- full
@@ -459,7 +444,7 @@
org.codehaus.mojo
exec-maven-plugin
- 3.6.2
+ 3.5.0
run
@@ -470,15 +455,10 @@
- true
-
- 0,1
java
false
true
true
-
- false
${jacocoFailsafe}
@@ -506,7 +486,7 @@
- jacoco.tcp.port=${jacoco.tcp.port}
+ ${jacoco.tcp.port}
@@ -618,10 +598,6 @@
dependency-check-maven
${version.owasp-dependency-check}
-
0
${project.basedir}/owasp-suppressions.xml
diff --git a/src/main/java/de/kosit/validationtool/api/Input.java b/src/main/java/de/kosit/validationtool/api/Input.java
index 8d93c7a..12f9fee 100644
--- a/src/main/java/de/kosit/validationtool/api/Input.java
+++ b/src/main/java/de/kosit/validationtool/api/Input.java
@@ -45,7 +45,7 @@ public interface Input {
/**
* The digest algorithm used for computing the {@link #getHashCode()}
*
- * @return the name of the digest algorithm
+ * @return the name of the digest algorith
*/
String getDigestAlgorithm();
diff --git a/src/main/java/de/kosit/validationtool/api/Result.java b/src/main/java/de/kosit/validationtool/api/Result.java
index f3ed697..4c04ab4 100644
--- a/src/main/java/de/kosit/validationtool/api/Result.java
+++ b/src/main/java/de/kosit/validationtool/api/Result.java
@@ -22,7 +22,6 @@ import org.oclc.purl.dsdl.svrl.FailedAssert;
import org.oclc.purl.dsdl.svrl.SchematronOutput;
import org.w3c.dom.Document;
-import de.kosit.validationtool.impl.model.CustomFailedAssert;
import net.sf.saxon.s9api.XdmNode;
/**
@@ -70,31 +69,23 @@ public interface Result {
/**
* Schnellzugriff auf die Empfehlung zur Weiterverarbeitung des Dokuments.
*
- * @return true wenn {@link AcceptRecommendation#ACCEPTABLE}
+ * @return true wenn {@link AcceptRecommendation#ACCEPTABLE}
*/
boolean isAcceptable();
/**
* Gibt eine Liste mit gefundenen Schema-Validation-Fehler zurück. Diese Liste ist leer, wenn keine Fehler gefunden
* wurden.
- *
- * @return List of schema validation errors.
*/
List getSchemaViolations();
/**
* Liefert die Ergebnisse der Schematron-Prüfungen, in der Reihenfolge der Szenario-Konfiguration.
*
- * @return List with Schematron results
+ * @return Liste mit Schematron-Ergebnissen
*/
List getSchematronResult();
- /**
- * @return List of custom failed asserts per Schematron level. Only failed assertions with a custom level are
- * contained. Never null but maybe empty.
- */
- List getCustomFailedAsserts();
-
/**
* Returns {@link org.oclc.purl.dsdl.svrl.FailedAssert FailedAsserts} of a schematron evaluation.
*
@@ -105,14 +96,14 @@ public interface Result {
/**
* Liefert ein true, wenn keine Schema-Violations vorhanden sind.
*
- * @return true if XML Schema compliant
+ * @return true wenn Schema-valide
*/
boolean isSchemaValid();
/**
* Liefert ein true, wenn der Prüfling eine well-formed XML-Datei ist.
*
- * @return true if wellformed
+ * @return true wenn well-formed
*/
boolean isWellformed();
@@ -120,7 +111,7 @@ public interface Result {
* Returns true, if schematron has been checked and the result does not contain any {@link FailedAssert
* FailedAsserts}.
*
- * @return true, if valid
+ * @return true, if valid
*/
boolean isSchematronValid();
}
diff --git a/src/main/java/de/kosit/validationtool/cmd/CheckAssertionAction.java b/src/main/java/de/kosit/validationtool/cmd/CheckAssertionAction.java
index 655c080..fb44ac9 100644
--- a/src/main/java/de/kosit/validationtool/cmd/CheckAssertionAction.java
+++ b/src/main/java/de/kosit/validationtool/cmd/CheckAssertionAction.java
@@ -23,14 +23,16 @@ import java.util.Map;
import org.apache.commons.lang3.StringUtils;
-import de.kosit.validationtool.cmd.assertions.AssertionType;
-import de.kosit.validationtool.cmd.assertions.Assertions;
-import de.kosit.validationtool.impl.model.Result;
-import de.kosit.validationtool.impl.tasks.CheckAction;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+
+import de.kosit.validationtool.cmd.assertions.AssertionType;
+import de.kosit.validationtool.cmd.assertions.Assertions;
+import de.kosit.validationtool.impl.model.Result;
+import de.kosit.validationtool.impl.tasks.CheckAction;
+
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.SaxonApiException;
import net.sf.saxon.s9api.XPathCompiler;
@@ -54,12 +56,12 @@ class CheckAssertionAction implements CheckAction {
private Map> mappedAssertions;
- private static boolean matches(final String key, final String name) {
+ private static boolean matches(String key, String name) {
return key.startsWith(name) || (name + ".xml").endsWith(key);
}
@Override
- public void check(final Bag results) {
+ public void check(Bag results) {
log.info("Checking assertions for {}", results.getInput().getName());
final List toCheck = findAssertions(results.getName());
final List errors = new ArrayList<>();
@@ -82,28 +84,28 @@ class CheckAssertionAction implements CheckAction {
}
}
- private List findAssertions(final String name) {
+ private List findAssertions(String name) {
return getMapped().entrySet().stream().filter(e -> matches(e.getKey(), name)).map(Map.Entry::getValue).findFirst().orElse(null);
}
- private boolean check(final XdmNode document, final AssertionType assertion) {
+ private boolean check(XdmNode document, AssertionType assertion) {
try {
final XPathSelector selector = createSelector(assertion);
selector.setContextItem(document);
return selector.effectiveBooleanValue();
- } catch (final SaxonApiException e) {
+ } catch (SaxonApiException e) {
log.error("Error evaluating assertion {} for {}", assertion.getTest(), assertion.getReportDoc(), e);
}
return false;
}
- private XPathSelector createSelector(final AssertionType assertion) {
+ private XPathSelector createSelector(AssertionType assertion) throws SaxonApiException {
try {
final XPathCompiler compiler = getProcessor().newXPathCompiler();
assertions.getNamespace().forEach(ns -> compiler.declareNamespace(ns.getPrefix(), ns.getValue()));
return compiler.compile(assertion.getTest()).load();
- } catch (final SaxonApiException e) {
+ } catch (SaxonApiException e) {
throw new IllegalStateException(String.format("Can not compile xpath match expression '%s'",
StringUtils.isNotBlank(assertion.getTest()) ? assertion.getTest() : "EMPTY EXPRESSION"), e);
}
@@ -112,8 +114,8 @@ class CheckAssertionAction implements CheckAction {
private Map> getMapped() {
if (mappedAssertions == null) {
mappedAssertions = new HashMap<>();
- for (final AssertionType assertionType : assertions.getAssertion()) {
- final List list = mappedAssertions.computeIfAbsent(assertionType.getReportDoc(), k -> new ArrayList<>());
+ for (AssertionType assertionType : assertions.getAssertion()) {
+ List list = mappedAssertions.computeIfAbsent(assertionType.getReportDoc(), k -> new ArrayList<>());
list.add(assertionType);
}
}
diff --git a/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java b/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java
index 37b9ed7..09e3757 100644
--- a/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java
+++ b/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java
@@ -95,8 +95,6 @@ public class CommandLineApplication {
return resultStatus;
}
- // The signature is required, because the method is used a lambda
- @SuppressWarnings("unused")
private static int logExecutionException(final Exception ex, final CommandLine cli, final ParseResult parseResult) {
final String message = isNotEmpty(ex.getMessage()) ? ex.getMessage() : "Es ist eine Fehler aufgetreten";
Printer.writeErr(ex, message);
diff --git a/src/main/java/de/kosit/validationtool/cmd/Validator.java b/src/main/java/de/kosit/validationtool/cmd/Validator.java
index 3384768..a54e3b5 100644
--- a/src/main/java/de/kosit/validationtool/cmd/Validator.java
+++ b/src/main/java/de/kosit/validationtool/cmd/Validator.java
@@ -321,8 +321,10 @@ public class Validator {
private static URI determineRepository(final Path d) {
if (Files.isDirectory(d)) {
return d.toUri();
+ } else {
+ throw new IllegalArgumentException(
+ String.format("Not a valid path for repository definition specified: '%s'", d.toAbsolutePath()));
}
- throw new IllegalArgumentException(String.format("Not a valid path for repository definition specified: '%s'", d.toAbsolutePath()));
}
diff --git a/src/main/java/de/kosit/validationtool/cmd/report/Grid.java b/src/main/java/de/kosit/validationtool/cmd/report/Grid.java
index 944acb6..f374535 100644
--- a/src/main/java/de/kosit/validationtool/cmd/report/Grid.java
+++ b/src/main/java/de/kosit/validationtool/cmd/report/Grid.java
@@ -82,7 +82,6 @@ public class Grid {
*
* @param name the name of the column
* @param maxLength the max length of the column
- * @param minLength the minimum length of the column
*/
public ColumnDefinition(final String name, final int maxLength, final int minLength) {
this(name, maxLength, minLength, 1);
@@ -92,8 +91,7 @@ public class Grid {
* Constructor.
*
* @param name the name of the column
- * @param maxLength the max length of the column
- * @param minLength the minimum length of the column
+ * @param minLength the max length of the column
* @param maxLines the max lines per cell
*/
public ColumnDefinition(final String name, final int maxLength, final int minLength, final int maxLines) {
@@ -151,6 +149,10 @@ public class Grid {
this.text.add(txt);
}
+ public Cell(final Object object, final Code... codes) {
+ this(new Text(object, codes));
+ }
+
protected Line getFormattedLine(final int lineNumber, final ColumnDefinition def) {
final Line line = new Line();
int startSubstring = lineNumber * def.getLength();
@@ -192,6 +194,11 @@ public class Grid {
}
+ public Cell add(final Object object, final Code... codes) {
+ this.text.add(new Text(object, codes));
+ return this;
+ }
+
}
private static final Format DEFAULT_FORMAT = new Format();
@@ -314,7 +321,7 @@ public class Grid {
}
private static boolean isEmpty(final StringBuilder current) {
- return current.toString().replace("|", "").trim().length() == 0;
+ return current.toString().replaceAll("\\|", "").trim().length() == 0;
}
private int getMaxVirtualLine() {
diff --git a/src/main/java/de/kosit/validationtool/config/ConfigurationLoader.java b/src/main/java/de/kosit/validationtool/config/ConfigurationLoader.java
index 0f279d8..bf1f2b8 100644
--- a/src/main/java/de/kosit/validationtool/config/ConfigurationLoader.java
+++ b/src/main/java/de/kosit/validationtool/config/ConfigurationLoader.java
@@ -16,6 +16,8 @@
package de.kosit.validationtool.config;
+import static org.apache.commons.lang3.StringUtils.startsWith;
+
import java.net.MalformedURLException;
import java.net.URI;
import java.util.HashMap;
@@ -25,7 +27,10 @@ import java.util.stream.Collectors;
import javax.xml.validation.Schema;
-import org.apache.commons.lang3.Strings;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import de.kosit.validationtool.api.Check;
import de.kosit.validationtool.api.Configuration;
@@ -44,10 +49,7 @@ import de.kosit.validationtool.model.reportInput.XMLSyntaxError;
import de.kosit.validationtool.model.scenarios.ResourceType;
import de.kosit.validationtool.model.scenarios.ScenarioType;
import de.kosit.validationtool.model.scenarios.Scenarios;
-import lombok.AccessLevel;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
+
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.QName;
import net.sf.saxon.s9api.XdmNode;
@@ -111,8 +113,8 @@ public class ConfigurationLoader {
private static boolean isSupportedDocument(final XdmNode doc) {
final XdmNode root = findRoot(doc);
final String frameworkVersion = root.getAttributeValue(new QName("frameworkVersion"));
- return Strings.CS.startsWith(frameworkVersion, SUPPORTED_MAJOR_VERSION)
- && root.getNodeName().getNamespace().equals(SUPPORTED_MAJOR_VERSION_SCHEMA);
+ return startsWith(frameworkVersion, SUPPORTED_MAJOR_VERSION)
+ && root.getNodeName().getNamespaceURI().equals(SUPPORTED_MAJOR_VERSION_SCHEMA);
}
private static Scenario createFallback(final Scenarios scenarios, final ContentRepository repository) {
diff --git a/src/main/java/de/kosit/validationtool/daemon/BaseHandler.java b/src/main/java/de/kosit/validationtool/daemon/BaseHandler.java
index e84dd28..ef1408c 100644
--- a/src/main/java/de/kosit/validationtool/daemon/BaseHandler.java
+++ b/src/main/java/de/kosit/validationtool/daemon/BaseHandler.java
@@ -44,18 +44,18 @@ abstract class BaseHandler implements HttpHandler {
throws IOException {
exchange.getResponseHeaders().add("Content-Type", contentType);
exchange.sendResponseHeaders(statusCode, 0);
- try ( final OutputStream os = exchange.getResponseBody() ) {
- write.write(os);
- }
+ final OutputStream os = exchange.getResponseBody();
+ write.write(os);
+ os.close();
}
protected static void error(final HttpExchange exchange, final int statusCode, final String message) throws IOException {
final byte[] bytes = message.getBytes();
exchange.getResponseHeaders().add("Content-Type", "text/plain");
exchange.sendResponseHeaders(statusCode, bytes.length);
- try ( final OutputStream os = exchange.getResponseBody() ) {
- os.write(bytes);
- }
+ final OutputStream os = exchange.getResponseBody();
+ os.write(bytes);
+ os.close();
}
@FunctionalInterface
diff --git a/src/main/java/de/kosit/validationtool/impl/CollectingErrorEventHandler.java b/src/main/java/de/kosit/validationtool/impl/CollectingErrorEventHandler.java
index be10111..3f522a6 100644
--- a/src/main/java/de/kosit/validationtool/impl/CollectingErrorEventHandler.java
+++ b/src/main/java/de/kosit/validationtool/impl/CollectingErrorEventHandler.java
@@ -17,9 +17,11 @@
package de.kosit.validationtool.impl;
import java.util.ArrayList;
-import java.util.List;
+import java.util.Collection;
import java.util.StringJoiner;
+import jakarta.xml.bind.ValidationEvent;
+import jakarta.xml.bind.ValidationEventHandler;
import javax.xml.transform.ErrorListener;
import javax.xml.transform.SourceLocator;
import javax.xml.transform.TransformerException;
@@ -28,11 +30,11 @@ import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
+import lombok.Getter;
+
import de.kosit.validationtool.model.reportInput.XMLSyntaxError;
import de.kosit.validationtool.model.reportInput.XMLSyntaxErrorSeverity;
-import jakarta.xml.bind.ValidationEvent;
-import jakarta.xml.bind.ValidationEventHandler;
-import lombok.Getter;
+
import net.sf.saxon.s9api.MessageListener2;
import net.sf.saxon.s9api.QName;
import net.sf.saxon.s9api.XdmNode;
@@ -49,7 +51,7 @@ public class CollectingErrorEventHandler implements ValidationEventHandler, Erro
private static final int stopProcessCount = DEFAULT_ABORT_COUNT;
- private final List errors = new ArrayList<>();
+ private final Collection errors = new ArrayList<>();
private static XMLSyntaxError createError(final XMLSyntaxErrorSeverity severity, final String message) {
final XMLSyntaxError e = new XMLSyntaxError();
diff --git a/src/main/java/de/kosit/validationtool/impl/ContentRepository.java b/src/main/java/de/kosit/validationtool/impl/ContentRepository.java
index e530040..521e3fc 100644
--- a/src/main/java/de/kosit/validationtool/impl/ContentRepository.java
+++ b/src/main/java/de/kosit/validationtool/impl/ContentRepository.java
@@ -37,6 +37,10 @@ import javax.xml.validation.SchemaFactory;
import org.apache.commons.lang3.StringUtils;
import org.xml.sax.SAXException;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
import de.kosit.validationtool.api.ResolvingConfigurationStrategy;
import de.kosit.validationtool.impl.Scenario.Transformation;
import de.kosit.validationtool.impl.xml.RelativeUriResolver;
@@ -45,9 +49,7 @@ import de.kosit.validationtool.model.scenarios.NamespaceType;
import de.kosit.validationtool.model.scenarios.ResourceType;
import de.kosit.validationtool.model.scenarios.ScenarioType;
import de.kosit.validationtool.model.scenarios.ValidateWithSchematron;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
+
import net.sf.saxon.lib.UnparsedTextURIResolver;
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.SaxonApiException;
diff --git a/src/main/java/de/kosit/validationtool/impl/ConversionService.java b/src/main/java/de/kosit/validationtool/impl/ConversionService.java
index bd0ba6c..d2ca2d2 100644
--- a/src/main/java/de/kosit/validationtool/impl/ConversionService.java
+++ b/src/main/java/de/kosit/validationtool/impl/ConversionService.java
@@ -24,6 +24,14 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.StringJoiner;
+import jakarta.xml.bind.JAXBContext;
+import jakarta.xml.bind.JAXBElement;
+import jakarta.xml.bind.JAXBException;
+import jakarta.xml.bind.JAXBIntrospector;
+import jakarta.xml.bind.Marshaller;
+import jakarta.xml.bind.Unmarshaller;
+import jakarta.xml.bind.ValidationEventHandler;
+import jakarta.xml.bind.annotation.XmlRegistry;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLOutputFactory;
@@ -36,14 +44,6 @@ import javax.xml.validation.Schema;
import org.apache.commons.lang3.StringUtils;
-import jakarta.xml.bind.JAXBContext;
-import jakarta.xml.bind.JAXBElement;
-import jakarta.xml.bind.JAXBException;
-import jakarta.xml.bind.JAXBIntrospector;
-import jakarta.xml.bind.Marshaller;
-import jakarta.xml.bind.Unmarshaller;
-import jakarta.xml.bind.ValidationEventHandler;
-import jakarta.xml.bind.annotation.XmlRegistry;
import lombok.extern.slf4j.Slf4j;
/**
@@ -219,7 +219,6 @@ public class ConversionService {
final XMLOutputFactory xof = XMLOutputFactory.newFactory();
final XMLStreamWriter xmlStreamWriter = xof.createXMLStreamWriter(w);
if (null == introspector.getElementName(model)) {
- @SuppressWarnings({ "rawtypes", "unchecked" })
final JAXBElement jaxbElement = new JAXBElement(createQName(model), model.getClass(), model);
marshaller.marshal(jaxbElement, xmlStreamWriter);
} else {
diff --git a/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java b/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java
index 26ab801..66bff80 100644
--- a/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java
+++ b/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java
@@ -20,21 +20,19 @@ import static de.kosit.validationtool.impl.DateFactory.createTimestamp;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
+import java.util.Collection;
import java.util.List;
import java.util.Map;
-import java.util.Optional;
import java.util.stream.Collectors;
-import org.oclc.purl.dsdl.svrl.FailedAssert;
-import org.oclc.purl.dsdl.svrl.SchematronOutput;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
import de.kosit.validationtool.api.Check;
import de.kosit.validationtool.api.Configuration;
import de.kosit.validationtool.api.Input;
import de.kosit.validationtool.api.Result;
import de.kosit.validationtool.api.XmlError;
-import de.kosit.validationtool.impl.model.CustomFailedAssert;
import de.kosit.validationtool.impl.tasks.CheckAction;
import de.kosit.validationtool.impl.tasks.CheckAction.Bag;
import de.kosit.validationtool.impl.tasks.ComputeAcceptanceAction;
@@ -49,10 +47,7 @@ import de.kosit.validationtool.impl.xml.ProcessorProvider;
import de.kosit.validationtool.model.reportInput.CreateReportInput;
import de.kosit.validationtool.model.reportInput.EngineType;
import de.kosit.validationtool.model.reportInput.XMLSyntaxError;
-import de.kosit.validationtool.model.scenarios.ErrorLevelType;
-import de.kosit.validationtool.model.scenarios.ScenarioType;
-import lombok.Getter;
-import lombok.extern.slf4j.Slf4j;
+
import net.sf.saxon.s9api.Processor;
/**
@@ -146,31 +141,10 @@ public class DefaultCheck implements Check {
result.setProcessingSuccessful(!t.isStopped() && t.isFinished());
result.setSchematronResult(t.getReportInput().getValidationResultsSchematron().stream().filter(e -> e.getResults() != null)
.map(e -> e.getResults().getSchematronOutput()).collect(Collectors.toList()));
-
- result.setCustomFailedAsserts(buildCustomFailedAssertsList(t, result.getSchematronResult()));
-
return result;
}
- private List buildCustomFailedAssertsList(final Bag t, final List schematronResult) {
- // Get Map of Assertion ID to custom error levels for the current scenario
- final Map customLevels = Optional.ofNullable(t.getScenarioSelectionResult())
- .map(de.kosit.validationtool.impl.model.Result::getObject).map(Scenario::getConfiguration)
- .map(ScenarioType::getCreateReport)
- .map(r -> r.getCustomLevel().stream()
- .flatMap(customLevel -> customLevel.getValue().stream().map(id -> Map.entry(id, customLevel.getLevel())))
- .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)))
- .orElse(Collections.emptyMap());
-
- // Now check all failed assertions of all schematron validations if they contain a failed assertion with one of
- // the changed IDs
- return schematronResult.stream().flatMap(x -> x.getActivePatternAndFiredRuleAndFailedAssert().stream())
- .filter(FailedAssert.class::isInstance).map(FailedAssert.class::cast).filter(fa -> customLevels.containsKey(fa.getId()))
- .map(fa -> new CustomFailedAssert(fa, customLevels.get(fa.getId()))).collect(Collectors.toList());
- }
-
- @SuppressWarnings("unchecked")
- private static List convertErrors(final List errors) {
+ private static List convertErrors(final Collection errors) {
// noinspection unchecked
return (List) (List>) errors;
}
diff --git a/src/main/java/de/kosit/validationtool/impl/DefaultResult.java b/src/main/java/de/kosit/validationtool/impl/DefaultResult.java
index 162e3f9..9892198 100644
--- a/src/main/java/de/kosit/validationtool/impl/DefaultResult.java
+++ b/src/main/java/de/kosit/validationtool/impl/DefaultResult.java
@@ -25,14 +25,15 @@ import org.oclc.purl.dsdl.svrl.SchematronOutput;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-import de.kosit.validationtool.api.AcceptRecommendation;
-import de.kosit.validationtool.api.Result;
-import de.kosit.validationtool.api.XmlError;
-import de.kosit.validationtool.impl.model.CustomFailedAssert;
-import de.kosit.validationtool.model.reportInput.CreateReportInput;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
+
+import de.kosit.validationtool.api.AcceptRecommendation;
+import de.kosit.validationtool.api.Result;
+import de.kosit.validationtool.api.XmlError;
+import de.kosit.validationtool.model.reportInput.CreateReportInput;
+
import net.sf.saxon.dom.NodeOverNodeInfo;
import net.sf.saxon.s9api.XdmNode;
@@ -66,11 +67,6 @@ public class DefaultResult implements Result {
@Setter(AccessLevel.PACKAGE)
private List schematronResult;
- /**
- * List of custom failed asserts per Schematron level. Only failed assertions with a custom level are contained.
- */
- private List customFailedAsserts;
-
@Getter
@Setter
private boolean processingSuccessful;
@@ -153,28 +149,19 @@ public class DefaultResult implements Result {
}
private List filterSchematronResult(final Class type) {
- return this.schematronResult != null
- ? this.schematronResult.stream().flatMap(e -> e.getActivePatternAndFiredRuleAndFailedAssert().stream())
+ return getSchematronResult() != null
+ ? getSchematronResult().stream().flatMap(e -> e.getActivePatternAndFiredRuleAndFailedAssert().stream())
.filter(type::isInstance).map(type::cast).collect(Collectors.toList())
: Collections.emptyList();
}
private boolean isSchematronEvaluated() {
- return this.schematronResult != null
- && this.schematronResult.stream().noneMatch(e -> e.getActivePatternAndFiredRuleAndFailedAssert().isEmpty());
+ return getSchematronResult() != null
+ && getSchematronResult().stream().noneMatch(e -> e.getActivePatternAndFiredRuleAndFailedAssert().isEmpty());
}
@Override
public boolean isSchematronValid() {
return isSchematronEvaluated() && getFailedAsserts().isEmpty();
}
-
- @Override
- public List getCustomFailedAsserts() {
- return this.customFailedAsserts;
- }
-
- public void setCustomFailedAsserts(List customFailedAsserts) {
- this.customFailedAsserts = customFailedAsserts;
- }
}
diff --git a/src/main/java/de/kosit/validationtool/impl/ScenarioRepository.java b/src/main/java/de/kosit/validationtool/impl/ScenarioRepository.java
index 267bc23..6306403 100644
--- a/src/main/java/de/kosit/validationtool/impl/ScenarioRepository.java
+++ b/src/main/java/de/kosit/validationtool/impl/ScenarioRepository.java
@@ -17,6 +17,7 @@
package de.kosit.validationtool.impl;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@@ -80,9 +81,10 @@ public class ScenarioRepository {
if (collect.size() == 1) {
result = new Result<>(collect.get(0));
} else if (collect.isEmpty()) {
- result = new Result<>(getFallbackScenario(), Arrays.asList("None of the loaded scenarios matches the specified document"));
+ result = new Result<>(getFallbackScenario(),
+ Collections.singleton("None of the loaded scenarios matches the specified document"));
} else {
- result = new Result<>(getFallbackScenario(), Arrays.asList("More than one scenario matches the specified document"));
+ result = new Result<>(getFallbackScenario(), Collections.singleton("More than one scenario matches the specified document"));
}
return result;
diff --git a/src/main/java/de/kosit/validationtool/impl/input/SourceInput.java b/src/main/java/de/kosit/validationtool/impl/input/SourceInput.java
index 60c926e..7b0a9b8 100644
--- a/src/main/java/de/kosit/validationtool/impl/input/SourceInput.java
+++ b/src/main/java/de/kosit/validationtool/impl/input/SourceInput.java
@@ -19,18 +19,18 @@ package de.kosit.validationtool.impl.input;
import static org.apache.commons.lang3.StringUtils.defaultIfBlank;
import java.io.IOException;
-import java.io.UncheckedIOException;
import java.nio.charset.Charset;
+import jakarta.xml.bind.util.JAXBSource;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;
import org.apache.commons.io.input.ReaderInputStream;
-import jakarta.xml.bind.util.JAXBSource;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
+
import net.sf.saxon.om.TreeInfo;
/**
@@ -102,7 +102,7 @@ public class SourceInput extends AbstractInput {
return isStreamSource();
}
- private boolean isConsumed() {
+ private boolean isConsumed() throws IOException {
if (isStreamSource()) {
final StreamSource ss = (StreamSource) this.source;
@@ -140,13 +140,7 @@ public class SourceInput extends AbstractInput {
if (ss.getInputStream() != null) {
result = new StreamSource(wrap(ss.getInputStream()), this.source.getSystemId());
} else if (ss.getReader() != null) {
- try {
- result = new StreamSource(
- wrap(ReaderInputStream.builder().setReader(ss.getReader()).setCharset(Charset.defaultCharset()).get()),
- this.source.getSystemId());
- } catch (final IOException ex) {
- throw new UncheckedIOException(ex);
- }
+ result = new StreamSource(wrap(new ReaderInputStream(ss.getReader(), Charset.defaultCharset())), this.source.getSystemId());
}
}
return result;
diff --git a/src/main/java/de/kosit/validationtool/impl/input/StreamHelper.java b/src/main/java/de/kosit/validationtool/impl/input/StreamHelper.java
index cefd0e3..0a49c22 100644
--- a/src/main/java/de/kosit/validationtool/impl/input/StreamHelper.java
+++ b/src/main/java/de/kosit/validationtool/impl/input/StreamHelper.java
@@ -20,14 +20,13 @@ import java.io.BufferedInputStream;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.io.UncheckedIOException;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.xml.transform.stream.StreamSource;
-import org.apache.commons.io.input.BoundedInputStream;
+import org.apache.commons.io.input.CountingInputStream;
import de.kosit.validationtool.api.Input;
@@ -40,7 +39,7 @@ public class StreamHelper {
/**
* Helper class, which generates the hashcode while reading the stream e.g. for parsing the document. This allows
- * generating the hashcode without an additional reading step.
+ * generating the hashcode without an aditional reading step.
*/
@SuppressWarnings("squid:S4929") // efficient read is done by internally used stream
private static class DigestingInputStream extends FilterInputStream {
@@ -97,15 +96,15 @@ public class StreamHelper {
private final LazyReadInput reference;
- public CountInputStream(final LazyReadInput input, final InputStream stream) throws IOException {
- super(BoundedInputStream.builder().setInputStream(stream).get());
+ public CountInputStream(final LazyReadInput input, final InputStream stream) {
+ super(new org.apache.commons.io.input.CountingInputStream(stream));
this.reference = input;
}
@Override
public void close() throws IOException {
super.close();
- this.reference.setLength(((BoundedInputStream) this.in).getCount());
+ this.reference.setLength(((CountingInputStream) this.in).getByteCount());
}
}
@@ -131,24 +130,19 @@ public class StreamHelper {
/**
* Wraps the {@link InputStream} with a counting length implementation.
*
- * @param input the lazy read input
+ * @param input the {@link LazyReadInput input}
* @param stream the stream
* @return a wrapped stream
*/
public static InputStream wrapCount(final LazyReadInput input, final InputStream stream) {
- try {
- return new CountInputStream(input, stream);
- } catch (final IOException ex) {
- throw new UncheckedIOException(ex);
- }
+ return new CountInputStream(input, stream);
}
/**
* Wraps the {@link InputStream} with an implementation the generates a hash sum over the stream data.
*
- * @param input the lazy read input
+ * @param input the {@link LazyReadInput input}
* @param stream the stream
- * @param digestAlgorithm the message digest algorithm to use
* @return a wrapped stream
*/
public static InputStream wrapDigesting(final LazyReadInput input, final InputStream stream, final String digestAlgorithm) {
@@ -181,7 +175,7 @@ public class StreamHelper {
* @param input the input
* @throws IOException on I/O errors
*/
- @SuppressWarnings({ "squid:S1854", "unused" })
+ @SuppressWarnings("squid:S1854")
public static void drain(final InputStream input) throws IOException {
final byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
diff --git a/src/main/java/de/kosit/validationtool/impl/model/CustomFailedAssert.java b/src/main/java/de/kosit/validationtool/impl/model/CustomFailedAssert.java
deleted file mode 100644
index e2163cb..0000000
--- a/src/main/java/de/kosit/validationtool/impl/model/CustomFailedAssert.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package de.kosit.validationtool.impl.model;
-
-import java.util.Objects;
-
-import org.oclc.purl.dsdl.svrl.FailedAssert;
-
-import de.kosit.validationtool.model.scenarios.ErrorLevelType;
-
-/**
- * This class contains a single Schematron failed assertion that has a custom error level.
- *
- * @since 1.6.0
- */
-public class CustomFailedAssert {
-
- private final FailedAssert originalFailedAssert;
-
- private final ErrorLevelType customLevelFlag;
-
- /**
- * Constructor
- *
- * @param failedAssert The failed assert from Schematron. May not be null.
- * @param customLevelFlag The custom error level. May not be null.
- */
- public CustomFailedAssert(final FailedAssert failedAssert, final ErrorLevelType customLevelFlag) {
- Objects.requireNonNull(failedAssert);
- Objects.requireNonNull(customLevelFlag);
- this.originalFailedAssert = failedAssert;
- this.customLevelFlag = customLevelFlag;
- }
-
- public FailedAssert getFailedAssert() {
- return this.originalFailedAssert;
- }
-
- public ErrorLevelType getCustomLevelFlag() {
- return this.customLevelFlag;
- }
-
-}
diff --git a/src/main/java/de/kosit/validationtool/impl/model/Result.java b/src/main/java/de/kosit/validationtool/impl/model/Result.java
index 893f586..5f94261 100644
--- a/src/main/java/de/kosit/validationtool/impl/model/Result.java
+++ b/src/main/java/de/kosit/validationtool/impl/model/Result.java
@@ -17,8 +17,8 @@
package de.kosit.validationtool.impl.model;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
-import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -37,14 +37,14 @@ public class Result {
private T object;
- private List errors = new ArrayList<>();
+ private Collection errors = new ArrayList<>();
/**
* Erzeugt ein neues Ergebnis mit Fehler
*
* @param errors die Fehler
*/
- public Result(final List errors) {
+ public Result(Collection errors) {
this(null, errors);
}
@@ -53,7 +53,7 @@ public class Result {
*
* @param o
*/
- public Result(final T o) {
+ public Result(T o) {
this(o, Collections.emptyList());
}
diff --git a/src/main/java/de/kosit/validationtool/impl/tasks/CheckAction.java b/src/main/java/de/kosit/validationtool/impl/tasks/CheckAction.java
index 22f03ca..5d0915f 100644
--- a/src/main/java/de/kosit/validationtool/impl/tasks/CheckAction.java
+++ b/src/main/java/de/kosit/validationtool/impl/tasks/CheckAction.java
@@ -21,6 +21,10 @@ import java.util.Collections;
import org.apache.commons.io.FilenameUtils;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.Setter;
+
import de.kosit.validationtool.api.AcceptRecommendation;
import de.kosit.validationtool.api.Input;
import de.kosit.validationtool.impl.Scenario;
@@ -28,9 +32,7 @@ import de.kosit.validationtool.impl.model.Result;
import de.kosit.validationtool.model.reportInput.CreateReportInput;
import de.kosit.validationtool.model.reportInput.ProcessingError;
import de.kosit.validationtool.model.reportInput.XMLSyntaxError;
-import lombok.AccessLevel;
-import lombok.Getter;
-import lombok.Setter;
+
import net.sf.saxon.s9api.XdmNode;
/**
@@ -53,9 +55,9 @@ public interface CheckAction {
private Result scenarioSelectionResult;
@Setter(AccessLevel.NONE)
- private final CreateReportInput reportInput;
+ private CreateReportInput reportInput;
- /** The final result */
+ /** Das finale Ergebnis */
private XdmNode report;
private boolean finished;
@@ -64,7 +66,7 @@ public interface CheckAction {
private AcceptRecommendation acceptStatus = AcceptRecommendation.UNDEFINED;
- /** The document to validate */
+ /** Das zu prüfende Dokument */
private Input input;
private Result parserResult;
@@ -83,9 +85,7 @@ public interface CheckAction {
}
/**
- * Indicates an early stop in processing.
- *
- * @param error Error text
+ * Signalisiert einen vorzeitigen Stop der Vearbeitung.
*/
public void stopProcessing(final String error) {
stopProcessing(Collections.singleton(error));
diff --git a/src/main/java/de/kosit/validationtool/impl/tasks/DocumentParseAction.java b/src/main/java/de/kosit/validationtool/impl/tasks/DocumentParseAction.java
index 57de17f..7eeb728 100644
--- a/src/main/java/de/kosit/validationtool/impl/tasks/DocumentParseAction.java
+++ b/src/main/java/de/kosit/validationtool/impl/tasks/DocumentParseAction.java
@@ -17,18 +17,19 @@
package de.kosit.validationtool.impl.tasks;
import java.io.IOException;
-import java.util.Arrays;
import java.util.Collections;
import java.util.stream.Collectors;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
import de.kosit.validationtool.api.Input;
import de.kosit.validationtool.impl.input.XdmNodeInput;
import de.kosit.validationtool.impl.model.Result;
import de.kosit.validationtool.model.reportInput.ValidationResultsWellformedness;
import de.kosit.validationtool.model.reportInput.XMLSyntaxError;
import de.kosit.validationtool.model.reportInput.XMLSyntaxErrorSeverity;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
+
import net.sf.saxon.s9api.DocumentBuilder;
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.SaxonApiException;
@@ -74,7 +75,7 @@ public class DocumentParseAction implements CheckAction {
final XMLSyntaxError error = new XMLSyntaxError();
error.setSeverityCode(XMLSyntaxErrorSeverity.SEVERITY_FATAL_ERROR);
error.setMessage(String.format("IOException while reading resource %s: %s", content.getName(), e.getMessage()));
- result = new Result<>(Arrays.asList(error));
+ result = new Result<>(Collections.singleton(error));
}
return result;
diff --git a/src/main/java/de/kosit/validationtool/impl/tasks/SchemaValidationAction.java b/src/main/java/de/kosit/validationtool/impl/tasks/SchemaValidationAction.java
index 2a0b175..b11eee3 100644
--- a/src/main/java/de/kosit/validationtool/impl/tasks/SchemaValidationAction.java
+++ b/src/main/java/de/kosit/validationtool/impl/tasks/SchemaValidationAction.java
@@ -31,6 +31,12 @@ import javax.xml.validation.Validator;
import org.apache.commons.io.FileUtils;
import org.xml.sax.SAXException;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+
import de.kosit.validationtool.api.Input;
import de.kosit.validationtool.impl.CollectingErrorEventHandler;
import de.kosit.validationtool.impl.Scenario;
@@ -39,11 +45,7 @@ import de.kosit.validationtool.impl.model.Result;
import de.kosit.validationtool.model.reportInput.CreateReportInput;
import de.kosit.validationtool.model.reportInput.ValidationResultsXmlSchema;
import de.kosit.validationtool.model.reportInput.XMLSyntaxError;
-import lombok.AccessLevel;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import lombok.Setter;
-import lombok.extern.slf4j.Slf4j;
+
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.SaxonApiException;
import net.sf.saxon.s9api.Serializer;
@@ -214,7 +216,7 @@ public class SchemaValidationAction implements CheckAction {
}
}
- private interface SerializedDocument extends SourceProvider {
+ private interface SerializedDocument extends AutoCloseable, SourceProvider {
void serialize(XdmNode node) throws SaxonApiException, IOException;
diff --git a/src/main/java/de/kosit/validationtool/impl/xml/ClassPathResourceResolver.java b/src/main/java/de/kosit/validationtool/impl/xml/ClassPathResourceResolver.java
index d961b2f..d1a2cdd 100644
--- a/src/main/java/de/kosit/validationtool/impl/xml/ClassPathResourceResolver.java
+++ b/src/main/java/de/kosit/validationtool/impl/xml/ClassPathResourceResolver.java
@@ -22,7 +22,7 @@ import java.io.Reader;
import java.net.URI;
import java.net.URL;
-import org.apache.commons.lang3.Strings;
+import org.apache.commons.lang3.StringUtils;
import org.w3c.dom.ls.LSInput;
import org.w3c.dom.ls.LSResourceResolver;
@@ -90,7 +90,7 @@ public class ClassPathResourceResolver implements LSResourceResolver {
* @param basePath der Basispfad
*/
public ClassPathResourceResolver(final String basePath) {
- if (!Strings.CS.startsWith(basePath, "/")) {
+ if (!StringUtils.startsWith(basePath, "/")) {
throw new IllegalArgumentException("Base path must start with a slash");
}
this.base = URI.create(basePath + (basePath.endsWith("/") == basePath.length() > 1 ? "" : "/"));
diff --git a/src/main/java/de/kosit/validationtool/impl/xml/RelativeUriResolver.java b/src/main/java/de/kosit/validationtool/impl/xml/RelativeUriResolver.java
index 132ed7e..b3b79e6 100644
--- a/src/main/java/de/kosit/validationtool/impl/xml/RelativeUriResolver.java
+++ b/src/main/java/de/kosit/validationtool/impl/xml/RelativeUriResolver.java
@@ -26,6 +26,7 @@ import javax.xml.transform.URIResolver;
import javax.xml.transform.stream.StreamSource;
import lombok.RequiredArgsConstructor;
+
import net.sf.saxon.Configuration;
import net.sf.saxon.lib.StandardUnparsedTextResolver;
import net.sf.saxon.lib.UnparsedTextURIResolver;
@@ -53,9 +54,10 @@ public class RelativeUriResolver implements URIResolver, UnparsedTextURIResolver
throw new TransformerException(String.format("Can not resolve required %s", href), e);
}
+ } else {
+ throw new TransformerException(String
+ .format("The resolved transformation artifact %s is not within the configured repository %s", resolved, this.baseUri));
}
- throw new TransformerException(String.format("The resolved transformation artifact %s is not within the configured repository %s",
- resolved, this.baseUri));
}
/**
@@ -94,9 +96,10 @@ public class RelativeUriResolver implements URIResolver, UnparsedTextURIResolver
public Reader resolve(final URI absoluteURI, final String encoding, final Configuration config) throws XPathException {
if (isUnderBaseUri(absoluteURI, this.baseUri)) {
return new StandardUnparsedTextResolver().resolve(absoluteURI, encoding, config);
+ } else {
+ throw new XPathException(String.format("The resolved transformation artifact %s is not within the configured repository %s",
+ absoluteURI, this.baseUri));
}
- throw new XPathException(String.format("The resolved transformation artifact %s is not within the configured repository %s",
- absoluteURI, this.baseUri));
}
}
\ No newline at end of file
diff --git a/src/test/java/de/kosit/validationtool/api/InputFactoryTest.java b/src/test/java/de/kosit/validationtool/api/InputFactoryTest.java
index 4a15843..9031741 100644
--- a/src/test/java/de/kosit/validationtool/api/InputFactoryTest.java
+++ b/src/test/java/de/kosit/validationtool/api/InputFactoryTest.java
@@ -25,13 +25,16 @@ import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Paths;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.ExpectedException;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
@@ -42,6 +45,7 @@ import de.kosit.validationtool.impl.TestObjectFactory;
import de.kosit.validationtool.impl.input.SourceInput;
import de.kosit.validationtool.impl.model.Result;
import de.kosit.validationtool.model.reportInput.XMLSyntaxError;
+
import net.sf.saxon.dom.NodeOverNodeInfo;
import net.sf.saxon.s9api.BuildingContentHandler;
import net.sf.saxon.s9api.DocumentBuilder;
@@ -57,6 +61,9 @@ public class InputFactoryTest {
public static final String SOME_VALUE = "some value";
+ @Rule
+ public ExpectedException expectedException = ExpectedException.none();
+
@Test
public void testDefaultDigestAlgorithm() {
assertThat(new InputFactory().getAlgorithm()).isEqualTo(InputFactory.DEFAULT_ALGORITH);
@@ -74,13 +81,15 @@ public class InputFactoryTest {
assertThat(s1).isNotEqualTo(s3);
}
- @Test(expected = IllegalArgumentException.class)
+ @Test
public void testWrongAlgorithm() {
+ this.expectedException.expect(IllegalArgumentException.class);
new InputFactory("unknown");
}
- @Test(expected = IllegalArgumentException.class)
+ @Test
public void testNullInputURL() {
+ this.expectedException.expect(IllegalArgumentException.class);
InputFactory.read((URL) null);
}
@@ -96,40 +105,44 @@ public class InputFactoryTest {
assertThat(input).isNotNull();
}
- @Test(expected = IllegalArgumentException.class)
+ @Test
public void testNullStream() {
- InputFactory.read((InputStream) null, SOME_VALUE);
+ this.expectedException.expect(IllegalArgumentException.class);
+ final Input input = InputFactory.read((InputStream) null, SOME_VALUE);
}
@Test
- public void testInputFile() {
+ public void testInputFile() throws URISyntaxException {
final Input input = InputFactory.read(new File(Simple.SIMPLE_VALID));
assertThat(input).isNotNull();
}
@Test
- public void testInputPath() {
+ public void testInputPath() throws URISyntaxException {
final Input input = InputFactory.read(Paths.get(Simple.SIMPLE_VALID));
assertThat(input).isNotNull();
}
- @Test(expected = IllegalArgumentException.class)
+ @Test
public void testNullInput() {
+ this.expectedException.expect(IllegalArgumentException.class);
InputFactory.read((byte[]) null, SOME_VALUE);
}
- @Test(expected = IllegalArgumentException.class)
+ @Test
public void testNullInputName() {
+ this.expectedException.expect(IllegalArgumentException.class);
InputFactory.read(SOME_VALUE.getBytes(), null);
}
- @Test(expected = IllegalArgumentException.class)
+ @Test
public void testEmptyInputName() throws IOException {
+ this.expectedException.expect(IllegalArgumentException.class);
final Input input = InputFactory.read(SOME_VALUE.getBytes(), "");
drain(input);
}
- @Test(expected = IllegalStateException.class)
+ @Test
public void testSourceInput() throws IOException {
try ( final InputStream s = Simple.SIMPLE_VALID.toURL().openStream() ) {
final SourceInput input = (SourceInput) InputFactory.read(new StreamSource(s));
@@ -137,11 +150,12 @@ public class InputFactoryTest {
drain(input);
assertThat(input.getHashCode()).isNotNull();
assertThat(input.getLength()).isGreaterThan(0L);
+ this.expectedException.expect(IllegalStateException.class);
input.getSource();
}
}
- @Test(expected = IllegalStateException.class)
+ @Test
public void testSourceInputReader() throws IOException {
try ( final InputStream s = Simple.SIMPLE_VALID.toURL().openStream();
final InputStreamReader reader = new InputStreamReader(s) ) {
@@ -150,12 +164,14 @@ public class InputFactoryTest {
drain(input);
assertThat(input.getHashCode()).isNotNull();
assertThat(input.getLength()).isGreaterThan(0L);
+ this.expectedException.expect(IllegalStateException.class);
input.getSource();
}
}
- @Test(expected = IllegalArgumentException.class)
+ @Test
public void testUnexistingInput() {
+ this.expectedException.expect(IllegalArgumentException.class);
InputFactory.read(Simple.NOT_EXISTING);
}
diff --git a/src/test/java/de/kosit/validationtool/cmd/CheckAssertionActionTest.java b/src/test/java/de/kosit/validationtool/cmd/CheckAssertionActionTest.java
index b8dda73..99d98c4 100644
--- a/src/test/java/de/kosit/validationtool/cmd/CheckAssertionActionTest.java
+++ b/src/test/java/de/kosit/validationtool/cmd/CheckAssertionActionTest.java
@@ -18,6 +18,7 @@ package de.kosit.validationtool.cmd;
import static org.assertj.core.api.Assertions.assertThat;
+import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
@@ -44,8 +45,11 @@ public class CheckAssertionActionTest {
private static final URL SAMPLE_ASSERTIONS = CheckAssertionActionTest.class.getResource("/examples/assertions/tests-xrechnung.xml");
+ private CommandLine commandLine;
+
@Before
- public void setup() {
+ public void setup() throws IOException {
+ this.commandLine = new CommandLine();
CommandLine.activate();
}
diff --git a/src/test/java/de/kosit/validationtool/cmd/CommandLine.java b/src/test/java/de/kosit/validationtool/cmd/CommandLine.java
index 37961a7..b4a3338 100644
--- a/src/test/java/de/kosit/validationtool/cmd/CommandLine.java
+++ b/src/test/java/de/kosit/validationtool/cmd/CommandLine.java
@@ -46,7 +46,6 @@ public class CommandLine {
*/
private static class ReplaceableOutputStream extends OutputStream {
- @SuppressWarnings("hiding")
@Getter
@Setter
private O out;
diff --git a/src/test/java/de/kosit/validationtool/cmd/CommandlineApplicationTest.java b/src/test/java/de/kosit/validationtool/cmd/CommandlineApplicationTest.java
index b9b2ed8..f8ce55d 100644
--- a/src/test/java/de/kosit/validationtool/cmd/CommandlineApplicationTest.java
+++ b/src/test/java/de/kosit/validationtool/cmd/CommandlineApplicationTest.java
@@ -26,7 +26,7 @@ import java.nio.file.Paths;
import java.util.List;
import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang3.Strings;
+import org.apache.commons.lang3.StringUtils;
import org.assertj.core.api.Condition;
import org.junit.After;
import org.junit.Before;
@@ -45,10 +45,13 @@ public class CommandlineApplicationTest {
public static final String RESULT_OUTPUT = "Processing 1 object(s) completed";
+ private CommandLine commandLine;
+
private final Path output = Paths.get("target/test-output");
@Before
public void setup() throws IOException {
+ this.commandLine = new CommandLine();
CommandLine.activate();
if (Files.exists(this.output)) {
FileUtils.deleteDirectory(this.output.toFile());
@@ -161,7 +164,7 @@ public class CommandlineApplicationTest {
final String[] args = { "-s", Paths.get(Simple.SCENARIOS).toString(), "-o", this.output.toString(), "-r",
Paths.get(Simple.REPOSITORY_URI).toString(), Paths.get(Simple.EXAMPLES).toString() };
CommandLineApplication.mainProgram(args);
- assertThat(CommandLine.getErrorOutput()).contains("Processing 9 object(s) completed");
+ assertThat(CommandLine.getErrorOutput()).contains("Processing 8 object(s) completed");
}
@Test
@@ -191,7 +194,7 @@ public class CommandlineApplicationTest {
CommandLineApplication.mainProgram(args);
assertThat(CommandLine.getErrorOutput()).contains(RESULT_OUTPUT);
assertThat(CommandLine.getOutputLines()).haveAtLeastOne(new Condition<>(
- s -> Strings.CS.contains(s, ""), "Must " + "contain xml preambel"));
+ s -> StringUtils.contains(s, ""), "Must " + "contain xml preambel"));
}
@Test
@@ -239,7 +242,7 @@ public class CommandlineApplicationTest {
}
@Test
- public void testAndre() {
+ public void testAndre() throws IOException {
final String[] args = { "-s", Paths.get(Simple.SCENARIOS).toString(), "-r", Paths.get(Simple.REPOSITORY_URI).toString(),
Paths.get(Simple.SIMPLE_VALID).toString(), "--report-prefix", "andre1" };
CommandLineApplication.mainProgram(args);
diff --git a/src/test/java/de/kosit/validationtool/cmd/PrintReportActionTest.java b/src/test/java/de/kosit/validationtool/cmd/PrintReportActionTest.java
index cd015db..63c2732 100644
--- a/src/test/java/de/kosit/validationtool/cmd/PrintReportActionTest.java
+++ b/src/test/java/de/kosit/validationtool/cmd/PrintReportActionTest.java
@@ -35,10 +35,13 @@ import de.kosit.validationtool.impl.tasks.CheckAction;
*/
public class PrintReportActionTest {
+ private CommandLine commandLine;
+
private PrintReportAction action;
@Before
public void setup() {
+ this.commandLine = new CommandLine();
CommandLine.activate();
this.action = new PrintReportAction(TestObjectFactory.createProcessor());
}
diff --git a/src/test/java/de/kosit/validationtool/config/ConfigurationBuilderTest.java b/src/test/java/de/kosit/validationtool/config/ConfigurationBuilderTest.java
index 26aa915..b9f9001 100644
--- a/src/test/java/de/kosit/validationtool/config/ConfigurationBuilderTest.java
+++ b/src/test/java/de/kosit/validationtool/config/ConfigurationBuilderTest.java
@@ -20,14 +20,15 @@ import static de.kosit.validationtool.config.ConfigurationBuilder.report;
import static de.kosit.validationtool.config.ConfigurationBuilder.schematron;
import static de.kosit.validationtool.config.TestConfigurationFactory.createSimpleConfiguration;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
import java.net.URI;
import java.time.LocalDate;
import java.util.Date;
+import org.hamcrest.Matchers;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.ExpectedException;
import de.kosit.validationtool.impl.Helper;
@@ -40,69 +41,58 @@ public class ConfigurationBuilderTest {
public static final LocalDate EPOCH = LocalDate.of(1970, 1, 1);
- @Test(expected = IllegalStateException.class)
+ @Rule
+ public ExpectedException exceptions = ExpectedException.none();
+
+ @Test
public void testNoConfiguration() {
+ this.exceptions.expect(IllegalStateException.class);
new ConfigurationBuilder().build(Helper.getTestProcessor());
}
@Test
public void testNoFallback() {
- try {
- final ConfigurationBuilder builder = createSimpleConfiguration();
- builder.with((FallbackBuilder) null);
- builder.build(Helper.getTestProcessor());
- fail();
- } catch (final IllegalStateException ex) {
- assertTrue(ex.getMessage().contains("fallback"));
- }
+ this.exceptions.expect(IllegalStateException.class);
+ this.exceptions.expectMessage(Matchers.containsString("fallback"));
+ final ConfigurationBuilder builder = createSimpleConfiguration();
+ builder.with((FallbackBuilder) null);
+ builder.build(Helper.getTestProcessor());
}
@Test
public void testNoSchema() {
- try {
- final ConfigurationBuilder builder = createSimpleConfiguration();
- builder.getScenarios().get(0).validate((SchemaBuilder) null);
- builder.build(Helper.getTestProcessor());
- fail();
- } catch (final IllegalStateException ex) {
- assertTrue(ex.getMessage().contains("schema"));
- }
+ this.exceptions.expect(IllegalStateException.class);
+ this.exceptions.expectMessage(Matchers.containsString("schema"));
+ final ConfigurationBuilder builder = createSimpleConfiguration();
+ builder.getScenarios().get(0).validate((SchemaBuilder) null);
+ builder.build(Helper.getTestProcessor());
}
@Test
public void testInvalidSchematron() {
- try {
- final ConfigurationBuilder builder = createSimpleConfiguration();
- builder.getScenarios().get(0).validate(schematron("invalid").source(URI.create("DoesNotExist")));
- builder.build(Helper.getTestProcessor());
- fail();
- } catch (final IllegalStateException ex) {
- assertTrue(ex.getMessage().contains("schematron"));
- }
+ this.exceptions.expect(IllegalStateException.class);
+ this.exceptions.expectMessage(Matchers.containsString("schematron"));
+ final ConfigurationBuilder builder = createSimpleConfiguration();
+ builder.getScenarios().get(0).validate(schematron("invalid").source(URI.create("DoesNotExist")));
+ builder.build(Helper.getTestProcessor());
}
@Test
public void testInsufficientSchematron() {
- try {
- final ConfigurationBuilder builder = createSimpleConfiguration();
- builder.getScenarios().get(0).validate(schematron("invalid"));
- builder.build(Helper.getTestProcessor());
- fail();
- } catch (final IllegalStateException ex) {
- assertTrue(ex.getMessage().contains("schematron"));
- }
+ this.exceptions.expect(IllegalStateException.class);
+ this.exceptions.expectMessage(Matchers.containsString("schematron"));
+ final ConfigurationBuilder builder = createSimpleConfiguration();
+ builder.getScenarios().get(0).validate(schematron("invalid"));
+ builder.build(Helper.getTestProcessor());
}
@Test
public void testNoReport() {
- try {
- final ConfigurationBuilder builder = createSimpleConfiguration();
- builder.getScenarios().get(0).with(report("invalid"));
- builder.build(Helper.getTestProcessor());
- fail();
- } catch (final IllegalStateException ex) {
- assertTrue(ex.getMessage().contains("report"));
- }
+ this.exceptions.expect(IllegalStateException.class);
+ this.exceptions.expectMessage(Matchers.containsString("report"));
+ final ConfigurationBuilder builder = createSimpleConfiguration();
+ builder.getScenarios().get(0).with(report("invalid"));
+ builder.build(Helper.getTestProcessor());
}
@Test
diff --git a/src/test/java/de/kosit/validationtool/config/ScenarioBuilderTest.java b/src/test/java/de/kosit/validationtool/config/ScenarioBuilderTest.java
index c1c635f..f9f5590 100644
--- a/src/test/java/de/kosit/validationtool/config/ScenarioBuilderTest.java
+++ b/src/test/java/de/kosit/validationtool/config/ScenarioBuilderTest.java
@@ -24,7 +24,9 @@ import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.RandomStringUtils;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.ExpectedException;
import de.kosit.validationtool.impl.ContentRepository;
import de.kosit.validationtool.impl.Helper.Simple;
@@ -41,6 +43,9 @@ import net.sf.saxon.s9api.XPathExecutable;
*/
public class ScenarioBuilderTest {
+ @Rule
+ public ExpectedException exceptions = ExpectedException.none();
+
@Test
public void simpleValid() {
final Result result = createScenario().build(Simple.createContentRepository());
@@ -156,7 +161,7 @@ public class ScenarioBuilderTest {
@Test
public void testBasicAttributes() {
final ContentRepository repository = Simple.createContentRepository();
- final String random = RandomStringUtils.secure().next(5);
+ final String random = RandomStringUtils.random(5);
final ScenarioBuilder builder = createScenario();
builder.name(random).description(random);
final Result result = builder.build(repository);
diff --git a/src/test/java/de/kosit/validationtool/config/XPathBuilderTest.java b/src/test/java/de/kosit/validationtool/config/XPathBuilderTest.java
index c8a1646..d55e7f7 100644
--- a/src/test/java/de/kosit/validationtool/config/XPathBuilderTest.java
+++ b/src/test/java/de/kosit/validationtool/config/XPathBuilderTest.java
@@ -28,6 +28,7 @@ import org.junit.Test;
import de.kosit.validationtool.impl.ContentRepository;
import de.kosit.validationtool.impl.Helper.Simple;
import de.kosit.validationtool.impl.model.Result;
+
import net.sf.saxon.s9api.XPathExecutable;
/**
@@ -39,7 +40,7 @@ public class XPathBuilderTest {
@Test
public void testSimpleString() {
- final String name = RandomStringUtils.secure().nextAlphanumeric(5);
+ final String name = RandomStringUtils.randomAlphanumeric(5);
final XPathBuilder b = new XPathBuilder(name);
b.setXpath("//*");
final Result result = b.build(Simple.createContentRepository());
@@ -53,7 +54,7 @@ public class XPathBuilderTest {
@Test
public void testStringWithNamespace() {
- final String name = RandomStringUtils.secure().nextAlphanumeric(5);
+ final String name = RandomStringUtils.randomAlphanumeric(5);
final XPathBuilder b = new XPathBuilder(name);
final Map ns = new HashMap<>();
ns.put("p", "http://somens");
@@ -68,7 +69,7 @@ public class XPathBuilderTest {
@Test
public void testStringWithUnknownNamespace() {
- final String name = RandomStringUtils.secure().nextAlphanumeric(5);
+ final String name = RandomStringUtils.randomAlphanumeric(5);
final XPathBuilder b = new XPathBuilder(name);
final Map ns = new HashMap<>();
ns.put("p", "http://somens");
@@ -81,7 +82,7 @@ public class XPathBuilderTest {
@Test
public void testExecutable() {
- final String name = RandomStringUtils.secure().nextAlphanumeric(5);
+ final String name = RandomStringUtils.randomAlphanumeric(5);
final ContentRepository repository = Simple.createContentRepository();
final XPathExecutable xpath = repository.createXPath("//*", Collections.emptyMap());
final XPathBuilder b = new XPathBuilder(name);
@@ -95,7 +96,7 @@ public class XPathBuilderTest {
@Test
public void testExecutableWithNamespace() {
- final String name = RandomStringUtils.secure().nextAlphanumeric(5);
+ final String name = RandomStringUtils.randomAlphanumeric(5);
final ContentRepository repository = Simple.createContentRepository();
final Map ns = new HashMap<>();
ns.put("p", "http://somens");
@@ -122,7 +123,7 @@ public class XPathBuilderTest {
@Test
public void testNoConfig() {
- final String name = RandomStringUtils.secure().nextAlphanumeric(5);
+ final String name = RandomStringUtils.randomAlphanumeric(5);
final XPathBuilder b = new XPathBuilder(name);
final Result result = b.build(Simple.createContentRepository());
assertThat(result).isNotNull();
diff --git a/src/test/java/de/kosit/validationtool/docs/MiscDocExampleCodes.java b/src/test/java/de/kosit/validationtool/docs/MiscDocExampleCodes.java
index 9e56ed1..ae8aa29 100644
--- a/src/test/java/de/kosit/validationtool/docs/MiscDocExampleCodes.java
+++ b/src/test/java/de/kosit/validationtool/docs/MiscDocExampleCodes.java
@@ -15,7 +15,6 @@ import net.sf.saxon.lib.UnparsedTextURIResolver;
public class MiscDocExampleCodes {
- @SuppressWarnings("unused")
void m1() {
final Configuration config = Configuration.load(URI.create("myscenarios.xml")).setResolvingMode(ResolvingMode.STRICT_LOCAL)
.build(ProcessorProvider.getProcessor());
@@ -44,7 +43,6 @@ public class MiscDocExampleCodes {
}
}
- @SuppressWarnings("unused")
void m2() {
final Configuration config = Configuration.load(URI.create("myscenarios.xml"))
.setResolvingStrategy(new MyCustomResolvingConfigurationStrategy()).build(ProcessorProvider.getProcessor());
diff --git a/src/test/java/de/kosit/validationtool/docs/MyValidator.java b/src/test/java/de/kosit/validationtool/docs/MyValidator.java
index 56536a6..7d4acd9 100644
--- a/src/test/java/de/kosit/validationtool/docs/MyValidator.java
+++ b/src/test/java/de/kosit/validationtool/docs/MyValidator.java
@@ -19,7 +19,6 @@ import de.kosit.validationtool.impl.xml.ProcessorProvider;
*/
public class MyValidator {
- @SuppressWarnings("unused")
public static void main(final String[] args) {
final Configuration config = Configuration.create().name("myconfiguration")
.with(scenario("firstScenario").match("//myNode").validate(schema("Sample Schema").schemaLocation(URI.create("simple.xsd")))
diff --git a/src/test/java/de/kosit/validationtool/docs/StandardExample.java b/src/test/java/de/kosit/validationtool/docs/StandardExample.java
index e2408d2..71025fe 100644
--- a/src/test/java/de/kosit/validationtool/docs/StandardExample.java
+++ b/src/test/java/de/kosit/validationtool/docs/StandardExample.java
@@ -20,7 +20,6 @@ import de.kosit.validationtool.impl.xml.ProcessorProvider;
*/
public class StandardExample {
- @SuppressWarnings("unused")
public void run(final Path testDocument) throws URISyntaxException {
// Load scenarios.xml from classpath
final URL scenarios = this.getClass().getClassLoader().getResource("examples/simple/scenarios-with-relative-paths.xml");
diff --git a/src/test/java/de/kosit/validationtool/impl/ContentRepositoryTest.java b/src/test/java/de/kosit/validationtool/impl/ContentRepositoryTest.java
index c63f2f5..4fe3422 100644
--- a/src/test/java/de/kosit/validationtool/impl/ContentRepositoryTest.java
+++ b/src/test/java/de/kosit/validationtool/impl/ContentRepositoryTest.java
@@ -28,9 +28,12 @@ import java.util.Map;
import javax.xml.validation.Schema;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.ExpectedException;
import de.kosit.validationtool.impl.Helper.Simple;
+
import net.sf.saxon.s9api.XPathExecutable;
import net.sf.saxon.s9api.XsltExecutable;
@@ -43,6 +46,9 @@ public class ContentRepositoryTest {
private ContentRepository repository;
+ @Rule
+ public ExpectedException exception = ExpectedException.none();
+
@Before
public void setup() {
this.repository = Simple.createContentRepository();
@@ -54,8 +60,9 @@ public class ContentRepositoryTest {
assertThat(schema).isNotNull();
}
- @Test(expected = IllegalStateException.class)
+ @Test
public void testCreateSchemaNotExisting() throws Exception {
+ this.exception.expect(IllegalStateException.class);
this.repository.createSchema(Simple.NOT_EXISTING.toURL());
}
@@ -65,8 +72,9 @@ public class ContentRepositoryTest {
assertThat(executable).isNotNull();
}
- @Test(expected = IllegalStateException.class)
+ @Test
public void testLoadXSLTNotExisting() {
+ this.exception.expect(IllegalStateException.class);
this.repository.loadXsltScript(Simple.NOT_EXISTING);
}
@@ -82,13 +90,15 @@ public class ContentRepositoryTest {
assertThat(xPath).isNotNull();
}
- @Test(expected = IllegalStateException.class)
+ @Test
public void testXpathCreationWithoutNamespace() {
+ this.exception.expect(IllegalStateException.class);
this.repository.createXPath("//html:html", null);
}
- @Test(expected = IllegalStateException.class)
+ @Test
public void testIllegalXpath() {
+ this.exception.expect(IllegalStateException.class);
this.repository.createXPath("kein Xpath Ausdruck", null);
}
diff --git a/src/test/java/de/kosit/validationtool/impl/ConversionServiceTest.java b/src/test/java/de/kosit/validationtool/impl/ConversionServiceTest.java
index 97ad5de..6c74b18 100644
--- a/src/test/java/de/kosit/validationtool/impl/ConversionServiceTest.java
+++ b/src/test/java/de/kosit/validationtool/impl/ConversionServiceTest.java
@@ -16,13 +16,16 @@
package de.kosit.validationtool.impl;
-import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Java6Assertions.assertThat;
import java.io.Serializable;
+import java.net.URISyntaxException;
import java.net.URL;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.ExpectedException;
import de.kosit.validationtool.impl.Helper.Invalid;
import de.kosit.validationtool.impl.Helper.Simple;
@@ -37,6 +40,9 @@ public class ConversionServiceTest {
private static final URL SCHEMA = ConversionServiceTest.class.getResource("/xsd/scenarios.xsd");
+ @Rule
+ public ExpectedException exception = ExpectedException.none();
+
private ConversionService service;
private ContentRepository repository;
@@ -47,13 +53,15 @@ public class ConversionServiceTest {
this.repository = Simple.createContentRepository();
}
- @Test(expected = ConversionService.ConversionExeption.class)
+ @Test
public void testMarshalNull() {
+ this.exception.expect(ConversionService.ConversionExeption.class);
this.service.writeXml(null);
}
- @Test(expected = ConversionService.ConversionExeption.class)
+ @Test
public void testMarshalUnknown() {
+ this.exception.expect(ConversionService.ConversionExeption.class);
this.service.writeXml(new Serializable() {
});
}
@@ -72,28 +80,33 @@ public class ConversionServiceTest {
assertThat(s.getName()).isEqualToIgnoringCase("HTML-TestSuite");
}
- @Test(expected = ConversionService.ConversionExeption.class)
+ @Test
public void testUnmarshalInvalidXml() {
+ this.exception.expect(ConversionService.ConversionExeption.class);
this.service.readXml(Invalid.SCENARIOS, Scenarios.class, this.repository.createSchema(SCHEMA));
}
- @Test(expected = ConversionService.ConversionExeption.class)
+ @Test
public void testUnmarshalIllFormed() {
+ this.exception.expect(ConversionService.ConversionExeption.class);
this.service.readXml(Invalid.SCENARIOS_ILLFORMED, Scenarios.class, this.repository.createSchema(SCHEMA));
}
- @Test(expected = ConversionService.ConversionExeption.class)
+ @Test
public void testUnmarshalEmpty() {
+ this.exception.expect(ConversionService.ConversionExeption.class);
this.service.readXml(null, Scenarios.class);
}
- @Test(expected = ConversionService.ConversionExeption.class)
- public void testUnmarshalUnknownType() {
+ @Test
+ public void testUnmarshalUnknownType() throws URISyntaxException {
+ this.exception.expect(ConversionService.ConversionExeption.class);
this.service.readXml(Simple.SCENARIOS, ConversionService.class);
}
- @Test(expected = ConversionService.ConversionExeption.class)
- public void testUnmarshalWithoutType() {
+ @Test
+ public void testUnmarshalWithoutType() throws URISyntaxException {
+ this.exception.expect(ConversionService.ConversionExeption.class);
this.service.readXml(Simple.SCENARIOS, null);
}
diff --git a/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java b/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java
index d26b295..5144652 100644
--- a/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java
+++ b/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java
@@ -17,7 +17,6 @@
package de.kosit.validationtool.impl;
import static de.kosit.validationtool.api.InputFactory.read;
-import static de.kosit.validationtool.impl.Helper.Simple.FOO_CUSTOM_LEVEL_ERROR;
import static de.kosit.validationtool.impl.Helper.Simple.FOO_SCHEMATRON_INVALID;
import static de.kosit.validationtool.impl.Helper.Simple.GARBAGE;
import static de.kosit.validationtool.impl.Helper.Simple.NOT_WELLFORMED;
@@ -45,8 +44,7 @@ import de.kosit.validationtool.api.Input;
import de.kosit.validationtool.api.InputFactory;
import de.kosit.validationtool.api.Result;
import de.kosit.validationtool.impl.Helper.Simple;
-import de.kosit.validationtool.impl.model.CustomFailedAssert;
-import de.kosit.validationtool.model.scenarios.ErrorLevelType;
+
import net.sf.saxon.s9api.XdmNode;
/**
@@ -241,8 +239,6 @@ public class DefaultCheckTest {
assertThat(result.isAcceptable()).isFalse();
assertThat(result.getReport()).isNotNull();
assertThat(result.getProcessingErrors()).hasSize(1);
- assertThat(result.getCustomFailedAsserts()).isNotNull();
- assertThat(result.getCustomFailedAsserts()).hasSize(0);
}
@Test
@@ -258,19 +254,4 @@ public class DefaultCheckTest {
result = this.validCheck.checkInput(domInput);
assertThat(result.isProcessingSuccessful()).isEqualTo(true);
}
-
- @Test
- public void testCustomFailedAssertsWarning() {
- final Result result = this.errorCheck.checkInput(read(FOO_CUSTOM_LEVEL_ERROR));
- assertThat(result.isSchematronValid()).isFalse();
- assertThat(result.getFailedAsserts()).isNotEmpty();
- assertThat(result.getAcceptRecommendation()).isEqualTo(AcceptRecommendation.ACCEPTABLE);
-
- assertThat(result.getCustomFailedAsserts()).isNotNull();
- assertThat(result.getCustomFailedAsserts()).hasSize(1);
- CustomFailedAssert customFailedAssert = result.getCustomFailedAsserts().get(0);
- assertThat(result.getFailedAsserts().get(0).getId()).isEqualTo(customFailedAssert.getFailedAssert().getId());
- assertThat(customFailedAssert.getCustomLevelFlag()).isEqualTo(ErrorLevelType.WARNING);
- }
-
}
diff --git a/src/test/java/de/kosit/validationtool/impl/Helper.java b/src/test/java/de/kosit/validationtool/impl/Helper.java
index 00da5a3..f60c8a1 100644
--- a/src/test/java/de/kosit/validationtool/impl/Helper.java
+++ b/src/test/java/de/kosit/validationtool/impl/Helper.java
@@ -57,8 +57,6 @@ public class Helper {
public static final URI FOO_SCHEMATRON_INVALID = EXAMPLES.resolve("foo-schematron-invalid.xml");
- public static final URI FOO_CUSTOM_LEVEL_ERROR = EXAMPLES.resolve("foo-custom-level-error.xml");
-
public static final URI REJECTED = ROOT.resolve("input/withManualReject.xml");
public static final URI SCENARIOS = ROOT.resolve("scenarios.xml");
diff --git a/src/test/java/de/kosit/validationtool/impl/RelativeUriResolverTest.java b/src/test/java/de/kosit/validationtool/impl/RelativeUriResolverTest.java
index 4a5f937..5ce1030 100644
--- a/src/test/java/de/kosit/validationtool/impl/RelativeUriResolverTest.java
+++ b/src/test/java/de/kosit/validationtool/impl/RelativeUriResolverTest.java
@@ -26,7 +26,9 @@ import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.URIResolver;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.ExpectedException;
import de.kosit.validationtool.impl.xml.RelativeUriResolver;
@@ -47,6 +49,9 @@ public class RelativeUriResolverTest {
}
}
+ @Rule
+ public ExpectedException exception = ExpectedException.none();
+
private URIResolver resolver = new RelativeUriResolver(BASE);
@Test
@@ -55,13 +60,15 @@ public class RelativeUriResolverTest {
assertThat(resource).isNotNull();
}
- @Test(expected = TransformerException.class)
+ @Test
public void testNotExisting() throws TransformerException {
+ this.exception.expect(TransformerException.class);
this.resolver.resolve("ubl-0001", BASE.toASCIIString());
}
- @Test(expected = TransformerException.class)
+ @Test
public void testOutOfPath() throws TransformerException {
+ this.exception.expect(TransformerException.class);
this.resolver.resolve("../results/report.xml", BASE.toASCIIString());
}
diff --git a/src/test/java/de/kosit/validationtool/impl/ScenarioRepositoryTest.java b/src/test/java/de/kosit/validationtool/impl/ScenarioRepositoryTest.java
index 2c39f9c..9bdc1fc 100644
--- a/src/test/java/de/kosit/validationtool/impl/ScenarioRepositoryTest.java
+++ b/src/test/java/de/kosit/validationtool/impl/ScenarioRepositoryTest.java
@@ -25,12 +25,15 @@ import java.util.ArrayList;
import java.util.HashMap;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.ExpectedException;
import de.kosit.validationtool.config.TestConfiguration;
import de.kosit.validationtool.impl.Helper.Simple;
import de.kosit.validationtool.impl.model.Result;
import de.kosit.validationtool.model.scenarios.ScenarioType;
+
import net.sf.saxon.s9api.XPathExecutable;
import net.sf.saxon.s9api.XdmNode;
@@ -42,6 +45,9 @@ import net.sf.saxon.s9api.XdmNode;
public class ScenarioRepositoryTest {
+ @Rule
+ public ExpectedException expectedException = ExpectedException.none();
+
private ScenarioRepository repository;
private TestConfiguration configInstance;
@@ -101,8 +107,9 @@ public class ScenarioRepositoryTest {
assertThat(scenario.getObject().getName()).isEqualTo("fallback");
}
- @Test(expected = IllegalArgumentException.class)
+ @Test
public void testNoConfiguration() {
+ this.expectedException.expect(IllegalArgumentException.class);
this.repository = new ScenarioRepository();
}
diff --git a/src/test/java/de/kosit/validationtool/impl/VersioningTest.java b/src/test/java/de/kosit/validationtool/impl/VersioningTest.java
index da310ba..4c40c4e 100644
--- a/src/test/java/de/kosit/validationtool/impl/VersioningTest.java
+++ b/src/test/java/de/kosit/validationtool/impl/VersioningTest.java
@@ -22,8 +22,11 @@ import java.net.URISyntaxException;
import java.net.URL;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import de.kosit.validationtool.impl.Helper.Simple;
import de.kosit.validationtool.model.scenarios.Scenarios;
/**
@@ -41,10 +44,16 @@ public class VersioningTest {
private static final URL NEW_VERSION = VersioningTest.class.getResource("/examples/versioning/scenarios-newversion.xml");
+ @Rule
+ public ExpectedException exception = ExpectedException.none();
+
private ConversionService service;
+ private ContentRepository repository;
+
@Before
public void setup() {
+ this.repository = Simple.createContentRepository();
this.service = new ConversionService();
}
@@ -60,13 +69,15 @@ public class VersioningTest {
assertThat(result).isNotNull();
}
- @Test(expected = ConversionService.ConversionExeption.class)
+ @Test
public void testNewFeature() throws URISyntaxException {
+ this.exception.expect(ConversionService.ConversionExeption.class);
this.service.readXml(NEW_FEATURE.toURI(), Scenarios.class, SchemaProvider.getScenarioSchema());
}
- @Test(expected = ConversionService.ConversionExeption.class)
+ @Test
public void testNewVersion() throws URISyntaxException {
+ this.exception.expect(ConversionService.ConversionExeption.class);
this.service.readXml(NEW_VERSION.toURI(), Scenarios.class, SchemaProvider.getScenarioSchema());
}
}
diff --git a/src/test/java/de/kosit/validationtool/impl/tasks/DocumentParseActionTest.java b/src/test/java/de/kosit/validationtool/impl/tasks/DocumentParseActionTest.java
index ae53d5b..d0b721f 100644
--- a/src/test/java/de/kosit/validationtool/impl/tasks/DocumentParseActionTest.java
+++ b/src/test/java/de/kosit/validationtool/impl/tasks/DocumentParseActionTest.java
@@ -20,12 +20,15 @@ import static de.kosit.validationtool.api.InputFactory.read;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.ExpectedException;
import de.kosit.validationtool.impl.Helper;
import de.kosit.validationtool.impl.Helper.Simple;
import de.kosit.validationtool.impl.model.Result;
import de.kosit.validationtool.model.reportInput.XMLSyntaxError;
+
import net.sf.saxon.s9api.XdmNode;
/**
@@ -35,6 +38,9 @@ import net.sf.saxon.s9api.XdmNode;
*/
public class DocumentParseActionTest {
+ @Rule
+ public ExpectedException exception = ExpectedException.none();
+
private DocumentParseAction action;
@Before
@@ -60,8 +66,9 @@ public class DocumentParseActionTest {
assertThat(result.isValid()).isFalse();
}
- @Test(expected = IllegalArgumentException.class)
+ @Test
public void testNullInput() {
+ this.exception.expect(IllegalArgumentException.class);
this.action.parseDocument(null);
}
diff --git a/src/test/java/de/kosit/validationtool/impl/tasks/SchemaValidatorActionTest.java b/src/test/java/de/kosit/validationtool/impl/tasks/SchemaValidatorActionTest.java
index 0732541..d02d4d4 100644
--- a/src/test/java/de/kosit/validationtool/impl/tasks/SchemaValidatorActionTest.java
+++ b/src/test/java/de/kosit/validationtool/impl/tasks/SchemaValidatorActionTest.java
@@ -35,6 +35,7 @@ import javax.xml.validation.Validator;
import org.junit.Before;
import org.junit.Test;
+import org.junit.rules.ExpectedException;
import org.xml.sax.SAXException;
import de.kosit.validationtool.api.Input;
@@ -55,6 +56,8 @@ import de.kosit.validationtool.impl.tasks.CheckAction.Bag;
*/
public class SchemaValidatorActionTest {
+ public ExpectedException expectedException = ExpectedException.none();
+
private SchemaValidationAction service;
@Before
diff --git a/src/test/java/de/kosit/validationtool/impl/xml/BaseResolverConfigurationTest.java b/src/test/java/de/kosit/validationtool/impl/xml/BaseResolverConfigurationTest.java
index fbae6f1..631ff81 100644
--- a/src/test/java/de/kosit/validationtool/impl/xml/BaseResolverConfigurationTest.java
+++ b/src/test/java/de/kosit/validationtool/impl/xml/BaseResolverConfigurationTest.java
@@ -25,7 +25,9 @@ import static org.mockito.Mockito.verify;
import javax.xml.XMLConstants;
import javax.xml.validation.SchemaFactory;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.ExpectedException;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;
@@ -49,6 +51,9 @@ public class BaseResolverConfigurationTest {
public static final String NOT_EXISTING_SCHEME = "not-existing-scheme";
+ @Rule
+ public ExpectedException expectedException = ExpectedException.none();
+
@Test
public void testIgnoreUnsupportedProperty() throws SAXNotRecognizedException, SAXNotSupportedException {
final SchemaFactory sf = mock(SchemaFactory.class);
@@ -57,8 +62,9 @@ public class BaseResolverConfigurationTest {
s.setInternalProperty(sf, true);
}
- @Test(expected = IllegalStateException.class)
+ @Test
public void testFailOnUnsupportedProperty() throws SAXNotRecognizedException, SAXNotSupportedException {
+ this.expectedException.expect(IllegalStateException.class);
final SchemaFactory sf = mock(SchemaFactory.class);
final TestResolvingStrategy s = new TestResolvingStrategy();
doThrow(new SAXNotRecognizedException("not supported")).when(sf).setProperty(any(), any());
diff --git a/src/test/java/de/kosit/validationtool/impl/xml/RemoteResolvingStrategyTest.java b/src/test/java/de/kosit/validationtool/impl/xml/RemoteResolvingStrategyTest.java
index a80a15b..431bc3a 100644
--- a/src/test/java/de/kosit/validationtool/impl/xml/RemoteResolvingStrategyTest.java
+++ b/src/test/java/de/kosit/validationtool/impl/xml/RemoteResolvingStrategyTest.java
@@ -21,7 +21,9 @@ import static org.assertj.core.api.Assertions.assertThat;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.ExpectedException;
import de.kosit.validationtool.api.ResolvingConfigurationStrategy;
import de.kosit.validationtool.impl.Helper.Resolving;
@@ -33,6 +35,9 @@ import de.kosit.validationtool.impl.Helper.Resolving;
*/
public class RemoteResolvingStrategyTest {
+ @Rule
+ public ExpectedException expectedException = ExpectedException.none();
+
@Test
public void testRemoteSchemaResolving() throws Exception {
final ResolvingConfigurationStrategy s = new RemoteResolvingStrategy();
diff --git a/src/test/java/de/kosit/validationtool/impl/xml/SchemaProviderTest.java b/src/test/java/de/kosit/validationtool/impl/xml/SchemaProviderTest.java
index 8d9e442..6e50378 100644
--- a/src/test/java/de/kosit/validationtool/impl/xml/SchemaProviderTest.java
+++ b/src/test/java/de/kosit/validationtool/impl/xml/SchemaProviderTest.java
@@ -16,12 +16,8 @@
package de.kosit.validationtool.impl.xml;
-import static org.junit.Assert.assertNotNull;
-
import javax.xml.validation.SchemaFactory;
-import org.junit.Test;
-
import de.kosit.validationtool.impl.ResolvingMode;
/**
@@ -29,10 +25,6 @@ import de.kosit.validationtool.impl.ResolvingMode;
*/
public class SchemaProviderTest {
- @Test
- public void testBasic() {
- final SchemaFactory schemaFactory = ResolvingMode.STRICT_RELATIVE.getStrategy().createSchemaFactory();
- assertNotNull(schemaFactory);
- }
+ private final SchemaFactory schemaFactory = ResolvingMode.STRICT_RELATIVE.getStrategy().createSchemaFactory();
}
diff --git a/src/test/java/de/kosit/validationtool/impl/xml/StrictLocalResolvingTest.java b/src/test/java/de/kosit/validationtool/impl/xml/StrictLocalResolvingTest.java
index 8929d2c..4c95953 100644
--- a/src/test/java/de/kosit/validationtool/impl/xml/StrictLocalResolvingTest.java
+++ b/src/test/java/de/kosit/validationtool/impl/xml/StrictLocalResolvingTest.java
@@ -17,13 +17,14 @@
package de.kosit.validationtool.impl.xml;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.fail;
-import static org.junit.Assert.assertTrue;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
+import org.hamcrest.Matchers;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.ExpectedException;
import org.xml.sax.SAXParseException;
import de.kosit.validationtool.api.ResolvingConfigurationStrategy;
@@ -36,16 +37,16 @@ import de.kosit.validationtool.impl.Helper.Resolving;
*/
public class StrictLocalResolvingTest {
+ @Rule
+ public ExpectedException expectedException = ExpectedException.none();
+
@Test
public void testRemoteSchemaResolving() throws Exception {
- try {
- final ResolvingConfigurationStrategy s = new StrictLocalResolvingStrategy();
- final SchemaFactory schemaFactory = s.createSchemaFactory();
- schemaFactory.newSchema(Resolving.SCHEMA_WITH_REMOTE_REFERENCE.toURL());
- fail();
- } catch (SAXParseException ex) {
- assertTrue(ex.getMessage().contains("schema_reference"));
- }
+ this.expectedException.expect(SAXParseException.class);
+ this.expectedException.expectMessage(Matchers.containsString("schema_reference"));
+ final ResolvingConfigurationStrategy s = new StrictLocalResolvingStrategy();
+ final SchemaFactory schemaFactory = s.createSchemaFactory();
+ schemaFactory.newSchema(Resolving.SCHEMA_WITH_REMOTE_REFERENCE.toURL());
}
@Test
diff --git a/src/test/java/de/kosit/validationtool/impl/xml/StrictRelativeResolvingTest.java b/src/test/java/de/kosit/validationtool/impl/xml/StrictRelativeResolvingTest.java
index 3b80d3d..32d5017 100644
--- a/src/test/java/de/kosit/validationtool/impl/xml/StrictRelativeResolvingTest.java
+++ b/src/test/java/de/kosit/validationtool/impl/xml/StrictRelativeResolvingTest.java
@@ -17,13 +17,14 @@
package de.kosit.validationtool.impl.xml;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.fail;
-import static org.junit.Assert.assertTrue;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
+import org.hamcrest.Matchers;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.ExpectedException;
import org.xml.sax.SAXParseException;
import de.kosit.validationtool.api.ResolvingConfigurationStrategy;
@@ -36,16 +37,16 @@ import de.kosit.validationtool.impl.Helper.Resolving;
*/
public class StrictRelativeResolvingTest {
+ @Rule
+ public ExpectedException expectedException = ExpectedException.none();
+
@Test
public void testRemoteSchemaResolving() throws Exception {
- try {
- final ResolvingConfigurationStrategy s = new StrictLocalResolvingStrategy();
- final SchemaFactory schemaFactory = s.createSchemaFactory();
- schemaFactory.newSchema(Resolving.SCHEMA_WITH_REMOTE_REFERENCE.toURL());
- fail();
- } catch (SAXParseException ex) {
- assertTrue(ex.getMessage().contains("schema_reference"));
- }
+ this.expectedException.expect(SAXParseException.class);
+ this.expectedException.expectMessage(Matchers.containsString("schema_reference"));
+ final ResolvingConfigurationStrategy s = new StrictLocalResolvingStrategy();
+ final SchemaFactory schemaFactory = s.createSchemaFactory();
+ schemaFactory.newSchema(Resolving.SCHEMA_WITH_REMOTE_REFERENCE.toURL());
}
@Test
diff --git a/src/test/resources/examples/simple/input/foo-custom-level-error.xml b/src/test/resources/examples/simple/input/foo-custom-level-error.xml
deleted file mode 100644
index c802e08..0000000
--- a/src/test/resources/examples/simple/input/foo-custom-level-error.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
- asldkfj
- asldkfj
-
-
-
\ No newline at end of file
diff --git a/src/test/resources/examples/simple/scenarios-with-errors.xml b/src/test/resources/examples/simple/scenarios-with-errors.xml
index a726508..2a4896f 100644
--- a/src/test/resources/examples/simple/scenarios-with-errors.xml
+++ b/src/test/resources/examples/simple/scenarios-with-errors.xml
@@ -52,38 +52,6 @@
-
- Simple
-
- Foo schematron error
-
- http://www.xoev.de/de/validator/framework/1/createreportinput
- http://validator.kosit.de/test-sample
- http://validator.kosit.de/test-report
- /test:foo
-
-
-
- Sample Schema
- simple.xsd
-
-
-
-
- Sample Schematron
- simple-schematron-error.xsl
-
-
-
-
- Report für eRechnung
- report.xsl
-
- content-2
-
- count(//test:rejected) = 0
-
-
default