Skip to content

Commit 9a05c75

Browse files
joakimegregw
andauthored
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 <[email protected]> Co-authored-by: Greg Wilkins <[email protected]>
1 parent dee0d4f commit 9a05c75

File tree

2 files changed

+47
-2
lines changed

2 files changed

+47
-2
lines changed

jetty-xml/src/main/java/org/eclipse/jetty/xml/XmlParser.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public class XmlParser
6666
*/
6767
public XmlParser()
6868
{
69-
SAXParserFactory factory = SAXParserFactory.newInstance();
69+
SAXParserFactory factory = newSAXParserFactory();
7070
boolean validatingDefault = factory.getClass().toString().contains("org.apache.xerces.");
7171
String validatingProp = System.getProperty("org.eclipse.jetty.xml.XmlParser.Validating", validatingDefault ? "true" : "false");
7272
boolean validating = Boolean.valueOf(validatingProp).booleanValue();
@@ -83,11 +83,16 @@ AutoLock lock()
8383
return _lock.lock();
8484
}
8585

86+
protected SAXParserFactory newSAXParserFactory()
87+
{
88+
return SAXParserFactory.newInstance();
89+
}
90+
8691
public void setValidating(boolean validating)
8792
{
8893
try
8994
{
90-
SAXParserFactory factory = SAXParserFactory.newInstance();
95+
SAXParserFactory factory = newSAXParserFactory();
9196
factory.setValidating(validating);
9297
_parser = factory.newSAXParser();
9398

@@ -129,6 +134,11 @@ public boolean isValidating()
129134
return _parser.isValidating();
130135
}
131136

137+
public SAXParser getSAXParser()
138+
{
139+
return _parser;
140+
}
141+
132142
public void redirectEntity(String name, URL entity)
133143
{
134144
if (entity != null)

jetty-xml/src/test/java/org/eclipse/jetty/xml/XmlParserTest.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,17 @@
1414
package org.eclipse.jetty.xml;
1515

1616
import java.net.URL;
17+
import javax.xml.parsers.SAXParser;
18+
import javax.xml.parsers.SAXParserFactory;
1719

1820
import org.junit.jupiter.api.Test;
21+
import org.xml.sax.SAXException;
22+
import org.xml.sax.XMLReader;
1923

24+
import static org.junit.jupiter.api.Assertions.assertFalse;
25+
import static org.junit.jupiter.api.Assertions.assertNotNull;
2026
import static org.junit.jupiter.api.Assertions.assertTrue;
27+
import static org.junit.jupiter.api.Assumptions.assumeTrue;
2128

2229
public class XmlParserTest
2330
{
@@ -38,4 +45,32 @@ public void testXmlParser() throws Exception
3845
assertTrue(testDocStr.startsWith("<Configure"));
3946
assertTrue(testDocStr.endsWith("</Configure>"));
4047
}
48+
49+
/**
50+
* Customize SAXParserFactory behavior.
51+
*/
52+
@Test
53+
public void testNewSAXParserFactory() throws SAXException
54+
{
55+
XmlParser xmlParser = new XmlParser()
56+
{
57+
@Override
58+
protected SAXParserFactory newSAXParserFactory()
59+
{
60+
SAXParserFactory saxParserFactory = super.newSAXParserFactory();
61+
// Configure at factory level
62+
saxParserFactory.setXIncludeAware(false);
63+
return saxParserFactory;
64+
}
65+
};
66+
67+
SAXParser saxParser = xmlParser.getSAXParser();
68+
assertNotNull(saxParser);
69+
70+
XMLReader xmlReader = saxParser.getXMLReader();
71+
// Only run testcase if Xerces is being used.
72+
assumeTrue(xmlReader.getClass().getName().contains("org.apache.xerces."));
73+
// look to see it was set at XMLReader level
74+
assertFalse(xmlReader.getFeature("http://apache.org/xml/features/xinclude"));
75+
}
4176
}

0 commit comments

Comments
 (0)