Skip to content

Commit

Permalink
Issue #10066 - Allow customization of SAXParserFactory and `SAXPars…
Browse files Browse the repository at this point in the history
…er` in `XmlParser` (#10067)

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

Signed-off-by: Joakim Erdfelt <[email protected]>
Co-authored-by: Greg Wilkins <[email protected]>
  • Loading branch information
joakime and gregw authored Jul 6, 2023
1 parent dee0d4f commit 9a05c75
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 2 deletions.
14 changes: 12 additions & 2 deletions jetty-xml/src/main/java/org/eclipse/jetty/xml/XmlParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -83,11 +83,16 @@ AutoLock lock()
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();

Expand Down Expand Up @@ -129,6 +134,11 @@ public boolean isValidating()
return _parser.isValidating();
}

public SAXParser getSAXParser()
{
return _parser;
}

public void redirectEntity(String name, URL entity)
{
if (entity != null)
Expand Down
35 changes: 35 additions & 0 deletions jetty-xml/src/test/java/org/eclipse/jetty/xml/XmlParserTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand All @@ -38,4 +45,32 @@ public void testXmlParser() throws Exception
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"));
}
}

0 comments on commit 9a05c75

Please sign in to comment.