You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by le...@apache.org on 2001/08/28 02:49:15 UTC

cvs commit: xml-xerces/java/src/org/apache/xerces/parsers AbstractDOMParser.java

lehors      01/08/27 17:49:14

  Modified:    java/docs features.xml
               java/src/org/apache/xerces/parsers AbstractDOMParser.java
  Added:       java/src/org/apache/xerces/dom DeferredAttrImpl.java
                        DeferredAttrNSImpl.java
                        DeferredCDATASectionImpl.java
                        DeferredCommentImpl.java DeferredDocumentImpl.java
                        DeferredDocumentTypeImpl.java
                        DeferredElementDefinitionImpl.java
                        DeferredElementImpl.java DeferredElementNSImpl.java
                        DeferredEntityImpl.java
                        DeferredEntityReferenceImpl.java DeferredNode.java
                        DeferredNotationImpl.java
                        DeferredProcessingInstructionImpl.java
                        DeferredTextImpl.java
  Log:
  Port of the deferred DOM to Xerces2. The major change is that it
  no longer uses/depends on the StringPool. Interestingly, this actually makes
  it more independent of the parser and it could easily be used with another
  one.
  
  Revision  Changes    Path
  1.17      +24 -2     xml-xerces/java/docs/features.xml
  
  Index: features.xml
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/docs/features.xml,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- features.xml	2001/08/23 00:35:14	1.16
  +++ features.xml	2001/08/28 00:49:14	1.17
  @@ -217,6 +217,28 @@
     </feature>
    </fcategory>
    <fcategory name='DOM Features'>
  +  <feature name='http://apache.org/xml/features/dom/defer-node-expansion'
  +           id="dom.defer-node-expansion">
  +   <true>
  +    Lazily expand the DOM nodes.
  +   </true>
  +   <false>
  +    Fully expand the DOM nodes.
  +   </false>
  +   <default value='true'/>
  +   <note>
  +<!--
  +    This feature only applies when the <link idref="properties"
  +    anchor="document-class-name">http://apache.org/xml/properties/dom/document-class-name</link>
  +    property is set to a value other than the name of the default document
  +    factory.
  +-->
  +    When this feature is set to true, the DOM nodes in the returned document
  +    are expanded as the tree is traversed. This allows the parser to return a
  +    document faster than if the tree is fully expanded during parsing and
  +    improves memory usage when the whole tree is not traversed.
  +   </note>
  +  </feature>
     <feature name='http://apache.org/xml/features/dom/create-entity-ref-nodes'
              id='dom.create-entity-ref-nodes'>
      <true>
  @@ -240,10 +262,10 @@
     <feature name='http://apache.org/xml/features/dom/include-ignorable-whitespace'
              id='dom.include-ignorable-whitespace'>
      <true>
  -    Includes text nodes that can be considered "ignorable whitespace" in 
  +    Include text nodes that can be considered "ignorable whitespace" in 
       the DOM tree.
      </true>
  -   <false>Does not include ignorable whitespace in the DOM tree.</false>
  +   <false>Do not include ignorable whitespace in the DOM tree.</false>
      <default value='true'/>
      <note>
       The only way that the parser can determine if text is ignorable 
  
  
  
  1.14      +2 -6      xml-xerces/java/src/org/apache/xerces/dom/DeferredAttrImpl.java
  
  
  
  
  1.17      +3 -6      xml-xerces/java/src/org/apache/xerces/dom/DeferredAttrNSImpl.java
  
  
  
  
  1.8       +0 -1      xml-xerces/java/src/org/apache/xerces/dom/DeferredCDATASectionImpl.java
  
  
  
  
  1.7       +0 -0      xml-xerces/java/src/org/apache/xerces/dom/DeferredCommentImpl.java
  
  
  
  
  1.29      +323 -288  xml-xerces/java/src/org/apache/xerces/dom/DeferredDocumentImpl.java
  
  
  
  
  1.14      +12 -11    xml-xerces/java/src/org/apache/xerces/dom/DeferredDocumentTypeImpl.java
  
  
  
  
  1.10      +3 -2      xml-xerces/java/src/org/apache/xerces/dom/DeferredElementDefinitionImpl.java
  
  
  
  
  1.13      +2 -6      xml-xerces/java/src/org/apache/xerces/dom/DeferredElementImpl.java
  
  
  
  
  1.12      +3 -7      xml-xerces/java/src/org/apache/xerces/dom/DeferredElementNSImpl.java
  
  
  
  
  1.12      +9 -10     xml-xerces/java/src/org/apache/xerces/dom/DeferredEntityImpl.java
  
  
  
  
  1.13      +5 -3      xml-xerces/java/src/org/apache/xerces/dom/DeferredEntityReferenceImpl.java
  
  
  
  
  1.3       +0 -0      xml-xerces/java/src/org/apache/xerces/dom/DeferredNode.java
  
  
  
  
  1.7       +4 -8      xml-xerces/java/src/org/apache/xerces/dom/DeferredNotationImpl.java
  
  
  
  
  1.8       +3 -2      xml-xerces/java/src/org/apache/xerces/dom/DeferredProcessingInstructionImpl.java
  
  
  
  
  1.10      +1 -1      xml-xerces/java/src/org/apache/xerces/dom/DeferredTextImpl.java
  
  
  
  
  1.3       +228 -78   xml-xerces/java/src/org/apache/xerces/parsers/AbstractDOMParser.java
  
  Index: AbstractDOMParser.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/parsers/AbstractDOMParser.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- AbstractDOMParser.java	2001/08/23 00:35:31	1.2
  +++ AbstractDOMParser.java	2001/08/28 00:49:14	1.3
  @@ -57,6 +57,7 @@
   
   package org.apache.xerces.parsers;
   
  +import org.apache.xerces.dom.DeferredDocumentImpl;
   import org.apache.xerces.dom.DocumentImpl;
   import org.apache.xerces.dom.EntityReferenceImpl;
   import org.apache.xerces.dom.TextImpl;
  @@ -91,7 +92,7 @@
    * @author Arnaud Le Hors, IBM
    * @author Andy Clark, IBM
    * 
  - * @version $Id: AbstractDOMParser.java,v 1.2 2001/08/23 00:35:31 lehors Exp $ 
  + * @version $Id: AbstractDOMParser.java,v 1.3 2001/08/28 00:49:14 lehors Exp $ 
    */
   public abstract class AbstractDOMParser
       extends AbstractXMLDocumentParser {
  @@ -108,6 +109,10 @@
       protected static final String INCLUDE_IGNORABLE_WHITESPACE =
           "http://apache.org/xml/features/dom/include-ignorable-whitespace";
   
  +    /** Feature id: defer node expansion. */
  +    protected static final String DEFER_NODE_EXPANSION =
  +        "http://apache.org/xml/features/dom/defer-node-expansion";
  +
       private static final boolean DEBUG_ENTITY_REF = false;
       
       //
  @@ -132,6 +137,20 @@
   
       /** Current node. */
       protected Node fCurrentNode;
  +    protected CDATASection fCurrentCDATASection;
  +
  +
  +    protected String               fCurrentEntityName;
  +    protected String               fCurrentEntityNode;
  +
  +    // deferred expansion data
  +
  +    protected boolean              fDeferNodeExpansion;
  +    protected DeferredDocumentImpl fDeferredDocumentImpl;
  +    protected int                  fDocumentIndex;
  +    protected int                  fDocumentTypeIndex;
  +    protected int                  fCurrentNodeIndex;
  +    protected int                  fCurrentCDATASectionIndex;
   
       // state
   
  @@ -158,12 +177,14 @@
           final String[] recognizedFeatures = {
               CREATE_ENTITY_REF_NODES,
               INCLUDE_IGNORABLE_WHITESPACE,
  +            DEFER_NODE_EXPANSION
           };
           fConfiguration.addRecognizedFeatures(recognizedFeatures);
   
           // set default values
           fConfiguration.setFeature(CREATE_ENTITY_REF_NODES, true);
           fConfiguration.setFeature(INCLUDE_IGNORABLE_WHITESPACE, true);
  +        fConfiguration.setFeature(DEFER_NODE_EXPANSION, true);
   
       } // <init>(XMLParserConfiguration)
   
  @@ -189,9 +210,15 @@
           super.reset();
   
           // get feature state
  -        fCreateEntityRefNodes = fConfiguration.getFeature(CREATE_ENTITY_REF_NODES);
  -        fIncludeIgnorableWhitespace = fConfiguration.getFeature(INCLUDE_IGNORABLE_WHITESPACE);
  +        fCreateEntityRefNodes =
  +            fConfiguration.getFeature(CREATE_ENTITY_REF_NODES);
   
  +        fIncludeIgnorableWhitespace =
  +            fConfiguration.getFeature(INCLUDE_IGNORABLE_WHITESPACE);
  +
  +        fDeferNodeExpansion =
  +            fConfiguration.getFeature(DEFER_NODE_EXPANSION);
  +
           // reset dom information
           fDocument = null;
           fCurrentNode = null;
  @@ -200,6 +227,8 @@
           fInDocument = false;
           fInDTD = false;
           fInCDATASection = false;
  +        fCurrentCDATASection = null;
  +        fCurrentCDATASectionIndex = -1;
   
       } // reset()
   
  @@ -237,9 +266,17 @@
                               String encoding) throws XNIException {
   
           if (fInDocument && !fInDTD && fCreateEntityRefNodes) {
  -            EntityReference entityRef = fDocument.createEntityReference(name);
  -            fCurrentNode.appendChild(entityRef);
  -            fCurrentNode = entityRef;
  +            if (!fDeferNodeExpansion) {
  +                EntityReference er = fDocument.createEntityReference(name);
  +                fCurrentNode.appendChild(er);
  +                fCurrentNode = er;
  +            }
  +            else {
  +                int er =
  +                    fDeferredDocumentImpl.createDeferredEntityReference(name);
  +                fDeferredDocumentImpl.appendChild(fCurrentNodeIndex, er);
  +                fCurrentNodeIndex = er;
  +            }
           }
   
       } // startEntity(String,String,String,String)
  @@ -253,8 +290,15 @@
        */
       public void comment(XMLString text) throws XNIException {
   
  -        Comment comment = fDocument.createComment(text.toString());
  -        fCurrentNode.appendChild(comment);
  +        if (!fDeferNodeExpansion) {
  +            Comment comment = fDocument.createComment(text.toString());
  +            fCurrentNode.appendChild(comment);
  +        }
  +        else {
  +            int comment =
  +                fDeferredDocumentImpl.createDeferredComment(text.toString());
  +            fDeferredDocumentImpl.appendChild(fCurrentNodeIndex, comment);
  +        }
   
       } // comment(XMLString)
   
  @@ -277,8 +321,16 @@
       public void processingInstruction(String target, XMLString data)
           throws XNIException {
   
  -        ProcessingInstruction pi = fDocument.createProcessingInstruction(target, data.toString());
  -        fCurrentNode.appendChild(pi);
  +        if (!fDeferNodeExpansion) {
  +            ProcessingInstruction pi =
  +                fDocument.createProcessingInstruction(target, data.toString());
  +            fCurrentNode.appendChild(pi);
  +        }
  +        else {
  +            int pi = fDeferredDocumentImpl.
  +                createDeferredProcessingInstruction(target, data.toString());
  +            fDeferredDocumentImpl.appendChild(fCurrentNodeIndex, pi);
  +        }
   
       } // processingInstruction(String,XMLString)
   
  @@ -299,11 +351,19 @@
           throws XNIException {
   
           fInDocument = true;
  -        fDocument = new DocumentImpl();
  -        fDocumentImpl = (DocumentImpl)fDocument;
  -        fCurrentNode = fDocument;
  -        // set DOM error checking off
  -        fDocumentImpl.setErrorChecking(false);
  +        if (!fDeferNodeExpansion) {
  +            fDocument = new DocumentImpl();
  +            fDocumentImpl = (DocumentImpl)fDocument;
  +            fCurrentNode = fDocument;
  +            // set DOM error checking off
  +            fDocumentImpl.setErrorChecking(false);
  +        }
  +        else {
  +            fDeferredDocumentImpl = new DeferredDocumentImpl();
  +            fDocument = fDeferredDocumentImpl;
  +            fDocumentIndex = fDeferredDocumentImpl.createDeferredDocument();
  +            fCurrentNodeIndex = fDocumentIndex;
  +        }
   
       } // startDocument(String,String)
   
  @@ -318,12 +378,21 @@
        *
        * @throws XNIException Thrown by handler to signal an error.
        */
  -    public void doctypeDecl(String rootElement, String publicId, String systemId)
  +    public void doctypeDecl(String rootElement,
  +                            String publicId, String systemId)
           throws XNIException {
           
  -        DocumentImpl docimpl = (DocumentImpl)fDocument;
  -        DocumentType doctype = docimpl.createDocumentType(rootElement, publicId, systemId);
  -        fCurrentNode.appendChild(doctype);
  +        if (!fDeferNodeExpansion) {
  +            DocumentImpl docimpl = (DocumentImpl) fDocument;
  +            DocumentType doctype =
  +                docimpl.createDocumentType(rootElement, publicId, systemId);
  +            fCurrentNode.appendChild(doctype);
  +        }
  +        else {
  +            int doctype = fDeferredDocumentImpl.
  +                createDeferredDocumentType(rootElement, publicId, systemId);
  +            fDeferredDocumentImpl.appendChild(fCurrentNodeIndex, doctype);
  +        }
   
       } // doctypeDecl(String,String,String)
   
  @@ -340,29 +409,41 @@
       public void startElement(QName element, XMLAttributes attributes)
           throws XNIException {
   
  -        Element elementNode = element.prefix != null
  -                            ? fDocument.createElementNS(element.uri, element.rawname)
  -                            : fDocument.createElement(element.rawname);
  -        int attrCount = attributes.getLength();
  -        for (int i = 0; i < attrCount; i++) {
  -            attributes.getName(i, fAttrQName);
  -            Attr attr = fAttrQName.prefix != null
  -                      ? fDocument.createAttributeNS(fAttrQName.uri, fAttrQName.rawname)
  -                      : fDocument.createAttribute(fAttrQName.rawname);
  -            attr.setNodeValue(attributes.getValue(i));
  -            // REVISIT: Handle entities in attribute value.
  -            elementNode.setAttributeNode(attr);
  -
  -            // build entity references
  -            int entityCount = attributes.getEntityCount(i);
  -            if (entityCount > 0) {
  -                Text text = (Text)attr.getFirstChild();
  -                buildAttrEntityRefs(text, attributes, i, entityCount, 0, 0);
  +        if (!fDeferNodeExpansion) {
  +            Element el = element.prefix != null
  +                ? fDocument.createElementNS(element.uri, element.rawname)
  +                : fDocument.createElement(element.rawname);
  +            int attrCount = attributes.getLength();
  +            for (int i = 0; i < attrCount; i++) {
  +                attributes.getName(i, fAttrQName);
  +                Attr attr = fAttrQName.prefix != null
  +                    ? fDocument.createAttributeNS(fAttrQName.uri,
  +                                                  fAttrQName.rawname)
  +                    : fDocument.createAttribute(fAttrQName.rawname);
  +                attr.setNodeValue(attributes.getValue(i));
  +                // REVISIT: Handle entities in attribute value.
  +                el.setAttributeNode(attr);
  +
  +                // build entity references
  +                int entityCount = attributes.getEntityCount(i);
  +                if (entityCount > 0) {
  +                    Text text = (Text)attr.getFirstChild();
  +                    buildAttrEntityRefs(text, attributes,
  +                                        i, entityCount, 0, 0);
  +                }
               }
  +            fCurrentNode.appendChild(el);
  +            fCurrentNode = el;
           }
  -        fCurrentNode.appendChild(elementNode);
  -        fCurrentNode = elementNode;
  +        else {
  +            int el = fDeferredDocumentImpl.
  +                createDeferredElement(element.prefix != null ?
  +                                      element.uri : null,
  +                                      element.rawname, attributes);
   
  +            fDeferredDocumentImpl.appendChild(fCurrentNodeIndex, el);
  +            fCurrentNodeIndex = el;
  +        }
       } // startElement(QName,XMLAttributes)
   
       /**
  @@ -374,22 +455,53 @@
        */
       public void characters(XMLString text) throws XNIException {
   
  -        if (fInCDATASection) {
  -            CDATASection cdataSection = (CDATASection)fCurrentNode;
  -            cdataSection.appendData(text.toString());
  -        }
  -        else if (!fInDTD) {
  -            Node child = fCurrentNode.getLastChild();
  -            if (child != null && child.getNodeType() == Node.TEXT_NODE) {
  -                Text textNode = (Text)child;
  -                textNode.appendData(text.toString());
  +        if (!fDeferNodeExpansion) {
  +            if (fInCDATASection) {
  +                if (fCurrentCDATASection == null) {
  +                    fCurrentCDATASection =
  +                        fDocument.createCDATASection(text.toString());
  +                    fCurrentNode.appendChild(fCurrentCDATASection);
  +                    fCurrentNode = fCurrentCDATASection;
  +                }
  +                else {
  +                    fCurrentCDATASection.appendData(text.toString());
  +                }
               }
  -            else {
  -                Text textNode = fDocument.createTextNode(text.toString());
  -                fCurrentNode.appendChild(textNode);
  +            else if (!fInDTD) {
  +                Node child = fCurrentNode.getLastChild();
  +                if (child != null && child.getNodeType() == Node.TEXT_NODE) {
  +                    Text textNode = (Text)child;
  +                    textNode.appendData(text.toString());
  +                }
  +                else {
  +                    Text textNode = fDocument.createTextNode(text.toString());
  +                    fCurrentNode.appendChild(textNode);
  +                }
               }
           }
  -
  +        else {
  +            // The Text and CDATASection normalization is taken care of within
  +            // the DOM in the deferred case.
  +            if (fInCDATASection) {
  +                if (fCurrentCDATASectionIndex == -1) {
  +                    int cs = fDeferredDocumentImpl.
  +                        createDeferredCDATASection(text.toString());
  +
  +                    fDeferredDocumentImpl.appendChild(fCurrentNodeIndex, cs);
  +                    fCurrentCDATASectionIndex = cs;
  +                    fCurrentNodeIndex = cs;
  +                }
  +                else {
  +                    int txt = fDeferredDocumentImpl.
  +                        createDeferredTextNode(text.toString(), false);
  +                    fDeferredDocumentImpl.appendChild(fCurrentNodeIndex, txt);
  +                }
  +            } if (!fInDTD) {
  +                int txt = fDeferredDocumentImpl.
  +                    createDeferredTextNode(text.toString(), false);
  +                fDeferredDocumentImpl.appendChild(fCurrentNodeIndex, txt);
  +            }
  +        }
       } // characters(XMLString)
   
       /**
  @@ -410,24 +522,38 @@
               return;
           }
   
  -        if (fInCDATASection) {
  -            CDATASection cdataSection = (CDATASection)fCurrentNode;
  -            cdataSection.appendData(text.toString());
  -            return;
  -        }
  +        if (!fDeferNodeExpansion) {
  +            /*
  +              REVISIT: This doesn't make sense - CDATASections are never
  +              ignorable whitespace - ALH!!!
  +
  +              if (fInCDATASection) {
  +              CDATASection cdataSection = (CDATASection)fCurrentNode;
  +              cdataSection.appendData(text.toString());
  +              return;
  +              }
  +            */
           
  -        Node child = fCurrentNode.getLastChild();
  -        if (child != null && child.getNodeType() == Node.TEXT_NODE) {
  -            Text textNode = (Text)child;
  -            textNode.appendData(text.toString());
  +            Node child = fCurrentNode.getLastChild();
  +            if (child != null && child.getNodeType() == Node.TEXT_NODE) {
  +                Text textNode = (Text)child;
  +                textNode.appendData(text.toString());
  +            }
  +            else {
  +                Text textNode = fDocument.createTextNode(text.toString());
  +                if (fDocumentImpl != null) {
  +                    TextImpl textNodeImpl = (TextImpl)textNode;
  +                    textNodeImpl.setIgnorableWhitespace(true);
  +                }
  +                fCurrentNode.appendChild(textNode);
  +            }
           }
           else {
  -            Text textNode = fDocument.createTextNode(text.toString());
  -            if (fDocumentImpl != null) {
  -                TextImpl textNodeImpl = (TextImpl)textNode;
  -                textNodeImpl.setIgnorableWhitespace(true);
  -            }
  -            fCurrentNode.appendChild(textNode);
  +            // The Text normalization is taken care of within the DOM in the
  +            // deferred case.
  +            int txt = fDeferredDocumentImpl.
  +                createDeferredTextNode(text.toString(), true);
  +            fDeferredDocumentImpl.appendChild(fCurrentNodeIndex, txt);
           }
   
       } // ignorableWhitespace(XMLString)
  @@ -440,8 +566,15 @@
        * @throws XNIException Thrown by handler to signal an error.
        */
       public void endElement(QName element) throws XNIException {
  +
  +        if (!fDeferNodeExpansion) {
  +            fCurrentNode = fCurrentNode.getParentNode();
  +        }
  +        else {
  +            fCurrentNodeIndex =
  +                fDeferredDocumentImpl.getParentNode(fCurrentNodeIndex, false);
  +        }
   
  -        fCurrentNode = fCurrentNode.getParentNode();
   
       } // endElement(QName)
   
  @@ -464,9 +597,6 @@
       public void startCDATA() throws XNIException {
   
           fInCDATASection = true;
  -        CDATASection cdataSection = fDocument.createCDATASection("");
  -        fCurrentNode.appendChild(cdataSection);
  -        fCurrentNode = cdataSection;
   
       } // startCDATA()
   
  @@ -478,7 +608,15 @@
       public void endCDATA() throws XNIException {
   
           fInCDATASection = false;
  -        fCurrentNode = fCurrentNode.getParentNode();
  +        if (!fDeferNodeExpansion) {
  +            fCurrentNode = fCurrentNode.getParentNode();
  +            fCurrentCDATASection = null;
  +        }
  +        else {
  +            fCurrentNodeIndex =
  +                fDeferredDocumentImpl.getParentNode(fCurrentNodeIndex, false);
  +            fCurrentCDATASectionIndex = -1;
  +        }
   
       } // endCDATA()
   
  @@ -489,12 +627,17 @@
        */
       public void endDocument() throws XNIException {
   
  -        // set DOM error checking back on
  -        if (fDocumentImpl != null) {
  -            fDocumentImpl.setErrorChecking(true);
  -        }
           fInDocument = false;
  -        fCurrentNode = null;
  +        if (!fDeferNodeExpansion) {
  +            // set DOM error checking back on
  +            if (fDocumentImpl != null) {
  +                fDocumentImpl.setErrorChecking(true);
  +            }
  +            fCurrentNode = null;
  +        }
  +        else {
  +            fCurrentNodeIndex = -1;
  +        }
   
       } // endDocument()
   
  @@ -518,7 +661,14 @@
       public void endEntity(String name) throws XNIException {
   
           if (fInDocument && !fInDTD && fCreateEntityRefNodes) {
  -            fCurrentNode = fCurrentNode.getParentNode();
  +            if (!fDeferNodeExpansion) {
  +                fCurrentNode = fCurrentNode.getParentNode();
  +            }
  +            else {
  +                fCurrentNodeIndex =
  +                    fDeferredDocumentImpl.getParentNode(fCurrentNodeIndex,
  +                                                        false);
  +            }
           }
   
       } // endEntity(String)
  
  
  

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