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&amp;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);