Author: fanningpj Date: Sat Aug 18 17:06:41 2018 New Revision: 1838345 URL: http://svn.apache.org/viewvc?rev=1838345&view=rev Log: use XmlOptions for parser properties instead of system properties
Modified: xmlbeans/trunk/CHANGES.txt xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/DocumentHelper.java xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/LoadSaveUtils.java xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/SAXHelper.java xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/StaxHelper.java xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/XMLBeansConstants.java xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Locale.java xmlbeans/trunk/src/xmlcomp/org/apache/xmlbeans/impl/tool/StreamInstanceValidator.java xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/XmlOptions.java xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/XmlOptionsBean.java xmlbeans/trunk/test/src/dom/checkin/ParserTest.java xmlbeans/trunk/test/src/misc/common/ParsersBase.java xmlbeans/trunk/test/src/misc/detailed/CharEncodingTest.java Modified: xmlbeans/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/xmlbeans/trunk/CHANGES.txt?rev=1838345&r1=1838344&r2=1838345&view=diff ============================================================================== --- xmlbeans/trunk/CHANGES.txt (original) +++ xmlbeans/trunk/CHANGES.txt Sat Aug 18 17:06:41 2018 @@ -1,3 +1,8 @@ +Changes in V3.0.1 since V3.0.0 + +* XMLBEANS-518: add support to XmlOptions to allow control over the XML parser settings that affect DTD loading +and entity expansion + Changes in V3.0.0 since V2.6.0 * XMLBEANS-517: use safe XML parsers Modified: xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/DocumentHelper.java URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/DocumentHelper.java?rev=1838345&r1=1838344&r2=1838345&view=diff ============================================================================== --- xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/DocumentHelper.java (original) +++ xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/DocumentHelper.java Sat Aug 18 17:06:41 2018 @@ -25,6 +25,7 @@ import javax.xml.parsers.DocumentBuilder import javax.xml.parsers.ParserConfigurationException; import javax.xml.stream.events.Namespace; +import org.apache.xmlbeans.XmlOptionsBean; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.ErrorHandler; @@ -77,12 +78,13 @@ public final class DocumentHelper { /** * Creates a new document builder, with sensible defaults * + * @param xmlOptions * @throws IllegalStateException If creating the DocumentBuilder fails, e.g. * due to {@link ParserConfigurationException}. */ - public static synchronized DocumentBuilder newDocumentBuilder() { + public static synchronized DocumentBuilder newDocumentBuilder(XmlOptionsBean xmlOptions) { try { - DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + DocumentBuilder documentBuilder = documentBuilderFactory(xmlOptions).newDocumentBuilder(); documentBuilder.setEntityResolver(SAXHelper.IGNORING_ENTITY_RESOLVER); documentBuilder.setErrorHandler(new DocHelperErrorHandler()); return documentBuilder; @@ -91,14 +93,15 @@ public final class DocumentHelper { } } - private static final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - static { + private static final DocumentBuilderFactory documentBuilderFactory(XmlOptionsBean options) { + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); documentBuilderFactory.setNamespaceAware(true); documentBuilderFactory.setValidating(false); trySetFeature(documentBuilderFactory, XMLConstants.FEATURE_SECURE_PROCESSING, true); - trySetFeature(documentBuilderFactory, XMLBeansConstants.FEATURE_LOAD_DTD_GRAMMAR, XMLBeansConstants.isLoadDtdGrammar()); - trySetFeature(documentBuilderFactory, XMLBeansConstants.FEATURE_LOAD_EXTERNAL_DTD, XMLBeansConstants.isLoadExternalDtd()); - trySetXercesSecurityManager(documentBuilderFactory); + trySetFeature(documentBuilderFactory, XMLBeansConstants.FEATURE_LOAD_DTD_GRAMMAR, options.isLoadDTDGrammar()); + trySetFeature(documentBuilderFactory, XMLBeansConstants.FEATURE_LOAD_EXTERNAL_DTD, options.isLoadExternalDTD()); + trySetXercesSecurityManager(documentBuilderFactory, options); + return documentBuilderFactory; } private static void trySetFeature(DocumentBuilderFactory dbf, String feature, boolean enabled) { @@ -111,7 +114,7 @@ public final class DocumentHelper { } } - private static void trySetXercesSecurityManager(DocumentBuilderFactory dbf) { + private static void trySetXercesSecurityManager(DocumentBuilderFactory dbf, XmlOptionsBean options) { // Try built-in JVM one first, standalone if not for (String securityManagerClassName : new String[]{ //"com.sun.org.apache.xerces.internal.util.SecurityManager", @@ -120,8 +123,8 @@ public final class DocumentHelper { try { Object mgr = Class.forName(securityManagerClassName).newInstance(); Method setLimit = mgr.getClass().getMethod("setEntityExpansionLimit", Integer.TYPE); - setLimit.invoke(mgr, XMLBeansConstants.getEntityExpansionLimit()); - dbf.setAttribute(XMLBeansConstants.XML_PROPERTY_SECURITY_MANAGER, mgr); + setLimit.invoke(mgr, options.getEntityExpansionLimit()); + dbf.setAttribute(XMLBeansConstants.SECURITY_MANAGER, mgr); // Stop once one can be setup without error return; } catch (ClassNotFoundException e) { @@ -132,7 +135,7 @@ public final class DocumentHelper { } // separate old version of Xerces not found => use the builtin way of setting the property - dbf.setAttribute(XMLBeansConstants.XML_PROPERTY_ENTITY_EXPANSION_LIMIT, XMLBeansConstants.getEntityExpansionLimit()); + dbf.setAttribute(XMLBeansConstants.ENTITY_EXPANSION_LIMIT, options.getEntityExpansionLimit()); } /** @@ -141,8 +144,8 @@ public final class DocumentHelper { * @param inp Stream to read the XML data from * @return the parsed Document */ - public static Document readDocument(InputStream inp) throws IOException, SAXException { - return newDocumentBuilder().parse(inp); + public static Document readDocument(XmlOptionsBean xmlOptions, InputStream inp) throws IOException, SAXException { + return newDocumentBuilder(xmlOptions).parse(inp); } /** @@ -151,12 +154,12 @@ public final class DocumentHelper { * @param inp sax source to read the XML data from * @return the parsed Document */ - public static Document readDocument(InputSource inp) throws IOException, SAXException { - return newDocumentBuilder().parse(inp); + public static Document readDocument(XmlOptionsBean xmlOptions, InputSource inp) throws IOException, SAXException { + return newDocumentBuilder(xmlOptions).parse(inp); } // must only be used to create empty documents, do not use it for parsing! - private static final DocumentBuilder documentBuilderSingleton = newDocumentBuilder(); + private static final DocumentBuilder documentBuilderSingleton = newDocumentBuilder(new XmlOptionsBean()); /** * Creates a new DOM Document Modified: xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/LoadSaveUtils.java URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/LoadSaveUtils.java?rev=1838345&r1=1838344&r2=1838345&view=diff ============================================================================== --- xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/LoadSaveUtils.java (original) +++ xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/LoadSaveUtils.java Sat Aug 18 17:06:41 2018 @@ -39,7 +39,7 @@ public class LoadSaveUtils public static Document xmlText2GenericDom(InputStream is, Document emptyDoc) throws SAXException, ParserConfigurationException, IOException { - SAXParser parser = SAXHelper.saxFactory.newSAXParser(); + SAXParser parser = SAXHelper.saxFactory().newSAXParser(); Sax2Dom handler = new Sax2Dom(emptyDoc); Modified: xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/SAXHelper.java URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/SAXHelper.java?rev=1838345&r1=1838344&r2=1838345&view=diff ============================================================================== --- xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/SAXHelper.java (original) +++ xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/SAXHelper.java Sat Aug 18 17:06:41 2018 @@ -24,6 +24,7 @@ import javax.xml.XMLConstants; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; +import org.apache.xmlbeans.XmlOptionsBean; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -41,30 +42,34 @@ public final class SAXHelper { /** * Creates a new SAX XMLReader, with sensible defaults */ - public static synchronized XMLReader newXMLReader() throws SAXException, ParserConfigurationException { - XMLReader xmlReader = saxFactory.newSAXParser().getXMLReader(); + public static XMLReader newXMLReader(XmlOptionsBean options) throws SAXException, ParserConfigurationException { + XMLReader xmlReader = saxFactory(options).newSAXParser().getXMLReader(); xmlReader.setEntityResolver(IGNORING_ENTITY_RESOLVER); trySetSAXFeature(xmlReader, XMLConstants.FEATURE_SECURE_PROCESSING); - trySetXercesSecurityManager(xmlReader); + trySetXercesSecurityManager(xmlReader, options); return xmlReader; } - static final EntityResolver IGNORING_ENTITY_RESOLVER = new EntityResolver() { + public static final EntityResolver IGNORING_ENTITY_RESOLVER = new EntityResolver() { @Override public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { return new InputSource(new StringReader("")); } }; - - static final SAXParserFactory saxFactory; - static { - saxFactory = SAXParserFactory.newInstance(); + + static SAXParserFactory saxFactory() { + return saxFactory(new XmlOptionsBean()); + } + + static SAXParserFactory saxFactory(XmlOptionsBean options) { + SAXParserFactory saxFactory = SAXParserFactory.newInstance(); saxFactory.setValidating(false); saxFactory.setNamespaceAware(true); trySetSAXFeature(saxFactory, XMLConstants.FEATURE_SECURE_PROCESSING, true); - trySetSAXFeature(saxFactory, XMLBeansConstants.FEATURE_LOAD_DTD_GRAMMAR, XMLBeansConstants.isLoadDtdGrammar()); - trySetSAXFeature(saxFactory, XMLBeansConstants.FEATURE_LOAD_EXTERNAL_DTD, XMLBeansConstants.isLoadExternalDtd()); + trySetSAXFeature(saxFactory, XMLBeansConstants.FEATURE_LOAD_DTD_GRAMMAR, options.isLoadDTDGrammar()); + trySetSAXFeature(saxFactory, XMLBeansConstants.FEATURE_LOAD_EXTERNAL_DTD, options.isLoadExternalDTD()); + return saxFactory; } private static void trySetSAXFeature(SAXParserFactory spf, String feature, boolean flag) { @@ -87,7 +92,7 @@ public final class SAXHelper { } } - private static void trySetXercesSecurityManager(XMLReader xmlReader) { + private static void trySetXercesSecurityManager(XMLReader xmlReader, XmlOptionsBean options) { // Try built-in JVM one first, standalone if not for (String securityManagerClassName : new String[] { //"com.sun.org.apache.xerces.internal.util.SecurityManager", @@ -96,8 +101,8 @@ public final class SAXHelper { try { Object mgr = Class.forName(securityManagerClassName).newInstance(); Method setLimit = mgr.getClass().getMethod("setEntityExpansionLimit", Integer.TYPE); - setLimit.invoke(mgr, XMLBeansConstants.getEntityExpansionLimit()); - xmlReader.setProperty(XMLBeansConstants.XML_PROPERTY_SECURITY_MANAGER, mgr); + setLimit.invoke(mgr, options.getEntityExpansionLimit()); + xmlReader.setProperty(XMLBeansConstants.SECURITY_MANAGER, mgr); // Stop once one can be setup without error return; } catch (Throwable e) { // NOSONAR - also catch things like NoClassDefError here @@ -111,7 +116,7 @@ public final class SAXHelper { // separate old version of Xerces not found => use the builtin way of setting the property try { - xmlReader.setProperty(XMLBeansConstants.XML_PROPERTY_ENTITY_EXPANSION_LIMIT, XMLBeansConstants.getEntityExpansionLimit()); + xmlReader.setProperty(XMLBeansConstants.ENTITY_EXPANSION_LIMIT, options.getEntityExpansionLimit()); } catch (SAXException e) { // NOSONAR - also catch things like NoClassDefError here // throttle the log somewhat as it can spam the log otherwise if(System.currentTimeMillis() > lastLog + TimeUnit.MINUTES.toMillis(5)) { Modified: xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/StaxHelper.java URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/StaxHelper.java?rev=1838345&r1=1838344&r2=1838345&view=diff ============================================================================== --- xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/StaxHelper.java (original) +++ xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/StaxHelper.java Sat Aug 18 17:06:41 2018 @@ -19,6 +19,7 @@ import javax.xml.stream.XMLEventFactory; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLOutputFactory; +import org.apache.xmlbeans.XmlOptionsBean; /** * Provides handy methods for working with StAX parsers and readers @@ -31,19 +32,19 @@ public final class StaxHelper { /** * Creates a new StAX XMLInputFactory, with sensible defaults */ - public static XMLInputFactory newXMLInputFactory() { + public static XMLInputFactory newXMLInputFactory(XmlOptionsBean options) { XMLInputFactory factory = XMLInputFactory.newFactory(); trySetProperty(factory, XMLInputFactory.IS_NAMESPACE_AWARE, true); trySetProperty(factory, XMLInputFactory.IS_VALIDATING, false); - trySetProperty(factory, XMLInputFactory.SUPPORT_DTD, XMLBeansConstants.isLoadDtdGrammar()); - trySetProperty(factory, XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, XMLBeansConstants.isLoadExternalDtd()); + trySetProperty(factory, XMLInputFactory.SUPPORT_DTD, options.isLoadDTDGrammar()); + trySetProperty(factory, XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, options.isLoadExternalDTD()); return factory; } /** * Creates a new StAX XMLOutputFactory, with sensible defaults */ - public static XMLOutputFactory newXMLOutputFactory() { + public static XMLOutputFactory newXMLOutputFactory(XmlOptionsBean options) { XMLOutputFactory factory = XMLOutputFactory.newFactory(); trySetProperty(factory, XMLOutputFactory.IS_REPAIRING_NAMESPACES, true); return factory; @@ -52,7 +53,7 @@ public final class StaxHelper { /** * Creates a new StAX XMLEventFactory, with sensible defaults */ - public static XMLEventFactory newXMLEventFactory() { + public static XMLEventFactory newXMLEventFactory(XmlOptionsBean options) { return XMLEventFactory.newFactory(); } Modified: xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/XMLBeansConstants.java URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/XMLBeansConstants.java?rev=1838345&r1=1838344&r2=1838345&view=diff ============================================================================== --- xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/XMLBeansConstants.java (original) +++ xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/XMLBeansConstants.java Sat Aug 18 17:06:41 2018 @@ -15,23 +15,11 @@ package org.apache.xmlbeans.impl.common; +import org.apache.xmlbeans.XmlOptions; + public class XMLBeansConstants { - public static final String PROPERTY_ENTITY_EXPANSION_LIMIT = "xmlbeans.entity.expansion.limit"; - public static final String PROPERTY_LOAD_DTD_GRAMMAR = "xmlbeans.load.dtd.grammar"; - public static final String PROPERTY_LOAD_EXTERNAL_DTD = "xmlbeans.load.external.dtd"; - public static final int DEFAULT_ENTITY_EXPANSION_LIMIT = 2048; - public static final String XML_PROPERTY_ENTITY_EXPANSION_LIMIT = "http://www.oracle.com/xml/jaxp/properties/entityExpansionLimit"; - public static final String XML_PROPERTY_SECURITY_MANAGER = "http://apache.org/xml/properties/security-manager"; + public static final String ENTITY_EXPANSION_LIMIT = "http://www.oracle.com/xml/jaxp/properties/entityExpansionLimit"; + public static final String SECURITY_MANAGER = "http://apache.org/xml/properties/security-manager"; public static final String FEATURE_LOAD_DTD_GRAMMAR = "http://apache.org/xml/features/nonvalidating/load-dtd-grammar"; public static final String FEATURE_LOAD_EXTERNAL_DTD = "http://apache.org/xml/features/nonvalidating/load-external-dtd"; - - public static int getEntityExpansionLimit() { - return Integer.getInteger(PROPERTY_ENTITY_EXPANSION_LIMIT, DEFAULT_ENTITY_EXPANSION_LIMIT); - } - public static boolean isLoadDtdGrammar() { - return Boolean.getBoolean(PROPERTY_LOAD_DTD_GRAMMAR); - } - public static boolean isLoadExternalDtd() { - return Boolean.getBoolean(PROPERTY_LOAD_EXTERNAL_DTD); - } } Modified: xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Locale.java URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Locale.java?rev=1838345&r1=1838344&r2=1838345&view=diff ============================================================================== --- xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Locale.java (original) +++ xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Locale.java Sat Aug 18 17:06:41 2018 @@ -82,6 +82,7 @@ import org.apache.xmlbeans.XmlErrorCodes import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlObject; import org.apache.xmlbeans.XmlOptions; +import org.apache.xmlbeans.XmlOptionsBean; import org.apache.xmlbeans.XmlSaxHandler; import org.apache.xmlbeans.SchemaType; import org.apache.xmlbeans.SchemaTypeLoader; @@ -3051,7 +3052,7 @@ public final class Locale if (xr == null) { try { - xr = SAXHelper.newXMLReader(); + xr = SAXHelper.newXMLReader(new XmlOptionsBean(options)); } catch(Exception e) { throw new XmlException("Problem creating XMLReader", e); } Modified: xmlbeans/trunk/src/xmlcomp/org/apache/xmlbeans/impl/tool/StreamInstanceValidator.java URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/xmlcomp/org/apache/xmlbeans/impl/tool/StreamInstanceValidator.java?rev=1838345&r1=1838344&r2=1838345&view=diff ============================================================================== --- xmlbeans/trunk/src/xmlcomp/org/apache/xmlbeans/impl/tool/StreamInstanceValidator.java (original) +++ xmlbeans/trunk/src/xmlcomp/org/apache/xmlbeans/impl/tool/StreamInstanceValidator.java Sat Aug 18 17:06:41 2018 @@ -20,6 +20,7 @@ import org.apache.xmlbeans.XmlBeans; import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlObject; import org.apache.xmlbeans.XmlOptions; +import org.apache.xmlbeans.XmlOptionsBean; import org.apache.xmlbeans.XmlError; import org.apache.xmlbeans.impl.common.StaxHelper; import org.apache.xmlbeans.impl.validator.ValidatingXMLStreamReader; @@ -40,8 +41,6 @@ import java.util.HashSet; public class StreamInstanceValidator { - private static final XMLInputFactory XML_INPUT_FACTORY = StaxHelper.newXMLInputFactory(); - public static void printUsage() { System.out.println("Validates the specified instance against the specified schema."); @@ -174,9 +173,11 @@ public class StreamInstanceValidator errors.clear(); try { + final XMLInputFactory xmlInputFactory = StaxHelper.newXMLInputFactory(new XmlOptionsBean(options)); + final FileInputStream fis = new FileInputStream(file); final XMLStreamReader rdr = - XML_INPUT_FACTORY.createXMLStreamReader(path, fis); + xmlInputFactory.createXMLStreamReader(path, fis); //advance to first start element. while(!rdr.isStartElement()) { Modified: xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/XmlOptions.java URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/XmlOptions.java?rev=1838345&r1=1838344&r2=1838345&view=diff ============================================================================== --- xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/XmlOptions.java (original) +++ xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/XmlOptions.java Sat Aug 18 17:06:41 2018 @@ -613,7 +613,7 @@ public class XmlOptions implements java. } /** - * By default, XmlBeans uses an internal Piccolo parser, + * By default, XmlBeans creates a JAXP parser, * other parsers can be used by providing an XMLReader. * For using the default JDK's SAX parser use: * xmlOptions.setLoadUseXMLReader( SAXParserFactory.newInstance().newSAXParser().getXMLReader() ); @@ -858,7 +858,7 @@ public class XmlOptions implements java. */ public XmlOptions setCopyUseNewSynchronizationDomain (boolean useNewSyncDomain) { - return set(COPY_USE_NEW_SYNC_DOMAIN, useNewSyncDomain ? Boolean.TRUE : Boolean.FALSE ); + return set(COPY_USE_NEW_SYNC_DOMAIN, useNewSyncDomain); } /** @@ -872,6 +872,41 @@ public class XmlOptions implements java. return set(LOAD_ENTITY_BYTES_LIMIT,entityBytesLimit); } + /** + * Sets the maximum number of entity expansions allowed during parsing. + * The default value is 2048. + * @param entityExpansionLimit + * @return this + */ + public XmlOptions setEntityExpansionLimit (int entityExpansionLimit) + { + return set(ENTITY_EXPANSION_LIMIT, entityExpansionLimit); + } + + /** + * Controls whether DTD grammar is loaded during parsing. + * The default value is false. + * + * @param loadDTDGrammar + * @return this + */ + public XmlOptions setLoadDTDGrammar (boolean loadDTDGrammar) + { + return set(LOAD_DTD_GRAMMAR, loadDTDGrammar); + } + + /** + * Controls whether external DTDs are loaded during parsing. + * The default value is false. + * + * @param loadExternalDTD + * @return this + */ + public XmlOptions setLoadExternalDTD (boolean loadExternalDTD) + { + return set(LOAD_EXTERNAL_DTD, loadExternalDTD); + } + public static final String GENERATE_JAVA_14 = "1.4"; public static final String GENERATE_JAVA_15 = "1.5"; @@ -996,6 +1031,14 @@ public class XmlOptions implements java. public static final String COPY_USE_NEW_SYNC_DOMAIN = "COPY_USE_NEW_LOCALE"; /** @exclude */ public static final String LOAD_ENTITY_BYTES_LIMIT = "LOAD_ENTITY_BYTES_LIMIT"; + /** @exclude */ + public static final String ENTITY_EXPANSION_LIMIT = "ENTITY_EXPANSION_LIMIT"; + /** @exclude */ + public static final String LOAD_DTD_GRAMMAR = "LOAD_DTD_GRAMMAR"; + /** @exclude */ + public static final String LOAD_EXTERNAL_DTD = "LOAD_EXTERNAL_DTD"; + + public static final int DEFAULT_ENTITY_EXPANSION_LIMIT = 2048; private static final XmlOptions EMPTY_OPTIONS; static { Modified: xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/XmlOptionsBean.java URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/XmlOptionsBean.java?rev=1838345&r1=1838344&r2=1838345&view=diff ============================================================================== --- xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/XmlOptionsBean.java (original) +++ xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/XmlOptionsBean.java Sat Aug 18 17:06:41 2018 @@ -442,4 +442,22 @@ public class XmlOptionsBean extends XmlO { return (String) get( GENERATE_JAVA_VERSION ); } + + public int getEntityExpansionLimit() + { + Integer limit = (Integer) get( ENTITY_EXPANSION_LIMIT ); + return limit == null ? DEFAULT_ENTITY_EXPANSION_LIMIT : limit; + } + + public boolean isLoadDTDGrammar() + { + Boolean flag = (Boolean) get( LOAD_DTD_GRAMMAR ); + return flag == null ? false : flag; + } + + public boolean isLoadExternalDTD() + { + Boolean flag = (Boolean) get( LOAD_EXTERNAL_DTD ); + return flag == null ? false : flag; + } } Modified: xmlbeans/trunk/test/src/dom/checkin/ParserTest.java URL: http://svn.apache.org/viewvc/xmlbeans/trunk/test/src/dom/checkin/ParserTest.java?rev=1838345&r1=1838344&r2=1838345&view=diff ============================================================================== --- xmlbeans/trunk/test/src/dom/checkin/ParserTest.java (original) +++ xmlbeans/trunk/test/src/dom/checkin/ParserTest.java Sat Aug 18 17:06:41 2018 @@ -16,11 +16,16 @@ package dom.checkin; +import java.io.ByteArrayInputStream; +import javax.xml.XMLConstants; import javax.xml.stream.XMLInputFactory; import junit.framework.*; +import org.apache.xmlbeans.XmlOptionsBean; import org.apache.xmlbeans.impl.common.*; +import org.xml.sax.InputSource; +import org.xml.sax.XMLReader; /** * Tests for XML Parser settings @@ -28,29 +33,26 @@ import org.apache.xmlbeans.impl.common.* public class ParserTest extends TestCase { - public void testXMLBeansConstantsDefaults() { - assertEquals(2048, XMLBeansConstants.getEntityExpansionLimit()); - assertFalse(XMLBeansConstants.isLoadDtdGrammar()); - assertFalse(XMLBeansConstants.isLoadExternalDtd()); + public void testXmlOptionsDefaults() { + XmlOptionsBean options = new XmlOptionsBean(); + assertEquals(2048, options.getEntityExpansionLimit()); + assertFalse(options.isLoadDTDGrammar()); + assertFalse(options.isLoadExternalDTD()); } public void testXMLBeansConstantsOverrides() { - try { - System.setProperty(XMLBeansConstants.PROPERTY_ENTITY_EXPANSION_LIMIT, "1"); - System.setProperty(XMLBeansConstants.PROPERTY_LOAD_DTD_GRAMMAR, "true"); - System.setProperty(XMLBeansConstants.PROPERTY_LOAD_EXTERNAL_DTD, "true"); - assertEquals(1, XMLBeansConstants.getEntityExpansionLimit()); - assertTrue(XMLBeansConstants.isLoadDtdGrammar()); - assertTrue(XMLBeansConstants.isLoadExternalDtd()); - } finally { - System.clearProperty(XMLBeansConstants.PROPERTY_ENTITY_EXPANSION_LIMIT); - System.clearProperty(XMLBeansConstants.PROPERTY_LOAD_DTD_GRAMMAR); - System.clearProperty(XMLBeansConstants.PROPERTY_LOAD_EXTERNAL_DTD); - } + XmlOptionsBean options = new XmlOptionsBean(); + options.setEntityExpansionLimit(1); + options.setLoadDTDGrammar(true); + options.setLoadExternalDTD(true); + assertEquals(1, options.getEntityExpansionLimit()); + assertTrue(options.isLoadDTDGrammar()); + assertTrue(options.isLoadExternalDTD()); } public void testXmlInputFactoryPropertyDefaults() { - XMLInputFactory factory = StaxHelper.newXMLInputFactory(); + XmlOptionsBean options = new XmlOptionsBean(); + XMLInputFactory factory = StaxHelper.newXMLInputFactory(options); assertEquals(true, factory.getProperty(XMLInputFactory.IS_NAMESPACE_AWARE)); assertEquals(false, factory.getProperty(XMLInputFactory.IS_VALIDATING)); assertEquals(false, factory.getProperty(XMLInputFactory.SUPPORT_DTD)); @@ -58,15 +60,39 @@ public class ParserTest extends TestCase } public void testXmlInputFactoryPropertyOverrides() { - try { - System.setProperty(XMLBeansConstants.PROPERTY_LOAD_DTD_GRAMMAR, "true"); - System.setProperty(XMLBeansConstants.PROPERTY_LOAD_EXTERNAL_DTD, "true"); - XMLInputFactory factory = StaxHelper.newXMLInputFactory(); - assertEquals(true, factory.getProperty(XMLInputFactory.SUPPORT_DTD)); - assertEquals(true, factory.getProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES)); - } finally { - System.clearProperty(XMLBeansConstants.PROPERTY_LOAD_DTD_GRAMMAR); - System.clearProperty(XMLBeansConstants.PROPERTY_LOAD_EXTERNAL_DTD); - } + XmlOptionsBean options = new XmlOptionsBean(); + options.setEntityExpansionLimit(1); + options.setLoadDTDGrammar(true); + options.setLoadExternalDTD(true); + XMLInputFactory factory = StaxHelper.newXMLInputFactory(options); + assertEquals(true, factory.getProperty(XMLInputFactory.SUPPORT_DTD)); + assertEquals(true, factory.getProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES)); + } + + public void testXMLReader() throws Exception { + XmlOptionsBean options = new XmlOptionsBean(); + XMLReader reader = SAXHelper.newXMLReader(options); + assertNotSame(reader, SAXHelper.newXMLReader(options)); + assertFalse(reader.getFeature(XMLBeansConstants.FEATURE_LOAD_DTD_GRAMMAR)); + assertFalse(reader.getFeature(XMLBeansConstants.FEATURE_LOAD_EXTERNAL_DTD)); + assertEquals(SAXHelper.IGNORING_ENTITY_RESOLVER, reader.getEntityResolver()); + assertNotNull(reader.getProperty(XMLBeansConstants.SECURITY_MANAGER)); + + reader.parse(new InputSource(new ByteArrayInputStream("<xml></xml>".getBytes("UTF-8")))); + } + + public void testXMLReaderOverrides() throws Exception { + XmlOptionsBean options = new XmlOptionsBean(); + options.setEntityExpansionLimit(1); + options.setLoadDTDGrammar(true); + options.setLoadExternalDTD(true); + XMLReader reader = SAXHelper.newXMLReader(options); + assertNotSame(reader, SAXHelper.newXMLReader(options)); + assertTrue(reader.getFeature(XMLBeansConstants.FEATURE_LOAD_DTD_GRAMMAR)); + assertTrue(reader.getFeature(XMLBeansConstants.FEATURE_LOAD_EXTERNAL_DTD)); + assertEquals(SAXHelper.IGNORING_ENTITY_RESOLVER, reader.getEntityResolver()); + assertNotNull(reader.getProperty(XMLBeansConstants.SECURITY_MANAGER)); + + reader.parse(new InputSource(new ByteArrayInputStream("<xml></xml>".getBytes("UTF-8")))); } } Modified: xmlbeans/trunk/test/src/misc/common/ParsersBase.java URL: http://svn.apache.org/viewvc/xmlbeans/trunk/test/src/misc/common/ParsersBase.java?rev=1838345&r1=1838344&r2=1838345&view=diff ============================================================================== --- xmlbeans/trunk/test/src/misc/common/ParsersBase.java (original) +++ xmlbeans/trunk/test/src/misc/common/ParsersBase.java Sat Aug 18 17:06:41 2018 @@ -40,16 +40,10 @@ public class ParsersBase extends TestCas // System Property Parser Value // ---------------------------------------------------------------------------------------------------------- // javax.xml.parsers.DocumentBuilderFactory Xerces org.apache.xerces.jaxp.DocumentBuilderFactoryImpl - // Crimson org.apache.crimson.jaxp.DocumentBuilderFactoryImpl - // Piccolo NA // // org.xml.sax.driver Xerces org.apache.xerces.parsers.SAXParser - // Crimson org.apache.crimson.parser.XmlReaderImpl - // Piccolo (Xbeans) org.apache.xmlbeans.impl.piccolo.xml.Piccolo // // javax.xml.parsers.SAXParserFactory Xerces org.apache.xerces.jaxp.SAXParserFactoryImpl - // Crimson org.apache.crimson.jaxp.SAXParserFactoryImpl - // Piccolo (XBeans) org.apache.xmlbeans.impl.piccolo.xml.JAXPSAXParserFactory // ---------------------------------------------------------------------------------------------------------- Modified: xmlbeans/trunk/test/src/misc/detailed/CharEncodingTest.java URL: http://svn.apache.org/viewvc/xmlbeans/trunk/test/src/misc/detailed/CharEncodingTest.java?rev=1838345&r1=1838344&r2=1838345&view=diff ============================================================================== --- xmlbeans/trunk/test/src/misc/detailed/CharEncodingTest.java (original) +++ xmlbeans/trunk/test/src/misc/detailed/CharEncodingTest.java Sat Aug 18 17:06:41 2018 @@ -33,38 +33,16 @@ public class CharEncodingTest extends Pa String I18N_test_string1 = "<i18n xmlns:\u00c1\u00c1\u00c1=\"\u00c1\u00c1\u00c1\" type=\"\u00c1\u00c1\u00c1:t\"/>"; String I18N_test_string2 = "<i18n xmlns:\u30af\u30af\u30af=\"\u30af\u30af\u30af\" type=\"\u30af\u30af\u30af:t\"/>"; - // Test all 3 parsers with string 1, this is a valid string and should pass - parseXmlWithSAXAPI(I18N_test_string1, - "Crimson", - "org.apache.crimson.parser.XmlReaderImpl", - "org.apache.crimson.jaxp.SAXParserFactoryImpl"); - parseXmlWithSAXAPI(I18N_test_string1, "Xerces", "org.apache.xerces.parsers.SAXParser", "org.apache.xerces.jaxp.SAXParserFactoryImpl"); - parseXmlWithSAXAPI(I18N_test_string1, - "Piccolo", - "org.apache.xmlbeans.impl.piccolo.xml.Piccolo", - "org.apache.xmlbeans.impl.piccolo.xml.JAXPSAXParserFactory"); - - // Now test all 3 parsers with string 2, this is a valid string and should pass but piccolo fails - parseXmlWithSAXAPI(I18N_test_string2, - "Crimson", - "org.apache.crimson.parser.XmlReaderImpl", - "org.apache.crimson.jaxp.SAXParserFactoryImpl"); - parseXmlWithSAXAPI(I18N_test_string2, "Xerces", "org.apache.xerces.parsers.SAXParser", "org.apache.xerces.jaxp.SAXParserFactoryImpl"); - parseXmlWithSAXAPI(I18N_test_string2, - "Piccolo", - "org.apache.xmlbeans.impl.piccolo.xml.Piccolo", - "org.apache.xmlbeans.impl.piccolo.xml.JAXPSAXParserFactory"); - } // Piccolo has an issue with handling external identifiers when the value is PUBLIC @@ -83,17 +61,6 @@ public class CharEncodingTest extends Pa "org.apache.xerces.parsers.SAXParser", "org.apache.xerces.jaxp.SAXParserFactoryImpl"); - parseXmlWithSAXAPI(netPubEntity, - "Piccolo", - "org.apache.xmlbeans.impl.piccolo.xml.Piccolo", - "org.apache.xmlbeans.impl.piccolo.xml.JAXPSAXParserFactory"); - - parseXmlWithSAXAPI(netPubEntity, - "Crimson", - "org.apache.crimson.parser.XmlReaderImpl", - "org.apache.crimson.jaxp.SAXParserFactoryImpl"); - - // parse same string using scomp XmlOptions options = new XmlOptions(); List errors = new ArrayList(); --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@poi.apache.org For additional commands, e-mail: dev-h...@poi.apache.org