#20 Initiales Parsen schon mit s9api umgesetzt. Kein w3c Document benutzt

This commit is contained in:
Andreas Penski (init) 2019-02-08 10:20:48 +01:00
parent 802e716e90
commit e82365c9e5
8 changed files with 62 additions and 64 deletions

View file

@ -51,7 +51,7 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<version.jacoco>0.7.9</version.jacoco> <version.jacoco>0.7.9</version.jacoco>
<version.lombok>1.16.16</version.lombok> <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> <version.slf4j>1.7.25</version.slf4j>
</properties> </properties>

View file

@ -19,16 +19,13 @@
package de.kosit.validationtool.impl; package de.kosit.validationtool.impl;
import static org.apache.commons.lang3.StringUtils.startsWith;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URI; import java.net.URI;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; 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.AccessLevel;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; 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.ScenarioType;
import de.kosit.validationtool.model.scenarios.Scenarios; 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. * Repository for die aktiven Szenario einer Prüfinstanz.
@ -69,16 +71,17 @@ public class ScenarioRepository {
@Getter(value = AccessLevel.PACKAGE) @Getter(value = AccessLevel.PACKAGE)
private Scenarios scenarios; private Scenarios scenarios;
private static boolean isSupportedDocument(Document doc) { private static boolean isSupportedDocument(XdmNode doc) {
final Element root = doc.getDocumentElement(); final XdmNode root = doc.children().iterator().next();
return root.hasAttribute("frameworkVersion") && root.getAttribute("frameworkVersion").startsWith(SUPPORTED_MAJOR_VERSION) final String frameworkVersion = root.getAttributeValue(new QName("frameworkVersion"));
&& doc.getDocumentElement().getNamespaceURI().equals(SUPPORTED_MAJOR_VERSION_SCHEMA); return startsWith(frameworkVersion, SUPPORTED_MAJOR_VERSION)
&& root.getNodeName().getNamespaceURI().equals(SUPPORTED_MAJOR_VERSION_SCHEMA);
} }
private static void checkVersion(URI scenarioDefinition) { private static void checkVersion(URI scenarioDefinition) {
DocumentParseAction p = new DocumentParseAction(); DocumentParseAction p = new DocumentParseAction();
try { 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())) { if (result.isValid() && !isSupportedDocument(result.getObject())) {
throw new IllegalStateException(String.format( throw new IllegalStateException(String.format(
"Specified scenario configuration %s is not supported.%nThis version only supports definitions of '%s'", "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 * @param document das Eingabedokument
* @return ein Ergebnis-Objekt zur weiteren Verarbeitung * @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<>(); Result<ScenarioType, String> result = new Result<>();
final List<ScenarioType> collect = scenarios.getScenario().stream().filter(s -> match(document, s)).collect(Collectors.toList()); final List<ScenarioType> collect = scenarios.getScenario().stream().filter(s -> match(document, s)).collect(Collectors.toList());
if (collect.size() == 1) { 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 { try {
final XPathSelector selector = scenario.getSelector(); final XPathSelector selector = scenario.getSelector();
DocumentBuilder documentBuilder = getProcessor().newDocumentBuilder(); selector.setContextItem(document);
final XdmNode xdmSource = documentBuilder.build(new DOMSource(document));
selector.setContextItem(xdmSource);
return selector.effectiveBooleanValue(); return selector.effectiveBooleanValue();
} catch (SaxonApiException e) { } catch (SaxonApiException e) {
log.error("Error evaluating xpath expression", e); log.error("Error evaluating xpath expression", e);

View file

@ -22,8 +22,6 @@ package de.kosit.validationtool.impl.tasks;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.w3c.dom.Document;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@ -85,7 +83,7 @@ public interface CheckAction {
/** Das zu prüfende Dokument */ /** Das zu prüfende Dokument */
private Input input; private Input input;
private Result<Document, XMLSyntaxError> parserResult; private Result<XdmNode, XMLSyntaxError> parserResult;
private Result<Integer, String> assertionResult; private Result<Integer, String> assertionResult;

View file

@ -70,10 +70,9 @@ public class CreateReportAction implements CheckAction {
final DocumentBuilder documentBuilder = processor.newDocumentBuilder(); final DocumentBuilder documentBuilder = processor.newDocumentBuilder();
try { try {
final Document inputDoc = results.getParserResult().isValid() ? results.getParserResult().getObject() final XdmNode parsedDocument = results.getParserResult().isValid() ? results.getParserResult().getObject()
: ObjectFactory.createDocumentBuilder(true).newDocument(); : ObjectFactory.createProcessor().newDocumentBuilder().newBuildingContentHandler().getDocumentNode();
final XdmNode parsedDocument = documentBuilder.build(new DOMSource(inputDoc));
final Document reportInput = conversionService.writeDocument(results.getReportInput()); final Document reportInput = conversionService.writeDocument(results.getReportInput());
final XdmNode root = documentBuilder.build(new DOMSource(reportInput)); final XdmNode root = documentBuilder.build(new DOMSource(reportInput));
final XsltTransformer transformer = getTransformation(results).load(); final XsltTransformer transformer = getTransformation(results).load();

View file

@ -19,23 +19,26 @@
package de.kosit.validationtool.impl.tasks; 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.api.Input;
import de.kosit.validationtool.impl.CollectingErrorEventHandler;
import de.kosit.validationtool.impl.ObjectFactory; import de.kosit.validationtool.impl.ObjectFactory;
import de.kosit.validationtool.impl.model.Result; import de.kosit.validationtool.impl.model.Result;
import de.kosit.validationtool.model.reportInput.ValidationResultsWellformedness; import de.kosit.validationtool.model.reportInput.ValidationResultsWellformedness;
import de.kosit.validationtool.model.reportInput.XMLSyntaxError; import de.kosit.validationtool.model.reportInput.XMLSyntaxError;
import de.kosit.validationtool.model.reportInput.XMLSyntaxErrorSeverity; 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 net.sf.saxon.s9api.DocumentBuilder;
import java.io.ByteArrayInputStream; import net.sf.saxon.s9api.SaxonApiException;
import java.io.IOException; import net.sf.saxon.s9api.XdmNode;
import java.io.InputStream;
import java.util.Collections;
/** /**
* Setzt Parsing-Funktionalitäten um. Prüft auf well-formedness * Setzt Parsing-Funktionalitäten um. Prüft auf well-formedness
@ -53,22 +56,18 @@ public class DocumentParseAction implements CheckAction {
* @param content ein Dokument * @param content ein Dokument
* @return Ergebnis des Parsings inklusive etwaiger Fehler * @return Ergebnis des Parsings inklusive etwaiger Fehler
*/ */
public Result<Document, XMLSyntaxError> parseDocument(Input content) { public Result<XdmNode, XMLSyntaxError> parseDocument(Input content) {
if (content == null) { if (content == null) {
throw new IllegalArgumentException("Url may not be null"); throw new IllegalArgumentException("Input may not be null");
} }
Result<Document, XMLSyntaxError> result; Result<XdmNode, XMLSyntaxError> result;
CollectingErrorEventHandler errorHandler = new CollectingErrorEventHandler();
try ( InputStream input = new ByteArrayInputStream(content.getContent()) ) { try ( InputStream input = new ByteArrayInputStream(content.getContent()) ) {
DocumentBuilder db = ObjectFactory.createDocumentBuilder(false); final DocumentBuilder builder = ObjectFactory.createProcessor().newDocumentBuilder();
db.setErrorHandler(errorHandler); builder.setLineNumbering(true);
Document doc = db.parse(input); XdmNode doc = builder.build(new StreamSource(input));
result = new Result<>(doc, errorHandler.getErrors()); result = new Result<>(doc, Collections.emptyList());
} catch (SAXException e) { } catch (SaxonApiException | IOException e) {
log.debug("SAXException while parsing {}", content.getName(), e); log.debug("Exception while parsing {}", content.getName(), e);
result = new Result<>(errorHandler.getErrors());
} catch (IOException e) {
log.debug("IOException while parsing {}", content, e);
XMLSyntaxError error = new XMLSyntaxError(); XMLSyntaxError error = new XMLSyntaxError();
error.setSeverity(XMLSyntaxErrorSeverity.SEVERITY_FATAL_ERROR); error.setSeverity(XMLSyntaxErrorSeverity.SEVERITY_FATAL_ERROR);
error.setMessage(String.format("IOException while reading resource %s", content.getName())); error.setMessage(String.format("IOException while reading resource %s", content.getName()));
@ -80,7 +79,7 @@ public class DocumentParseAction implements CheckAction {
@Override @Override
public void check(Bag results) { public void check(Bag results) {
Result<Document, XMLSyntaxError> parserResult = parseDocument(results.getInput()); Result<XdmNode, XMLSyntaxError> parserResult = parseDocument(results.getInput());
ValidationResultsWellformedness v = new ValidationResultsWellformedness(); ValidationResultsWellformedness v = new ValidationResultsWellformedness();
results.setParserResult(parserResult); results.setParserResult(parserResult);
v.getXmlSyntaxError().addAll(parserResult.getErrors()); v.getXmlSyntaxError().addAll(parserResult.getErrors());

View file

@ -23,8 +23,6 @@ import java.net.URI;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.xml.transform.dom.DOMSource;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import lombok.RequiredArgsConstructor; 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.reportInput.ValidationResultsSchematron;
import de.kosit.validationtool.model.scenarios.ScenarioType; 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. * Ausführung von konfigurierten Schematron Validierungen eines Szenarios.
@ -51,14 +53,12 @@ public class SchematronValidationAction implements CheckAction {
private final URI repository; 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()); return scenario.getSchematronValidations().stream().map(v -> validate(document, v)).collect(Collectors.toList());
} }
private ValidationResultsSchematron validate(Document document, BaseScenario.Transformation validation) { private ValidationResultsSchematron validate(XdmNode document, BaseScenario.Transformation validation) {
final DocumentBuilder documentBuilder = processor.newDocumentBuilder();
try { try {
final XdmNode root = documentBuilder.build(new DOMSource(document));
final XsltTransformer transformer = validation.getExecutable().load(); final XsltTransformer transformer = validation.getExecutable().load();
// resolving nur relative zum Repository // resolving nur relative zum Repository
final RelativeUriResolver resolver = new RelativeUriResolver(repository); final RelativeUriResolver resolver = new RelativeUriResolver(repository);
@ -68,7 +68,7 @@ public class SchematronValidationAction implements CheckAction {
Document result = ObjectFactory.createDocumentBuilder(false).newDocument(); Document result = ObjectFactory.createDocumentBuilder(false).newDocument();
transformer.setDestination(new DOMDestination(result)); transformer.setDestination(new DOMDestination(result));
transformer.setInitialContextNode(root); transformer.setInitialContextNode(document);
transformer.transform(); transformer.transform();
ValidationResultsSchematron s = new ValidationResultsSchematron(); ValidationResultsSchematron s = new ValidationResultsSchematron();
s.setResource(validation.getResourceType()); s.setResource(validation.getResourceType());
@ -85,9 +85,9 @@ public class SchematronValidationAction implements CheckAction {
@Override @Override
public void check(Bag results) { public void check(Bag results) {
final CreateReportInput report = results.getReportInput(); final CreateReportInput report = results.getReportInput();
final List<ValidationResultsSchematron> bla = validate(results.getParserResult().getObject(), final List<ValidationResultsSchematron> validationResult = validate(results.getParserResult().getObject(),
results.getScenarioSelectionResult().getObject()); results.getScenarioSelectionResult().getObject());
report.getValidationResultsSchematron().addAll(bla); report.getValidationResultsSchematron().addAll(validationResult);
} }
@Override @Override

View file

@ -29,12 +29,13 @@ import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.ExpectedException; import org.junit.rules.ExpectedException;
import org.w3c.dom.Document;
import de.kosit.validationtool.impl.model.Result; import de.kosit.validationtool.impl.model.Result;
import de.kosit.validationtool.impl.tasks.DocumentParseAction; import de.kosit.validationtool.impl.tasks.DocumentParseAction;
import de.kosit.validationtool.model.reportInput.XMLSyntaxError; import de.kosit.validationtool.model.reportInput.XMLSyntaxError;
import net.sf.saxon.s9api.XdmNode;
/** /**
* @author Andreas Penski * @author Andreas Penski
*/ */
@ -60,7 +61,7 @@ public class DocumentParserTest {
@Test @Test
public void testSimple() throws IOException { 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).isNotNull();
assertThat(result.getObject()).isNotNull(); assertThat(result.getObject()).isNotNull();
assertThat(result.getErrors()).isEmpty(); assertThat(result.getErrors()).isEmpty();
@ -70,7 +71,7 @@ public class DocumentParserTest {
@Test @Test
public void testIllformed() throws IOException { 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).isNotNull();
assertThat(result.getErrors()).isNotEmpty(); assertThat(result.getErrors()).isNotEmpty();
assertThat(result.getObject()).isNull(); assertThat(result.getObject()).isNull();

View file

@ -30,13 +30,14 @@ import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.ExpectedException; import org.junit.rules.ExpectedException;
import org.w3c.dom.Document;
import de.kosit.validationtool.impl.model.Result; import de.kosit.validationtool.impl.model.Result;
import de.kosit.validationtool.impl.tasks.DocumentParseAction; import de.kosit.validationtool.impl.tasks.DocumentParseAction;
import de.kosit.validationtool.model.scenarios.ScenarioType; import de.kosit.validationtool.model.scenarios.ScenarioType;
import de.kosit.validationtool.model.scenarios.Scenarios; import de.kosit.validationtool.model.scenarios.Scenarios;
import net.sf.saxon.s9api.XdmNode;
/** /**
* Testet das {@link ScenarioRepository}. * Testet das {@link ScenarioRepository}.
* *
@ -94,7 +95,7 @@ public class ScenarioRepositoryTest {
assertThat(scenario.isValid()).isFalse(); assertThat(scenario.isValid()).isFalse();
} }
private Document load(URL url) throws IOException { private XdmNode load(URL url) throws IOException {
DocumentParseAction p = new DocumentParseAction(); DocumentParseAction p = new DocumentParseAction();
return p.parseDocument(read(url)).getObject(); return p.parseDocument(read(url)).getObject();
} }