X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=xmltooling%2FAbstractDOMCachingXMLObject.cpp;h=061df1a0373997d464516b00a9453dd3163a6ba0;hb=c73d95072f73521bd4b881214631c59adf79f41a;hp=496615604d4245a00ae01531b95699e30da6edf9;hpb=e7a65d784215bc04355f014141219b3e7ab4559a;p=shibboleth%2Fcpp-xmltooling.git diff --git a/xmltooling/AbstractDOMCachingXMLObject.cpp b/xmltooling/AbstractDOMCachingXMLObject.cpp index 4966156..061df1a 100644 --- a/xmltooling/AbstractDOMCachingXMLObject.cpp +++ b/xmltooling/AbstractDOMCachingXMLObject.cpp @@ -1,17 +1,21 @@ -/* - * 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. */ /** @@ -28,44 +32,69 @@ #include #include -#include 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" ); @@ -75,21 +104,23 @@ void AbstractDOMCachingXMLObject::releaseParentDOM(bool propagateRelease) const } } -class _release : public binary_function { -public: - void operator()(XMLObject* obj, bool propagate) const { - if (obj) { - obj->releaseDOM(); - if (propagate) - obj->releaseChildrenDOM(propagate); +namespace { + class _release : public binary_function { + 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" ); @@ -101,11 +132,20 @@ void AbstractDOMCachingXMLObject::releaseChildrenDOM(bool propagateRelease) cons DOMElement* AbstractDOMCachingXMLObject::cloneDOM(DOMDocument* doc) const { if (getDOM()) { - if (!doc) - doc=DOMImplementationRegistry::getDOMImplementation(NULL)->createDocument(); - return static_cast(doc->importNode(getDOM(),true)); + DOMDocument* cloneDoc = doc; + if (!cloneDoc) + cloneDoc=DOMImplementationRegistry::getDOMImplementation(nullptr)->createDocument(); + try { + return static_cast(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 @@ -117,7 +157,7 @@ XMLObject* AbstractDOMCachingXMLObject::clone() const const XMLObjectBuilder* b=XMLObjectBuilder::getBuilder(domCopy); if (!b) { auto_ptr 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(); @@ -128,7 +168,7 @@ XMLObject* AbstractDOMCachingXMLObject::clone() const janitor.release(); // safely transferred return ret; } - return NULL; + return nullptr; } void AbstractDOMCachingXMLObject::detach() @@ -146,7 +186,7 @@ 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();