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