From a31fc1169edb33126242eb035dc038cbdea407e8 Mon Sep 17 00:00:00 2001 From: Adrian Kummerländer Date: Thu, 24 Apr 2014 20:14:14 +0200 Subject: Changed TransformerFacade into TransformationFacade for single XSLTs * contains a single, compiled transformation as specified by its construction argument * uses the transformation's location as the FilesystemContext * allows generation of output documents using _generate_ member method --- CMakeLists.txt | 2 +- src/function/read_directory.cc | 2 +- src/transformation_facade.cc | 65 +++++++++++++++++++++++++++++++++++++ src/transformation_facade.h | 31 ++++++++++++++++++ src/transformer_facade.cc | 74 ------------------------------------------ src/transformer_facade.h | 30 ----------------- test.cc | 9 ++--- 7 files changed, 101 insertions(+), 112 deletions(-) create mode 100644 src/transformation_facade.cc create mode 100644 src/transformation_facade.h delete mode 100644 src/transformer_facade.cc delete mode 100644 src/transformer_facade.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 94ade96..ee6e7e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,7 +13,7 @@ include_directories( add_executable( test test.cc - src/transformer_facade.cc + src/transformation_facade.cc src/function/read_file.cc src/function/read_xml_file.cc src/function/read_directory.cc 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()) { } + documents_(std::make_shared>()) { } 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 +#include + +#include + +#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(""); + 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 + +#include +#include + +#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 -#include -#include -#include - -#include -#include - -#include - -#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 - -#include -#include - -#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_ diff --git a/test.cc b/test.cc index 44c2484..f15e1f6 100644 --- a/test.cc +++ b/test.cc @@ -1,12 +1,9 @@ #include "plattform_guard.h" -#include "transformer_facade.h" +#include "transformation_facade.h" int main() { InputXSLT::PlattformGuard plattform; - InputXSLT::TransformerFacade transformer("../dummy/"); + InputXSLT::TransformationFacade transformation("../dummy/transform.xsl"); - return transformer.execute( - "../dummy/transform.xsl", - "out.xml" - ); + return transformation.generate("out.xml"); } -- cgit v1.2.3