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