jaxp/src/com/sun/org/apache/xerces/internal/jaxp/SAXParserImpl.java
Print this page
@@ -110,11 +110,11 @@
private final ErrorHandler fInitErrorHandler;
/** Initial EntityResolver */
private final EntityResolver fInitEntityResolver;
- private XMLSecurityPropertyManager fSecurityPropertyMgr;
+ private final XMLSecurityPropertyManager fSecurityPropertyMgr;
/**
* Create a SAX parser with the associated features
* @param features Hashtable of SAX features, may be null
*/
@@ -128,12 +128,14 @@
* @param features Hashtable of SAX features, may be null
*/
SAXParserImpl(SAXParserFactoryImpl spf, Hashtable features, boolean secureProcessing)
throws SAXException
{
+ fSecurityPropertyMgr = new XMLSecurityPropertyManager();
+
// Instantiate a SAXParser directly and not through SAX so that we use the right ClassLoader
- xmlReader = new JAXPSAXParser(this);
+ xmlReader = new JAXPSAXParser(this, fSecurityPropertyMgr);
// JAXP "namespaceAware" == SAX Namespaces feature
// Note: there is a compatibility problem here with default values:
// JAXP default is false while SAX 2 default is true!
xmlReader.setFeature0(NAMESPACES_FEATURE, spf.isNamespaceAware());
@@ -148,11 +150,10 @@
// does not support XInclude.
if (spf.isXIncludeAware()) {
xmlReader.setFeature0(XINCLUDE_FEATURE, true);
}
- fSecurityPropertyMgr = new XMLSecurityPropertyManager();
xmlReader.setProperty0(XML_SECURITY_PROPERTY_MANAGER, fSecurityPropertyMgr);
// If the secure processing feature is on set a security manager.
if (secureProcessing) {
xmlReader.setProperty0(SECURITY_MANAGER, new SecurityManager());
@@ -395,19 +396,37 @@
public static class JAXPSAXParser extends com.sun.org.apache.xerces.internal.parsers.SAXParser {
private final HashMap fInitFeatures = new HashMap();
private final HashMap fInitProperties = new HashMap();
private final SAXParserImpl fSAXParser;
+ private XMLSecurityPropertyManager fSecurityPropertyMgr;
+
public JAXPSAXParser() {
- this(null);
+ this(null, null);
}
- JAXPSAXParser(SAXParserImpl saxParser) {
+ JAXPSAXParser(SAXParserImpl saxParser, XMLSecurityPropertyManager spm) {
super();
fSAXParser = saxParser;
+ fSecurityPropertyMgr = spm;
+
+ /**
+ * This class may be used directly. So initialize the security manager if
+ * it is null.
+ */
+ if (fSecurityPropertyMgr == null) {
+ fSecurityPropertyMgr = new XMLSecurityPropertyManager();
+ try {
+ super.setProperty(XML_SECURITY_PROPERTY_MANAGER, fSecurityPropertyMgr);
+ } catch (SAXException e) {
+ throw new UnsupportedOperationException(
+ SAXMessageFormatter.formatMessage(fConfiguration.getLocale(),
+ "property-not-recognized", new Object [] {SECURITY_MANAGER}), e);
}
+ }
+ }
/**
* Override SAXParser's setFeature method to track the initial state
* of features. This keeps us from affecting the performance of the
* SAXParser when it is created with XMLReaderFactory.
@@ -540,13 +559,13 @@
/** Forward property to the schema validator if there is one. **/
if (fSAXParser != null && fSAXParser.fSchemaValidator != null) {
setSchemaValidatorProperty(name, value);
}
/** Check to see if the property is managed by the property manager **/
- int index = fSAXParser.fSecurityPropertyMgr.getIndex(name);
+ int index = (fSecurityPropertyMgr != null) ? fSecurityPropertyMgr.getIndex(name) : -1;
if (index > -1) {
- fSAXParser.fSecurityPropertyMgr.setValue(index,
+ fSecurityPropertyMgr.setValue(index,
XMLSecurityPropertyManager.State.APIPROPERTY, (String)value);
} else {
if (!fInitProperties.containsKey(name)) {
fInitProperties.put(name, super.getProperty(name));
}
@@ -562,13 +581,13 @@
}
if (fSAXParser != null && JAXP_SCHEMA_LANGUAGE.equals(name)) {
// JAXP 1.2 support
return fSAXParser.schemaLanguage;
}
- int index = fSAXParser.fSecurityPropertyMgr.getIndex(name);
+ int index = (fSecurityPropertyMgr != null) ? fSecurityPropertyMgr.getIndex(name) : -1;
if (index > -1) {
- return fSAXParser.fSecurityPropertyMgr.getValueByIndex(index);
+ return fSecurityPropertyMgr.getValueByIndex(index);
}
return super.getProperty(name);
}