From 353eeb16e99044dd8b3e875b5f861067f60a3f87 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Mon, 12 Dec 2016 22:08:13 +0000 Subject: Load stylesheets as needed and reload them on change --- icespider/xslt/Jamfile.jam | 2 ++ icespider/xslt/xsltStreamSerializer.cpp | 19 +++++++++++++++---- icespider/xslt/xsltStreamSerializer.h | 6 +++++- 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 : : : : /usr/include/adhocutil ; lib slicer-xml : : : : /usr/include/slicer ; lib boost_system ; +lib boost_filesystem ; lib IceUtil ; lib xslt ; lib exslt ; @@ -11,6 +12,7 @@ lib icespider-xslt : adhocutil slicer-xml boost_system + boost_filesystem IceUtil xslt 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 #include #include +#include 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 #include #include +#include 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 *); -- cgit v1.2.3