aboutsummaryrefslogtreecommitdiff
path: root/src/support/dom
diff options
context:
space:
mode:
authorAdrian Kummerländer2014-04-26 11:21:10 +0200
committerAdrian Kummerländer2014-04-26 11:21:10 +0200
commit0b611b7bd28851fe8096b3d2c121c68e231ada11 (patch)
tree80352794dce96cec2b86659e5a8260fb9a7686c2 /src/support/dom
parent938ed7622656c3494ae8fdb83bc2ad4b1f31d901 (diff)
downloadInputXSLT-0b611b7bd28851fe8096b3d2c121c68e231ada11.tar
InputXSLT-0b611b7bd28851fe8096b3d2c121c68e231ada11.tar.gz
InputXSLT-0b611b7bd28851fe8096b3d2c121c68e231ada11.tar.bz2
InputXSLT-0b611b7bd28851fe8096b3d2c121c68e231ada11.tar.lz
InputXSLT-0b611b7bd28851fe8096b3d2c121c68e231ada11.tar.xz
InputXSLT-0b611b7bd28851fe8096b3d2c121c68e231ada11.tar.zst
InputXSLT-0b611b7bd28851fe8096b3d2c121c68e231ada11.zip
Implemented global DOM document cache
* the plan to return XML-nodes from each external function requires a better way to manage the lifetime of many xerces DOM document instances and their support class instances ** this is why DomDocumentCache and DomDocumentCache::item were implemented ** based on std::map so we can easily access the result of old function calls * changed external read-directory function to return the children of the document node instead of the document node itself ** removes unnecessary cruft in function calls ** will make returning status codes alongside the function result more pleasing to the eye * updated test transformation to reflect new features
Diffstat (limited to 'src/support/dom')
-rw-r--r--src/support/dom/document_cache.cc26
-rw-r--r--src/support/dom/document_cache.h27
-rw-r--r--src/support/dom/document_cache_item.cc50
-rw-r--r--src/support/dom/document_cache_item.h42
4 files changed, 145 insertions, 0 deletions
diff --git a/src/support/dom/document_cache.cc b/src/support/dom/document_cache.cc
new file mode 100644
index 0000000..f814559
--- /dev/null
+++ b/src/support/dom/document_cache.cc
@@ -0,0 +1,26 @@
+#include "document_cache.h"
+
+namespace InputXSLT {
+
+DomDocumentCache::DomDocumentCache():
+ map_() { }
+
+DomDocumentCache::item* DomDocumentCache::get(const std::string& key) {
+ auto itemIter = this->map_.find(key);
+
+ if ( itemIter == this->map_.end() ) {
+ auto result = this->map_.emplace(
+ std::make_pair(key, std::unique_ptr<item>(new item("content")))
+ );
+
+ if ( result.second ) {
+ return (*(result.first)).second.get();
+ } else {
+ return nullptr;
+ }
+ } else {
+ return (*itemIter).second.get();
+ }
+}
+
+}
diff --git a/src/support/dom/document_cache.h b/src/support/dom/document_cache.h
new file mode 100644
index 0000000..4447a18
--- /dev/null
+++ b/src/support/dom/document_cache.h
@@ -0,0 +1,27 @@
+#ifndef INPUTXSLT_SRC_SUPPORT_DOM_DOCUMENT_CACHE_H_
+#define INPUTXSLT_SRC_SUPPORT_DOM_DOCUMENT_CACHE_H_
+
+#include <map>
+#include <string>
+#include <memory>
+
+namespace InputXSLT {
+
+class DomDocumentCache {
+ public:
+ class item;
+
+ DomDocumentCache();
+
+ item* get(const std::string&);
+
+ private:
+ std::map<std::string, std::unique_ptr<item>> map_;
+
+};
+
+}
+
+#include "document_cache_item.h"
+
+#endif // INPUTXSLT_SRC_SUPPORT_DOM_DOCUMENT_CACHE_H_
diff --git a/src/support/dom/document_cache_item.cc b/src/support/dom/document_cache_item.cc
new file mode 100644
index 0000000..8cc1c24
--- /dev/null
+++ b/src/support/dom/document_cache_item.cc
@@ -0,0 +1,50 @@
+#include "support/dom/document_cache_item.h"
+
+#include <xercesc/dom/DOMImplementation.hpp>
+#include <xercesc/util/XMLString.hpp>
+
+#include "support/xerces_string_guard.h"
+
+namespace InputXSLT {
+
+DomDocumentCache::item::item(const std::string& rootNode):
+ parser_(),
+ dom_support_(parser_),
+ document_(
+ xercesc::DOMImplementation::getImplementation()->createDocument(
+ nullptr,
+ *XercesStringGuard(rootNode),
+ nullptr
+ )
+ ),
+ parsed_source_() { }
+
+DomDocumentCache::item::~item() {
+ this->document_->release();
+}
+
+bool DomDocumentCache::item::isFinalized() const {
+ return static_cast<bool>(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();
+ }
+}
+
+}
diff --git a/src/support/dom/document_cache_item.h b/src/support/dom/document_cache_item.h
new file mode 100644
index 0000000..1f7152b
--- /dev/null
+++ b/src/support/dom/document_cache_item.h
@@ -0,0 +1,42 @@
+#ifndef INPUTXSLT_SRC_SUPPORT_DOM_DOCUMENT_CACHE_ITEM_H_
+#define INPUTXSLT_SRC_SUPPORT_DOM_DOCUMENT_CACHE_ITEM_H_
+
+#include <xalanc/XercesParserLiaison/XercesParserLiaison.hpp>
+#include <xalanc/XercesParserLiaison/XercesDOMSupport.hpp>
+#include <xalanc/XalanTransformer/XercesDOMWrapperParsedSource.hpp>
+
+#include <xercesc/dom/DOMDocument.hpp>
+
+#include <string>
+#include <memory>
+
+#include "common.h"
+#include "document_cache.h"
+
+namespace InputXSLT {
+
+class DomDocumentCache::item {
+ public:
+ ~item();
+
+ bool isFinalized() const;
+
+ xercesc::DOMDocument* getXercesDocument() const;
+ xalan::XalanDocument* getXalanDocument();
+
+ protected:
+ friend DomDocumentCache;
+
+ item(const std::string&);
+
+ private:
+ xalan::XercesParserLiaison parser_;
+ xalan::XercesDOMSupport dom_support_;
+ xercesc::DOMDocument* const document_;
+ std::unique_ptr<xalan::XercesDOMWrapperParsedSource> parsed_source_;
+
+};
+
+}
+
+#endif // INPUTXSLT_SRC_SUPPORT_DOM_DOCUMENT_CACHE_ITEM_H_