aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Kummerländer2014-04-20 13:09:32 +0200
committerAdrian Kummerländer2014-04-20 13:09:32 +0200
commit29a9fb20b4c8414f2590886e43ae86794a53db89 (patch)
tree4d426d45293a019caee8ee879186111c90b426d3
parent3383e24e396431eed7d4ab9f69ff8ffaf12d4925 (diff)
downloadInputXSLT-29a9fb20b4c8414f2590886e43ae86794a53db89.tar
InputXSLT-29a9fb20b4c8414f2590886e43ae86794a53db89.tar.gz
InputXSLT-29a9fb20b4c8414f2590886e43ae86794a53db89.tar.bz2
InputXSLT-29a9fb20b4c8414f2590886e43ae86794a53db89.tar.lz
InputXSLT-29a9fb20b4c8414f2590886e43ae86794a53db89.tar.xz
InputXSLT-29a9fb20b4c8414f2590886e43ae86794a53db89.tar.zst
InputXSLT-29a9fb20b4c8414f2590886e43ae86794a53db89.zip
Implemented support for modifying external function base path
* one expects a read-file function to work relative to the directory the transformation is located and not to the executable's location ** from the perspective of the user the transformation is the application, not the actual executable * removed PlattformGuard struct from TransformerGuard (now TransformerFacade) * TransformerFacade is instatiated with the appropriate relative working path ** i.e. it will have to be instantiated for every directory containing one or more transformations
-rw-r--r--CMakeLists.txt2
-rw-r--r--dummy/transform.xsl4
-rw-r--r--src/common.h6
-rw-r--r--src/function/read_file.cc20
-rw-r--r--src/function/read_file.h8
-rw-r--r--src/function/read_xml_file.cc11
-rw-r--r--src/function/read_xml_file.h7
-rw-r--r--src/plattform_guard.h4
-rw-r--r--src/transformer_facade.cc (renamed from src/transformer_guard.cc)11
-rw-r--r--src/transformer_facade.h (renamed from src/transformer_guard.h)13
-rw-r--r--test.cc8
11 files changed, 61 insertions, 33 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 26ff8d1..4421841 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -14,7 +14,7 @@ add_executable(
test
test.cc
src/utility.cc
- src/transformer_guard.cc
+ src/transformer_facade.cc
src/function/read_file.cc
src/function/read_xml_file.cc
)
diff --git a/dummy/transform.xsl b/dummy/transform.xsl
index 08d005b..803e0f6 100644
--- a/dummy/transform.xsl
+++ b/dummy/transform.xsl
@@ -16,10 +16,10 @@
</head>
<body>
<div id="raw">
- <xsl:value-of select="external:read-file('../dummy/test.txt')" />
+ <xsl:value-of select="external:read-file('test.txt')" />
</div>
<ul>
- <xsl:for-each select="external:read-xml-file('../dummy/test.txt')/tester/eintrag">
+ <xsl:for-each select="external:read-xml-file('test.txt')/tester/eintrag">
<li><xsl:value-of select="."/></li>
</xsl:for-each>
</ul>
diff --git a/src/common.h b/src/common.h
new file mode 100644
index 0000000..8643eef
--- /dev/null
+++ b/src/common.h
@@ -0,0 +1,6 @@
+#ifndef INPUTXSLT_SRC_COMMON_H_
+#define INPUTXSLT_SRC_COMMON_H_
+
+namespace xalan = xalanc_1_11;
+
+#endif // INPUTXSLT_SRC_COMMON_H_
diff --git a/src/function/read_file.cc b/src/function/read_file.cc
index efc1f61..dcbff25 100644
--- a/src/function/read_file.cc
+++ b/src/function/read_file.cc
@@ -1,7 +1,12 @@
#include "read_file.h"
+#include "utility.h"
+
namespace InputXSLT {
+FunctionReadFile::FunctionReadFile(const std::string& path):
+ path_(path) { }
+
xalan::XObjectPtr FunctionReadFile::execute(
xalan::XPathExecutionContext& executionContext,
xalan::XalanNode* context,
@@ -16,20 +21,21 @@ xalan::XObjectPtr FunctionReadFile::execute(
generalError(executionContext, context, locator);
}
- xalan::CharVectorType fileNameVector;
- std::string fileNameString;
+ xalan::CharVectorType castHelper;
+ arguments[0]->str().transcode(castHelper);
- arguments[0]->str().transcode(fileNameVector);
+ std::string fileName(this->path_);
+ fileName.reserve(fileName.size() + castHelper.size());
std::move(
- fileNameVector.begin(),
- fileNameVector.end(),
- fileNameString.begin()
+ castHelper.begin(),
+ castHelper.end(),
+ fileName.end()
);
return executionContext.getXObjectFactory().createString(
xalan::XalanDOMString(
- InputXSLT::readFile(fileNameString).data()
+ InputXSLT::readFile(fileName).data()
)
);
}
diff --git a/src/function/read_file.h b/src/function/read_file.h
index dbcf3d6..f800c37 100644
--- a/src/function/read_file.h
+++ b/src/function/read_file.h
@@ -8,12 +8,16 @@
#include <xalanc/XPath/Function.hpp>
#include <xalanc/XPath/XObject.hpp>
-#include "utility.h"
+#include <string>
+
+#include "common.h"
namespace InputXSLT {
class FunctionReadFile : public xalan::Function {
public:
+ FunctionReadFile(const std::string&);
+
virtual xalan::XObjectPtr execute(
xalan::XPathExecutionContext&,
xalan::XalanNode*,
@@ -27,6 +31,8 @@ class FunctionReadFile : public xalan::Function {
bool operator==(const FunctionReadFile&) const = delete;
private:
+ const std::string path_;
+
const xalan::XalanDOMString& getError(xalan::XalanDOMString&) const;
};
diff --git a/src/function/read_xml_file.cc b/src/function/read_xml_file.cc
index 616d189..be091a0 100644
--- a/src/function/read_xml_file.cc
+++ b/src/function/read_xml_file.cc
@@ -2,10 +2,12 @@
namespace InputXSLT {
-FunctionReadXmlFile::FunctionReadXmlFile():
+FunctionReadXmlFile::FunctionReadXmlFile(const std::string& path):
+ path_(path),
parser_() { }
-FunctionReadXmlFile::FunctionReadXmlFile(const FunctionReadXmlFile&):
+FunctionReadXmlFile::FunctionReadXmlFile(const FunctionReadXmlFile& src):
+ path_(src.path_),
parser_() { }
xalan::XObjectPtr FunctionReadXmlFile::execute(
@@ -22,9 +24,12 @@ xalan::XObjectPtr FunctionReadXmlFile::execute(
generalError(executionContext, context, locator);
}
+ xalan::XalanDOMString fileName(this->path_.data());
+ fileName.append(arguments[0]->str());
+
return executionContext.getXObjectFactory().createNodeSet(
this->parser_.parseXMLStream(
- xalan::XSLTInputSource(arguments[0]->str())
+ xalan::XSLTInputSource(fileName)
)
);
}
diff --git a/src/function/read_xml_file.h b/src/function/read_xml_file.h
index 1556764..c755852 100644
--- a/src/function/read_xml_file.h
+++ b/src/function/read_xml_file.h
@@ -9,13 +9,15 @@
#include <xalanc/XPath/XObject.hpp>
#include <xalanc/XercesParserLiaison/XercesParserLiaison.hpp>
-#include "utility.h"
+#include <string>
+
+#include "common.h"
namespace InputXSLT {
class FunctionReadXmlFile : public xalan::Function {
public:
- FunctionReadXmlFile();
+ FunctionReadXmlFile(const std::string&);
FunctionReadXmlFile(const FunctionReadXmlFile&);
virtual xalan::XObjectPtr execute(
@@ -31,6 +33,7 @@ class FunctionReadXmlFile : public xalan::Function {
bool operator==(const FunctionReadXmlFile&) const = delete;
private:
+ const std::string path_;
mutable xalan::XercesParserLiaison parser_;
const xalan::XalanDOMString& getError(xalan::XalanDOMString& result) const;
diff --git a/src/plattform_guard.h b/src/plattform_guard.h
index 9e99fdc..fe8b954 100644
--- a/src/plattform_guard.h
+++ b/src/plattform_guard.h
@@ -2,9 +2,11 @@
#define INPUTXSLT_SRC_PLATTFORM_GUARD_H_
#include <xalanc/Include/PlatformDefinitions.hpp>
+#include <xalanc/XalanTransformer/XalanTransformer.hpp>
+
#include <xercesc/util/PlatformUtils.hpp>
-namespace xalan = xalanc_1_11;
+#include "common.h"
namespace InputXSLT {
diff --git a/src/transformer_guard.cc b/src/transformer_facade.cc
index 73bcea2..be2a6a2 100644
--- a/src/transformer_guard.cc
+++ b/src/transformer_facade.cc
@@ -1,4 +1,4 @@
-#include "transformer_guard.h"
+#include "transformer_facade.h"
#include <xalanc/Include/PlatformDefinitions.hpp>
#include <xercesc/util/PlatformUtils.hpp>
@@ -16,8 +16,7 @@
namespace InputXSLT {
-TransformerGuard::TransformerGuard():
- plattform_(),
+TransformerFacade::TransformerFacade(const std::string& path):
parser_(),
transformer_() {
const xalan::XalanDOMString customNamespace(
@@ -27,18 +26,18 @@ TransformerGuard::TransformerGuard():
this->transformer_.installExternalFunction(
customNamespace,
xalan::XalanDOMString("read-file"),
- InputXSLT::FunctionReadFile()
+ InputXSLT::FunctionReadFile(path)
);
this->transformer_.installExternalFunction(
customNamespace,
xalan::XalanDOMString("read-xml-file"),
- InputXSLT::FunctionReadXmlFile()
+ InputXSLT::FunctionReadXmlFile(path)
);
}
-int TransformerGuard::execute(
+int TransformerFacade::execute(
const std::string& transformation,
const std::string& target
) {
diff --git a/src/transformer_guard.h b/src/transformer_facade.h
index 381fb94..c11fa78 100644
--- a/src/transformer_guard.h
+++ b/src/transformer_facade.h
@@ -1,23 +1,22 @@
-#ifndef INPUTXSLT_SRC_TRANSFORMER_GUARD_H_
-#define INPUTXSLT_SRC_TRANSFORMER_GUARD_H_
+#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 "plattform_guard.h"
+#include "common.h"
namespace InputXSLT {
-class TransformerGuard {
+class TransformerFacade {
public:
- TransformerGuard();
+ TransformerFacade(const std::string&);
int execute(const std::string&, const std::string&);
private:
- const PlattformGuard plattform_;
mutable xalan::XercesParserLiaison parser_;
xalan::XalanTransformer transformer_;
@@ -26,4 +25,4 @@ class TransformerGuard {
}
-#endif // INPUTXSLT_SRC_TRANSFORMER_GUARD_H_
+#endif // INPUTXSLT_SRC_TRANSFORMER_FACADE_H_
diff --git a/test.cc b/test.cc
index 09325f7..44c2484 100644
--- a/test.cc
+++ b/test.cc
@@ -1,9 +1,11 @@
-#include "transformer_guard.h"
+#include "plattform_guard.h"
+#include "transformer_facade.h"
int main() {
- InputXSLT::TransformerGuard guard;
+ InputXSLT::PlattformGuard plattform;
+ InputXSLT::TransformerFacade transformer("../dummy/");
- return guard.execute(
+ return transformer.execute(
"../dummy/transform.xsl",
"out.xml"
);