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]