Author: amassari
Date: Tue Jan  3 08:13:25 2006
New Revision: 365671

URL: http://svn.apache.org/viewcvs?rev=365671&view=rev
Log:
DOM L3: implemented getWholeText/replaceWholeText

Modified:
    xerces/c/trunk/src/xercesc/dom/DOMNode.hpp
    xerces/c/trunk/src/xercesc/dom/DOMText.hpp
    xerces/c/trunk/src/xercesc/dom/impl/DOMCDATASectionImpl.cpp
    xerces/c/trunk/src/xercesc/dom/impl/DOMCDATASectionImpl.hpp
    xerces/c/trunk/src/xercesc/dom/impl/DOMTextImpl.cpp
    xerces/c/trunk/src/xercesc/dom/impl/DOMTextImpl.hpp
    xerces/c/trunk/tests/src/DOM/DOMTest/DTest.cpp
    xerces/c/trunk/tests/src/DOM/DOMTest/DTest.h

Modified: xerces/c/trunk/src/xercesc/dom/DOMNode.hpp
URL: 
http://svn.apache.org/viewcvs/xerces/c/trunk/src/xercesc/dom/DOMNode.hpp?rev=365671&r1=365670&r2=365671&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/dom/DOMNode.hpp (original)
+++ xerces/c/trunk/src/xercesc/dom/DOMNode.hpp Tue Jan  3 08:13:25 2006
@@ -903,12 +903,12 @@
         ((DOMDocumentImpl*)(ptr->getOwnerDocument()))
 
 #define GET_DIRECT_MM(ptr)           \
-        ptr ? ((DOMDocumentImpl*)ptr)->getMemoryManager() : 
XMLPlatformUtils::fgMemoryManager        
+        (ptr ? ((DOMDocumentImpl*)ptr)->getMemoryManager() : 
XMLPlatformUtils::fgMemoryManager)
 
 #define GET_INDIRECT_MM(ptr)                                                   
 \
-        !ptr ? XMLPlatformUtils::fgMemoryManager :                             
 \
+        (!ptr ? XMLPlatformUtils::fgMemoryManager :                            
  \
         GET_OWNER_DOCUMENT(ptr) ? GET_OWNER_DOCUMENT(ptr)->getMemoryManager() 
: \
-        XMLPlatformUtils::fgMemoryManager
+        XMLPlatformUtils::fgMemoryManager)
 
 /***
  * For DOMNode and its derivatives

Modified: xerces/c/trunk/src/xercesc/dom/DOMText.hpp
URL: 
http://svn.apache.org/viewcvs/xerces/c/trunk/src/xercesc/dom/DOMText.hpp?rev=365671&r1=365670&r2=365671&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/dom/DOMText.hpp (original)
+++ xerces/c/trunk/src/xercesc/dom/DOMText.hpp Tue Jan  3 08:13:25 2006
@@ -124,7 +124,7 @@
      *
      * @since DOM Level 3
      */
-    virtual const XMLCh* getWholeText() = 0;
+    virtual const XMLCh* getWholeText() const = 0;
 
     /**
      * Substitutes the a specified text for the text of the current node and

Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMCDATASectionImpl.cpp
URL: 
http://svn.apache.org/viewcvs/xerces/c/trunk/src/xercesc/dom/impl/DOMCDATASectionImpl.cpp?rev=365671&r1=365670&r2=365671&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/dom/impl/DOMCDATASectionImpl.cpp (original)
+++ xerces/c/trunk/src/xercesc/dom/impl/DOMCDATASectionImpl.cpp Tue Jan  3 
08:13:25 2006
@@ -25,21 +25,23 @@
 #include "DOMCasts.hpp"
 #include "DOMStringPool.hpp"
 #include <xercesc/dom/DOMException.hpp>
+#include <xercesc/dom/DOMNodeFilter.hpp>
+#include <xercesc/dom/DOMTreeWalker.hpp>
 #include <xercesc/util/XMLUniDefs.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
 DOMCDATASectionImpl::DOMCDATASectionImpl(DOMDocument *ownerDoc,
                                    const XMLCh *dat)
-    : fNode(ownerDoc), fParent(ownerDoc), fCharacterData(ownerDoc, dat)
+    : fNode(ownerDoc), fCharacterData(ownerDoc, dat)
 {
+    fNode.setIsLeafNode(true);
 }
 
 
 DOMCDATASectionImpl::DOMCDATASectionImpl(const DOMCDATASectionImpl &other, 
bool /*deep*/)
     : DOMCDATASection(other),
     fNode(*castToNodeImpl(&other)),
-    fParent(*castToParentImpl(&other)),
     fChild(*castToChildImpl(&other)),
     fCharacterData(other.fCharacterData)
 {
@@ -123,14 +125,102 @@
     return isIgnorableWhitespace();
 }
 
-const XMLCh* DOMCDATASectionImpl::getWholeText() {
-    throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0, 
GetDOMNodeMemoryManager);
-    return 0;
+const XMLCh* DOMCDATASectionImpl::getWholeText() const 
+{
+    DOMTreeWalker* 
pWalker=getOwnerDocument()->createTreeWalker(getOwnerDocument()->getDocumentElement(),
 DOMNodeFilter::SHOW_ALL, NULL, true);
+    pWalker->setCurrentNode((DOMNode*)this);
+    // Logically-adjacent text nodes are Text or CDATASection nodes that can 
be visited sequentially in document order or in 
+    // reversed document order without entering, exiting, or passing over 
Element, Comment, or ProcessingInstruction nodes.
+    while(true)
+    {
+        DOMNode* prevNode=pWalker->previousNode();
+        if(prevNode==NULL || prevNode->getNodeType()==ELEMENT_NODE || 
prevNode->getNodeType()==COMMENT_NODE || 
prevNode->getNodeType()==PROCESSING_INSTRUCTION_NODE)
+            break;
+    }
+       XMLBuffer buff(1023, GetDOMNodeMemoryManager);
+    while(true)
+    {
+        DOMNode* nextNode=pWalker->nextNode();
+        if(nextNode==NULL || nextNode->getNodeType()==ELEMENT_NODE || 
nextNode->getNodeType()==COMMENT_NODE || 
nextNode->getNodeType()==PROCESSING_INSTRUCTION_NODE)
+            break;
+        if(nextNode->getNodeType()==TEXT_NODE || 
nextNode->getNodeType()==CDATA_SECTION_NODE)
+               buff.append(nextNode->getNodeValue());
+    }
+    pWalker->release();
+
+    XMLCh* wholeString = (XMLCh*) 
(GetDOMNodeMemoryManager->allocate((buff.getLen()+1)*sizeof(XMLCh)));
+       XMLString::copyString(wholeString, buff.getRawBuffer());
+       return wholeString;
 }
 
-DOMText* DOMCDATASectionImpl::replaceWholeText(const XMLCh*){
-    throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0, 
GetDOMNodeMemoryManager);
-    return 0;
+DOMText* DOMCDATASectionImpl::replaceWholeText(const XMLCh* newText)
+{
+    DOMTreeWalker* 
pWalker=getOwnerDocument()->createTreeWalker(getOwnerDocument()->getDocumentElement(),
 DOMNodeFilter::SHOW_ALL, NULL, true);
+    pWalker->setCurrentNode((DOMNode*)this);
+    // Logically-adjacent text nodes are Text or CDATASection nodes that can 
be visited sequentially in document order or in 
+    // reversed document order without entering, exiting, or passing over 
Element, Comment, or ProcessingInstruction nodes.
+    DOMNode* pFirstTextNode=this;
+    while(true)
+    {
+        DOMNode* prevNode=pWalker->previousNode();
+        if(prevNode==NULL || prevNode->getNodeType()==ELEMENT_NODE || 
prevNode->getNodeType()==COMMENT_NODE || 
prevNode->getNodeType()==PROCESSING_INSTRUCTION_NODE)
+            break;
+        pFirstTextNode=prevNode;
+    }
+    // before doing any change we need to check if we are going to remove an 
entity reference that doesn't contain just text
+    DOMNode* pCurrentNode=pWalker->getCurrentNode();
+    while(true)
+    {
+        DOMNode* nextNode=pWalker->nextNode();
+        if(nextNode==NULL || nextNode->getNodeType()==ELEMENT_NODE || 
nextNode->getNodeType()==COMMENT_NODE || 
nextNode->getNodeType()==PROCESSING_INSTRUCTION_NODE)
+            break;
+        if(nextNode->getNodeType()==ENTITY_REFERENCE_NODE)
+        {
+            DOMTreeWalker* 
pInnerWalker=getOwnerDocument()->createTreeWalker(nextNode, 
DOMNodeFilter::SHOW_ALL, NULL, true);
+            while(pInnerWalker->nextNode())
+            {
+                short nodeType=pInnerWalker->getCurrentNode()->getNodeType();
+                if(nodeType!=ENTITY_REFERENCE_NODE && nodeType!=TEXT_NODE && 
nodeType!=CDATA_SECTION_NODE)
+                    throw 
DOMException(DOMException::NO_MODIFICATION_ALLOWED_ERR, 0, 
GetDOMNodeMemoryManager);
+            }
+            pInnerWalker->release();
+        }
+    }
+    DOMText* retVal=NULL;
+    // if the first node in the chain is a text node, replace its content, 
otherwise create a new node
+    if(newText && *newText)
+    {
+        if(!castToNodeImpl(pFirstTextNode)->isReadOnly() && 
(pFirstTextNode->getNodeType()==TEXT_NODE || 
pFirstTextNode->getNodeType()==CDATA_SECTION_NODE))
+        {
+            pFirstTextNode->setNodeValue(newText);
+            retVal=(DOMText*)pFirstTextNode;
+        }
+        else
+        {
+            if(getNodeType()==TEXT_NODE)
+                retVal=getOwnerDocument()->createTextNode(newText);
+            else
+                retVal=getOwnerDocument()->createCDATASection(newText);
+            pFirstTextNode->getParentNode()->insertBefore(retVal, 
pFirstTextNode);
+        }
+    }
+    // now delete all the following text nodes
+    pWalker->setCurrentNode(pCurrentNode);
+    while(true)
+    {
+        DOMNode* nextNode=pWalker->nextNode();
+        if(nextNode==NULL || nextNode->getNodeType()==ELEMENT_NODE || 
nextNode->getNodeType()==COMMENT_NODE || 
nextNode->getNodeType()==PROCESSING_INSTRUCTION_NODE)
+            break;
+        if(nextNode!=retVal)
+        {
+            // keep the tree walker valid
+            pWalker->previousNode();
+            nextNode->getParentNode()->removeChild(nextNode);
+            nextNode->release();
+        }
+    }
+    pWalker->release();
+    return retVal;
 }
 
 
@@ -143,7 +233,6 @@
 
     if (doc) {
         fNode.callUserDataHandlers(DOMUserDataHandler::NODE_DELETED, 0, 0);
-        fParent.release();
         fCharacterData.releaseBuffer();
         doc->release(this, DOMMemoryManager::CDATA_SECTION_OBJECT);
     }
@@ -157,32 +246,32 @@
 //
 //  Delegation stubs for other DOM_Node inherited functions.
 //
-           DOMNode*         DOMCDATASectionImpl::appendChild(DOMNode 
*newChild)          {return fParent.appendChild (newChild); }
+           DOMNode*         DOMCDATASectionImpl::appendChild(DOMNode 
*newChild)          {return fNode.appendChild (newChild); }
            DOMNamedNodeMap* DOMCDATASectionImpl::getAttributes() const         
          {return fNode.getAttributes (); }
-           DOMNodeList*     DOMCDATASectionImpl::getChildNodes() const         
          {return fParent.getChildNodes (); }
-           DOMNode*         DOMCDATASectionImpl::getFirstChild() const         
          {return fParent.getFirstChild (); }
-           DOMNode*         DOMCDATASectionImpl::getLastChild() const          
          {return fParent.getLastChild (); }
+           DOMNodeList*     DOMCDATASectionImpl::getChildNodes() const         
          {return fNode.getChildNodes (); }
+           DOMNode*         DOMCDATASectionImpl::getFirstChild() const         
          {return fNode.getFirstChild (); }
+           DOMNode*         DOMCDATASectionImpl::getLastChild() const          
          {return fNode.getLastChild (); }
      const XMLCh*           DOMCDATASectionImpl::getLocalName() const          
          {return fNode.getLocalName (); }
      const XMLCh*           DOMCDATASectionImpl::getNamespaceURI() const       
          {return fNode.getNamespaceURI (); }
            DOMNode*         DOMCDATASectionImpl::getNextSibling() const        
          {return fChild.getNextSibling (); }
      const XMLCh*           DOMCDATASectionImpl::getNodeValue() const          
          {return fCharacterData.getNodeValue (); }
-           DOMDocument*     DOMCDATASectionImpl::getOwnerDocument() const      
          {return fParent.fOwnerDocument; }
+           DOMDocument*     DOMCDATASectionImpl::getOwnerDocument() const      
          {return fNode.getOwnerDocument(); }
      const XMLCh*           DOMCDATASectionImpl::getPrefix() const             
          {return fNode.getPrefix (); }
            DOMNode*         DOMCDATASectionImpl::getParentNode() const         
          {return fChild.getParentNode (this); }
            DOMNode*         DOMCDATASectionImpl::getPreviousSibling() const    
          {return fChild.getPreviousSibling (this); }
-           bool             DOMCDATASectionImpl::hasChildNodes() const         
          {return fParent.hasChildNodes (); }
+           bool             DOMCDATASectionImpl::hasChildNodes() const         
          {return fNode.hasChildNodes (); }
            DOMNode*         DOMCDATASectionImpl::insertBefore(DOMNode 
*newChild, DOMNode *refChild)
-                                                                               
          {return fParent.insertBefore (newChild, refChild); }
+                                                                               
          {return fNode.insertBefore (newChild, refChild); }
            void             DOMCDATASectionImpl::normalize()                   
          {fNode.normalize (); }
-           DOMNode*         DOMCDATASectionImpl::removeChild(DOMNode 
*oldChild)          {return fParent.removeChild (oldChild); }
+           DOMNode*         DOMCDATASectionImpl::removeChild(DOMNode 
*oldChild)          {return fNode.removeChild (oldChild); }
            DOMNode*         DOMCDATASectionImpl::replaceChild(DOMNode 
*newChild, DOMNode *oldChild)
-                                                                               
          {return fParent.replaceChild (newChild, oldChild); }
+                                                                               
          {return fNode.replaceChild (newChild, oldChild); }
            bool             DOMCDATASectionImpl::isSupported(const XMLCh 
*feature, const XMLCh *version) const
                                                                                
          {return fNode.isSupported (feature, version); }
            void             DOMCDATASectionImpl::setPrefix(const XMLCh  
*prefix)         {fNode.setPrefix(prefix); }
            bool             DOMCDATASectionImpl::hasAttributes() const         
          {return fNode.hasAttributes(); }
            bool             DOMCDATASectionImpl::isSameNode(const DOMNode* 
other) const  {return fNode.isSameNode(other); }
-           bool             DOMCDATASectionImpl::isEqualNode(const DOMNode* 
arg) const   {return fParent.isEqualNode(arg); }
+           bool             DOMCDATASectionImpl::isEqualNode(const DOMNode* 
arg) const   {return fNode.isEqualNode(arg); }
            void*            DOMCDATASectionImpl::setUserData(const XMLCh* key, 
void* data, DOMUserDataHandler* handler)
                                                                                
          {return fNode.setUserData(key, data, handler); }
            void*            DOMCDATASectionImpl::getUserData(const XMLCh* key) 
const     {return fNode.getUserData(key); }

Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMCDATASectionImpl.hpp
URL: 
http://svn.apache.org/viewcvs/xerces/c/trunk/src/xercesc/dom/impl/DOMCDATASectionImpl.hpp?rev=365671&r1=365670&r2=365671&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/dom/impl/DOMCDATASectionImpl.hpp (original)
+++ xerces/c/trunk/src/xercesc/dom/impl/DOMCDATASectionImpl.hpp Tue Jan  3 
08:13:25 2006
@@ -43,7 +43,6 @@
 class CDOM_EXPORT DOMCDATASectionImpl: public DOMCDATASection {
 private:
     DOMNodeImpl           fNode;
-    DOMParentNode         fParent;
     DOMChildNode          fChild;
     DOMCharacterDataImpl  fCharacterData;
 
@@ -58,7 +57,7 @@
     virtual DOMText*     splitText(XMLSize_t offset);
     // DOM Level 3
     virtual bool            getIsElementContentWhitespace() const;
-    virtual const XMLCh*    getWholeText();
+    virtual const XMLCh*    getWholeText() const;
     virtual DOMText*        replaceWholeText(const XMLCh* content);
 
     // non-standard extension

Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMTextImpl.cpp
URL: 
http://svn.apache.org/viewcvs/xerces/c/trunk/src/xercesc/dom/impl/DOMTextImpl.cpp?rev=365671&r1=365670&r2=365671&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/dom/impl/DOMTextImpl.cpp (original)
+++ xerces/c/trunk/src/xercesc/dom/impl/DOMTextImpl.cpp Tue Jan  3 08:13:25 2006
@@ -23,6 +23,10 @@
 
 #include <xercesc/dom/DOMException.hpp>
 #include <xercesc/dom/DOMNode.hpp>
+#include <xercesc/dom/DOMElement.hpp>
+#include <xercesc/dom/DOMCDATASection.hpp>
+#include <xercesc/dom/DOMNodeFilter.hpp>
+#include <xercesc/dom/DOMTreeWalker.hpp>
 
 #include "DOMDocumentImpl.hpp"
 #include "DOMStringPool.hpp"
@@ -30,7 +34,7 @@
 #include "DOMCharacterDataImpl.hpp"
 #include "DOMChildNode.hpp"
 #include "DOMRangeImpl.hpp"
-
+#include "DOMCasts.hpp"
 
 #include <assert.h>
 
@@ -130,14 +134,102 @@
     return isIgnorableWhitespace();
 }
 
-const XMLCh* DOMTextImpl::getWholeText() {
-    throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0, 
GetDOMNodeMemoryManager);
-    return 0;
+const XMLCh* DOMTextImpl::getWholeText() const 
+{
+    DOMTreeWalker* 
pWalker=getOwnerDocument()->createTreeWalker(getOwnerDocument()->getDocumentElement(),
 DOMNodeFilter::SHOW_ALL, NULL, true);
+    pWalker->setCurrentNode((DOMNode*)this);
+    // Logically-adjacent text nodes are Text or CDATASection nodes that can 
be visited sequentially in document order or in 
+    // reversed document order without entering, exiting, or passing over 
Element, Comment, or ProcessingInstruction nodes.
+    while(true)
+    {
+        DOMNode* prevNode=pWalker->previousNode();
+        if(prevNode==NULL || prevNode->getNodeType()==ELEMENT_NODE || 
prevNode->getNodeType()==COMMENT_NODE || 
prevNode->getNodeType()==PROCESSING_INSTRUCTION_NODE)
+            break;
+    }
+       XMLBuffer buff(1023, GetDOMNodeMemoryManager);
+    while(true)
+    {
+        DOMNode* nextNode=pWalker->nextNode();
+        if(nextNode==NULL || nextNode->getNodeType()==ELEMENT_NODE || 
nextNode->getNodeType()==COMMENT_NODE || 
nextNode->getNodeType()==PROCESSING_INSTRUCTION_NODE)
+            break;
+        if(nextNode->getNodeType()==TEXT_NODE || 
nextNode->getNodeType()==CDATA_SECTION_NODE)
+               buff.append(nextNode->getNodeValue());
+    }
+    pWalker->release();
+
+    XMLCh* wholeString = (XMLCh*) 
(GetDOMNodeMemoryManager->allocate((buff.getLen()+1)*sizeof(XMLCh)));
+       XMLString::copyString(wholeString, buff.getRawBuffer());
+       return wholeString;
 }
 
-DOMText* DOMTextImpl::replaceWholeText(const XMLCh*){
-    throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0, 
GetDOMNodeMemoryManager);
-    return 0;
+DOMText* DOMTextImpl::replaceWholeText(const XMLCh* newText)
+{
+    DOMTreeWalker* 
pWalker=getOwnerDocument()->createTreeWalker(getOwnerDocument()->getDocumentElement(),
 DOMNodeFilter::SHOW_ALL, NULL, true);
+    pWalker->setCurrentNode((DOMNode*)this);
+    // Logically-adjacent text nodes are Text or CDATASection nodes that can 
be visited sequentially in document order or in 
+    // reversed document order without entering, exiting, or passing over 
Element, Comment, or ProcessingInstruction nodes.
+    DOMNode* pFirstTextNode=this;
+    while(true)
+    {
+        DOMNode* prevNode=pWalker->previousNode();
+        if(prevNode==NULL || prevNode->getNodeType()==ELEMENT_NODE || 
prevNode->getNodeType()==COMMENT_NODE || 
prevNode->getNodeType()==PROCESSING_INSTRUCTION_NODE)
+            break;
+        pFirstTextNode=prevNode;
+    }
+    // before doing any change we need to check if we are going to remove an 
entity reference that doesn't contain just text
+    DOMNode* pCurrentNode=pWalker->getCurrentNode();
+    while(true)
+    {
+        DOMNode* nextNode=pWalker->nextNode();
+        if(nextNode==NULL || nextNode->getNodeType()==ELEMENT_NODE || 
nextNode->getNodeType()==COMMENT_NODE || 
nextNode->getNodeType()==PROCESSING_INSTRUCTION_NODE)
+            break;
+        if(nextNode->getNodeType()==ENTITY_REFERENCE_NODE)
+        {
+            DOMTreeWalker* 
pInnerWalker=getOwnerDocument()->createTreeWalker(nextNode, 
DOMNodeFilter::SHOW_ALL, NULL, true);
+            while(pInnerWalker->nextNode())
+            {
+                short nodeType=pInnerWalker->getCurrentNode()->getNodeType();
+                if(nodeType!=ENTITY_REFERENCE_NODE && nodeType!=TEXT_NODE && 
nodeType!=CDATA_SECTION_NODE)
+                    throw 
DOMException(DOMException::NO_MODIFICATION_ALLOWED_ERR, 0, 
GetDOMNodeMemoryManager);
+            }
+            pInnerWalker->release();
+        }
+    }
+    DOMText* retVal=NULL;
+    // if the first node in the chain is a text node, replace its content, 
otherwise create a new node
+    if(newText && *newText)
+    {
+        if(!castToNodeImpl(pFirstTextNode)->isReadOnly() && 
(pFirstTextNode->getNodeType()==TEXT_NODE || 
pFirstTextNode->getNodeType()==CDATA_SECTION_NODE))
+        {
+            pFirstTextNode->setNodeValue(newText);
+            retVal=(DOMText*)pFirstTextNode;
+        }
+        else
+        {
+            if(getNodeType()==TEXT_NODE)
+                retVal=getOwnerDocument()->createTextNode(newText);
+            else
+                retVal=getOwnerDocument()->createCDATASection(newText);
+            pFirstTextNode->getParentNode()->insertBefore(retVal, 
pFirstTextNode);
+        }
+    }
+    // now delete all the following text nodes
+    pWalker->setCurrentNode(pCurrentNode);
+    while(true)
+    {
+        DOMNode* nextNode=pWalker->nextNode();
+        if(nextNode==NULL || nextNode->getNodeType()==ELEMENT_NODE || 
nextNode->getNodeType()==COMMENT_NODE || 
nextNode->getNodeType()==PROCESSING_INSTRUCTION_NODE)
+            break;
+        if(nextNode!=retVal)
+        {
+            // keep the tree walker valid
+            pWalker->previousNode();
+            nextNode->getParentNode()->removeChild(nextNode);
+            nextNode->release();
+        }
+    }
+    pWalker->release();
+    return retVal;
 }
 
 

Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMTextImpl.hpp
URL: 
http://svn.apache.org/viewcvs/xerces/c/trunk/src/xercesc/dom/impl/DOMTextImpl.hpp?rev=365671&r1=365670&r2=365671&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/dom/impl/DOMTextImpl.hpp (original)
+++ xerces/c/trunk/src/xercesc/dom/impl/DOMTextImpl.hpp Tue Jan  3 08:13:25 2006
@@ -56,7 +56,7 @@
     virtual DOMText*        splitText(XMLSize_t offset);
     // DOM Level 3
     virtual bool            getIsElementContentWhitespace() const;
-    virtual const XMLCh*    getWholeText();
+    virtual const XMLCh*    getWholeText() const;
     virtual DOMText*        replaceWholeText(const XMLCh* content);
 
     // non-standard extension

Modified: xerces/c/trunk/tests/src/DOM/DOMTest/DTest.cpp
URL: 
http://svn.apache.org/viewcvs/xerces/c/trunk/tests/src/DOM/DOMTest/DTest.cpp?rev=365671&r1=365670&r2=365671&view=diff
==============================================================================
--- xerces/c/trunk/tests/src/DOM/DOMTest/DTest.cpp (original)
+++ xerces/c/trunk/tests/src/DOM/DOMTest/DTest.cpp Tue Jan  3 08:13:25 2006
@@ -34,6 +34,7 @@
 #include <xercesc/parsers/XercesDOMParser.hpp>
 #include <xercesc/dom/DOMException.hpp>
 #include <xercesc/util/OutOfMemoryException.hpp>
+#include <xercesc/framework/MemBufInputSource.hpp>
 
 #define EXCEPTIONSTEST(operation, expectedException, resultFlag, testNum) \
     {                                                               \
@@ -932,8 +933,9 @@
         parser->setCreateEntityReferenceNodes(true);
         OK = test.testBaseURI(parser);
 
+               OK = test.testWholeText(parser);
         delete parser;
-    };
+    }
 
     XMLPlatformUtils::Terminate();
 
@@ -4658,6 +4660,110 @@
     return OK;
 }
 
+bool DOMTest::testWholeText(XercesDOMParser* parser) {
+       char* sXml="<?xml version='1.0'?>"
+                               "<!DOCTYPE root["
+                "<!ENTITY ent1 'Dallas. &ent3; #5668'>"
+                "<!ENTITY ent2 '1900 Dallas Road<![CDATA[ (East) ]]>'>"
+                "<!ENTITY ent3 'California. &ent4; PO'>  "
+                "<!ENTITY ent4 'USA '>"
+                "<!ENTITY ent5 'The Content &ent6; never reached'>"
+                "<!ENTITY ent6 'ends here. <foo/>'>"
+                "]>"
+                "<root>&ent1; &ent2;"
+                  "<elem>Home </elem>"
+                  "<elem>Test: &ent5;</elem>"
+                "</root>";
+       MemBufInputSource is((XMLByte*)sXml, strlen(sXml), "bufId");
+       parser->parse(is);
+       DOMDocument* doc=parser->getDocument();
+       // pointing to "Dallas. "
+       DOMNode* t1=doc->getDocumentElement()->getFirstChild()->getFirstChild();
+       if(t1==NULL || t1->getNodeType()!=DOMNode::TEXT_NODE)
+       {
+        fprintf(stderr, "checking wholeText failed at line %i\n",  __LINE__);
+               return false;
+       }
+       const XMLCh* s1=((DOMText*)t1)->getWholeText();
+    const XMLCh* refText=XMLString::transcode("Dallas. California. USA  PO 
#5668 1900 Dallas Road (East) ");
+       if(XMLString::compareString(s1,refText)!=0)
+       {
+        fprintf(stderr, "checking wholeText failed at line %i\n",  __LINE__);
+               return false;
+       }
+
+    // pointing to " (East) " [CDATA]
+       DOMNode* 
t2=doc->getDocumentElement()->getFirstChild()->getNextSibling()->getNextSibling()->getFirstChild()->getNextSibling();
+       if(t2==NULL || t2->getNodeType()!=DOMNode::CDATA_SECTION_NODE)
+       {
+        fprintf(stderr, "checking wholeText failed at line %i\n",  __LINE__);
+               return false;
+       }
+       const XMLCh* s2=((DOMText*)t2)->getWholeText();
+       if(XMLString::compareString(s2,refText)!=0)
+       {
+        fprintf(stderr, "checking wholeText failed at line %i\n",  __LINE__);
+               return false;
+       }
+
+    // pointing to "Home "
+       DOMNode* 
t3=doc->getDocumentElement()->getFirstChild()->getNextSibling()->getNextSibling()->getNextSibling()->getFirstChild();
+       if(t3==NULL || t3->getNodeType()!=DOMNode::TEXT_NODE)
+       {
+        fprintf(stderr, "checking wholeText failed at line %i\n",  __LINE__);
+               return false;
+       }
+       const XMLCh* s3=((DOMText*)t3)->getWholeText();
+    refText=XMLString::transcode("Home ");
+       if(XMLString::compareString(s3,refText)!=0)
+       {
+        fprintf(stderr, "checking wholeText failed at line %i\n",  __LINE__);
+               return false;
+       }
+
+    // pointing to "The Content "
+       DOMNode* 
t4=doc->getDocumentElement()->getFirstChild()->getNextSibling()->getNextSibling()->getNextSibling()->getNextSibling()->getFirstChild()->getNextSibling()->getFirstChild();
+       if(t4==NULL || t4->getNodeType()!=DOMNode::TEXT_NODE)
+       {
+        fprintf(stderr, "checking wholeText failed at line %i\n",  __LINE__);
+               return false;
+       }
+       const XMLCh* s4=((DOMText*)t4)->getWholeText();
+    refText=XMLString::transcode("Test: The Content ends here. ");
+       if(XMLString::compareString(s4,refText)!=0)
+       {
+        fprintf(stderr, "checking wholeText failed at line %i\n",  __LINE__);
+               return false;
+       }
+
+    DOMNode* newt2=((DOMText*)t2)->replaceWholeText(s2);
+    DOMNode* newt3=((DOMText*)t3)->replaceWholeText(s3);
+    try
+    {
+        DOMNode* newt4=((DOMText*)t4)->replaceWholeText(s4);
+        // ent5 contains a <foo/> node, and cannot be removed
+        fprintf(stderr, "checking wholeText failed at line %i\n",  __LINE__);
+        return false;
+    }
+    catch(DOMException&)
+    {
+    }
+
+    DOMLSSerializer* 
writer=DOMImplementation::getImplementation()->createLSSerializer();
+    const XMLCh* xml=writer->writeToString(doc->getDocumentElement());
+
+    refText=XMLString::transcode("<root><![CDATA[Dallas. California. USA  PO 
#5668 1900 Dallas Road (East) ]]>"
+                                   "<elem>Home </elem>"
+                                   "<elem>Test: &ent5;</elem>"
+                                 "</root>");
+       if(XMLString::compareString(xml,refText)!=0)
+       {
+        fprintf(stderr, "checking wholeText failed at line %i\n",  __LINE__);
+               return false;
+       }
+    writer->release();
+    return true;
+}
 
 /**
  *

Modified: xerces/c/trunk/tests/src/DOM/DOMTest/DTest.h
URL: 
http://svn.apache.org/viewcvs/xerces/c/trunk/tests/src/DOM/DOMTest/DTest.h?rev=365671&r1=365670&r2=365671&view=diff
==============================================================================
--- xerces/c/trunk/tests/src/DOM/DOMTest/DTest.h (original)
+++ xerces/c/trunk/tests/src/DOM/DOMTest/DTest.h Tue Jan  3 08:13:25 2006
@@ -104,6 +104,7 @@
 bool treeCompare(DOMNode* node, DOMNode* node2);
 
 bool testBaseURI(XercesDOMParser* parser);
+bool testWholeText(XercesDOMParser* parser);
 
 };
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to