-/*
- * Copyright 2001-2006 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 <algorithm>
#include <functional>
-#include <log4cpp/Category.hh>
using namespace xmltooling;
-using namespace log4cpp;
+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;
}
}
void AbstractDOMCachingXMLObject::releaseDOM() const
{
if (m_dom) {
- Category& log=Category::getInstance(XMLTOOLING_LOGCAT".DOM");
- if (log.isDebugEnabled()) {
+ if (m_log.isDebugEnabled()) {
string qname=getElementQName().toString();
- log.debug("releasing cached DOM representation for (%s)", qname.empty() ? "unknown" : qname.c_str());
+ m_log.debug("releasing cached DOM representation for (%s)", qname.empty() ? "unknown" : qname.c_str());
}
- setDOM(NULL);
+ setDOM(nullptr);
}
}
void AbstractDOMCachingXMLObject::releaseParentDOM(bool propagateRelease) const
{
if (getParent() && getParent()->getDOM()) {
- Category::getInstance(XMLTOOLING_LOGCAT".DOM").debug(
+ m_log.debug(
"releasing cached DOM representation for parent object with propagation set to %s",
propagateRelease ? "true" : "false"
);
}
}
-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
{
if (hasChildren()) {
- Category::getInstance(XMLTOOLING_LOGCAT".DOM").debug(
+ m_log.debug(
"releasing cached DOM representation for children with propagation set to %s",
propagateRelease ? "true" : "false"
);
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
const XMLObjectBuilder* b=XMLObjectBuilder::getBuilder(domCopy);
if (!b) {
auto_ptr<QName> q(XMLHelper::getNodeQName(domCopy));
- Category::getInstance(XMLTOOLING_LOGCAT".DOM").error(
+ m_log.error(
"DOM clone failed, unable to locate builder for element (%s)", q->toString().c_str()
);
domCopy->getOwnerDocument()->release();
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();