From 0281d9492930a042dfd4d91f9efd67d0c45b1b46 Mon Sep 17 00:00:00 2001 From: apenski Date: Tue, 8 Nov 2022 08:32:11 +0100 Subject: [PATCH] Upgrade Saxon to 11.4 --- .mvn/createBuildImages.sh | 2 +- CHANGELOG.md | 1 + pom.xml | 2 +- .../validationtool/config/XPathBuilder.java | 12 +- .../impl/CollectingErrorEventHandler.java | 7 +- .../impl/tasks/CreateReportAction.java | 147 +++++++++--------- 6 files changed, 84 insertions(+), 87 deletions(-) diff --git a/.mvn/createBuildImages.sh b/.mvn/createBuildImages.sh index f03f060..b393ea9 100644 --- a/.mvn/createBuildImages.sh +++ b/.mvn/createBuildImages.sh @@ -16,7 +16,7 @@ # limitations under the License. # -TAGS=("3-openjdk-16" "3-jdk-11" "3-jdk-11-openj9" "3-jdk-8" "3-jdk-8-openj9" "3-openjdk-15" "3-openjdk-17") +TAGS=("3-openjdk-16" "3-jdk-11" "3-jdk-11-openj9" "3-jdk-8" "3-jdk-8-openj9" "3-openjdk-15" "3-openjdk-17", "3-openjdk-18") docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY" for i in "${TAGS[@]}" diff --git a/CHANGELOG.md b/CHANGELOG.md index 575bb9b..6e74fdb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [ResolvingConfigurationStrategy.java#getProcessor()](de/kosit/validationtool/api/ResolvingConfigurationStrategy) is removed. +- Bump [Saxon HE](https://www.saxonica.com/documentation11/documentation.xml) to 11.4 - Bump [jaxb-ri](https://github.com/eclipse-ee4j/jaxb-ri) to 2.3.7 - [INTERNAL] CLI parsing based on pico-cli, commons-cli is removed diff --git a/pom.xml b/pom.xml index 4d31b69..7c005ae 100644 --- a/pom.xml +++ b/pom.xml @@ -57,7 +57,7 @@ 0.8.7 2.3.7 1.18.20 - 9.9.1-7 + 11.4 1.7.25 diff --git a/src/main/java/de/kosit/validationtool/config/XPathBuilder.java b/src/main/java/de/kosit/validationtool/config/XPathBuilder.java index a895824..90b5351 100644 --- a/src/main/java/de/kosit/validationtool/config/XPathBuilder.java +++ b/src/main/java/de/kosit/validationtool/config/XPathBuilder.java @@ -49,7 +49,7 @@ import net.sf.saxon.s9api.XPathExecutable; @Slf4j class XPathBuilder implements Builder { - private static final String[] IGNORED_PREFIXES = new String[] { "xsd", "saxon", "xsl", "xs" }; + private static final String[] IGNORED_PREFIXES = new String[] { "xsd", "saxon", "xsl", "xs", "xml" }; private final String name; @@ -60,6 +60,10 @@ class XPathBuilder implements Builder { @Setter(AccessLevel.PACKAGE) private Map namespaces; + private static Result createError(final String msg) { + return new Result<>(null, Collections.singletonList(msg)); + } + Map getNamespaces() { if (this.namespaces == null) { this.namespaces = new HashMap<>(); @@ -69,7 +73,7 @@ class XPathBuilder implements Builder { /** * Returns the xpath expression. - * + * * @return xpath expression */ public String getXPath() { @@ -118,8 +122,4 @@ class XPathBuilder implements Builder { private String extractExpression() { return this.executable.getUnderlyingExpression().getInternalExpression().toString(); } - - private static Result createError(final String msg) { - return new Result<>(null, Collections.singletonList(msg)); - } } diff --git a/src/main/java/de/kosit/validationtool/impl/CollectingErrorEventHandler.java b/src/main/java/de/kosit/validationtool/impl/CollectingErrorEventHandler.java index 8534b89..3897006 100644 --- a/src/main/java/de/kosit/validationtool/impl/CollectingErrorEventHandler.java +++ b/src/main/java/de/kosit/validationtool/impl/CollectingErrorEventHandler.java @@ -35,7 +35,8 @@ import lombok.Getter; import de.kosit.validationtool.model.reportInput.XMLSyntaxError; import de.kosit.validationtool.model.reportInput.XMLSyntaxErrorSeverity; -import net.sf.saxon.s9api.MessageListener; +import net.sf.saxon.s9api.MessageListener2; +import net.sf.saxon.s9api.QName; import net.sf.saxon.s9api.XdmNode; /** @@ -44,7 +45,7 @@ import net.sf.saxon.s9api.XdmNode; * @author Andreas Penski */ @Getter -public class CollectingErrorEventHandler implements ValidationEventHandler, ErrorHandler, MessageListener, ErrorListener { +public class CollectingErrorEventHandler implements ValidationEventHandler, ErrorHandler, MessageListener2, ErrorListener { private static final int DEFAULT_ABORT_COUNT = 50; @@ -131,7 +132,7 @@ public class CollectingErrorEventHandler implements ValidationEventHandler, Erro } @Override - public void message(final XdmNode content, final boolean terminate, final SourceLocator locator) { + public void message(final XdmNode content, final QName errorCode, final boolean terminate, final SourceLocator locator) { final XMLSyntaxError e = new XMLSyntaxError(); if (locator != null) { e.setColumnNumber(locator.getColumnNumber()); diff --git a/src/main/java/de/kosit/validationtool/impl/tasks/CreateReportAction.java b/src/main/java/de/kosit/validationtool/impl/tasks/CreateReportAction.java index ac2d661..554a47f 100644 --- a/src/main/java/de/kosit/validationtool/impl/tasks/CreateReportAction.java +++ b/src/main/java/de/kosit/validationtool/impl/tasks/CreateReportAction.java @@ -33,7 +33,6 @@ import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; import org.xml.sax.SAXNotSupportedException; import org.xml.sax.XMLReader; -import org.xml.sax.helpers.AttributesImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -44,7 +43,6 @@ import de.kosit.validationtool.impl.EngineInformation; import de.kosit.validationtool.impl.Scenario; import de.kosit.validationtool.model.reportInput.XMLSyntaxError; -import net.sf.saxon.s9api.BuildingContentHandler; import net.sf.saxon.s9api.DocumentBuilder; import net.sf.saxon.s9api.Processor; import net.sf.saxon.s9api.QName; @@ -53,6 +51,8 @@ import net.sf.saxon.s9api.XdmDestination; import net.sf.saxon.s9api.XdmNode; import net.sf.saxon.s9api.XsltExecutable; import net.sf.saxon.s9api.XsltTransformer; +import net.sf.saxon.sapling.SaplingDocument; +import net.sf.saxon.sapling.Saplings; /** * Erzeugt den Report auf Basis der gesammelten Informationen über den Prüfling. Sollte kein Szenario identifiziert @@ -64,6 +64,64 @@ import net.sf.saxon.s9api.XsltTransformer; @Slf4j public class CreateReportAction implements CheckAction { + private static final String ERROR_MESSAGE_ELEMENT = "error-message"; + + private final Processor processor; + + private final ConversionService conversionService; + + private static XsltExecutable loadFromScenario(final Scenario object) { + return object.getReportTransformation().getExecutable(); + } + + private static XsltExecutable getTransformation(final Bag results) { + return loadFromScenario(results.getScenarioSelectionResult().getObject()); + } + + @Override + public void check(final Bag results) { + final DocumentBuilder documentBuilder = this.processor.newDocumentBuilder(); + try { + + final XdmNode parsedDocument = results.getParserResult().isValid() ? results.getParserResult().getObject() + : createErrorInformation(results.getParserResult().getErrors()); + + final Marshaller marshaller = this.conversionService.getJaxbContext().createMarshaller(); + final JAXBSource source = new JAXBSource(marshaller, results.getReportInput()); + // wrap to circumvent inconsistency between sax and saxon + source.setXMLReader(new ReaderWrapper(source.getXMLReader())); + + final XdmNode root = documentBuilder.build(source); + final XsltTransformer transformer = getTransformation(results).load(); + transformer.setInitialContextNode(root); + final CollectingErrorEventHandler e = new CollectingErrorEventHandler(); + transformer.setMessageListener(e); + final Scenario scenario = results.getScenarioSelectionResult().getObject(); + transformer.setURIResolver(scenario.getUriResolver()); + + if (scenario.getUnparsedTextURIResolver() != null) { + transformer.getUnderlyingController().setUnparsedTextURIResolver(scenario.getUnparsedTextURIResolver()); + } + if (parsedDocument != null) { + transformer.setParameter(new QName("input-document"), parsedDocument); + } + final XdmDestination destination = new XdmDestination(); + transformer.setDestination(destination); + transformer.transform(); + results.setReport(destination.getXdmNode()); + + } catch (final SaxonApiException | JAXBException e) { + log.error("Error creating final report", e); + results.stopProcessing("Can not create final report: " + e.getMessage()); + } + } + + private XdmNode createErrorInformation(final Collection errors) throws SaxonApiException { + final String message = errors.stream().map(XMLSyntaxError::getMessage).collect(Collectors.joining()); + final SaplingDocument doc = Saplings.doc(EngineInformation.getFrameworkNamespace()); + return doc.withChild(Saplings.elem(ERROR_MESSAGE_ELEMENT).withText(message)).toXdmNode(this.processor); + } + /** * Wrapper to fix some inconsistencies between sax and saxon. Saxon tries to set some properties which has no effect * on {@link JAXBSource}'s XMLReader, but it throws exceptions on unknown properties. This just drops this @@ -113,19 +171,14 @@ public class CreateReportAction implements CheckAction { this.delegate.setProperty(name, value); } - @Override - public void setEntityResolver(final EntityResolver resolver) { - this.delegate.setEntityResolver(resolver); - } - @Override public EntityResolver getEntityResolver() { return this.delegate.getEntityResolver(); } @Override - public void setDTDHandler(final DTDHandler handler) { - this.delegate.setDTDHandler(handler); + public void setEntityResolver(final EntityResolver resolver) { + this.delegate.setEntityResolver(resolver); } @Override @@ -134,8 +187,8 @@ public class CreateReportAction implements CheckAction { } @Override - public void setContentHandler(final ContentHandler handler) { - this.delegate.setContentHandler(handler); + public void setDTDHandler(final DTDHandler handler) { + this.delegate.setDTDHandler(handler); } @Override @@ -144,8 +197,8 @@ public class CreateReportAction implements CheckAction { } @Override - public void setErrorHandler(final ErrorHandler handler) { - this.delegate.setErrorHandler(handler); + public void setContentHandler(final ContentHandler handler) { + this.delegate.setContentHandler(handler); } @Override @@ -153,6 +206,11 @@ public class CreateReportAction implements CheckAction { return this.delegate.getErrorHandler(); } + @Override + public void setErrorHandler(final ErrorHandler handler) { + this.delegate.setErrorHandler(handler); + } + @Override public void parse(final InputSource input) throws IOException, SAXException { this.delegate.parse(input); @@ -164,67 +222,4 @@ public class CreateReportAction implements CheckAction { } } - private static final String ERROR_MESSAGE_ELEMENT = "error-message"; - - private final Processor processor; - - private final ConversionService conversionService; - - private static XsltExecutable loadFromScenario(final Scenario object) { - return object.getReportTransformation().getExecutable(); - } - - @Override - public void check(final Bag results) { - final DocumentBuilder documentBuilder = this.processor.newDocumentBuilder(); - try { - - final XdmNode parsedDocument = results.getParserResult().isValid() ? results.getParserResult().getObject() - : createErrorInformation(results.getParserResult().getErrors()); - - final Marshaller marshaller = this.conversionService.getJaxbContext().createMarshaller(); - final JAXBSource source = new JAXBSource(marshaller, results.getReportInput()); - // wrap to circumvent inconsistency between sax and saxon - source.setXMLReader(new ReaderWrapper(source.getXMLReader())); - - final XdmNode root = documentBuilder.build(source); - final XsltTransformer transformer = getTransformation(results).load(); - transformer.setInitialContextNode(root); - final CollectingErrorEventHandler e = new CollectingErrorEventHandler(); - transformer.setMessageListener(e); - final Scenario scenario = results.getScenarioSelectionResult().getObject(); - transformer.setURIResolver(scenario.getUriResolver()); - - if (scenario.getUnparsedTextURIResolver() != null) { - transformer.getUnderlyingController().setUnparsedTextURIResolver(scenario.getUnparsedTextURIResolver()); - } - if (parsedDocument != null) { - transformer.setParameter(new QName("input-document"), parsedDocument); - } - final XdmDestination destination = new XdmDestination(); - transformer.setDestination(destination); - transformer.transform(); - results.setReport(destination.getXdmNode()); - - } catch (final SaxonApiException | SAXException | JAXBException e) { - log.error("Error creating final report", e); - results.stopProcessing("Can not create final report: " + e.getMessage()); - } - } - - private XdmNode createErrorInformation(final Collection errors) throws SaxonApiException, SAXException { - final BuildingContentHandler contentHandler = this.processor.newDocumentBuilder().newBuildingContentHandler(); - contentHandler.startDocument(); - contentHandler.startElement(EngineInformation.getFrameworkNamespace(), ERROR_MESSAGE_ELEMENT, ERROR_MESSAGE_ELEMENT, - new AttributesImpl()); - final String message = errors.stream().map(XMLSyntaxError::getMessage).collect(Collectors.joining()); - contentHandler.characters(message.toCharArray(), 0, message.length()); - contentHandler.endElement(EngineInformation.getFrameworkNamespace(), ERROR_MESSAGE_ELEMENT, ERROR_MESSAGE_ELEMENT); - return contentHandler.getDocumentNode(); - } - - private static XsltExecutable getTransformation(final Bag results) { - return loadFromScenario(results.getScenarioSelectionResult().getObject()); - } - }