summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2016-12-12 22:08:13 +0000
committerDan Goodliffe <dan@randomdan.homeip.net>2016-12-12 22:08:13 +0000
commit353eeb16e99044dd8b3e875b5f861067f60a3f87 (patch)
treeb861a7cf17d8a7855fbd8b81065bbf75ac91df27
parentAdd missing include (diff)
downloadicespider-353eeb16e99044dd8b3e875b5f861067f60a3f87.tar.bz2
icespider-353eeb16e99044dd8b3e875b5f861067f60a3f87.tar.xz
icespider-353eeb16e99044dd8b3e875b5f861067f60a3f87.zip
Load stylesheets as needed and reload them on change
-rw-r--r--icespider/xslt/Jamfile.jam2
-rw-r--r--icespider/xslt/xsltStreamSerializer.cpp19
-rw-r--r--icespider/xslt/xsltStreamSerializer.h6
3 files changed, 22 insertions, 5 deletions
diff --git a/icespider/xslt/Jamfile.jam b/icespider/xslt/Jamfile.jam
index 1bf62a8..97408be 100644
--- a/icespider/xslt/Jamfile.jam
+++ b/icespider/xslt/Jamfile.jam
@@ -1,6 +1,7 @@
lib adhocutil : : : : <include>/usr/include/adhocutil ;
lib slicer-xml : : : : <include>/usr/include/slicer ;
lib boost_system ;
+lib boost_filesystem ;
lib IceUtil ;
lib xslt ;
lib exslt ;
@@ -11,6 +12,7 @@ lib icespider-xslt :
<library>adhocutil
<library>slicer-xml
<library>boost_system
+ <library>boost_filesystem
<library>IceUtil
<library>xslt
<library>exslt
diff --git a/icespider/xslt/xsltStreamSerializer.cpp b/icespider/xslt/xsltStreamSerializer.cpp
index 3e27fc3..d89adcd 100644
--- a/icespider/xslt/xsltStreamSerializer.cpp
+++ b/icespider/xslt/xsltStreamSerializer.cpp
@@ -2,6 +2,7 @@
#include <libxslt/xsltInternals.h>
#include <libxml/HTMLtree.h>
#include <factory.impl.h>
+#include <boost/filesystem/convenience.hpp>
namespace IceSpider {
static int xmlstrmclosecallback(void * context)
@@ -17,11 +18,10 @@ namespace IceSpider {
}
XsltStreamSerializer::IceSpiderFactory::IceSpiderFactory(const char * path) :
- stylesheet(xsltParseStylesheetFile(BAD_CAST path))
+ stylesheetPath(path),
+ stylesheetWriteTime(0),
+ stylesheet(nullptr)
{
- if (!stylesheet) {
- throw xmlpp::exception("Failed to load stylesheet");
- }
}
XsltStreamSerializer::IceSpiderFactory::~IceSpiderFactory()
@@ -32,6 +32,17 @@ namespace IceSpider {
XsltStreamSerializer *
XsltStreamSerializer::IceSpiderFactory::create(std::ostream & strm) const
{
+ auto newMtime = boost::filesystem::last_write_time(stylesheetPath);
+ if (newMtime != stylesheetWriteTime) {
+ if (stylesheet) {
+ xsltFreeStylesheet(stylesheet);
+ }
+ stylesheet = xsltParseStylesheetFile(BAD_CAST stylesheetPath.c_str());
+ if (!stylesheet) {
+ throw xmlpp::exception("Failed to load stylesheet");
+ }
+ stylesheetWriteTime = newMtime;
+ }
return new XsltStreamSerializer(strm, stylesheet);
}
diff --git a/icespider/xslt/xsltStreamSerializer.h b/icespider/xslt/xsltStreamSerializer.h
index b9b9372..b061012 100644
--- a/icespider/xslt/xsltStreamSerializer.h
+++ b/icespider/xslt/xsltStreamSerializer.h
@@ -4,6 +4,7 @@
#include <slicer/xml/serializer.h>
#include <visibility.h>
#include <libxslt/transform.h>
+#include <boost/filesystem/path.hpp>
namespace IceSpider {
class DLL_PUBLIC XsltStreamSerializer : public Slicer::XmlDocumentSerializer {
@@ -15,7 +16,10 @@ namespace IceSpider {
XsltStreamSerializer * create(std::ostream &) const override;
- xsltStylesheet * stylesheet;
+ private:
+ const boost::filesystem::path stylesheetPath;
+ mutable std::time_t stylesheetWriteTime;
+ mutable xsltStylesheet * stylesheet;
};
XsltStreamSerializer(std::ostream &, xsltStylesheet *);