From 261170cc5b6661106877dc2611dab281f4d91348 Mon Sep 17 00:00:00 2001 From: Adrian Kummerländer Date: Sat, 3 May 2014 22:04:16 +0200 Subject: Revamped DomDocumentCache with regard to thread safety * DomDocumentCache::item class now is _finalized_ by default and doesn't perform document instantiation, just lifetime management ** xercesc::DOMDocument is instantiated inside the external function implementations and committed to the document cache for conversion to a xalan document * added mutex with scoped lock to prevent concurrent write access to the std::unordered_map contained withing DomDocumentCache * functionality of the _get_ member method was split into _get_ and _create_ ** added typedef for std::pair specialization type "optional_item" that functions as the return value of _create_ and _get_ * "locator->getSystemId()" was leaking memory as xerces doesn't manage the lifetime of the returned heap-allocated char array ** analog to XMLCh* strings ** transformed XercesStringGuard into template class to be instantiated on either XMLCh or char --- src/support/dom/document_cache_item.cc | 43 +++++++--------------------------- 1 file changed, 8 insertions(+), 35 deletions(-) (limited to 'src/support/dom/document_cache_item.cc') diff --git a/src/support/dom/document_cache_item.cc b/src/support/dom/document_cache_item.cc index 8cc1c24..9798bfa 100644 --- a/src/support/dom/document_cache_item.cc +++ b/src/support/dom/document_cache_item.cc @@ -1,50 +1,23 @@ #include "support/dom/document_cache_item.h" -#include -#include - -#include "support/xerces_string_guard.h" - namespace InputXSLT { -DomDocumentCache::item::item(const std::string& rootNode): +DomDocumentCache::item::item(xercesc::DOMDocument* document): parser_(), dom_support_(parser_), - document_( - xercesc::DOMImplementation::getImplementation()->createDocument( - nullptr, - *XercesStringGuard(rootNode), - nullptr - ) - ), - parsed_source_() { } + document_(document), + parsed_source_( + document_, + parser_, + dom_support_ + ) { } DomDocumentCache::item::~item() { this->document_->release(); } -bool DomDocumentCache::item::isFinalized() const { - return static_cast(this->parsed_source_); -} - -xercesc::DOMDocument* DomDocumentCache::item::getXercesDocument() const { - return this->document_; -} - xalan::XalanDocument* DomDocumentCache::item::getXalanDocument() { - if ( this->parsed_source_ ) { - return this->parsed_source_->getDocument(); - } else { - this->parsed_source_.reset( - new xalan::XercesDOMWrapperParsedSource( - document_, - parser_, - dom_support_ - ) - ); - - return this->parsed_source_->getDocument(); - } + return this->parsed_source_.getDocument(); } } -- cgit v1.2.3