Refactored simple content and child-handling into mixin classes.
[shibboleth/cpp-xmltooling.git] / xmltooling / AbstractDOMCachingXMLObject.cpp
index fb4c0f5..53564ff 100644 (file)
@@ -64,28 +64,24 @@ void AbstractDOMCachingXMLObject::releaseDOM() const
 \r
 void AbstractDOMCachingXMLObject::releaseParentDOM(bool propagateRelease) const\r
 {\r
-    DOMCachingXMLObject* domCachingParent = dynamic_cast<DOMCachingXMLObject*>(getParent());\r
-    if (domCachingParent) {\r
-        if (domCachingParent->getDOM()) {\r
-            Category::getInstance(XMLTOOLING_LOGCAT".DOM").debug(\r
-                "releasing cached DOM representation for parent object with propagation set to %s",\r
-                propagateRelease ? "true" : "false"\r
-                );\r
-            domCachingParent->releaseDOM();\r
-            if (propagateRelease)\r
-                domCachingParent->releaseParentDOM(propagateRelease);\r
-        }\r
+    if (getParent() && getParent()->getDOM()) {\r
+        Category::getInstance(XMLTOOLING_LOGCAT".DOM").debug(\r
+            "releasing cached DOM representation for parent object with propagation set to %s",\r
+            propagateRelease ? "true" : "false"\r
+            );\r
+        getParent()->releaseDOM();\r
+        if (propagateRelease)\r
+            getParent()->releaseParentDOM(propagateRelease);\r
     }\r
 }\r
 \r
 class _release : public binary_function<XMLObject*,bool,void> {\r
 public:\r
     void operator()(XMLObject* obj, bool propagate) const {\r
-        DOMCachingXMLObject* domCaching = dynamic_cast<DOMCachingXMLObject*>(obj);\r
-        if (domCaching) {\r
-            domCaching->releaseDOM();\r
+        if (obj) {\r
+            obj->releaseDOM();\r
             if (propagate)\r
-                domCaching->releaseChildrenDOM(propagate);\r
+                obj->releaseChildrenDOM(propagate);\r
         }\r
     }\r
 };\r
@@ -97,7 +93,8 @@ void AbstractDOMCachingXMLObject::releaseChildrenDOM(bool propagateRelease) cons
             "releasing cached DOM representation for children with propagation set to %s",\r
             propagateRelease ? "true" : "false"\r
             );\r
-        for_each(m_children.begin(),m_children.end(),bind2nd(_release(),propagateRelease));\r
+        const list<XMLObject*>& children=getOrderedChildren();\r
+        for_each(children.begin(),children.end(),bind2nd(_release(),propagateRelease));\r
     }\r
 }\r
 \r
@@ -127,9 +124,7 @@ XMLObject* AbstractDOMCachingXMLObject::clone() const
             throw UnmarshallingException("Unable to locate builder for cloned element.");\r
         }\r
         try {\r
-            auto_ptr<XMLObject> objCopy(b->buildObject(domCopy));\r
-            objCopy->unmarshall(domCopy, true);    // bind document\r
-            return objCopy.release();\r
+            return b->buildFromElement(domCopy,true); // bind document\r
         }\r
         catch (...) {\r
             domCopy->getOwnerDocument()->release();\r
@@ -138,28 +133,3 @@ XMLObject* AbstractDOMCachingXMLObject::clone() const
     }\r
     return NULL;\r
 }\r
-\r
-XMLObject* AbstractDOMCachingXMLObject::prepareForAssignment(XMLObject* oldValue, XMLObject* newValue) {\r
-\r
-    if (newValue && newValue->hasParent())\r
-        throw XMLObjectException("child XMLObject cannot be added - it is already the child of another XMLObject");\r
-\r
-    if (!oldValue) {\r
-        if (newValue) {\r
-            releaseThisandParentDOM();\r
-            newValue->setParent(this);\r
-            return newValue;\r
-        }\r
-        else {\r
-            return NULL;\r
-        }\r
-    }\r
-\r
-    if (oldValue != newValue) {\r
-        delete oldValue;\r
-        releaseThisandParentDOM();\r
-        newValue->setParent(this);\r
-    }\r
-\r
-    return newValue;\r
-}\r