You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by mr...@apache.org on 2004/05/11 03:06:55 UTC

cvs commit: xml-xerces/java/src/org/apache/xerces/impl/msg SAXMessages.properties

mrglavas    2004/05/10 18:06:55

  Modified:    java/src/org/apache/xerces/parsers AbstractSAXParser.java
               java/src/org/apache/xerces/impl/msg SAXMessages.properties
  Log:
  Feature/Property Support for SAX2 Extensions 1.1 & SAX 2.0.2.
  
  SAX2 Extensions 1.1:
  - is-standalone
  - resolve-dtd-uris
  - use-attributes2
  - use-locator2
  - use-entity-resolver2
  
  SAX 2.0.2:
  - unicode-normalization-checking
  - xmlns-uris
  - xml-1.1
  - document-xml-version (property)
  
  Still need to link with the SAX 2.0.2 API. Until then, returning false
  for use-attributes2 and use-locator2. Getting and setting of
  use-entity-resolver2 currently commented out.
  
  Revision  Changes    Path
  1.55      +235 -29   xml-xerces/java/src/org/apache/xerces/parsers/AbstractSAXParser.java
  
  Index: AbstractSAXParser.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/parsers/AbstractSAXParser.java,v
  retrieving revision 1.54
  retrieving revision 1.55
  diff -u -r1.54 -r1.55
  --- AbstractSAXParser.java	7 Apr 2004 15:42:05 -0000	1.54
  +++ AbstractSAXParser.java	11 May 2004 01:06:55 -0000	1.55
  @@ -22,6 +22,8 @@
   import org.apache.xerces.impl.Constants;
   import org.apache.xerces.xs.PSVIProvider;
   import org.apache.xerces.util.EntityResolverWrapper;
  +import org.apache.xerces.util.EntityResolver2Wrapper;
  +import org.apache.xerces.util.EntityResolver2Wrapper.EntityResolver2;
   import org.apache.xerces.util.ErrorHandlerWrapper;
   import org.apache.xerces.util.SAXMessageFormatter;
   import org.apache.xerces.util.SymbolHash;
  @@ -143,6 +145,21 @@
       
       /** Lexical handler parameter entities. */
       protected boolean fLexicalHandlerParameterEntities = true;
  +    
  +    /** Standalone document declaration. */
  +    protected boolean fStandalone;
  +    
  +    /** Resolve DTD URIs. */
  +    protected boolean fResolveDTDURIs = true;
  +    
  +    /** Use EntityResolver2. */
  +    protected boolean fUseEntityResolver2 = true;
  +    
  +    /** 
  +     * XMLNS URIs: Namespace declarations in the 
  +     * http://www.w3.org/2000/xmlns/ namespace.
  +     */
  +    protected boolean fXMLNSURIs = false;
   
       // parser handlers
   
  @@ -286,10 +303,10 @@
        */
       public void xmlDecl(String version, String encoding, String standalone, Augmentations augs)
           throws XNIException {
  -
           // the version need only be set once; if
           // document's XML 1.0|1.1, that's how it'll stay
           fVersion = version;
  +        fStandalone = "yes".equals(standalone);
       } // xmlDecl(String,String,String)
   
       /**
  @@ -448,15 +465,21 @@
                       // we cannot use the declared prefix count for the current context
                       // to skip this section. -- mrglavas
                       int len = attributes.getLength();
  -                    for (int i = len - 1; i >= 0; --i) {
  -                        attributes.getName(i, fQName);    
  -                        if ((fQName.prefix == XMLSymbols.PREFIX_XMLNS) || 
  -                            (fQName.rawname == XMLSymbols.PREFIX_XMLNS)) {
  -                            if (!fNamespacePrefixes) {
  +                    if (!fNamespacePrefixes) {
  +                        for (int i = len - 1; i >= 0; --i) {
  +                            attributes.getName(i, fQName);    
  +                            if ((fQName.prefix == XMLSymbols.PREFIX_XMLNS) || 
  +                               (fQName.rawname == XMLSymbols.PREFIX_XMLNS)) {
                                   // remove namespace declaration attributes
                                   attributes.removeAttributeAt(i);
                               }
  -                            else {
  +                        }
  +                    }
  +                    else if (!fXMLNSURIs) {
  +                        for (int i = len - 1; i >= 0; --i) {
  +                            attributes.getName(i, fQName);    
  +                            if ((fQName.prefix == XMLSymbols.PREFIX_XMLNS) || 
  +                               (fQName.rawname == XMLSymbols.PREFIX_XMLNS)) {
                                   // localpart should be empty string as per SAX documentation:
                                   // http://www.saxproject.org/?selected=namespaces
                                   fQName.prefix = "";
  @@ -981,13 +1004,13 @@
        */
       public void externalEntityDecl(String name, XMLResourceIdentifier identifier,
                                      Augmentations augs) throws XNIException {
  -
  -        String publicId = identifier.getPublicId();
  -        String literalSystemId = identifier.getLiteralSystemId();
           try {
               // SAX2 extension
               if (fDeclHandler != null) {
  -                fDeclHandler.externalEntityDecl(name, publicId, literalSystemId);
  +                String publicId = identifier.getPublicId();
  +                String systemId = fResolveDTDURIs ? 
  +                    identifier.getExpandedSystemId() : identifier.getLiteralSystemId();
  +                fDeclHandler.externalEntityDecl(name, publicId, systemId);
               }
           }
           catch (SAXException e) {
  @@ -1012,14 +1035,13 @@
       public void unparsedEntityDecl(String name, XMLResourceIdentifier identifier, 
                                      String notation,
                                      Augmentations augs) throws XNIException {
  -
  -        String publicId = identifier.getPublicId();
  -        String expandedSystemId = identifier.getExpandedSystemId(); 
           try {
               // SAX2 extension
               if (fDTDHandler != null) {
  -                fDTDHandler.unparsedEntityDecl(name, publicId,
  -                                               expandedSystemId, notation);
  +                String publicId = identifier.getPublicId();
  +                String systemId = fResolveDTDURIs ? 
  +                    identifier.getExpandedSystemId() : identifier.getLiteralSystemId();
  +                fDTDHandler.unparsedEntityDecl(name, publicId, systemId, notation);
               }
           }
           catch (SAXException e) {
  @@ -1041,13 +1063,13 @@
        */
       public void notationDecl(String name, XMLResourceIdentifier identifier,
                                Augmentations augs) throws XNIException {
  -
  -        String publicId = identifier.getPublicId();
  -        String expandedSystemId = identifier.getExpandedSystemId();
           try {
               // SAX1 and SAX2
               if (fDTDHandler != null) {
  -                fDTDHandler.notationDecl(name, publicId, expandedSystemId);
  +                String publicId = identifier.getPublicId();
  +                String systemId = fResolveDTDURIs ? 
  +                    identifier.getExpandedSystemId() : identifier.getLiteralSystemId();
  +                fDTDHandler.notationDecl(name, publicId, systemId);
               }
           }
           catch (SAXException e) {
  @@ -1241,8 +1263,14 @@
       public void setEntityResolver(EntityResolver resolver) {
   
           try {
  -            fConfiguration.setProperty(ENTITY_RESOLVER,
  -                                       new EntityResolverWrapper(resolver));
  +            if (fUseEntityResolver2 && resolver instanceof EntityResolver2) {
  +                fConfiguration.setProperty(ENTITY_RESOLVER,
  +                    new EntityResolver2Wrapper((EntityResolver2) resolver));
  +            }
  +            else {
  +                fConfiguration.setProperty(ENTITY_RESOLVER,
  +                    new EntityResolverWrapper(resolver));
  +            }
           }
           catch (XMLConfigurationException e) {
               // do nothing
  @@ -1263,9 +1291,15 @@
           try {
               XMLEntityResolver xmlEntityResolver =
                   (XMLEntityResolver)fConfiguration.getProperty(ENTITY_RESOLVER);
  -            if (xmlEntityResolver != null &&
  -                xmlEntityResolver instanceof EntityResolverWrapper) {
  -                entityResolver = ((EntityResolverWrapper)xmlEntityResolver).getEntityResolver();
  +            if (xmlEntityResolver != null) {
  +                if (xmlEntityResolver instanceof EntityResolverWrapper) {
  +                    entityResolver =
  +                        ((EntityResolverWrapper) xmlEntityResolver).getEntityResolver();
  +                }
  +                else if (xmlEntityResolver instanceof EntityResolver2Wrapper) {
  +                    entityResolver = 
  +                        ((EntityResolver2Wrapper) xmlEntityResolver).getEntityResolver();
  +                }
               }
           }
           catch (XMLConfigurationException e) {
  @@ -1464,6 +1498,7 @@
                       fNamespaces = state;
                       return;
                   }
  +                
                   // http://xml.org/sax/features/namespace-prefixes
                   //   controls the reporting of raw prefixed names and Namespace
                   //   declarations (xmlns* attributes): when this feature is false
  @@ -1476,6 +1511,7 @@
                       fNamespacePrefixes = state;
                       return;
                   }
  +                
                   // http://xml.org/sax/features/string-interning
                   //   controls the use of java.lang.String#intern() for strings
                   //   passed to SAX handlers.
  @@ -1489,6 +1525,7 @@
                       }
                       return;
                   }
  +                
                   // http://xml.org/sax/features/lexical-handler/parameter-entities
                   //   controls whether the beginning and end of parameter entities
                   //   will be reported to the LexicalHandler.
  @@ -1498,6 +1535,85 @@
                       fLexicalHandlerParameterEntities = state;
                       return;
                   }
  +                
  +                // http://xml.org/sax/features/resolve-dtd-uris
  +                //   controls whether system identifiers will be absolutized relative to
  +                //   their base URIs before reporting.
  +                //
  +                if (suffixLength == Constants.RESOLVE_DTD_URIS_FEATURE.length() && 
  +                    featureId.endsWith(Constants.RESOLVE_DTD_URIS_FEATURE)) {
  +                    fResolveDTDURIs = state;
  +                    return;
  +                }
  +                
  +                // http://xml.org/sax/features/unicode-normalization-checking
  +                //   controls whether Unicode normalization checking is performed
  +                //   as per Appendix B of the XML 1.1 specification
  +                //
  +                if (suffixLength == Constants.UNICODE_NORMALIZATION_CHECKING_FEATURE.length() &&
  +                    featureId.endsWith(Constants.UNICODE_NORMALIZATION_CHECKING_FEATURE)) {
  +                    // REVISIT: Allow this feature to be set once Unicode normalization
  +                    // checking is supported -- mrglavas.
  +                    if (state) {
  +                        throw new SAXNotSupportedException(
  +                            SAXMessageFormatter.formatMessage(fConfiguration.getLocale(), 
  +                            "true-not-supported", new Object [] {featureId}));  
  +                    }
  +                    return;
  +                }
  +                
  +                // http://xml.org/sax/features/xmlns-uris
  +                //   controls whether the parser reports that namespace declaration
  +                //   attributes as being in the namespace: http://www.w3.org/2000/xmlns/
  +                //
  +                if (suffixLength == Constants.XMLNS_URIS_FEATURE.length() &&
  +                    featureId.endsWith(Constants.XMLNS_URIS_FEATURE)) {
  +                    fXMLNSURIs = state;
  +                    return;
  +                }
  +                
  +                // http://xml.org/sax/features/use-entity-resolver2
  +                //   controls whether the methods of an object implementing
  +                //   org.xml.sax.ext.EntityResolver2 will be used by the parser.
  +                //
  +                // TODO: Uncomment once SAX 2.0.2 is available. -- mrglavas
  +                /**if (suffixLength == Constants.USE_ENTITY_RESOLVER2_FEATURE.length() &&
  +                    featureId.endsWith(Constants.USE_ENTITY_RESOLVER2_FEATURE)) {
  +                    if (state != fUseEntityResolver2) {
  +                        fUseEntityResolver2 = state;
  +                        // Refresh EntityResolver wrapper.
  +                        setEntityResolver(getEntityResolver());
  +                    }
  +                    return;
  +                }**/
  +                
  +                //
  +                // Read only features.
  +                //
  +                
  +                // http://xml.org/sax/features/is-standalone
  +                //   reports whether the document specified a standalone document declaration.
  +                // http://xml.org/sax/features/use-attributes2
  +                //   reports whether Attributes objects passed to startElement also implement
  +                //   the org.xml.sax.ext.Attributes2 interface.
  +                // http://xml.org/sax/features/use-locator2
  +                //   reports whether Locator objects passed to setDocumentLocator also implement
  +                //   the org.xml.sax.ext.Locator2 interface.
  +                // http://xml.org/sax/features/xml-1.1
  +                //   reports whether the parser supports both XML 1.1 and XML 1.0.
  +                if ((suffixLength == Constants.IS_STANDALONE_FEATURE.length() &&
  +                    featureId.endsWith(Constants.IS_STANDALONE_FEATURE)) ||
  +                    (suffixLength == Constants.USE_ATTRIBUTES2_FEATURE.length() &&
  +                    featureId.endsWith(Constants.USE_ATTRIBUTES2_FEATURE)) ||
  +                    (suffixLength == Constants.USE_LOCATOR2_FEATURE.length() &&
  +                    featureId.endsWith(Constants.USE_LOCATOR2_FEATURE)) ||
  +                    (suffixLength == Constants.XML_11_FEATURE.length() &&
  +                    featureId.endsWith(Constants.XML_11_FEATURE))) {
  +                    throw new SAXNotSupportedException(
  +                        SAXMessageFormatter.formatMessage(fConfiguration.getLocale(), 
  +                        "feature-read-only", new Object [] {featureId}));
  +                }
  +                
   
                   //
                   // Drop through and perform default processing
  @@ -1584,14 +1700,84 @@
                       return true;
                   }
                   
  +                // http://xml.org/sax/features/is-standalone
  +                //   reports whether the document specified a standalone document declaration.
  +                //
  +                if (suffixLength == Constants.IS_STANDALONE_FEATURE.length() &&
  +                    featureId.endsWith(Constants.IS_STANDALONE_FEATURE)) {
  +                    return fStandalone;
  +                }
  +                
  +                // http://xml.org/sax/features/xml-1.1
  +                //   reports whether the parser supports both XML 1.1 and XML 1.0.
  +                //
  +                if (suffixLength == Constants.XML_11_FEATURE.length() &&
  +                    featureId.endsWith(Constants.XML_11_FEATURE)) {
  +                    return (fConfiguration instanceof XML11Configuration);
  +                }
  +                
                   // http://xml.org/sax/features/lexical-handler/parameter-entities
                   //   controls whether the beginning and end of parameter entities
                   //   will be reported to the LexicalHandler.
                   //
                   if (suffixLength == Constants.LEXICAL_HANDLER_PARAMETER_ENTITIES_FEATURE.length() &&
                       featureId.endsWith(Constants.LEXICAL_HANDLER_PARAMETER_ENTITIES_FEATURE)) {
  -                    	return fLexicalHandlerParameterEntities;
  +                    return fLexicalHandlerParameterEntities;
  +                }
  +                
  +                // http://xml.org/sax/features/resolve-dtd-uris
  +                //   controls whether system identifiers will be absolutized relative to
  +                //   their base URIs before reporting.
  +                if (suffixLength == Constants.RESOLVE_DTD_URIS_FEATURE.length() && 
  +                    featureId.endsWith(Constants.RESOLVE_DTD_URIS_FEATURE)) {
  +                    return fResolveDTDURIs;
                   }
  +                
  +                // http://xml.org/sax/features/xmlns-uris
  +                //   controls whether the parser reports that namespace declaration
  +                //   attributes as being in the namespace: http://www.w3.org/2000/xmlns/
  +                //
  +                if (suffixLength == Constants.XMLNS_URIS_FEATURE.length() &&
  +                    featureId.endsWith(Constants.XMLNS_URIS_FEATURE)) {
  +                    return fXMLNSURIs;
  +                }
  +                
  +                // http://xml.org/sax/features/unicode-normalization-checking
  +                //   controls whether Unicode normalization checking is performed
  +                //   as per Appendix B of the XML 1.1 specification
  +                //
  +                if (suffixLength == Constants.UNICODE_NORMALIZATION_CHECKING_FEATURE.length() &&
  +                    featureId.endsWith(Constants.UNICODE_NORMALIZATION_CHECKING_FEATURE)) {
  +                    // REVISIT: Allow this feature to be set once Unicode normalization
  +                    // checking is supported -- mrglavas.
  +                    return false;
  +                }
  +                
  +                // http://xml.org/sax/features/use-entity-resolver2
  +                //   controls whether the methods of an object implementing
  +                //   org.xml.sax.ext.EntityResolver2 will be used by the parser.
  +                //
  +                // TODO: Uncomment once SAX 2.0.2 is available. -- mrglavas
  +                /** if (suffixLength == Constants.USE_ENTITY_RESOLVER2_FEATURE.length() &&
  +                    featureId.endsWith(Constants.USE_ENTITY_RESOLVER2_FEATURE)) {
  +                    return fUseEntityResolver2;
  +                }**/
  +                
  +                // http://xml.org/sax/features/use-attributes2
  +                //   reports whether Attributes objects passed to startElement also implement
  +                //   the org.xml.sax.ext.Attributes2 interface.
  +                // http://xml.org/sax/features/use-locator2
  +                //   reports whether Locator objects passed to setDocumentLocator also implement
  +                //   the org.xml.sax.ext.Locator2 interface.
  +                //
  +                if ((suffixLength == Constants.USE_ATTRIBUTES2_FEATURE.length() &&
  +                    featureId.endsWith(Constants.USE_ATTRIBUTES2_FEATURE)) ||
  +                    (suffixLength == Constants.USE_LOCATOR2_FEATURE.length() &&
  +                    featureId.endsWith(Constants.USE_LOCATOR2_FEATURE))) {
  +                    // REVISIT: Return true once SAX 2.0.2 interfaces are available. -- mrglavas
  +                    return false;
  +                }                
  +                
   
                   //
                   // Drop through and perform default processing
  @@ -1699,9 +1885,15 @@
                   //   supports this property but is not currently visiting a DOM
                   //   node, it should return null (this is a good way to check for
                   //   availability before the parse begins).
  +                // http://xml.org/sax/properties/document-xml-version
  +                // Value type: java.lang.String
  +                // Access: read-only
  +                //   The literal string describing the actual XML version of the document. 
                   //
  -                if (suffixLength == Constants.DOM_NODE_PROPERTY.length() && 
  -                    propertyId.endsWith(Constants.DOM_NODE_PROPERTY)) {
  +                if ((suffixLength == Constants.DOM_NODE_PROPERTY.length() && 
  +                    propertyId.endsWith(Constants.DOM_NODE_PROPERTY)) ||
  +                    (suffixLength == Constants.DOCUMENT_XML_VERSION_PROPERTY.length() &&
  +                    propertyId.endsWith(Constants.DOCUMENT_XML_VERSION_PROPERTY))) {
                       throw new SAXNotSupportedException(
                           SAXMessageFormatter.formatMessage(fConfiguration.getLocale(), 
                           "property-read-only", new Object [] {propertyId}));
  @@ -1771,6 +1963,17 @@
                   final int suffixLength = propertyId.length() - Constants.SAX_PROPERTY_PREFIX.length();
   
                   //
  +                // http://xml.org/sax/properties/document-xml-version
  +                // Value type: java.lang.String
  +                // Access: read-only
  +                //   The literal string describing the actual XML version of the document. 
  +                //
  +                if (suffixLength == Constants.DOCUMENT_XML_VERSION_PROPERTY.length() &&
  +                    propertyId.endsWith(Constants.DOCUMENT_XML_VERSION_PROPERTY)) {
  +                    return fVersion;
  +                }
  +                
  +                //
                   // http://xml.org/sax/properties/lexical-handler
                   // Value type: org.xml.sax.ext.LexicalHandler
                   // Access: read/write, pre-parse only
  @@ -1790,6 +1993,7 @@
                       propertyId.endsWith(Constants.DECLARATION_HANDLER_PROPERTY)) {
                       return getDeclHandler();
                   }
  +                
                   //
                   // http://xml.org/sax/properties/dom-node
                   // Value type: DOM Node
  @@ -1807,6 +2011,7 @@
                           SAXMessageFormatter.formatMessage(fConfiguration.getLocale(), 
                           "dom-node-read-not-supported", null));
                   }
  +                
                   //
                   // Drop through and perform default processing
                   //
  @@ -1968,6 +2173,7 @@
           // reset state
           fInDTD = false;
           fVersion = "1.0";
  +        fStandalone = false;
   
           // features
           fNamespaces = fConfiguration.getFeature(NAMESPACES);           
  
  
  
  1.2       +2 -1      xml-xerces/java/src/org/apache/xerces/impl/msg/SAXMessages.properties
  
  Index: SAXMessages.properties
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/msg/SAXMessages.properties,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SAXMessages.properties	5 Feb 2004 21:30:09 -0000	1.1
  +++ SAXMessages.properties	11 May 2004 01:06:55 -0000	1.2
  @@ -17,6 +17,7 @@
   feature-not-recognized = Feature ''{0}'' is not recognized.
   true-not-supported = True state for feature ''{0}'' is not supported.
   false-not-supported = False state for feature ''{0}'' is not supported.
  +feature-read-only = Feature ''{0}'' is read only.
   
   # property messages
   property-not-supported = Property ''{0}'' is not supported.
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org