You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by an...@locus.apache.org on 2000/06/21 04:38:20 UTC
cvs commit: xml-xerces/java/src/org/apache/xerces/dom DeferredDocumentImpl.java DeferredTextImpl.java
andyc 00/06/20 19:38:18
Modified: java/src/org/apache/xerces/dom DeferredDocumentImpl.java
DeferredTextImpl.java
Log:
Fixed bug in deferred DOM implementation that prevented adjacent
text nodes from being pre-normalized after parsing. This caused
parsed character data that contained references to the pre-defined
entities or character entities to appear in separate text nodes.
For example:
<root>a&b</root>
appeared as the following DOM tree:
element: root
text: 'a'
text: '&'
text: 'b'
when it should have appeared as the following DOM tree:
element: root
text: 'a&b'
This bug only affected the deferred implementation.
Revision Changes Path
1.18 +39 -7 xml-xerces/java/src/org/apache/xerces/dom/DeferredDocumentImpl.java
Index: DeferredDocumentImpl.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/DeferredDocumentImpl.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- DeferredDocumentImpl.java 2000/05/26 19:00:20 1.17
+++ DeferredDocumentImpl.java 2000/06/21 02:38:17 1.18
@@ -658,13 +658,20 @@
int chunk = nodeIndex >> CHUNK_SHIFT;
int index = nodeIndex & CHUNK_MASK;
- nodeIndex = free ? clearChunkIndex(fNodePrevSib, chunk, index)
- : getChunkIndex(fNodePrevSib, chunk, index);
-
- while (nodeIndex != -1 && getChunkIndex(fNodeType, chunk, index) == Node.TEXT_NODE) {
+ int type = getChunkIndex(fNodeType, chunk, index);
+ if (type == Node.TEXT_NODE) {
+ do {
+ nodeIndex = getChunkIndex(fNodePrevSib, chunk, index);
+ if (nodeIndex == -1) {
+ break;
+ }
+ chunk = nodeIndex >> CHUNK_SHIFT;
+ index = nodeIndex & CHUNK_MASK;
+ type = getChunkIndex(fNodeType, chunk, index);
+ } while (type == Node.TEXT_NODE);
+ }
+ else {
nodeIndex = getChunkIndex(fNodePrevSib, chunk, index);
- chunk = nodeIndex >> CHUNK_SHIFT;
- index = nodeIndex & CHUNK_MASK;
}
return nodeIndex;
@@ -755,7 +762,10 @@
// get node type
int chunk = nodeIndex >> CHUNK_SHIFT;
int index = nodeIndex & CHUNK_MASK;
- int type = clearChunkIndex(fNodeType, chunk, index);
+ int type = getChunkIndex(fNodeType, chunk, index);
+ if (type != Node.TEXT_NODE) {
+ clearChunkIndex(fNodeType, chunk, index);
+ }
// create new node
DeferredNode node = null;
@@ -960,6 +970,28 @@
: getChunkIndex(fNodeValue, chunk, index);
if (valueIndex == -1) {
return null;
+ }
+
+ int type = getChunkIndex(fNodeType, chunk, index);
+ if (type == Node.TEXT_NODE) {
+ int prevSib = getRealPrevSibling(nodeIndex);
+ if (prevSib != -1 && getNodeType(prevSib, false) == Node.TEXT_NODE) {
+ StringBuffer str = new StringBuffer();
+ str.append(fStringPool.toString(valueIndex));
+ do {
+ chunk = prevSib >> CHUNK_SHIFT;
+ index = prevSib & CHUNK_MASK;
+ valueIndex = getChunkIndex(fNodeValue, chunk, index);
+ // NOTE: This has to be done backwards because the
+ // children are placed backwards.
+ str.insert(0, fStringPool.toString(valueIndex));
+ prevSib = getChunkIndex(fNodePrevSib, chunk, index);
+ if (prevSib == -1) {
+ break;
+ }
+ } while (getNodeType(prevSib, false) == Node.TEXT_NODE);
+ return str.toString();
+ }
}
return fStringPool.toString(valueIndex);
1.6 +3 -18 xml-xerces/java/src/org/apache/xerces/dom/DeferredTextImpl.java
Index: DeferredTextImpl.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/DeferredTextImpl.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- DeferredTextImpl.java 2000/04/13 00:34:41 1.5
+++ DeferredTextImpl.java 2000/06/21 02:38:18 1.6
@@ -133,24 +133,9 @@
(DeferredDocumentImpl) this.ownerDocument();
data = ownerDocument.getNodeValueString(fNodeIndex);
- // revisit: we only normalize text nodes with Elements as parents.
- int parent = -1;
- if (getNodeType() == Node.TEXT_NODE &&
- (parent = ownerDocument.getParentNode(fNodeIndex)) != -1 &&
- ownerDocument.getNodeType(parent) == Node.ELEMENT_NODE) {
-
- int realPrev = ownerDocument.getRealPrevSibling(fNodeIndex);
- int type = ownerDocument.getNodeType(realPrev);
- if (realPrev != -1 && type == Node.TEXT_NODE) {
- StringBuffer sb = new StringBuffer(data);
- while (realPrev != -1 && type == Node.TEXT_NODE) {
- sb.insert(0, ownerDocument.getNodeValueString(realPrev));
- realPrev = ownerDocument.getRealPrevSibling(realPrev);
- type = ownerDocument.getNodeType(realPrev);
- }
- data = sb.toString();
- }
- }
+ // NOTE: We used to normalize adjacent text node values here.
+ // This code has moved to the DeferredDocumentImpl
+ // getNodeValueString() method. -Ac
// ignorable whitespace
ignorableWhitespace(ownerDocument.getLastChild(fNodeIndex) == 1);