|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
package jdk.xml.internal; |
|
|
|
import com.sun.org.apache.xalan.internal.utils.XMLSecurityManager; |
|
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; |
|
import com.sun.org.apache.xerces.internal.impl.Constants; |
|
import com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl; |
|
import com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl; |
|
import com.sun.org.apache.xerces.internal.util.ParserConfigurationSettings; |
|
import com.sun.org.apache.xerces.internal.xni.parser.XMLComponentManager; |
|
import com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException; |
|
import javax.xml.XMLConstants; |
|
import javax.xml.catalog.CatalogFeatures; |
|
import javax.xml.catalog.CatalogFeatures.Feature; |
|
import javax.xml.parsers.DocumentBuilderFactory; |
|
import javax.xml.parsers.ParserConfigurationException; |
|
import javax.xml.parsers.SAXParserFactory; |
|
import javax.xml.transform.TransformerConfigurationException; |
|
import javax.xml.transform.sax.SAXTransformerFactory; |
|
import org.w3c.dom.Document; |
|
import org.xml.sax.SAXException; |
|
import org.xml.sax.SAXNotRecognizedException; |
|
import org.xml.sax.SAXNotSupportedException; |
|
import org.xml.sax.XMLReader; |
|
|
|
|
|
|
|
*/ |
|
public class JdkXmlUtils { |
|
private static final String DOM_FACTORY_ID = "javax.xml.parsers.DocumentBuilderFactory"; |
|
private static final String SAX_FACTORY_ID = "javax.xml.parsers.SAXParserFactory"; |
|
private static final String SAX_DRIVER = "org.xml.sax.driver"; |
|
|
|
|
|
|
|
*/ |
|
public static final String NAMESPACES_FEATURE = |
|
Constants.SAX_FEATURE_PREFIX + Constants.NAMESPACES_FEATURE; |
|
public static final String NAMESPACE_PREFIXES_FEATURE = |
|
Constants.SAX_FEATURE_PREFIX + Constants.NAMESPACE_PREFIXES_FEATURE; |
|
|
|
|
|
|
|
|
|
*/ |
|
public final static String USE_CATALOG = XMLConstants.USE_CATALOG; |
|
public final static String SP_USE_CATALOG = "javax.xml.useCatalog"; |
|
public final static String CATALOG_FILES = CatalogFeatures.Feature.FILES.getPropertyName(); |
|
public final static String CATALOG_DEFER = CatalogFeatures.Feature.DEFER.getPropertyName(); |
|
public final static String CATALOG_PREFER = CatalogFeatures.Feature.PREFER.getPropertyName(); |
|
public final static String CATALOG_RESOLVE = CatalogFeatures.Feature.RESOLVE.getPropertyName(); |
|
|
|
|
|
|
|
|
|
*/ |
|
public final static String RESET_SYMBOL_TABLE = "jdk.xml.resetSymbolTable"; |
|
|
|
|
|
|
|
|
|
*/ |
|
public static final String OVERRIDE_PARSER = "jdk.xml.overrideDefaultParser"; |
|
public static final boolean OVERRIDE_PARSER_DEFAULT = SecuritySupport.getJAXPSystemProperty( |
|
Boolean.class, OVERRIDE_PARSER, "false"); |
|
|
|
|
|
|
|
*/ |
|
public static final String FEATURE_TRUE = "true"; |
|
public static final String FEATURE_FALSE = "false"; |
|
|
|
|
|
|
|
*/ |
|
public static final boolean USE_CATALOG_DEFAULT |
|
= SecuritySupport.getJAXPSystemProperty(Boolean.class, SP_USE_CATALOG, "true"); |
|
|
|
|
|
|
|
*/ |
|
public static final boolean RESET_SYMBOL_TABLE_DEFAULT |
|
= SecuritySupport.getJAXPSystemProperty(Boolean.class, RESET_SYMBOL_TABLE, "false"); |
|
|
|
|
|
|
|
*/ |
|
public final static String CDATA_CHUNK_SIZE = "jdk.xml.cdataChunkSize"; |
|
public static final int CDATA_CHUNK_SIZE_DEFAULT |
|
= SecuritySupport.getJAXPSystemProperty(Integer.class, CDATA_CHUNK_SIZE, "0"); |
|
|
|
|
|
|
|
*/ |
|
private static final SAXParserFactory defaultSAXFactory = getSAXFactory(false); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static int getValue(Object value, int defValue) { |
|
if (value == null) { |
|
return defValue; |
|
} |
|
|
|
if (value instanceof Number) { |
|
return ((Number) value).intValue(); |
|
} else if (value instanceof String) { |
|
return Integer.parseInt(String.valueOf(value)); |
|
} else { |
|
throw new IllegalArgumentException("Unexpected class: " |
|
+ value.getClass()); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static void setXMLReaderPropertyIfSupport(XMLReader reader, String property, |
|
Object value, boolean warn) { |
|
try { |
|
reader.setProperty(property, value); |
|
} catch (SAXNotRecognizedException | SAXNotSupportedException e) { |
|
if (warn) { |
|
XMLSecurityManager.printWarning(reader.getClass().getName(), |
|
property, e); |
|
} |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static String getCatalogFeature(CatalogFeatures features, String name) { |
|
for (Feature feature : Feature.values()) { |
|
if (feature.getPropertyName().equals(name)) { |
|
return features.get(feature); |
|
} |
|
} |
|
return null; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static CatalogFeatures getCatalogFeatures(String defer, String file, |
|
String prefer, String resolve) { |
|
|
|
CatalogFeatures.Builder builder = CatalogFeatures.builder(); |
|
if (file != null) { |
|
builder = builder.with(CatalogFeatures.Feature.FILES, file); |
|
} |
|
if (prefer != null) { |
|
builder = builder.with(CatalogFeatures.Feature.PREFER, prefer); |
|
} |
|
if (defer != null) { |
|
builder = builder.with(CatalogFeatures.Feature.DEFER, defer); |
|
} |
|
if (resolve != null) { |
|
builder = builder.with(CatalogFeatures.Feature.RESOLVE, resolve); |
|
} |
|
|
|
return builder.build(); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static void catalogFeaturesConfig2Config(XMLComponentManager config1, |
|
ParserConfigurationSettings config2) { |
|
boolean supportCatalog = true; |
|
boolean useCatalog = config1.getFeature(XMLConstants.USE_CATALOG); |
|
try { |
|
config2.setFeature(JdkXmlUtils.USE_CATALOG, useCatalog); |
|
} catch (XMLConfigurationException e) { |
|
supportCatalog = false; |
|
} |
|
|
|
if (supportCatalog && useCatalog) { |
|
try { |
|
for (CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) { |
|
config2.setProperty(f.getPropertyName(), config1.getProperty(f.getPropertyName())); |
|
} |
|
} catch (XMLConfigurationException e) { |
|
//shall not happen for internal settings |
|
} |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static void catalogFeaturesConfig2Reader(XMLComponentManager config, XMLReader reader) { |
|
boolean supportCatalog = true; |
|
boolean useCatalog = config.getFeature(XMLConstants.USE_CATALOG); |
|
try { |
|
reader.setFeature(JdkXmlUtils.USE_CATALOG, useCatalog); |
|
} catch (SAXNotRecognizedException | SAXNotSupportedException e) { |
|
supportCatalog = false; |
|
} |
|
|
|
if (supportCatalog && useCatalog) { |
|
try { |
|
for (CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) { |
|
reader.setProperty(f.getPropertyName(), config.getProperty(f.getPropertyName())); |
|
} |
|
} catch (SAXNotRecognizedException | SAXNotSupportedException e) { |
|
//shall not happen for internal settings |
|
} |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static XMLReader getXMLReader(boolean overrideDefaultParser, |
|
boolean secureProcessing) { |
|
SAXParserFactory saxFactory; |
|
XMLReader reader = null; |
|
String spSAXDriver = SecuritySupport.getSystemProperty(SAX_DRIVER); |
|
if (spSAXDriver != null) { |
|
reader = getXMLReaderWXMLReaderFactory(); |
|
} else if (overrideDefaultParser) { |
|
reader = getXMLReaderWSAXFactory(overrideDefaultParser); |
|
} |
|
|
|
if (reader != null) { |
|
if (secureProcessing) { |
|
try { |
|
reader.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, secureProcessing); |
|
} catch (SAXException e) { |
|
XMLSecurityManager.printWarning(reader.getClass().getName(), |
|
XMLConstants.FEATURE_SECURE_PROCESSING, e); |
|
} |
|
} |
|
try { |
|
reader.setFeature(NAMESPACES_FEATURE, true); |
|
reader.setFeature(NAMESPACE_PREFIXES_FEATURE, false); |
|
} catch (SAXException se) { |
|
// older version of a parser |
|
} |
|
return reader; |
|
} |
|
|
|
|
|
saxFactory = defaultSAXFactory; |
|
|
|
try { |
|
reader = saxFactory.newSAXParser().getXMLReader(); |
|
} catch (ParserConfigurationException | SAXException ex) { |
|
// shall not happen with the system-default reader |
|
} |
|
return reader; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static Document getDOMDocument() { |
|
try { |
|
DocumentBuilderFactory dbf = JdkXmlUtils.getDOMFactory(false); |
|
return dbf.newDocumentBuilder().newDocument(); |
|
} catch (ParserConfigurationException pce) { |
|
// can never happen with the system-default configuration |
|
} |
|
return null; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static DocumentBuilderFactory getDOMFactory(boolean overrideDefaultParser) { |
|
boolean override = overrideDefaultParser; |
|
String spDOMFactory = SecuritySupport.getJAXPSystemProperty(DOM_FACTORY_ID); |
|
|
|
if (spDOMFactory != null && System.getSecurityManager() == null) { |
|
override = true; |
|
} |
|
DocumentBuilderFactory dbf |
|
= !override |
|
? new DocumentBuilderFactoryImpl() |
|
: DocumentBuilderFactory.newInstance(); |
|
dbf.setNamespaceAware(true); |
|
|
|
dbf.setValidating(false); |
|
return dbf; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static SAXParserFactory getSAXFactory(boolean overrideDefaultParser) { |
|
boolean override = overrideDefaultParser; |
|
String spSAXFactory = SecuritySupport.getJAXPSystemProperty(SAX_FACTORY_ID); |
|
if (spSAXFactory != null && System.getSecurityManager() == null) { |
|
override = true; |
|
} |
|
|
|
SAXParserFactory factory |
|
= !override |
|
? new SAXParserFactoryImpl() |
|
: SAXParserFactory.newInstance(); |
|
factory.setNamespaceAware(true); |
|
return factory; |
|
} |
|
|
|
public static SAXTransformerFactory getSAXTransformFactory(boolean overrideDefaultParser) { |
|
SAXTransformerFactory tf = overrideDefaultParser |
|
? (SAXTransformerFactory) SAXTransformerFactory.newInstance() |
|
: (SAXTransformerFactory) new TransformerFactoryImpl(); |
|
try { |
|
tf.setFeature(OVERRIDE_PARSER, overrideDefaultParser); |
|
} catch (TransformerConfigurationException ex) { |
|
// ignore since it'd never happen with the JDK impl. |
|
} |
|
return tf; |
|
} |
|
|
|
private static XMLReader getXMLReaderWSAXFactory(boolean overrideDefaultParser) { |
|
SAXParserFactory saxFactory = getSAXFactory(overrideDefaultParser); |
|
try { |
|
return saxFactory.newSAXParser().getXMLReader(); |
|
} catch (ParserConfigurationException | SAXException ex) { |
|
return getXMLReaderWXMLReaderFactory(); |
|
} |
|
} |
|
|
|
@SuppressWarnings("deprecation") |
|
private static XMLReader getXMLReaderWXMLReaderFactory() { |
|
try { |
|
return org.xml.sax.helpers.XMLReaderFactory.createXMLReader(); |
|
} catch (SAXException ex1) { |
|
} |
|
return null; |
|
} |
|
} |