src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java

Print this page

        

*** 51,61 **** --- 51,71 ---- import java.util.Iterator; import java.util.Locale; import java.util.Map; import java.util.Stack; import java.util.StringTokenizer; + import javax.xml.XMLConstants; + import javax.xml.catalog.CatalogException; + import javax.xml.catalog.CatalogFeatures; + import javax.xml.catalog.CatalogFeatures.Feature; + import javax.xml.catalog.CatalogManager; + import javax.xml.catalog.CatalogResolver; + import javax.xml.catalog.CatalogUriResolver; import javax.xml.stream.XMLInputFactory; + import javax.xml.transform.Source; + import jdk.xml.internal.JdkXmlUtils; + import org.xml.sax.InputSource; /** * Will keep track of current entity. *
*** 182,222 **** VALIDATION, EXTERNAL_GENERAL_ENTITIES, EXTERNAL_PARAMETER_ENTITIES, ALLOW_JAVA_ENCODINGS, WARN_ON_DUPLICATE_ENTITYDEF, ! STANDARD_URI_CONFORMANT }; /** Feature defaults. */ private static final Boolean[] FEATURE_DEFAULTS = { null, Boolean.TRUE, Boolean.TRUE, Boolean.TRUE, Boolean.FALSE, ! Boolean.FALSE }; /** Recognized properties. */ private static final String[] RECOGNIZED_PROPERTIES = { SYMBOL_TABLE, ERROR_REPORTER, ENTITY_RESOLVER, VALIDATION_MANAGER, BUFFER_SIZE, SECURITY_MANAGER, ! XML_SECURITY_PROPERTY_MANAGER }; /** Property defaults. */ private static final Object[] PROPERTY_DEFAULTS = { null, null, null, null, ! new Integer(DEFAULT_BUFFER_SIZE), null, null }; private static final String XMLEntity = "[xml]".intern(); --- 192,242 ---- VALIDATION, EXTERNAL_GENERAL_ENTITIES, EXTERNAL_PARAMETER_ENTITIES, ALLOW_JAVA_ENCODINGS, WARN_ON_DUPLICATE_ENTITYDEF, ! STANDARD_URI_CONFORMANT, ! XMLConstants.USE_CATALOG }; /** Feature defaults. */ private static final Boolean[] FEATURE_DEFAULTS = { null, Boolean.TRUE, Boolean.TRUE, Boolean.TRUE, Boolean.FALSE, ! Boolean.FALSE, ! JdkXmlUtils.USE_CATALOG_DEFAULT }; /** Recognized properties. */ private static final String[] RECOGNIZED_PROPERTIES = { SYMBOL_TABLE, ERROR_REPORTER, ENTITY_RESOLVER, VALIDATION_MANAGER, BUFFER_SIZE, SECURITY_MANAGER, ! XML_SECURITY_PROPERTY_MANAGER, ! JdkXmlUtils.CATALOG_DEFER, ! JdkXmlUtils.CATALOG_FILES, ! JdkXmlUtils.CATALOG_PREFER, ! JdkXmlUtils.CATALOG_RESOLVE }; /** Property defaults. */ private static final Object[] PROPERTY_DEFAULTS = { null, null, null, null, ! DEFAULT_BUFFER_SIZE, ! null, ! null, ! null, ! null, null, null }; private static final String XMLEntity = "[xml]".intern();
*** 394,403 **** --- 414,434 ---- private final Augmentations fEntityAugs = new AugmentationsImpl(); /** Pool of character buffers. */ private CharacterBufferPool fBufferPool = new CharacterBufferPool(fBufferSize, DEFAULT_INTERNAL_BUFFER_SIZE); + /** indicate whether Catalog should be used for resolving external resources */ + private boolean fUseCatalog = true; + CatalogFeatures fCatalogFeatures; + CatalogResolver fCatalogResolver; + CatalogUriResolver fCatalogUriResolver; + + private String fCatalogFile; + private String fDefer; + private String fPrefer; + private String fResolve; + // // Constructors // /**
*** 1005,1014 **** --- 1036,1061 ---- if(xmlInputSource != null){ //wrap this XMLInputSource to StaxInputSource staxInputSource = new StaxXMLInputSource(xmlInputSource, fISCreatedByResolver); } + if (staxInputSource == null) { + if (fCatalogFeatures == null) { + fCatalogFeatures = JdkXmlUtils.getCatalogFeatures(fDefer, fCatalogFile, fPrefer, fResolve); + } + fCatalogFile = fCatalogFeatures.get(Feature.FILES); + if (fUseCatalog && fCatalogFile != null) { + if (fCatalogResolver == null) { + fCatalogResolver = CatalogManager.catalogResolver(fCatalogFeatures); + } + InputSource is = fCatalogResolver.resolveEntity(publicId, literalSystemId); + if (is != null && !is.isEmpty()) { + staxInputSource = new StaxXMLInputSource(new XMLInputSource(is, true), true); + } + } + } + // do default resolution //this works for both stax & Xerces, if staxInputSource is null, //it means parser need to revert to default resolution if (staxInputSource == null) { // REVISIT: when systemId is null, I think we should return null.
*** 1083,1092 **** --- 1130,1174 ---- resourceIdentifier.setBaseSystemId(baseSystemId); resourceIdentifier.setExpandedSystemId(expandedSystemId); xmlInputSource = fEntityResolver.resolveEntity(resourceIdentifier); } + if (xmlInputSource == null) { + if (fCatalogFeatures == null) { + fCatalogFeatures = JdkXmlUtils.getCatalogFeatures(fDefer, fCatalogFile, fPrefer, fResolve); + } + fCatalogFile = fCatalogFeatures.get(Feature.FILES); + if (fUseCatalog && fCatalogFile != null) { + /* + since the method can be called from various processors, both + CatalogResolver and CatalogUriResolver are used to attempt to find + a match + */ + InputSource is = null; + try { + if (fCatalogResolver == null) { + fCatalogResolver = CatalogManager.catalogResolver(fCatalogFeatures); + } + String pid = (publicId != null? publicId : resourceIdentifier.getNamespace()); + if (pid != null || literalSystemId != null) { + is = fCatalogResolver.resolveEntity(pid, literalSystemId); + } + } catch (CatalogException e) {} + if (is != null && !is.isEmpty()) { + xmlInputSource = new XMLInputSource(is, true); + } else if (literalSystemId != null) { + if (fCatalogUriResolver == null) { + fCatalogUriResolver = CatalogManager.catalogUriResolver(fCatalogFeatures); + } + Source source = fCatalogUriResolver.resolve(literalSystemId, baseSystemId); + if (source != null && !source.isEmpty()) { + xmlInputSource = new XMLInputSource(publicId, source.getSystemId(), baseSystemId, true); + } + } + } + } + // do default resolution // REVISIT: what's the correct behavior if the user provided an entity // resolver (fEntityResolver != null), but resolveEntity doesn't return // an input source (xmlInputSource == null)? // do we do default resolution, or do we just return null? -SG
*** 1440,1455 **** fStaxEntityResolver = (StaxEntityResolverWrapper)propertyManager.getProperty(STAX_ENTITY_RESOLVER); } catch (XMLConfigurationException e) { fStaxEntityResolver = null; } ! fSupportDTD = ((Boolean)propertyManager.getProperty(XMLInputFactory.SUPPORT_DTD)).booleanValue(); ! fReplaceEntityReferences = ((Boolean)propertyManager.getProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES)).booleanValue(); ! fSupportExternalEntities = ((Boolean)propertyManager.getProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES)).booleanValue(); // Zephyr feature ignore-external-dtd is the opposite of Xerces' load-external-dtd ! fLoadExternalDTD = !((Boolean)propertyManager.getProperty(Constants.ZEPHYR_PROPERTY_PREFIX + Constants.IGNORE_EXTERNAL_DTD)).booleanValue(); // JAXP 1.5 feature XMLSecurityPropertyManager spm = (XMLSecurityPropertyManager) propertyManager.getProperty(XML_SECURITY_PROPERTY_MANAGER); fAccessExternalDTD = spm.getValue(XMLSecurityPropertyManager.Property.ACCESS_EXTERNAL_DTD); --- 1522,1544 ---- fStaxEntityResolver = (StaxEntityResolverWrapper)propertyManager.getProperty(STAX_ENTITY_RESOLVER); } catch (XMLConfigurationException e) { fStaxEntityResolver = null; } ! fSupportDTD = ((Boolean)propertyManager.getProperty(XMLInputFactory.SUPPORT_DTD)); ! fReplaceEntityReferences = ((Boolean)propertyManager.getProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES)); ! fSupportExternalEntities = ((Boolean)propertyManager.getProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES)); // Zephyr feature ignore-external-dtd is the opposite of Xerces' load-external-dtd ! fLoadExternalDTD = !((Boolean)propertyManager.getProperty(Constants.ZEPHYR_PROPERTY_PREFIX + Constants.IGNORE_EXTERNAL_DTD)); ! ! //Use Catalog ! fUseCatalog = (Boolean)propertyManager.getProperty(XMLConstants.USE_CATALOG); ! fCatalogFile = (String)propertyManager.getProperty(JdkXmlUtils.CATALOG_FILES); ! fDefer = (String)propertyManager.getProperty(JdkXmlUtils.CATALOG_DEFER); ! fPrefer = (String)propertyManager.getProperty(JdkXmlUtils.CATALOG_PREFER); ! fResolve = (String)propertyManager.getProperty(JdkXmlUtils.CATALOG_RESOLVE); // JAXP 1.5 feature XMLSecurityPropertyManager spm = (XMLSecurityPropertyManager) propertyManager.getProperty(XML_SECURITY_PROPERTY_MANAGER); fAccessExternalDTD = spm.getValue(XMLSecurityPropertyManager.Property.ACCESS_EXTERNAL_DTD);
*** 1533,1542 **** --- 1622,1638 ---- if (spm == null) { spm = new XMLSecurityPropertyManager(); } fAccessExternalDTD = spm.getValue(XMLSecurityPropertyManager.Property.ACCESS_EXTERNAL_DTD); + //Use Catalog + fUseCatalog = componentManager.getFeature(XMLConstants.USE_CATALOG, true); + fCatalogFile = (String)componentManager.getProperty(JdkXmlUtils.CATALOG_FILES); + fDefer = (String)componentManager.getProperty(JdkXmlUtils.CATALOG_DEFER); + fPrefer = (String)componentManager.getProperty(JdkXmlUtils.CATALOG_PREFER); + fResolve = (String)componentManager.getProperty(JdkXmlUtils.CATALOG_RESOLVE); + //reset general state reset(); fEntityScanner.reset(componentManager); fEntityStorage.reset(componentManager);
*** 1629,1638 **** --- 1725,1736 ---- if (suffixLength == Constants.LOAD_EXTERNAL_DTD_FEATURE.length() && featureId.endsWith(Constants.LOAD_EXTERNAL_DTD_FEATURE)) { fLoadExternalDTD = state; return; } + } else if (featureId.equals(XMLConstants.USE_CATALOG)) { + fUseCatalog = state; } } // setFeature(String,boolean) /**
*** 1689,1698 **** --- 1787,1808 ---- //JAXP 1.5 properties if (propertyId.equals(XML_SECURITY_PROPERTY_MANAGER)) { XMLSecurityPropertyManager spm = (XMLSecurityPropertyManager)value; fAccessExternalDTD = spm.getValue(XMLSecurityPropertyManager.Property.ACCESS_EXTERNAL_DTD); + return; + } + + //Catalog properties + if (propertyId.equals(JdkXmlUtils.CATALOG_FILES)) { + fCatalogFile = (String)value; + } else if (propertyId.equals(JdkXmlUtils.CATALOG_DEFER)) { + fDefer = (String)value; + } else if (propertyId.equals(JdkXmlUtils.CATALOG_PREFER)) { + fPrefer = (String)value; + } else if (propertyId.equals(JdkXmlUtils.CATALOG_RESOLVE)) { + fResolve = (String)value; } } public void setLimitAnalyzer(XMLLimitAnalyzer fLimitAnalyzer) { this.fLimitAnalyzer = fLimitAnalyzer;
*** 2064,2074 **** return null; } // system id has to be a valid URI if (strict) { - try { // if it's already an absolute one, return it new URI(systemId); return systemId; } --- 2174,2183 ----