From 59500ddeacd4045d9d5af29ce30d4713a1d879bf Mon Sep 17 00:00:00 2001
From: Tinny Ng <tng@apache.org>
Date: Thu, 4 Jul 2002 15:34:42 +0000
Subject: [PATCH] DOM L3: add DOMDocument::renameNode

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@173940 13f79535-47bb-0310-9956-ffa450edef68
---
 src/xercesc/dom/impl/DOMAttrMapImpl.cpp | 117 ++++++++++++++++++------
 src/xercesc/dom/impl/DOMAttrMapImpl.hpp |  24 ++---
 2 files changed, 101 insertions(+), 40 deletions(-)

diff --git a/src/xercesc/dom/impl/DOMAttrMapImpl.cpp b/src/xercesc/dom/impl/DOMAttrMapImpl.cpp
index 40f1eaeda..3ded9df81 100644
--- a/src/xercesc/dom/impl/DOMAttrMapImpl.cpp
+++ b/src/xercesc/dom/impl/DOMAttrMapImpl.cpp
@@ -60,6 +60,7 @@
  */
 
 #include "DOMAttrMapImpl.hpp"
+#include "DOMAttrImpl.hpp"
 #include "DOMNamedNodeMapImpl.hpp"
 #include "DOMNodeImpl.hpp"
 #include "DOMElementImpl.hpp"
@@ -101,40 +102,100 @@ DOMAttrMapImpl *DOMAttrMapImpl::cloneAttrMap(DOMNode *ownerNode_p)
 
 DOMNode *DOMAttrMapImpl::removeNamedItem(const XMLCh *name)
 {
-	DOMNode* removed = DOMNamedNodeMapImpl::removeNamedItem(name);
+    DOMNode* removed = DOMNamedNodeMapImpl::removeNamedItem(name);
 
-	// Replace it if it had a default value
-	// (DOM spec level 1 - Element Interface)
-	if (hasDefaults() && (removed != 0))
-	{
-		DOMAttrMapImpl* defAttrs = ((DOMElementImpl*)fOwnerNode)->getDefaultAttributes();
-		DOMAttr* attr = (DOMAttr*)(defAttrs->getNamedItem(name));
-		if (attr != 0)
-		{
-			DOMAttr* newAttr = (DOMAttr*)attr->cloneNode(true);
-			setNamedItem(newAttr);
-		}
-	}
+    // Replace it if it had a default value
+    // (DOM spec level 1 - Element Interface)
+    if (hasDefaults() && (removed != 0))
+    {
+        DOMAttrMapImpl* defAttrs = ((DOMElementImpl*)fOwnerNode)->getDefaultAttributes();
+        DOMAttr* attr = (DOMAttr*)(defAttrs->getNamedItem(name));
+        if (attr != 0)
+        {
+            DOMAttr* newAttr = (DOMAttr*)attr->cloneNode(true);
+            setNamedItem(newAttr);
+        }
+    }
 
-	return removed;
+    return removed;
 }
 
 DOMNode *DOMAttrMapImpl::removeNamedItemNS(const XMLCh *namespaceURI, const XMLCh *localName)
 {
-	DOMNode* removed = DOMNamedNodeMapImpl::removeNamedItemNS(namespaceURI, localName);
+    DOMNode* removed = DOMNamedNodeMapImpl::removeNamedItemNS(namespaceURI, localName);
 
-	// Replace it if it had a default value
-	// (DOM spec level 2 - Element Interface)
-	if (hasDefaults() && (removed != 0))
-	{
-		DOMAttrMapImpl* defAttrs = ((DOMElementImpl*)fOwnerNode)->getDefaultAttributes();
-		DOMAttr* attr = (DOMAttr*)(defAttrs->getNamedItemNS(namespaceURI, localName));
-		if (attr != 0)
-		{
-			DOMAttr* newAttr = (DOMAttr*)attr->cloneNode(true);
-			setNamedItem(newAttr);
-		}
-	}
+    // Replace it if it had a default value
+    // (DOM spec level 2 - Element Interface)
+
+    if (hasDefaults() && (removed != 0))
+    {
+        DOMAttrMapImpl* defAttrs = ((DOMElementImpl*)fOwnerNode)->getDefaultAttributes();
+        DOMAttr* attr = (DOMAttr*)(defAttrs->getNamedItemNS(namespaceURI, localName));
+        if (attr != 0)
+        {
+            DOMAttr* newAttr = (DOMAttr*)attr->cloneNode(true);
+            setNamedItemNS(newAttr);
+        }
+    }
 
-	return removed;
+    return removed;
 }
+
+/**
+ * Get this AttributeMap in sync with the given "defaults" map.
+ * @param defaults The default attributes map to sync with.
+ */
+void DOMAttrMapImpl::reconcileDefaultAttributes(const DOMAttrMapImpl* defaults) {
+
+    // remove any existing default
+    XMLSize_t nsize = getLength();
+    for (XMLSSize_t i = nsize - 1; i >= 0; i--) {
+        DOMAttr* attr = (DOMAttr*)item(i);
+        if (!attr->getSpecified()) {
+            removeNamedItemAt(i);
+        }
+    }
+
+    hasDefaults(false);
+
+    // add the new defaults
+    if (defaults) {
+        hasDefaults(true);
+
+        if (nsize == 0) {
+            cloneContent(defaults);
+        }
+        else {
+            XMLSize_t dsize = defaults->getLength();
+            for (XMLSize_t n = 0; n < dsize; n++) {
+                DOMAttr* attr = (DOMAttr*)defaults->item(n);
+
+                DOMAttr* newAttr = (DOMAttr*)attr->cloneNode(true);
+                setNamedItemNS(newAttr);
+                DOMAttrImpl* newAttrImpl = (DOMAttrImpl*) newAttr;
+                newAttrImpl->setSpecified(false);
+            }
+        }
+    }
+} // reconcileDefaults()
+
+
+/**
+ * Move specified attributes from the given map to this one
+ */
+void DOMAttrMapImpl::moveSpecifiedAttributes(DOMAttrMapImpl* srcmap) {
+    XMLSize_t nsize = srcmap->getLength();
+
+    for (XMLSSize_t i = nsize - 1; i >= 0; i--) {
+        DOMAttr* attr = (DOMAttr*)srcmap->item(i);
+        if (attr->getSpecified()) {
+            srcmap->removeNamedItemAt(i);
+        }
+
+        if (attr->getLocalName())
+            setNamedItemNS(attr);
+        else
+            setNamedItem(attr);
+    }
+} // moveSpecifiedAttributes(AttributeMap):void
+
diff --git a/src/xercesc/dom/impl/DOMAttrMapImpl.hpp b/src/xercesc/dom/impl/DOMAttrMapImpl.hpp
index a50e3ff47..98a2eebbb 100644
--- a/src/xercesc/dom/impl/DOMAttrMapImpl.hpp
+++ b/src/xercesc/dom/impl/DOMAttrMapImpl.hpp
@@ -80,24 +80,27 @@ class DOMNamedNodeMap;
 class CDOM_EXPORT DOMAttrMapImpl : public DOMNamedNodeMapImpl
 {
 private:
-	//  bool attrDefaults;    // revisit.  Move up to the owning element level.
+    bool attrDefaults;
 
 public:
-	DOMAttrMapImpl(DOMNode *ownerNod);
+    DOMAttrMapImpl(DOMNode *ownerNod);
 
     // revisit.  This "copy" constructor is used for cloning an Element with Attributes,
     //                and for setting up default attributes.  It's probably not right
     //                for one or the other or both.
-	DOMAttrMapImpl(DOMNode *ownerNod, const DOMNamedNodeMapImpl *defaults);
-	DOMAttrMapImpl();
+    DOMAttrMapImpl(DOMNode *ownerNod, const DOMNamedNodeMapImpl *defaults);
+    DOMAttrMapImpl();
 
     virtual ~DOMAttrMapImpl();
-	virtual DOMAttrMapImpl *cloneAttrMap(DOMNode *ownerNode);
-	virtual bool hasDefaults();
-	virtual void hasDefaults(bool value);
+    virtual DOMAttrMapImpl *cloneAttrMap(DOMNode *ownerNode);
+    virtual bool hasDefaults();
+    virtual void hasDefaults(bool value);
 
     virtual DOMNode *removeNamedItem(const XMLCh *name);
     virtual DOMNode *removeNamedItemNS(const XMLCh *namespaceURI, const XMLCh *localName);
+
+    void reconcileDefaultAttributes(const DOMAttrMapImpl* defaults);
+    void moveSpecifiedAttributes(DOMAttrMapImpl* srcmap);
 };
 
 // ---------------------------------------------------------------------------
@@ -106,15 +109,12 @@ public:
 
 inline bool DOMAttrMapImpl::hasDefaults()
 {
-    //   revisit.   Put a flag on the element for this value.
-	// return attrDefaults;
-    return false;
+    return attrDefaults;
 }
 
 inline void DOMAttrMapImpl::hasDefaults(bool value)
 {
-    //   revisit.  Put a flag on the Element for this value.
-	//  attrDefaults = value;
+    attrDefaults = value;
 }
 
 
-- 
GitLab