This is an automated email from the ASF dual-hosted git repository. michaelo pushed a commit to branch DOXIA-716 in repository https://gitbox.apache.org/repos/asf/maven-doxia.git
commit c8edfefb36b7b4d3639dd3f8cf39db7e8345960a Author: Michael Osipov <micha...@apache.org> AuthorDate: Sat Dec 30 13:40:13 2023 +0100 Make XMLValidator configurable --- .../maven/doxia/parser/AbstractXmlParser.java | 6 ++- .../org/apache/maven/doxia/util/XmlValidator.java | 46 +++++++++++++++++----- .../apache/maven/doxia/util/XmlValidatorTest.java | 3 ++ 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java b/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java index d0d143d6..aa60cb52 100644 --- a/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java +++ b/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java @@ -114,7 +114,11 @@ public abstract class AbstractXmlParser extends AbstractParser implements XmlMar throw new ParseException("Error reading the model", e); } - new XmlValidator().validate(content); + XmlValidator validator = new XmlValidator(); + validator.setDefaultHandler(new XmlValidator.MessagesErrorHandler()); + validator.setEntityResolver(new CachedFileEntityResolver()); + + validator.validate(content); src = new StringReader(content); } diff --git a/doxia-core/src/main/java/org/apache/maven/doxia/util/XmlValidator.java b/doxia-core/src/main/java/org/apache/maven/doxia/util/XmlValidator.java index 6f3b8dcf..709efc46 100644 --- a/doxia-core/src/main/java/org/apache/maven/doxia/util/XmlValidator.java +++ b/doxia-core/src/main/java/org/apache/maven/doxia/util/XmlValidator.java @@ -29,10 +29,10 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.maven.doxia.markup.XmlMarkup; -import org.apache.maven.doxia.parser.AbstractXmlParser.CachedFileEntityResolver; import org.apache.maven.doxia.parser.ParseException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; @@ -50,6 +50,34 @@ public class XmlValidator { /** lazy xmlReader to validate xml content*/ private XMLReader xmlReader; + private boolean validate = true; + private DefaultHandler defaultHandler; + private EntityResolver entityResolver; + + public boolean isValidate() { + return validate; + } + + public void setValidate(boolean validate) { + this.validate = validate; + } + + public DefaultHandler getDefaultHandler() { + return defaultHandler; + } + + public void setDefaultHandler(DefaultHandler defaultHandler) { + this.defaultHandler = defaultHandler; + } + + public EntityResolver getEntityResolver() { + return entityResolver; + } + + public void setEntityResolver(EntityResolver entityResolver) { + this.entityResolver = entityResolver; + } + /** * Validate an XML content with SAX. * @@ -69,7 +97,7 @@ public class XmlValidator { * @throws SAXException if any * @throws ParserConfigurationException */ - private XMLReader getXmlReader() throws SAXException, ParserConfigurationException { + public XMLReader getXmlReader() throws SAXException, ParserConfigurationException { if (xmlReader == null) { SAXParserFactory parserFactory = SAXParserFactory.newInstance(); parserFactory.setNamespaceAware(true); @@ -80,11 +108,11 @@ public class XmlValidator { // Always force language-neutral exception messages for MessagesErrorHandler parser.setProperty("http://apache.org/xml/properties/locale", Locale.ROOT); xmlReader = parser.getXMLReader(); - xmlReader.setFeature("http://xml.org/sax/features/validation", true); - xmlReader.setFeature("http://apache.org/xml/features/validation/dynamic", true); - xmlReader.setFeature("http://apache.org/xml/features/validation/schema", true); - xmlReader.setErrorHandler(new MessagesErrorHandler()); - xmlReader.setEntityResolver(new CachedFileEntityResolver()); + xmlReader.setFeature("http://xml.org/sax/features/validation", isValidate()); + xmlReader.setFeature("http://apache.org/xml/features/validation/dynamic", isValidate()); + xmlReader.setFeature("http://apache.org/xml/features/validation/schema", isValidate()); + xmlReader.setErrorHandler(getDefaultHandler()); + xmlReader.setEntityResolver(getEntityResolver()); } return xmlReader; @@ -93,7 +121,7 @@ public class XmlValidator { /** * Convenience class to beautify <code>SAXParseException</code> messages. */ - private static class MessagesErrorHandler extends DefaultHandler { + public static class MessagesErrorHandler extends DefaultHandler { private static final int TYPE_UNKNOWN = 0; private static final int TYPE_WARNING = 1; @@ -108,8 +136,6 @@ public class XmlValidator { private static final Pattern ELEMENT_TYPE_PATTERN = Pattern.compile("Element type \".*\" must be declared.", Pattern.DOTALL); - private MessagesErrorHandler() {} - /** {@inheritDoc} */ @Override public void warning(SAXParseException e) throws SAXException { diff --git a/doxia-core/src/test/java/org/apache/maven/doxia/util/XmlValidatorTest.java b/doxia-core/src/test/java/org/apache/maven/doxia/util/XmlValidatorTest.java index 1868ec1a..942d003a 100644 --- a/doxia-core/src/test/java/org/apache/maven/doxia/util/XmlValidatorTest.java +++ b/doxia-core/src/test/java/org/apache/maven/doxia/util/XmlValidatorTest.java @@ -19,6 +19,7 @@ package org.apache.maven.doxia.util; import org.apache.commons.io.IOUtils; +import org.apache.maven.doxia.parser.AbstractXmlParser.CachedFileEntityResolver; import org.codehaus.plexus.testing.PlexusTest; import org.codehaus.plexus.util.xml.XmlStreamReader; import org.junit.jupiter.api.Test; @@ -35,6 +36,8 @@ public class XmlValidatorTest { String xml = IOUtils.toString(new XmlStreamReader(this.getClass().getResourceAsStream("/test.xml"))); XmlValidator validator = new XmlValidator(); + validator.setDefaultHandler(new XmlValidator.MessagesErrorHandler()); + validator.setEntityResolver(new CachedFileEntityResolver()); validator.validate(xml); }