--- parser3/src/include/pa_stylesheet_connection.h 2001/09/14 15:41:59 1.1 +++ parser3/src/include/pa_stylesheet_connection.h 2001/10/19 14:15:23 1.13 @@ -1,11 +1,10 @@ /** @file - Parser: stylesheet fstylesheet decl. + Parser: Stylesheet connection decl. Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) - Author: Alexander Petrosyan (http://design.ru/paf) - $Id: pa_stylesheet_connection.h,v 1.1 2001/09/14 15:41:59 parser Exp $ + $Id: pa_stylesheet_connection.h,v 1.13 2001/10/19 14:15:23 parser Exp $ */ #ifndef PA_STYLESHEET_CONNECTION_H @@ -17,7 +16,7 @@ #include "pa_exception.h" #include "pa_common.h" -#include +#include "XalanTransformer2.hpp" // defines @@ -25,19 +24,19 @@ /** Connection with stylesheet: remembers time and can figure out that it needs recompilation - @test free ftransformer somehow */ class Stylesheet_connection : public Pooled { public: Stylesheet_connection(Pool& pool, const String& afile_spec) : Pooled(pool), - ftransformer(new XalanTransformer), + ftransformer(new XalanTransformer2), ffile_spec(afile_spec), time_used(0), prev_disk_time(0), - fservices_pool(0) { + fservices_pool(0), + fstylesheet(0) { } const String& file_spec() { return ffile_spec; } @@ -56,12 +55,16 @@ public: void disconnect() { /*ignore error*/ftransformer->destroyStylesheet(fstylesheet); fstylesheet=0; + + // connection effectively useless now, free up some memory + delete ftransformer; } bool connected() { return fstylesheet!=0; } - XalanCompiledStylesheet& stylesheet() { - if(time_t new_disk_time=get_new_disk_time()) + const XalanCompiledStylesheet& stylesheet(bool nocache) { + time_t new_disk_time=get_new_disk_time(); + if(nocache || new_disk_time) load(new_disk_time); return *fstylesheet; } @@ -76,11 +79,27 @@ private: void load(time_t new_disk_time) { Pool& pool=*fservices_pool; - int error=ftransformer->compileStylesheet(ffile_spec.cstr(String::UL_FILE_SPEC), fstylesheet); - if(error) - PTHROW(0, 0, - &ffile_spec, - ftransformer->getLastError()); + try{ + const XalanCompiledStylesheet *nstylesheet; + ftransformer->compileStylesheet2(ffile_spec.cstr(String::UL_FILE_SPEC), nstylesheet); + ftransformer->destroyStylesheet(fstylesheet); + fstylesheet=nstylesheet; + } + catch (XSLException& e) { + Exception::convert(pool, &ffile_spec, e); + } + catch (SAXParseException& e) { + Exception::convert(pool, &ffile_spec, e); + } + catch (SAXException& e) { + Exception::convert(pool, &ffile_spec, e); + } + catch (XMLException& e) { + Exception::convert(pool, &ffile_spec, e); + } + catch(const XalanDOMException& e) { + Exception::convert(pool, &ffile_spec, e); + } prev_disk_time=new_disk_time; } @@ -90,25 +109,26 @@ private: time_t atime, mtime, ctime; String stamp_file_spec(ffile_spec); stamp_file_spec << STYLESHEET_FILENAME_STAMP_SUFFIX; - // {file_spec}.stamp modification time OR {file_spec} mtime - if(!file_stat(file_readable(stamp_file_spec)?stamp_file_spec:ffile_spec, + // {file_spec}.stamp modification time OR {file_spec} + const String& stat_file_spec=file_readable(stamp_file_spec)?stamp_file_spec:ffile_spec; + if(!file_stat(stat_file_spec, size, atime, mtime, ctime, - false/*no exceptions on global pool, please*/)) - mtime=0; // no file=no time + false/*no exception on global pool[stat_file_spec], please*/)) + mtime=1; //no file=pseudo non-zero time, see get_new_disk_time return mtime; } private: const String& ffile_spec; - XalanCompiledStylesheet *fstylesheet; + const XalanCompiledStylesheet *fstylesheet; time_t time_used; time_t prev_disk_time; private: - XalanTransformer *ftransformer; + XalanTransformer2 *ftransformer; Pool *fservices_pool; };