diff options
| -rw-r--r-- | icespider/xslt/Jamfile.jam | 2 | ||||
| -rw-r--r-- | icespider/xslt/xsltStreamSerializer.cpp | 19 | ||||
| -rw-r--r-- | 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 : : : : <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 *); | 
