diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/function/resolve_include.cc | 62 | ||||
-rw-r--r-- | src/function/resolve_include.h | 44 | ||||
-rw-r--r-- | src/plattform_guard.cc | 9 | ||||
-rw-r--r-- | src/plattform_guard.h | 5 |
4 files changed, 118 insertions, 2 deletions
diff --git a/src/function/resolve_include.cc b/src/function/resolve_include.cc new file mode 100644 index 0000000..ac4adf5 --- /dev/null +++ b/src/function/resolve_include.cc @@ -0,0 +1,62 @@ +#include "resolve_include.h" + +#include <algorithm> + +#include "support/xalan_string.h" + +namespace InputXSLT { + +FunctionResolveInclude::FunctionResolveInclude( + const std::vector<std::string>& path): + path_(new std::vector<FilesystemContext>()) { + this->path_->reserve(path.size()); + + std::transform( + path.begin(), + path.end(), + std::back_inserter(*this->path_), + [](const std::string& path) -> FilesystemContext { + return FilesystemContext(path); + } + ); +} + +xalan::XObjectPtr FunctionResolveInclude::execute( + xalan::XPathExecutionContext& executionContext, + xalan::XalanNode*, + const xalan::XObjectPtr parameter, + const xalan::Locator* +) const { + const std::string filePath(toString(parameter->str())); + + for ( auto&& context : *this->path_ ) { + const boost::filesystem::path resolvedPath( + context.resolve(filePath) + ); + + if ( boost::filesystem::exists(resolvedPath) && + boost::filesystem::is_regular_file(resolvedPath) ) { + return executionContext.getXObjectFactory().createString( + toString(resolvedPath.string()) + ); + } + } + + return executionContext.getXObjectFactory().createString( + toString("error") + ); +} + +FunctionResolveInclude* FunctionResolveInclude::clone( + xalan::MemoryManager& manager) const { + return xalan::XalanCopyConstruct(manager, *this); +} + +const xalan::XalanDOMString& FunctionResolveInclude::getError( + xalan::XalanDOMString& result) const { + result.assign("The function expects one parameter of type string."); + + return result; +} + +} diff --git a/src/function/resolve_include.h b/src/function/resolve_include.h new file mode 100644 index 0000000..2d6e62f --- /dev/null +++ b/src/function/resolve_include.h @@ -0,0 +1,44 @@ +#ifndef INPUTXSLT_SRC_FUNCTION_RESOLVE_INCLUDE_H_ +#define INPUTXSLT_SRC_FUNCTION_RESOLVE_INCLUDE_H_ + +#include <xalanc/XPath/XObjectFactory.hpp> +#include <xalanc/XPath/Function.hpp> +#include <xalanc/XPath/XObject.hpp> + +#include "boost/filesystem.hpp" + +#include <memory> +#include <string> +#include <vector> + +#include "common.h" +#include "support/filesystem_context.h" + +namespace InputXSLT { + +class FunctionResolveInclude : public xalan::Function { + public: + FunctionResolveInclude(const std::vector<std::string>&); + + virtual xalan::XObjectPtr execute( + xalan::XPathExecutionContext&, + xalan::XalanNode*, + const xalan::XObjectPtr, + const xalan::Locator* + ) const; + + virtual FunctionResolveInclude* clone(xalan::MemoryManager&) const; + + FunctionResolveInclude& operator=(const FunctionResolveInclude&) = delete; + bool operator==(const FunctionResolveInclude&) const = delete; + + private: + const std::shared_ptr<std::vector<FilesystemContext>> path_; + + const xalan::XalanDOMString& getError(xalan::XalanDOMString&) const; + +}; + +} + +#endif // INPUTXSLT_SRC_FUNCTION_RESOLVE_INCLUDE_H_ diff --git a/src/plattform_guard.cc b/src/plattform_guard.cc index da3b6d7..820346e 100644 --- a/src/plattform_guard.cc +++ b/src/plattform_guard.cc @@ -10,10 +10,11 @@ #include "function/read_xml_file.h" #include "function/read_directory.h" #include "function/transform.h" +#include "function/resolve_include.h" namespace InputXSLT { -PlattformGuard::PlattformGuard() { +PlattformGuard::PlattformGuard(const std::vector<std::string>& path) { xercesc::XMLPlatformUtils::Initialize(); xalan::XalanTransformer::initialize(); @@ -44,6 +45,12 @@ PlattformGuard::PlattformGuard() { xalan::XalanDOMString("transform"), InputXSLT::FunctionTransform() ); + + xalan::XalanTransformer::installExternalFunctionGlobal( + customNamespace, + xalan::XalanDOMString("resolve-include"), + InputXSLT::FunctionResolveInclude(path) + ); } PlattformGuard::~PlattformGuard() { diff --git a/src/plattform_guard.h b/src/plattform_guard.h index 12b19f0..f6abcba 100644 --- a/src/plattform_guard.h +++ b/src/plattform_guard.h @@ -1,10 +1,13 @@ #ifndef INPUTXSLT_SRC_PLATTFORM_GUARD_H_ #define INPUTXSLT_SRC_PLATTFORM_GUARD_H_ +#include <string> +#include <vector> + namespace InputXSLT { struct PlattformGuard { - PlattformGuard(); + PlattformGuard(const std::vector<std::string>&); ~PlattformGuard(); }; |