Issue #10066 - Allow customization of `SAXParserFactory` and `SAXParser` in `XmlParser` (#10067)

* Allow customization of SAXParserFactory / SAXParser in XmlParser
* Introduce method `.getSAXParser()`
---------

Signed-off-by: Joakim Erdfelt <joakim.erdfelt@gmail.com>
Co-authored-by: Greg Wilkins <gregw@webtide.com>
This commit is contained in:
Joakim Erdfelt 2023-07-06 16:32:49 -05:00 committed by GitHub
parent dee0d4ff7d
commit 9a05c75ad2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 47 additions and 2 deletions

View File

@ -66,7 +66,7 @@ public class XmlParser
*/
public XmlParser()
{
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParserFactory factory = newSAXParserFactory();
boolean validatingDefault = factory.getClass().toString().contains("org.apache.xerces.");
String validatingProp = System.getProperty("org.eclipse.jetty.xml.XmlParser.Validating", validatingDefault ? "true" : "false");
boolean validating = Boolean.valueOf(validatingProp).booleanValue();
@ -83,11 +83,16 @@ public class XmlParser
return _lock.lock();
}
protected SAXParserFactory newSAXParserFactory()
{
return SAXParserFactory.newInstance();
}
public void setValidating(boolean validating)
{
try
{
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParserFactory factory = newSAXParserFactory();
factory.setValidating(validating);
_parser = factory.newSAXParser();
@ -129,6 +134,11 @@ public class XmlParser
return _parser.isValidating();
}
public SAXParser getSAXParser()
{
return _parser;
}
public void redirectEntity(String name, URL entity)
{
if (entity != null)

View File

@ -14,10 +14,17 @@
package org.eclipse.jetty.xml;
import java.net.URL;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.junit.jupiter.api.Test;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
public class XmlParserTest
{
@ -38,4 +45,32 @@ public class XmlParserTest
assertTrue(testDocStr.startsWith("<Configure"));
assertTrue(testDocStr.endsWith("</Configure>"));
}
/**
* Customize SAXParserFactory behavior.
*/
@Test
public void testNewSAXParserFactory() throws SAXException
{
XmlParser xmlParser = new XmlParser()
{
@Override
protected SAXParserFactory newSAXParserFactory()
{
SAXParserFactory saxParserFactory = super.newSAXParserFactory();
// Configure at factory level
saxParserFactory.setXIncludeAware(false);
return saxParserFactory;
}
};
SAXParser saxParser = xmlParser.getSAXParser();
assertNotNull(saxParser);
XMLReader xmlReader = saxParser.getXMLReader();
// Only run testcase if Xerces is being used.
assumeTrue(xmlReader.getClass().getName().contains("org.apache.xerces."));
// look to see it was set at XMLReader level
assertFalse(xmlReader.getFeature("http://apache.org/xml/features/xinclude"));
}
}