diff options
Diffstat (limited to 'src/function')
-rw-r--r-- | src/function/resolve_include.cc | 62 | ||||
-rw-r--r-- | src/function/resolve_include.h | 44 |
2 files changed, 106 insertions, 0 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_ |