Remove catch(...) handler occurrences.
[shibboleth/cpp-xmltooling.git] / xmltooling / io / AbstractXMLObjectMarshaller.cpp
index 5d22362..e6a10f4 100644 (file)
@@ -85,32 +85,26 @@ DOMElement* AbstractXMLObjectMarshaller::marshall(
         document=DOMImplementationRegistry::getDOMImplementation(NULL)->createDocument();\r
         bindDocument=true;\r
     }\r
+    \r
+    XercesJanitor<DOMDocument> janitor(bindDocument ? document : NULL);\r
 \r
-    try {\r
-        XT_log.debug("creating root element to marshall");\r
-        DOMElement* domElement = document->createElementNS(\r
-            getElementQName().getNamespaceURI(), getElementQName().getLocalPart()\r
-            );\r
-        setDocumentElement(document, domElement);\r
+    XT_log.debug("creating root element to marshall");\r
+    DOMElement* domElement = document->createElementNS(\r
+        getElementQName().getNamespaceURI(), getElementQName().getLocalPart()\r
+        );\r
+    setDocumentElement(document, domElement);\r
 #ifndef XMLTOOLING_NO_XMLSEC\r
-        marshallInto(domElement, sigs);\r
+    marshallInto(domElement, sigs);\r
 #else\r
-        marshallInto(domElement);\r
+    marshallInto(domElement);\r
 #endif\r
-        //Recache the DOM.\r
-        XT_log.debug("caching DOM for XMLObject (document is %sbound)", bindDocument ? "" : "not ");\r
-        setDOM(domElement, bindDocument);\r
-        releaseParentDOM(true);\r
+    //Recache the DOM.\r
+    XT_log.debug("caching DOM for XMLObject (document is %sbound)", bindDocument ? "" : "not ");\r
+    setDOM(domElement, bindDocument);\r
+    janitor.release();  // safely transferred\r
+    releaseParentDOM(true);\r
 \r
-        return domElement;\r
-    }\r
-    catch (...) {\r
-        // Delete the document if need be, and rethrow.\r
-        if (bindDocument) {\r
-            document->release();\r
-        }\r
-        throw;\r
-    }\r
+    return domElement;\r
 }\r
 \r
 DOMElement* AbstractXMLObjectMarshaller::marshall(\r
@@ -177,12 +171,19 @@ void AbstractXMLObjectMarshaller::marshallInto(
 {\r
     if (getElementQName().hasPrefix())\r
         targetElement->setPrefix(getElementQName().getPrefix());\r
+\r
+    if (m_schemaLocation) {\r
+        static const XMLCh schemaLocation[]= UNICODE_LITERAL_14(s,c,h,e,m,a,L,o,c,a,t,i,o,n);\r
+        if (targetElement->getParentNode()==NULL || targetElement->getParentNode()->getNodeType()==DOMNode::DOCUMENT_NODE)\r
+            targetElement->setAttributeNS(XMLConstants::XSI_NS,schemaLocation,m_schemaLocation); \r
+    }\r
+\r
     marshallElementType(targetElement);\r
     marshallNamespaces(targetElement);\r
     marshallAttributes(targetElement);\r
     marshallChildElements(targetElement);\r
     marshallElementContent(targetElement);\r
-\r
+    \r
 #ifndef XMLTOOLING_NO_XMLSEC\r
     if (sigs) {\r
         for_each(sigs->begin(),sigs->end(),mem_fun<void,Signature>(&Signature::sign));\r