/*
- * Copyright 2001-2007 Internet2
+ * Copyright 2001-2010 Internet2
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
using namespace xercesc;
using namespace std;
+AbstractDOMCachingXMLObject::AbstractDOMCachingXMLObject() : m_dom(NULL), m_document(NULL)
+{
+}
+
+AbstractDOMCachingXMLObject::AbstractDOMCachingXMLObject(const AbstractDOMCachingXMLObject& src)
+ : AbstractXMLObject(src), m_dom(NULL), m_document(NULL)
+{
+}
+
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;
}
}
+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) {
}
}
-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(NULL)->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;
}