mirror of
https://github.com/itplr-kosit/validator.git
synced 2026-05-25 16:55:39 +00:00
#21 Übergabe von Fehlerinformation in der API
This commit is contained in:
parent
8d49b0fea3
commit
3d777fa8e5
10 changed files with 289 additions and 86 deletions
|
|
@ -1,11 +1,9 @@
|
||||||
package de.kosit.validationtool.api;
|
package de.kosit.validationtool.api;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
|
|
||||||
import net.sf.saxon.dom.NodeOverNodeInfo;
|
|
||||||
import net.sf.saxon.s9api.XdmNode;
|
import net.sf.saxon.s9api.XdmNode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -13,32 +11,33 @@ import net.sf.saxon.s9api.XdmNode;
|
||||||
*
|
*
|
||||||
* @author Andreas Penski
|
* @author Andreas Penski
|
||||||
*/
|
*/
|
||||||
@Getter
|
|
||||||
@RequiredArgsConstructor
|
public interface Result {
|
||||||
public class Result {
|
|
||||||
|
|
||||||
/** Der generierte Report. */
|
/** Der generierte Report. */
|
||||||
private final XdmNode report;
|
XdmNode getReport();
|
||||||
|
|
||||||
/** Das evaluierte Ergebnis. */
|
/** Das evaluierte Ergebnis. */
|
||||||
private final AcceptRecommendation acceptRecommendation;
|
AcceptRecommendation getAcceptRecommendation();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gibt den Report als W3C-{@link Document} zurück.
|
* Gibt den Report als W3C-{@link Document} zurück.
|
||||||
*
|
*
|
||||||
* @return der Report
|
* @return der Report
|
||||||
*/
|
*/
|
||||||
public Document getReportDocument() {
|
Document getReportDocument();
|
||||||
return (Document) NodeOverNodeInfo.wrap(getReport().getUnderlyingNode());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Schnellzugriff auf die Empfehlung zur Weiterverarbeitung des Dokuments.
|
* Schnellzugriff auf die Empfehlung zur Weiterverarbeitung des Dokuments.
|
||||||
*
|
*
|
||||||
* @return true wenn {@link AcceptRecommendation#ACCEPTABLE}
|
* @return true wenn {@link AcceptRecommendation#ACCEPTABLE}
|
||||||
*/
|
*/
|
||||||
public boolean isAcceptable() {
|
boolean isAcceptable();
|
||||||
return AcceptRecommendation.ACCEPTABLE.equals(acceptRecommendation);
|
|
||||||
}
|
/**
|
||||||
|
* Gibt eine Liste mit gefundenen Schema-Validation-Fehler zurück. Diese Liste ist leer, wenn keine Fehler gefunden
|
||||||
|
* wurden.
|
||||||
|
*/
|
||||||
|
List<XmlError> getSchemaViolations();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
43
src/main/java/de/kosit/validationtool/api/XmlError.java
Normal file
43
src/main/java/de/kosit/validationtool/api/XmlError.java
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
package de.kosit.validationtool.api;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fehlerobjekt für die Bereitstellung von Fehlern aus der internen Verarbeitung, bspw. Schema-Validation-Fehler.
|
||||||
|
*
|
||||||
|
* @author Andreas Penski
|
||||||
|
*/
|
||||||
|
public interface XmlError {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gibt die Fehlermeldung zurück.
|
||||||
|
*
|
||||||
|
* @return die Fehlermeldung
|
||||||
|
*/
|
||||||
|
String getMessage();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Zeigt den Schweregrad der Fehlermeldung an
|
||||||
|
*
|
||||||
|
* @return der Schweregrad
|
||||||
|
* @see Severity
|
||||||
|
*/
|
||||||
|
Severity getSeverity();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gibt optional eine Zeilennummer an, aus der der Fehler resultiert.
|
||||||
|
*
|
||||||
|
* @return die Zeitelnnummer
|
||||||
|
*/
|
||||||
|
Integer getRowNumber();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gibt optional eine Spaltennummer an, aus der der Fehler resultiert.
|
||||||
|
*
|
||||||
|
* @return die Spaltennummer
|
||||||
|
*/
|
||||||
|
Integer getColumnNumber();
|
||||||
|
|
||||||
|
enum Severity {
|
||||||
|
SEVERITY_WARNING, SEVERITY_ERROR, SEVERITY_FATAL_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -20,20 +20,17 @@
|
||||||
package de.kosit.validationtool.cmd;
|
package de.kosit.validationtool.cmd;
|
||||||
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
import de.kosit.validationtool.impl.ContentRepository;
|
import de.kosit.validationtool.impl.ContentRepository;
|
||||||
|
import de.kosit.validationtool.impl.HtmlExtraction;
|
||||||
import de.kosit.validationtool.impl.tasks.CheckAction;
|
import de.kosit.validationtool.impl.tasks.CheckAction;
|
||||||
|
|
||||||
import net.sf.saxon.s9api.QName;
|
import net.sf.saxon.s9api.QName;
|
||||||
import net.sf.saxon.s9api.SaxonApiException;
|
import net.sf.saxon.s9api.SaxonApiException;
|
||||||
import net.sf.saxon.s9api.Serializer;
|
import net.sf.saxon.s9api.Serializer;
|
||||||
import net.sf.saxon.s9api.XPathExecutable;
|
|
||||||
import net.sf.saxon.s9api.XPathSelector;
|
|
||||||
import net.sf.saxon.s9api.XdmItem;
|
import net.sf.saxon.s9api.XdmItem;
|
||||||
import net.sf.saxon.s9api.XdmNode;
|
import net.sf.saxon.s9api.XdmNode;
|
||||||
|
|
||||||
|
|
@ -48,49 +45,38 @@ class ExtractHtmlContentAction implements CheckAction {
|
||||||
|
|
||||||
private static final QName NAME_ATTRIBUTE = new QName("data-report-type");
|
private static final QName NAME_ATTRIBUTE = new QName("data-report-type");
|
||||||
|
|
||||||
private final ContentRepository repository;
|
|
||||||
|
|
||||||
private final Path outputDirectory;
|
private final Path outputDirectory;
|
||||||
|
|
||||||
private XPathExecutable executable;
|
private HtmlExtraction htmlExtraction;
|
||||||
|
|
||||||
@Override
|
private ContentRepository repository;
|
||||||
public void check(Bag results) {
|
|
||||||
try {
|
|
||||||
final XPathSelector selector = getSelector();
|
|
||||||
final XdmNode xdmSource = results.getReport();
|
|
||||||
selector.setContextItem(xdmSource);
|
|
||||||
selector.forEach(m -> print(results.getName(), m));
|
|
||||||
|
|
||||||
} catch (SaxonApiException e) {
|
public ExtractHtmlContentAction(final ContentRepository repository, final Path outputDirectory) {
|
||||||
throw new IllegalStateException("Can not extract html content", e);
|
this.outputDirectory = outputDirectory;
|
||||||
}
|
this.htmlExtraction = new HtmlExtraction(repository);
|
||||||
|
this.repository = repository;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void print(String origName, XdmItem xdmItem) {
|
@Override
|
||||||
XdmNode node = (XdmNode) xdmItem;
|
public void check(final Bag results) {
|
||||||
|
this.htmlExtraction.extract(results.getReport()).forEach(i -> print(results.getName(), i));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void print(final String origName, final XdmItem xdmItem) {
|
||||||
|
final XdmNode node = (XdmNode) xdmItem;
|
||||||
final String name = origName + "-" + node.getAttributeValue(NAME_ATTRIBUTE);
|
final String name = origName + "-" + node.getAttributeValue(NAME_ATTRIBUTE);
|
||||||
final Path file = outputDirectory.resolve(name + ".html");
|
final Path file = this.outputDirectory.resolve(name + ".html");
|
||||||
final Serializer serializer = repository.getProcessor().newSerializer(file.toFile());
|
final Serializer serializer = this.repository.getProcessor().newSerializer(file.toFile());
|
||||||
try {
|
try {
|
||||||
log.info("Writing report html '{}' to {}", name, file.toAbsolutePath());
|
log.info("Writing report html '{}' to {}", name, file.toAbsolutePath());
|
||||||
serializer.serializeNode(node);
|
serializer.serializeNode(node);
|
||||||
} catch (SaxonApiException e) {
|
} catch (final SaxonApiException e) {
|
||||||
log.info("Error extracting html content to {}", file.toAbsolutePath(), e);
|
log.info("Error extracting html content to {}", file.toAbsolutePath(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private XPathSelector getSelector() {
|
|
||||||
if (executable == null) {
|
|
||||||
Map<String, String> ns = new HashMap<>();
|
|
||||||
ns.put("html", "http://www.w3.org/1999/xhtml");
|
|
||||||
executable = repository.createXPath("//html:html", ns);
|
|
||||||
}
|
|
||||||
return executable.load();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isSkipped(Bag results) {
|
public boolean isSkipped(final Bag results) {
|
||||||
if (results.getReport() == null) {
|
if (results.getReport() == null) {
|
||||||
log.warn("Can not extract html content. No report document found");
|
log.warn("Can not extract html content. No report document found");
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -51,26 +51,26 @@ public class CollectingErrorEventHandler implements ValidationEventHandler, Erro
|
||||||
|
|
||||||
private static final int DEFAULT_ABORT_COUNT = 50;
|
private static final int DEFAULT_ABORT_COUNT = 50;
|
||||||
|
|
||||||
private Collection<XMLSyntaxError> errors = new ArrayList<>();
|
private final Collection<XMLSyntaxError> errors = new ArrayList<>();
|
||||||
|
|
||||||
private int stopProcessCount = DEFAULT_ABORT_COUNT;
|
private final int stopProcessCount = DEFAULT_ABORT_COUNT;
|
||||||
|
|
||||||
private static XMLSyntaxError createError(XMLSyntaxErrorSeverity severity, String message) {
|
private static XMLSyntaxError createError(final XMLSyntaxErrorSeverity severity, final String message) {
|
||||||
XMLSyntaxError e = new XMLSyntaxError();
|
final XMLSyntaxError e = new XMLSyntaxError();
|
||||||
e.setSeverity(severity);
|
e.setSeverity(severity);
|
||||||
e.setMessage(message);
|
e.setMessage(message);
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static XMLSyntaxError createError(XMLSyntaxErrorSeverity severity, SAXParseException exception) {
|
private static XMLSyntaxError createError(final XMLSyntaxErrorSeverity severity, final SAXParseException exception) {
|
||||||
XMLSyntaxError e = createError(severity, exception.getMessage());
|
final XMLSyntaxError e = createError(severity, exception.getMessage());
|
||||||
e.setRowNumber(exception.getLineNumber());
|
e.setRowNumber(exception.getLineNumber());
|
||||||
e.setColumnNumber(exception.getColumnNumber());
|
e.setColumnNumber(exception.getColumnNumber());
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static XMLSyntaxError createError(XMLSyntaxErrorSeverity severity, TransformerException exception) {
|
private static XMLSyntaxError createError(final XMLSyntaxErrorSeverity severity, final TransformerException exception) {
|
||||||
XMLSyntaxError e = createError(severity, exception.getMessage());
|
final XMLSyntaxError e = createError(severity, exception.getMessage());
|
||||||
if (exception.getLocator() != null) {
|
if (exception.getLocator() != null) {
|
||||||
e.setRowNumber(exception.getLocator().getLineNumber());
|
e.setRowNumber(exception.getLocator().getLineNumber());
|
||||||
e.setColumnNumber(exception.getLocator().getColumnNumber());
|
e.setColumnNumber(exception.getLocator().getColumnNumber());
|
||||||
|
|
@ -78,7 +78,7 @@ public class CollectingErrorEventHandler implements ValidationEventHandler, Erro
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static XMLSyntaxErrorSeverity translateSeverity(int severity) {
|
private static XMLSyntaxErrorSeverity translateSeverity(final int severity) {
|
||||||
switch (severity) {
|
switch (severity) {
|
||||||
case ValidationEvent.WARNING:
|
case ValidationEvent.WARNING:
|
||||||
return XMLSyntaxErrorSeverity.SEVERITY_WARNING;
|
return XMLSyntaxErrorSeverity.SEVERITY_WARNING;
|
||||||
|
|
@ -92,12 +92,12 @@ public class CollectingErrorEventHandler implements ValidationEventHandler, Erro
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean handleEvent(ValidationEvent event) {
|
public boolean handleEvent(final ValidationEvent event) {
|
||||||
XMLSyntaxError e = createError(translateSeverity(event.getSeverity()), event.getMessage());
|
final XMLSyntaxError e = createError(translateSeverity(event.getSeverity()), event.getMessage());
|
||||||
e.setColumnNumber(event.getLocator().getColumnNumber());
|
e.setColumnNumber(event.getLocator().getColumnNumber());
|
||||||
e.setRowNumber(event.getLocator().getLineNumber());
|
e.setRowNumber(event.getLocator().getLineNumber());
|
||||||
errors.add(e);
|
this.errors.add(e);
|
||||||
return stopProcessCount != errors.size();
|
return this.stopProcessCount != this.errors.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -106,7 +106,7 @@ public class CollectingErrorEventHandler implements ValidationEventHandler, Erro
|
||||||
* @return true wenn mindestens ein Fehler vorhanden ist.
|
* @return true wenn mindestens ein Fehler vorhanden ist.
|
||||||
*/
|
*/
|
||||||
public boolean hasErrors() {
|
public boolean hasErrors() {
|
||||||
return hasEvents() && errors.stream().anyMatch(e -> e.getSeverity() != XMLSyntaxErrorSeverity.SEVERITY_WARNING);
|
return hasEvents() && this.errors.stream().anyMatch(e -> e.getSeverityCode() != XMLSyntaxErrorSeverity.SEVERITY_WARNING);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -115,27 +115,27 @@ public class CollectingErrorEventHandler implements ValidationEventHandler, Erro
|
||||||
* @return true wenn mindestens ein Validierungsereignis aufgetreten ist
|
* @return true wenn mindestens ein Validierungsereignis aufgetreten ist
|
||||||
*/
|
*/
|
||||||
public boolean hasEvents() {
|
public boolean hasEvents() {
|
||||||
return !errors.isEmpty();
|
return !this.errors.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void warning(SAXParseException exception) throws SAXException {
|
public void warning(final SAXParseException exception) throws SAXException {
|
||||||
errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_WARNING, exception));
|
this.errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_WARNING, exception));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void error(SAXParseException exception) throws SAXException {
|
public void error(final SAXParseException exception) throws SAXException {
|
||||||
errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_ERROR, exception));
|
this.errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_ERROR, exception));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void fatalError(SAXParseException exception) throws SAXException {
|
public void fatalError(final SAXParseException exception) throws SAXException {
|
||||||
errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_FATAL_ERROR, exception));
|
this.errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_FATAL_ERROR, exception));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void message(XdmNode content, boolean terminate, SourceLocator locator) {
|
public void message(final XdmNode content, final boolean terminate, final SourceLocator locator) {
|
||||||
XMLSyntaxError e = new XMLSyntaxError();
|
final XMLSyntaxError e = new XMLSyntaxError();
|
||||||
if (locator != null) {
|
if (locator != null) {
|
||||||
e.setColumnNumber(locator.getColumnNumber());
|
e.setColumnNumber(locator.getColumnNumber());
|
||||||
e.setRowNumber(locator.getLineNumber());
|
e.setRowNumber(locator.getLineNumber());
|
||||||
|
|
@ -145,24 +145,25 @@ public class CollectingErrorEventHandler implements ValidationEventHandler, Erro
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void warning(TransformerException exception) throws TransformerException {
|
public void warning(final TransformerException exception) throws TransformerException {
|
||||||
errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_WARNING, exception));
|
this.errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_WARNING, exception));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void error(TransformerException exception) throws TransformerException {
|
public void error(final TransformerException exception) throws TransformerException {
|
||||||
errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_ERROR, exception));
|
this.errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_ERROR, exception));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void fatalError(TransformerException exception) throws TransformerException {
|
public void fatalError(final TransformerException exception) throws TransformerException {
|
||||||
errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_FATAL_ERROR, exception));
|
this.errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_FATAL_ERROR, exception));
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getErrorDescription() {
|
public String getErrorDescription() {
|
||||||
final StringJoiner joiner = new StringJoiner("\n");
|
final StringJoiner joiner = new StringJoiner("\n");
|
||||||
errors.forEach(e -> joiner
|
this.errors.forEach(e -> joiner
|
||||||
.add(e.getSeverity().value() + " " + e.getMessage() + " At row " + e.getRowNumber() + " at pos " + e.getColumnNumber()));
|
.add(e.getSeverityCode().value() + " " + e.getMessage() + " At row " + e.getRowNumber() + " at pos "
|
||||||
|
+ e.getColumnNumber()));
|
||||||
return joiner.toString();
|
return joiner.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -20,6 +20,7 @@
|
||||||
package de.kosit.validationtool.impl;
|
package de.kosit.validationtool.impl;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
@ -29,7 +30,9 @@ import de.kosit.validationtool.api.Check;
|
||||||
import de.kosit.validationtool.api.CheckConfiguration;
|
import de.kosit.validationtool.api.CheckConfiguration;
|
||||||
import de.kosit.validationtool.api.Input;
|
import de.kosit.validationtool.api.Input;
|
||||||
import de.kosit.validationtool.api.Result;
|
import de.kosit.validationtool.api.Result;
|
||||||
|
import de.kosit.validationtool.api.XmlError;
|
||||||
import de.kosit.validationtool.impl.tasks.CheckAction;
|
import de.kosit.validationtool.impl.tasks.CheckAction;
|
||||||
|
import de.kosit.validationtool.impl.tasks.CheckAction.Bag;
|
||||||
import de.kosit.validationtool.impl.tasks.ComputeAcceptanceAction;
|
import de.kosit.validationtool.impl.tasks.ComputeAcceptanceAction;
|
||||||
import de.kosit.validationtool.impl.tasks.CreateReportAction;
|
import de.kosit.validationtool.impl.tasks.CreateReportAction;
|
||||||
import de.kosit.validationtool.impl.tasks.DocumentParseAction;
|
import de.kosit.validationtool.impl.tasks.DocumentParseAction;
|
||||||
|
|
@ -41,6 +44,7 @@ import de.kosit.validationtool.model.reportInput.CreateReportInput;
|
||||||
import de.kosit.validationtool.model.reportInput.DocumentIdentificationType;
|
import de.kosit.validationtool.model.reportInput.DocumentIdentificationType;
|
||||||
import de.kosit.validationtool.model.reportInput.EngineType;
|
import de.kosit.validationtool.model.reportInput.EngineType;
|
||||||
import de.kosit.validationtool.model.reportInput.ProcessingError;
|
import de.kosit.validationtool.model.reportInput.ProcessingError;
|
||||||
|
import de.kosit.validationtool.model.reportInput.XMLSyntaxError;
|
||||||
|
|
||||||
import net.sf.saxon.s9api.Processor;
|
import net.sf.saxon.s9api.Processor;
|
||||||
|
|
||||||
|
|
@ -125,7 +129,20 @@ public class DefaultCheck implements Check {
|
||||||
}
|
}
|
||||||
t.setFinished(true);
|
t.setFinished(true);
|
||||||
log.info("Finished check of {} in {}ms\n", t.getInput().getName(), System.currentTimeMillis() - started);
|
log.info("Finished check of {} in {}ms\n", t.getInput().getName(), System.currentTimeMillis() - started);
|
||||||
return new Result(t.getReport(), t.getAcceptStatus());
|
return createResult(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Result createResult(final Bag t) {
|
||||||
|
final DefaultResult result = new DefaultResult(t.getReport(), t.getAcceptStatus(), this.contentRepository);
|
||||||
|
if (t.getSchemaValidationResult() != null) {
|
||||||
|
result.setSchemaViolations(convertErrors(t.getSchemaValidationResult().getErrors()));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<XmlError> convertErrors(final Collection<XMLSyntaxError> errors) {
|
||||||
|
// noinspection unchecked
|
||||||
|
return (List<XmlError>) (List<?>) errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void createDocumentIdentification(final CheckAction.Bag transporter) {
|
private static void createDocumentIdentification(final CheckAction.Bag transporter) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,97 @@
|
||||||
|
package de.kosit.validationtool.impl;
|
||||||
|
|
||||||
|
import java.io.StringWriter;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
|
||||||
|
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 net.sf.saxon.dom.NodeOverNodeInfo;
|
||||||
|
import net.sf.saxon.s9api.SaxonApiException;
|
||||||
|
import net.sf.saxon.s9api.Serializer;
|
||||||
|
import net.sf.saxon.s9api.XdmNode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Andreas Penski
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class DefaultResult implements Result {
|
||||||
|
|
||||||
|
/** Der generierte Report. */
|
||||||
|
@Getter
|
||||||
|
private final XdmNode report;
|
||||||
|
|
||||||
|
/** Das evaluierte Ergebnis. */
|
||||||
|
@Getter
|
||||||
|
private final AcceptRecommendation acceptRecommendation;
|
||||||
|
|
||||||
|
private final HtmlExtraction htmlExtraction;
|
||||||
|
|
||||||
|
@Setter(AccessLevel.PACKAGE)
|
||||||
|
@Getter
|
||||||
|
private List<XmlError> schemaViolations = new ArrayList<>();
|
||||||
|
|
||||||
|
public DefaultResult(final XdmNode report, final AcceptRecommendation recommendation, final ContentRepository repository) {
|
||||||
|
this.report = report;
|
||||||
|
this.acceptRecommendation = recommendation;
|
||||||
|
this.htmlExtraction = new HtmlExtraction(repository);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gibt den Report als W3C-{@link Document} zurück.
|
||||||
|
*
|
||||||
|
* @return der Report
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Document getReportDocument() {
|
||||||
|
return (Document) NodeOverNodeInfo.wrap(getReport().getUnderlyingNode());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schnellzugriff auf die Empfehlung zur Weiterverarbeitung des Dokuments.
|
||||||
|
*
|
||||||
|
* @return true wenn {@link AcceptRecommendation#ACCEPTABLE}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean isAcceptable() {
|
||||||
|
return AcceptRecommendation.ACCEPTABLE.equals(this.acceptRecommendation);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> extractHtmlAsString() {
|
||||||
|
return extractHtml().stream().map(this::convertToString).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
private String convertToString(final XdmNode element) {
|
||||||
|
try {
|
||||||
|
final StringWriter writer = new StringWriter();
|
||||||
|
final Serializer serializer = ObjectFactory.createProcessor().newSerializer(writer);
|
||||||
|
serializer.serializeNode(element);
|
||||||
|
return writer.toString();
|
||||||
|
} catch (SaxonApiException e) {
|
||||||
|
throw new IllegalStateException("Can not convert to string", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Element> extractHtmlAsElement() {
|
||||||
|
return extractHtml().stream().map(DefaultResult::convertToElement).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Element convertToElement(final XdmNode xdmItem) {
|
||||||
|
return (Element) NodeOverNodeInfo.wrap(xdmItem.getUnderlyingNode());
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<XdmNode> extractHtml() {
|
||||||
|
return this.htmlExtraction.extract(getReport());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
package de.kosit.validationtool.impl;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
import net.sf.saxon.s9api.SaxonApiException;
|
||||||
|
import net.sf.saxon.s9api.XPathExecutable;
|
||||||
|
import net.sf.saxon.s9api.XPathSelector;
|
||||||
|
import net.sf.saxon.s9api.XdmItem;
|
||||||
|
import net.sf.saxon.s9api.XdmNode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Andreas Penski
|
||||||
|
*/
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class HtmlExtraction {
|
||||||
|
|
||||||
|
private final ContentRepository repository;
|
||||||
|
|
||||||
|
private XPathExecutable executable;
|
||||||
|
|
||||||
|
public List<XdmNode> extract(XdmNode xdmSource) {
|
||||||
|
try {
|
||||||
|
final XPathSelector selector = getSelector();
|
||||||
|
selector.setContextItem(xdmSource);
|
||||||
|
return selector.stream().map(this::castToNode).collect(Collectors.toList());
|
||||||
|
|
||||||
|
} catch (SaxonApiException e) {
|
||||||
|
throw new IllegalStateException("Can not extract html content", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private XdmNode castToNode(final XdmItem xdmItem) {
|
||||||
|
return (XdmNode) xdmItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
private XPathSelector getSelector() {
|
||||||
|
if (executable == null) {
|
||||||
|
Map<String, String> ns = new HashMap<>();
|
||||||
|
ns.put("html", "http://www.w3.org/1999/xhtml");
|
||||||
|
executable = repository.createXPath("//html:html", ns);
|
||||||
|
}
|
||||||
|
return executable.load();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -21,6 +21,7 @@ package de.kosit.validationtool.impl.model;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
import de.kosit.validationtool.api.XmlError;
|
||||||
import de.kosit.validationtool.model.reportInput.XMLSyntaxErrorSeverity;
|
import de.kosit.validationtool.model.reportInput.XMLSyntaxErrorSeverity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -29,17 +30,17 @@ import de.kosit.validationtool.model.reportInput.XMLSyntaxErrorSeverity;
|
||||||
*
|
*
|
||||||
* @author Andreas Penski
|
* @author Andreas Penski
|
||||||
*/
|
*/
|
||||||
public abstract class BaseXMLSyntaxError {
|
public abstract class BaseXMLSyntaxError implements XmlError {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Logged den Syntax-Fehler über einen definierten Logger.
|
* Logged den Syntax-Fehler über einen definierten Logger.
|
||||||
*
|
*
|
||||||
* @param logger der Logger
|
* @param logger der Logger
|
||||||
*/
|
*/
|
||||||
public void log(Logger logger) {
|
public void log(final Logger logger) {
|
||||||
String msgTemplate = "{} At row {} at pos {}";
|
final String msgTemplate = "{} At row {} at pos {}";
|
||||||
Object[] params = { getMessage(), getRowNumber(), getColumnNumber() };
|
final Object[] params = { getMessage(), getRowNumber(), getColumnNumber() };
|
||||||
if (getSeverity() == XMLSyntaxErrorSeverity.SEVERITY_WARNING) {
|
if (getSeverityCode() == XMLSyntaxErrorSeverity.SEVERITY_WARNING) {
|
||||||
logger.warn(msgTemplate, params);
|
logger.warn(msgTemplate, params);
|
||||||
} else {
|
} else {
|
||||||
logger.error(msgTemplate, params);
|
logger.error(msgTemplate, params);
|
||||||
|
|
@ -57,6 +58,7 @@ public abstract class BaseXMLSyntaxError {
|
||||||
*
|
*
|
||||||
* @return Spalte des Fehlers
|
* @return Spalte des Fehlers
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public abstract Integer getColumnNumber();
|
public abstract Integer getColumnNumber();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -64,6 +66,7 @@ public abstract class BaseXMLSyntaxError {
|
||||||
*
|
*
|
||||||
* @return Zeile des Fehlers
|
* @return Zeile des Fehlers
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public abstract Integer getRowNumber();
|
public abstract Integer getRowNumber();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -71,6 +74,7 @@ public abstract class BaseXMLSyntaxError {
|
||||||
*
|
*
|
||||||
* @return Fehlermeldung
|
* @return Fehlermeldung
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public abstract String getMessage();
|
public abstract String getMessage();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -78,5 +82,11 @@ public abstract class BaseXMLSyntaxError {
|
||||||
*
|
*
|
||||||
* @return severity
|
* @return severity
|
||||||
*/
|
*/
|
||||||
public abstract XMLSyntaxErrorSeverity getSeverity();
|
public abstract XMLSyntaxErrorSeverity getSeverityCode();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Severity getSeverity() {
|
||||||
|
final XMLSyntaxErrorSeverity code = getSeverityCode();
|
||||||
|
return code != null ? Severity.valueOf(code.name()) : null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,7 @@
|
||||||
<xs:complexType name="XMLSyntaxError">
|
<xs:complexType name="XMLSyntaxError">
|
||||||
<xs:sequence>
|
<xs:sequence>
|
||||||
<xs:element name="message" type="xs:normalizedString"/>
|
<xs:element name="message" type="xs:normalizedString"/>
|
||||||
<xs:element name="severity" type="in:XMLSyntaxErrorSeverity"/>
|
<xs:element name="getSeverityCode" type="in:XMLSyntaxErrorSeverity" />
|
||||||
<xs:element name="rowNumber" type="xs:int" minOccurs="0"/>
|
<xs:element name="rowNumber" type="xs:int" minOccurs="0"/>
|
||||||
<xs:element name="columnNumber" type="xs:int" minOccurs="0"/>
|
<xs:element name="columnNumber" type="xs:int" minOccurs="0"/>
|
||||||
</xs:sequence>
|
</xs:sequence>
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,7 @@ public class SimpleScenarioCheck {
|
||||||
final Result result = this.implementation.checkInput(InputFactory.read(Simple.INVALID.toURL()));
|
final Result result = this.implementation.checkInput(InputFactory.read(Simple.INVALID.toURL()));
|
||||||
assertThat(result).isNotNull();
|
assertThat(result).isNotNull();
|
||||||
assertThat(result.getAcceptRecommendation()).isEqualTo(AcceptRecommendation.REJECT);
|
assertThat(result.getAcceptRecommendation()).isEqualTo(AcceptRecommendation.REJECT);
|
||||||
|
assertThat(result.getSchemaViolations()).isNotEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue