-/*
- * Copyright 2001-2007 Internet2
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+/**
+ * Licensed to the University Corporation for Advanced Internet
+ * Development, Inc. (UCAID) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for
+ * additional information regarding copyright ownership.
+ *
+ * UCAID licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the
+ * License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific
+ * language governing permissions and limitations under the License.
*/
/**
#include <functional>
using namespace xmltooling;
+using namespace xercesc;
using namespace std;
+AbstractDOMCachingXMLObject::AbstractDOMCachingXMLObject() : m_dom(nullptr), m_document(nullptr)
+{
+}
+
+AbstractDOMCachingXMLObject::AbstractDOMCachingXMLObject(const AbstractDOMCachingXMLObject& src)
+ : AbstractXMLObject(src), m_dom(nullptr), m_document(nullptr)
+{
+}
+
AbstractDOMCachingXMLObject::~AbstractDOMCachingXMLObject()
{
if (m_document)
m_document->release();
}
+DOMElement* AbstractDOMCachingXMLObject::getDOM() const
+{
+ return m_dom;
+}
+
void AbstractDOMCachingXMLObject::setDOM(DOMElement* dom, bool bindDocument) const
{
- m_dom=dom;
- if (dom) {
- if (bindDocument) {
- setDocument(dom->getOwnerDocument());
- }
+ m_dom = dom;
+ if (dom && bindDocument) {
+ DOMDocument* doc = dom->getOwnerDocument();
+ setDocument(doc);
+ DOMElement* documentRoot = doc->getDocumentElement();
+ if (!documentRoot)
+ doc->appendChild(dom);
+ else if (documentRoot != dom)
+ doc->replaceChild(dom, documentRoot);
+ }
+}
+
+void AbstractDOMCachingXMLObject::setDocument(DOMDocument* doc) const
+{
+ if (m_document != doc) {
+ if (m_document)
+ m_document->release();
+ m_document=doc;
}
}
string qname=getElementQName().toString();
m_log.debug("releasing cached DOM representation for (%s)", qname.empty() ? "unknown" : qname.c_str());
}
- setDOM(NULL);
+ setDOM(nullptr);
}
}
}
}
-class _release : public binary_function<XMLObject*,bool,void> {
-public:
- void operator()(XMLObject* obj, bool propagate) const {
- if (obj) {
- obj->releaseDOM();
- if (propagate)
- obj->releaseChildrenDOM(propagate);
+namespace {
+ class _release : public binary_function<XMLObject*,bool,void> {
+ public:
+ void operator()(XMLObject* obj, bool propagate) const {
+ if (obj) {
+ obj->releaseDOM();
+ if (propagate)
+ obj->releaseChildrenDOM(propagate);
+ }
}
- }
+ };
};
void AbstractDOMCachingXMLObject::releaseChildrenDOM(bool propagateRelease) const
DOMElement* AbstractDOMCachingXMLObject::cloneDOM(DOMDocument* doc) const
{
if (getDOM()) {
- if (!doc)
- doc=DOMImplementationRegistry::getDOMImplementation(NULL)->createDocument();
- return static_cast<DOMElement*>(doc->importNode(getDOM(),true));
+ DOMDocument* cloneDoc = doc;
+ if (!cloneDoc)
+ cloneDoc=DOMImplementationRegistry::getDOMImplementation(nullptr)->createDocument();
+ try {
+ return static_cast<DOMElement*>(cloneDoc->importNode(getDOM(),true));
+ }
+ catch (XMLException& ex) {
+ if (!doc)
+ cloneDoc->release();
+ auto_ptr_char temp(ex.getMessage());
+ m_log.error("DOM clone failed: %s", temp.get());
+ }
}
- return NULL;
+ return nullptr;
}
XMLObject* AbstractDOMCachingXMLObject::clone() const
janitor.release(); // safely transferred
return ret;
}
- return NULL;
+ return nullptr;
}
void AbstractDOMCachingXMLObject::detach()
if (parent && parent->m_document) {
// Transfer control of document to me...
setDocument(parent->m_document);
- parent->m_document = NULL;
+ parent->m_document = nullptr;
}
// The rest is done by the base.
AbstractXMLObject::detach();