Initial unit test plus fixes
[shibboleth/cpp-xmltooling.git] / xmltooling / io / AbstractXMLObjectMarshaller.cpp
index c66b770..0b09c3e 100644 (file)
@@ -62,7 +62,8 @@ DOMElement* AbstractXMLObjectMarshaller::marshall(XMLObject* xmlObject, DOMDocum
         if (cachedDOM) {\r
             if (!document || document==cachedDOM->getOwnerDocument()) {\r
                 XT_log.debug("XMLObject has a usable cached DOM, reusing it");\r
-                setDocumentElement(cachedDOM->getOwnerDocument(),cachedDOM);\r
+                if (document)\r
+                    setDocumentElement(cachedDOM->getOwnerDocument(),cachedDOM);\r
                 dc->releaseParentDOM(true);\r
                 return cachedDOM;\r
             }\r
@@ -165,11 +166,11 @@ DOMElement* AbstractXMLObjectMarshaller::marshall(XMLObject* xmlObject, DOMEleme
 void AbstractXMLObjectMarshaller::marshallInto(XMLObject* xmlObject, DOMElement* targetElement) const\r
 {\r
     targetElement->setPrefix(xmlObject->getElementQName().getPrefix());\r
+    marshallElementType(xmlObject, targetElement);\r
     marshallNamespaces(xmlObject, targetElement);\r
     marshallAttributes(xmlObject, targetElement);\r
     marshallChildElements(xmlObject, targetElement);\r
     marshallElementContent(xmlObject, targetElement);\r
-    marshallElementType(xmlObject, targetElement);\r
 \r
     /* TODO Signing/Encryption\r
     if (xmlObject instanceof SignableXMLObject) {\r
@@ -221,6 +222,12 @@ public:
     void operator()(DOMElement* domElement, const Namespace& ns) const {\r
         const XMLCh* prefix=ns.getNamespacePrefix();\r
         const XMLCh* uri=ns.getNamespaceURI();\r
+        \r
+        // Check to see if the prefix is already declared properly above this node.\r
+        if (!ns.alwaysDeclare() && domElement->getParentNode() &&\r
+                XMLString::equals(domElement->getParentNode()->lookupNamespaceURI(prefix),uri))\r
+            return;\r
+            \r
         if (prefix && *prefix) {\r
             XMLCh* xmlns=new XMLCh[XMLString::stringLen(XMLConstants::XMLNS_PREFIX) + XMLString::stringLen(prefix) + 2*sizeof(XMLCh)];\r
             *xmlns=chNull;\r
@@ -260,7 +267,7 @@ public:
                 );\r
             throw MarshallingException("Marshaller found unknown child element, but no default marshaller was found.");\r
         }\r
-        element->appendChild(marshaller->marshall(obj, element->getOwnerDocument()));\r
+        element->appendChild(marshaller->marshall(obj, element));\r
     }\r
 };\r
 \r