diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/function/read_directory.cc | 2 | ||||
-rw-r--r-- | src/transformation_facade.cc | 65 | ||||
-rw-r--r-- | src/transformation_facade.h | 31 | ||||
-rw-r--r-- | src/transformer_facade.cc | 74 | ||||
-rw-r--r-- | src/transformer_facade.h | 30 |
5 files changed, 97 insertions, 105 deletions
diff --git a/src/function/read_directory.cc b/src/function/read_directory.cc index 6d643da..0ed33bc 100644 --- a/src/function/read_directory.cc +++ b/src/function/read_directory.cc @@ -10,7 +10,7 @@ namespace InputXSLT { FunctionReadDirectory::FunctionReadDirectory(const FilesystemContext& context): fs_context_(context), - documents_(new std::stack<DomDocumentGuard>()) { } + documents_(std::make_shared<std::stack<DomDocumentGuard>>()) { } xalan::XObjectPtr FunctionReadDirectory::execute( xalan::XPathExecutionContext& executionContext, diff --git a/src/transformation_facade.cc b/src/transformation_facade.cc new file mode 100644 index 0000000..58bdb52 --- /dev/null +++ b/src/transformation_facade.cc @@ -0,0 +1,65 @@ +#include "transformation_facade.h" + +#include <xalanc/XSLT/XSLTInputSource.hpp> +#include <xalanc/XalanTransformer/XalanCompiledStylesheet.hpp> + +#include <sstream> + +#include "function/read_file.h" +#include "function/read_xml_file.h" +#include "function/read_directory.h" + + +namespace InputXSLT { + +TransformationFacade::TransformationFacade(const std::string& transformation): + fs_context_(boost::filesystem::path(transformation).parent_path().string()), + transformation_{}, + transformer_() { + const xalan::XalanDOMString customNamespace( + "http://ExternalFunction.xalan-c++.xml.apache.org" + ); + + this->transformer_.installExternalFunction( + customNamespace, + xalan::XalanDOMString("read-file"), + InputXSLT::FunctionReadFile(this->fs_context_) + ); + + this->transformer_.installExternalFunction( + customNamespace, + xalan::XalanDOMString("read-xml-file"), + InputXSLT::FunctionReadXmlFile(this->fs_context_) + ); + + this->transformer_.installExternalFunction( + customNamespace, + xalan::XalanDOMString("read-directory"), + InputXSLT::FunctionReadDirectory(this->fs_context_) + ); + + this->transformer_.compileStylesheet( + xalan::XSLTInputSource(transformation.data()), + this->transformation_ + ); +} + +TransformationFacade::~TransformationFacade() { + this->transformer_.destroyStylesheet( + this->transformation_ + ); +} + +int TransformationFacade::generate(const std::string& target) { + std::stringstream emptyStream("<dummy/>"); + xalan::XSLTInputSource inputSource(emptyStream); + xalan::XSLTResultTarget outputTarget(target.data()); + + return this->transformer_.transform( + inputSource, + this->transformation_, + outputTarget + ); +} + +} diff --git a/src/transformation_facade.h b/src/transformation_facade.h new file mode 100644 index 0000000..715d72e --- /dev/null +++ b/src/transformation_facade.h @@ -0,0 +1,31 @@ +#ifndef INPUTXSLT_SRC_TRANSFORMATION_FACADE_H_ +#define INPUTXSLT_SRC_TRANSFORMATION_FACADE_H_ + +#include <string> + +#include <xalanc/XalanTransformer/XalanTransformer.hpp> +#include <xalanc/XercesParserLiaison/XercesParserLiaison.hpp> + +#include "common.h" +#include "support/filesystem_context.h" + +namespace InputXSLT { + +class TransformationFacade { + public: + TransformationFacade(const std::string&); + ~TransformationFacade(); + + int generate(const std::string&); + + private: + const FilesystemContext fs_context_; + const xalan::XalanCompiledStylesheet* transformation_; + + xalan::XalanTransformer transformer_; + +}; + +} + +#endif // INPUTXSLT_SRC_TRANSFORMATION_FACADE_H_ diff --git a/src/transformer_facade.cc b/src/transformer_facade.cc deleted file mode 100644 index fbf604c..0000000 --- a/src/transformer_facade.cc +++ /dev/null @@ -1,74 +0,0 @@ -#include "transformer_facade.h" - -#include <xalanc/XSLT/XSLTInputSource.hpp> -#include <xalanc/XalanTransformer/XalanTransformer.hpp> -#include <xalanc/XercesParserLiaison/XercesDOMSupport.hpp> -#include <xalanc/XalanTransformer/XercesDOMWrapperParsedSource.hpp> - -#include <xercesc/dom/DOMDocument.hpp> -#include <xercesc/dom/DOMImplementation.hpp> - -#include <iostream> - -#include "function/read_file.h" -#include "function/read_xml_file.h" -#include "function/read_directory.h" - - -namespace InputXSLT { - -TransformerFacade::TransformerFacade(const std::string& path): - fs_context_(path), - parser_(), - transformer_() { - const xalan::XalanDOMString customNamespace( - "http://ExternalFunction.xalan-c++.xml.apache.org" - ); - - this->transformer_.installExternalFunction( - customNamespace, - xalan::XalanDOMString("read-file"), - InputXSLT::FunctionReadFile(this->fs_context_) - ); - - this->transformer_.installExternalFunction( - customNamespace, - xalan::XalanDOMString("read-xml-file"), - InputXSLT::FunctionReadXmlFile(this->fs_context_) - ); - - this->transformer_.installExternalFunction( - customNamespace, - xalan::XalanDOMString("read-directory"), - InputXSLT::FunctionReadDirectory(this->fs_context_) - ); -} - -int TransformerFacade::execute( - const std::string& transformation, - const std::string& target -) { - xercesc::DOMDocument* inputDom( - xercesc::DOMImplementation::getImplementation()->createDocument() - ); - xalan::XercesDOMSupport domSupport(this->parser_); - - xalan::XercesDOMWrapperParsedSource parsedInput( - inputDom, - this->parser_, - domSupport - ); - - inputDom->release(); - - xalan::XSLTInputSource transform(transformation.data()); - xalan::XSLTResultTarget output(target.data()); - - return this->transformer_.transform( - parsedInput, - transform, - output - ); -} - -} diff --git a/src/transformer_facade.h b/src/transformer_facade.h deleted file mode 100644 index ed25edc..0000000 --- a/src/transformer_facade.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef INPUTXSLT_SRC_TRANSFORMER_FACADE_H_ -#define INPUTXSLT_SRC_TRANSFORMER_FACADE_H_ - -#include <string> - -#include <xalanc/XalanTransformer/XalanTransformer.hpp> -#include <xalanc/XercesParserLiaison/XercesParserLiaison.hpp> - -#include "common.h" -#include "support/filesystem_context.h" - -namespace InputXSLT { - -class TransformerFacade { - public: - TransformerFacade(const std::string&); - - int execute(const std::string&, const std::string&); - - private: - const FilesystemContext fs_context_; - mutable xalan::XercesParserLiaison parser_; - - xalan::XalanTransformer transformer_; - -}; - -} - -#endif // INPUTXSLT_SRC_TRANSFORMER_FACADE_H_ |