mirror of
https://github.com/itplr-kosit/validator.git
synced 2026-05-25 16:55:39 +00:00
#20 Initiales Parsen schon mit s9api umgesetzt. Kein w3c Document benutzt
This commit is contained in:
parent
802e716e90
commit
e82365c9e5
8 changed files with 62 additions and 64 deletions
2
pom.xml
2
pom.xml
|
|
@ -51,7 +51,7 @@
|
|||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<version.jacoco>0.7.9</version.jacoco>
|
||||
<version.lombok>1.16.16</version.lombok>
|
||||
<version.saxon-he>9.7.0-15</version.saxon-he>
|
||||
<version.saxon-he>9.9.0-1</version.saxon-he>
|
||||
<version.slf4j>1.7.25</version.slf4j>
|
||||
</properties>
|
||||
|
||||
|
|
|
|||
|
|
@ -19,16 +19,13 @@
|
|||
|
||||
package de.kosit.validationtool.impl;
|
||||
|
||||
import static org.apache.commons.lang3.StringUtils.startsWith;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URI;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.xml.transform.dom.DOMSource;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
|
@ -42,7 +39,12 @@ import de.kosit.validationtool.model.reportInput.XMLSyntaxError;
|
|||
import de.kosit.validationtool.model.scenarios.ScenarioType;
|
||||
import de.kosit.validationtool.model.scenarios.Scenarios;
|
||||
|
||||
import net.sf.saxon.s9api.*;
|
||||
import net.sf.saxon.s9api.Processor;
|
||||
import net.sf.saxon.s9api.QName;
|
||||
import net.sf.saxon.s9api.SaxonApiException;
|
||||
import net.sf.saxon.s9api.XPathSelector;
|
||||
import net.sf.saxon.s9api.XdmNode;
|
||||
import net.sf.saxon.s9api.XsltExecutable;
|
||||
|
||||
/**
|
||||
* Repository for die aktiven Szenario einer Prüfinstanz.
|
||||
|
|
@ -69,16 +71,17 @@ public class ScenarioRepository {
|
|||
@Getter(value = AccessLevel.PACKAGE)
|
||||
private Scenarios scenarios;
|
||||
|
||||
private static boolean isSupportedDocument(Document doc) {
|
||||
final Element root = doc.getDocumentElement();
|
||||
return root.hasAttribute("frameworkVersion") && root.getAttribute("frameworkVersion").startsWith(SUPPORTED_MAJOR_VERSION)
|
||||
&& doc.getDocumentElement().getNamespaceURI().equals(SUPPORTED_MAJOR_VERSION_SCHEMA);
|
||||
private static boolean isSupportedDocument(XdmNode doc) {
|
||||
final XdmNode root = doc.children().iterator().next();
|
||||
final String frameworkVersion = root.getAttributeValue(new QName("frameworkVersion"));
|
||||
return startsWith(frameworkVersion, SUPPORTED_MAJOR_VERSION)
|
||||
&& root.getNodeName().getNamespaceURI().equals(SUPPORTED_MAJOR_VERSION_SCHEMA);
|
||||
}
|
||||
|
||||
private static void checkVersion(URI scenarioDefinition) {
|
||||
DocumentParseAction p = new DocumentParseAction();
|
||||
try {
|
||||
final Result<Document, XMLSyntaxError> result = p.parseDocument(InputFactory.read(scenarioDefinition.toURL()));
|
||||
final Result<XdmNode, XMLSyntaxError> result = p.parseDocument(InputFactory.read(scenarioDefinition.toURL()));
|
||||
if (result.isValid() && !isSupportedDocument(result.getObject())) {
|
||||
throw new IllegalStateException(String.format(
|
||||
"Specified scenario configuration %s is not supported.%nThis version only supports definitions of '%s'",
|
||||
|
|
@ -138,7 +141,7 @@ public class ScenarioRepository {
|
|||
* @param document das Eingabedokument
|
||||
* @return ein Ergebnis-Objekt zur weiteren Verarbeitung
|
||||
*/
|
||||
public Result<ScenarioType, String> selectScenario(Document document) {
|
||||
public Result<ScenarioType, String> selectScenario(XdmNode document) {
|
||||
Result<ScenarioType, String> result = new Result<>();
|
||||
final List<ScenarioType> collect = scenarios.getScenario().stream().filter(s -> match(document, s)).collect(Collectors.toList());
|
||||
if (collect.size() == 1) {
|
||||
|
|
@ -152,13 +155,10 @@ public class ScenarioRepository {
|
|||
|
||||
}
|
||||
|
||||
private boolean match(Document document, ScenarioType scenario) {
|
||||
private boolean match(XdmNode document, ScenarioType scenario) {
|
||||
try {
|
||||
final XPathSelector selector = scenario.getSelector();
|
||||
DocumentBuilder documentBuilder = getProcessor().newDocumentBuilder();
|
||||
|
||||
final XdmNode xdmSource = documentBuilder.build(new DOMSource(document));
|
||||
selector.setContextItem(xdmSource);
|
||||
selector.setContextItem(document);
|
||||
return selector.effectiveBooleanValue();
|
||||
} catch (SaxonApiException e) {
|
||||
log.error("Error evaluating xpath expression", e);
|
||||
|
|
|
|||
|
|
@ -22,8 +22,6 @@ package de.kosit.validationtool.impl.tasks;
|
|||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
|
|
@ -85,7 +83,7 @@ public interface CheckAction {
|
|||
/** Das zu prüfende Dokument */
|
||||
private Input input;
|
||||
|
||||
private Result<Document, XMLSyntaxError> parserResult;
|
||||
private Result<XdmNode, XMLSyntaxError> parserResult;
|
||||
|
||||
private Result<Integer, String> assertionResult;
|
||||
|
||||
|
|
|
|||
|
|
@ -70,10 +70,9 @@ public class CreateReportAction implements CheckAction {
|
|||
final DocumentBuilder documentBuilder = processor.newDocumentBuilder();
|
||||
try {
|
||||
|
||||
final Document inputDoc = results.getParserResult().isValid() ? results.getParserResult().getObject()
|
||||
: ObjectFactory.createDocumentBuilder(true).newDocument();
|
||||
final XdmNode parsedDocument = results.getParserResult().isValid() ? results.getParserResult().getObject()
|
||||
: ObjectFactory.createProcessor().newDocumentBuilder().newBuildingContentHandler().getDocumentNode();
|
||||
|
||||
final XdmNode parsedDocument = documentBuilder.build(new DOMSource(inputDoc));
|
||||
final Document reportInput = conversionService.writeDocument(results.getReportInput());
|
||||
final XdmNode root = documentBuilder.build(new DOMSource(reportInput));
|
||||
final XsltTransformer transformer = getTransformation(results).load();
|
||||
|
|
|
|||
|
|
@ -19,23 +19,26 @@
|
|||
|
||||
package de.kosit.validationtool.impl.tasks;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Collections;
|
||||
|
||||
import javax.xml.transform.stream.StreamSource;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import de.kosit.validationtool.api.Input;
|
||||
import de.kosit.validationtool.impl.CollectingErrorEventHandler;
|
||||
import de.kosit.validationtool.impl.ObjectFactory;
|
||||
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 org.w3c.dom.Document;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Collections;
|
||||
import net.sf.saxon.s9api.DocumentBuilder;
|
||||
import net.sf.saxon.s9api.SaxonApiException;
|
||||
import net.sf.saxon.s9api.XdmNode;
|
||||
|
||||
/**
|
||||
* Setzt Parsing-Funktionalitäten um. Prüft auf well-formedness
|
||||
|
|
@ -53,22 +56,18 @@ public class DocumentParseAction implements CheckAction {
|
|||
* @param content ein Dokument
|
||||
* @return Ergebnis des Parsings inklusive etwaiger Fehler
|
||||
*/
|
||||
public Result<Document, XMLSyntaxError> parseDocument(Input content) {
|
||||
public Result<XdmNode, XMLSyntaxError> parseDocument(Input content) {
|
||||
if (content == null) {
|
||||
throw new IllegalArgumentException("Url may not be null");
|
||||
throw new IllegalArgumentException("Input may not be null");
|
||||
}
|
||||
Result<Document, XMLSyntaxError> result;
|
||||
CollectingErrorEventHandler errorHandler = new CollectingErrorEventHandler();
|
||||
Result<XdmNode, XMLSyntaxError> result;
|
||||
try ( InputStream input = new ByteArrayInputStream(content.getContent()) ) {
|
||||
DocumentBuilder db = ObjectFactory.createDocumentBuilder(false);
|
||||
db.setErrorHandler(errorHandler);
|
||||
Document doc = db.parse(input);
|
||||
result = new Result<>(doc, errorHandler.getErrors());
|
||||
} catch (SAXException e) {
|
||||
log.debug("SAXException while parsing {}", content.getName(), e);
|
||||
result = new Result<>(errorHandler.getErrors());
|
||||
} catch (IOException e) {
|
||||
log.debug("IOException while parsing {}", content, e);
|
||||
final DocumentBuilder builder = ObjectFactory.createProcessor().newDocumentBuilder();
|
||||
builder.setLineNumbering(true);
|
||||
XdmNode doc = builder.build(new StreamSource(input));
|
||||
result = new Result<>(doc, Collections.emptyList());
|
||||
} catch (SaxonApiException | IOException e) {
|
||||
log.debug("Exception while parsing {}", content.getName(), e);
|
||||
XMLSyntaxError error = new XMLSyntaxError();
|
||||
error.setSeverity(XMLSyntaxErrorSeverity.SEVERITY_FATAL_ERROR);
|
||||
error.setMessage(String.format("IOException while reading resource %s", content.getName()));
|
||||
|
|
@ -80,7 +79,7 @@ public class DocumentParseAction implements CheckAction {
|
|||
|
||||
@Override
|
||||
public void check(Bag results) {
|
||||
Result<Document, XMLSyntaxError> parserResult = parseDocument(results.getInput());
|
||||
Result<XdmNode, XMLSyntaxError> parserResult = parseDocument(results.getInput());
|
||||
ValidationResultsWellformedness v = new ValidationResultsWellformedness();
|
||||
results.setParserResult(parserResult);
|
||||
v.getXmlSyntaxError().addAll(parserResult.getErrors());
|
||||
|
|
|
|||
|
|
@ -23,8 +23,6 @@ import java.net.URI;
|
|||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.xml.transform.dom.DOMSource;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
|
@ -37,7 +35,11 @@ import de.kosit.validationtool.model.reportInput.CreateReportInput;
|
|||
import de.kosit.validationtool.model.reportInput.ValidationResultsSchematron;
|
||||
import de.kosit.validationtool.model.scenarios.ScenarioType;
|
||||
|
||||
import net.sf.saxon.s9api.*;
|
||||
import net.sf.saxon.s9api.DOMDestination;
|
||||
import net.sf.saxon.s9api.Processor;
|
||||
import net.sf.saxon.s9api.SaxonApiException;
|
||||
import net.sf.saxon.s9api.XdmNode;
|
||||
import net.sf.saxon.s9api.XsltTransformer;
|
||||
|
||||
/**
|
||||
* Ausführung von konfigurierten Schematron Validierungen eines Szenarios.
|
||||
|
|
@ -51,16 +53,14 @@ public class SchematronValidationAction implements CheckAction {
|
|||
|
||||
private final URI repository;
|
||||
|
||||
private List<ValidationResultsSchematron> validate(Document document, ScenarioType scenario) {
|
||||
private List<ValidationResultsSchematron> validate(XdmNode document, ScenarioType scenario) {
|
||||
return scenario.getSchematronValidations().stream().map(v -> validate(document, v)).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private ValidationResultsSchematron validate(Document document, BaseScenario.Transformation validation) {
|
||||
final DocumentBuilder documentBuilder = processor.newDocumentBuilder();
|
||||
private ValidationResultsSchematron validate(XdmNode document, BaseScenario.Transformation validation) {
|
||||
try {
|
||||
final XdmNode root = documentBuilder.build(new DOMSource(document));
|
||||
final XsltTransformer transformer = validation.getExecutable().load();
|
||||
//resolving nur relative zum Repository
|
||||
// resolving nur relative zum Repository
|
||||
final RelativeUriResolver resolver = new RelativeUriResolver(repository);
|
||||
transformer.setURIResolver(resolver);
|
||||
CollectingErrorEventHandler e = new CollectingErrorEventHandler();
|
||||
|
|
@ -68,7 +68,7 @@ public class SchematronValidationAction implements CheckAction {
|
|||
|
||||
Document result = ObjectFactory.createDocumentBuilder(false).newDocument();
|
||||
transformer.setDestination(new DOMDestination(result));
|
||||
transformer.setInitialContextNode(root);
|
||||
transformer.setInitialContextNode(document);
|
||||
transformer.transform();
|
||||
ValidationResultsSchematron s = new ValidationResultsSchematron();
|
||||
s.setResource(validation.getResourceType());
|
||||
|
|
@ -85,9 +85,9 @@ public class SchematronValidationAction implements CheckAction {
|
|||
@Override
|
||||
public void check(Bag results) {
|
||||
final CreateReportInput report = results.getReportInput();
|
||||
final List<ValidationResultsSchematron> bla = validate(results.getParserResult().getObject(),
|
||||
final List<ValidationResultsSchematron> validationResult = validate(results.getParserResult().getObject(),
|
||||
results.getScenarioSelectionResult().getObject());
|
||||
report.getValidationResultsSchematron().addAll(bla);
|
||||
report.getValidationResultsSchematron().addAll(validationResult);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -29,12 +29,13 @@ import org.junit.Before;
|
|||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.rules.ExpectedException;
|
||||
import org.w3c.dom.Document;
|
||||
|
||||
import de.kosit.validationtool.impl.model.Result;
|
||||
import de.kosit.validationtool.impl.tasks.DocumentParseAction;
|
||||
import de.kosit.validationtool.model.reportInput.XMLSyntaxError;
|
||||
|
||||
import net.sf.saxon.s9api.XdmNode;
|
||||
|
||||
/**
|
||||
* @author Andreas Penski
|
||||
*/
|
||||
|
|
@ -60,7 +61,7 @@ public class DocumentParserTest {
|
|||
|
||||
@Test
|
||||
public void testSimple() throws IOException {
|
||||
final Result<Document, XMLSyntaxError> result = parser.parseDocument(read(CONTENT));
|
||||
final Result<XdmNode, XMLSyntaxError> result = parser.parseDocument(read(CONTENT));
|
||||
assertThat(result).isNotNull();
|
||||
assertThat(result.getObject()).isNotNull();
|
||||
assertThat(result.getErrors()).isEmpty();
|
||||
|
|
@ -70,7 +71,7 @@ public class DocumentParserTest {
|
|||
|
||||
@Test
|
||||
public void testIllformed() throws IOException {
|
||||
final Result<Document, XMLSyntaxError> result = parser.parseDocument(read(ILLFORMED));
|
||||
final Result<XdmNode, XMLSyntaxError> result = parser.parseDocument(read(ILLFORMED));
|
||||
assertThat(result).isNotNull();
|
||||
assertThat(result.getErrors()).isNotEmpty();
|
||||
assertThat(result.getObject()).isNull();
|
||||
|
|
|
|||
|
|
@ -30,13 +30,14 @@ import org.junit.Before;
|
|||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.rules.ExpectedException;
|
||||
import org.w3c.dom.Document;
|
||||
|
||||
import de.kosit.validationtool.impl.model.Result;
|
||||
import de.kosit.validationtool.impl.tasks.DocumentParseAction;
|
||||
import de.kosit.validationtool.model.scenarios.ScenarioType;
|
||||
import de.kosit.validationtool.model.scenarios.Scenarios;
|
||||
|
||||
import net.sf.saxon.s9api.XdmNode;
|
||||
|
||||
/**
|
||||
* Testet das {@link ScenarioRepository}.
|
||||
*
|
||||
|
|
@ -94,7 +95,7 @@ public class ScenarioRepositoryTest {
|
|||
assertThat(scenario.isValid()).isFalse();
|
||||
}
|
||||
|
||||
private Document load(URL url) throws IOException {
|
||||
private XdmNode load(URL url) throws IOException {
|
||||
DocumentParseAction p = new DocumentParseAction();
|
||||
return p.parseDocument(read(url)).getObject();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue