From ca713add1f0a044e9f9bd3b8946fae97b9fd3075 Mon Sep 17 00:00:00 2001 From: randomdan Date: Mon, 18 Jul 2011 18:46:18 +0000 Subject: Allow references to scripts deep in the tree --- project2/Jamfile.jam | 1 + project2/cgi/cgiEnvironment.cpp | 15 ++++++++++----- project2/cgi/cgiStageCustomError.cpp | 4 ++-- project2/cgi/cgiStageCustomNotFound.cpp | 4 ++-- project2/cgi/cgiStageInitial.cpp | 4 ++-- project2/cgi/cgiStagePresent.cpp | 12 ++++++------ project2/cgi/cgiStageRequest.cpp | 6 +++--- project2/checkHost.cpp | 8 +------- project2/checkHost.h | 3 +-- project2/commonObjects.cpp | 5 ++--- project2/console/consoleAppEngine.cpp | 8 ++++---- project2/environment.cpp | 25 +++++++++++++++++++++++++ project2/environment.h | 5 +++++ project2/sendmailTask.cpp | 3 ++- project2/taskHost.cpp | 9 +-------- project2/taskHost.h | 3 +-- project2/viewHost.cpp | 10 +--------- project2/viewHost.h | 3 +-- project2/xmlScriptParser.cpp | 24 ++++++++---------------- project2/xmlScriptParser.h | 6 +++--- 20 files changed, 81 insertions(+), 77 deletions(-) diff --git a/project2/Jamfile.jam b/project2/Jamfile.jam index 6015b7e..af19cee 100644 --- a/project2/Jamfile.jam +++ b/project2/Jamfile.jam @@ -194,6 +194,7 @@ lib p2web : p2uuid boost_program_options boost_regex + boost_filesystem p2xmlSession : : p2parts diff --git a/project2/cgi/cgiEnvironment.cpp b/project2/cgi/cgiEnvironment.cpp index 2bc3b02..21799db 100644 --- a/project2/cgi/cgiEnvironment.cpp +++ b/project2/cgi/cgiEnvironment.cpp @@ -3,18 +3,23 @@ #include "../exceptions.h" #include #include -#include -template -std::vectormakeVector(const Y & y) +std::vector +makeVector(const boost::filesystem::path & y) { - return std::vector(y.begin(), y.end()); + std::vector r; + boost::filesystem::path::iterator p = y.begin(); + p++; + while(p != y.end()) { + r.push_back((p++)->string()); + } + return r; } CgiEnvironment::CgiEnvironment(cgicc::Cgicc * c) : Environment(0, NULL), cgicc::CgiEnvironment(c->getEnvironment()), - elems(makeVector(boost::tokenizer >(getRedirectURL(), boost::char_separator("/")))), + elems(makeVector(boost::filesystem::path(getRedirectURL()))), cgi(c) { } diff --git a/project2/cgi/cgiStageCustomError.cpp b/project2/cgi/cgiStageCustomError.cpp index fb2f0de..26fdf51 100644 --- a/project2/cgi/cgiStageCustomError.cpp +++ b/project2/cgi/cgiStageCustomError.cpp @@ -5,8 +5,8 @@ CgiApplicationEngine::CustomErrorStage::CustomErrorStage(const CgiEnvironment * env, const std::exception & ex) : CgiApplicationEngine::ResponseStage(env), - ::XmlScriptParser(env->errorPresentRoot, env->onErrorPresent, false), - ::CheckHost(env->errorPresentRoot, env->onErrorPresent), + ::XmlScriptParser(e->resolveScript(env->errorPresentRoot, env->onErrorPresent), false), + ::CheckHost(e->resolveScript(env->errorPresentRoot, env->onErrorPresent)), CgiApplicationEngine::DefaultErrorStage(env, ex), CgiApplicationEngine::PresentStage(env, env->errorPresentRoot, env->onErrorPresent) { diff --git a/project2/cgi/cgiStageCustomNotFound.cpp b/project2/cgi/cgiStageCustomNotFound.cpp index 7c08a9f..4f06c2e 100644 --- a/project2/cgi/cgiStageCustomNotFound.cpp +++ b/project2/cgi/cgiStageCustomNotFound.cpp @@ -5,8 +5,8 @@ CgiApplicationEngine::CustomNotFoundStage::CustomNotFoundStage(const CgiEnvironment * env, const ::XmlScriptParser::NotFound & notfound) : CgiApplicationEngine::ResponseStage(env), - ::XmlScriptParser(env->errorPresentRoot, env->notFoundPresent, false), - ::CheckHost(env->errorPresentRoot, env->notFoundPresent), + ::XmlScriptParser(e->resolveScript(env->errorPresentRoot, env->notFoundPresent), false), + ::CheckHost(e->resolveScript(env->errorPresentRoot, env->notFoundPresent)), CgiApplicationEngine::DefaultNotFoundStage(env, notfound), CgiApplicationEngine::PresentStage(env, env->errorPresentRoot, env->notFoundPresent) { diff --git a/project2/cgi/cgiStageInitial.cpp b/project2/cgi/cgiStageInitial.cpp index 1db8f8f..7c7b198 100644 --- a/project2/cgi/cgiStageInitial.cpp +++ b/project2/cgi/cgiStageInitial.cpp @@ -16,10 +16,10 @@ CgiApplicationEngine::InitialStage::run() if (e->elems.empty()) { throw EmptyRequestURL(); } - return NextStage(new RequestStage(e, e->elems[0])); + return NextStage(new RequestStage(e, e->getRedirectURL())); } else { - return NextStage(new PresentStage(e, e->elems.empty() ? e->defaultPresent : e->elems[0])); + return NextStage(new PresentStage(e, e->elems.empty() ? e->defaultPresent : e->getRedirectURL())); } } diff --git a/project2/cgi/cgiStagePresent.cpp b/project2/cgi/cgiStagePresent.cpp index 6091ed8..4920623 100644 --- a/project2/cgi/cgiStagePresent.cpp +++ b/project2/cgi/cgiStagePresent.cpp @@ -6,17 +6,17 @@ CgiApplicationEngine::PresentStage::PresentStage(const CgiEnvironment * e, const std::string & id) : CgiApplicationEngine::ResponseStage(e), - XmlScriptParser(e->presentRoot, id, false), - CheckHost(e->presentRoot, id), - ViewHost(e->presentRoot, id) + XmlScriptParser(e->resolveScript(e->presentRoot, id), false), + CheckHost(e->resolveScript(e->presentRoot, id)), + ViewHost(e->resolveScript(e->presentRoot, id)) { } CgiApplicationEngine::PresentStage::PresentStage(const CgiEnvironment * e, const std::string & group, const std::string & id) : CgiApplicationEngine::ResponseStage(e), - XmlScriptParser(group, id, false), - CheckHost(group, id), - ViewHost(group, id) + XmlScriptParser(e->resolveScript(group, id), false), + CheckHost(e->resolveScript(group, id)), + ViewHost(e->resolveScript(group, id)) { } diff --git a/project2/cgi/cgiStageRequest.cpp b/project2/cgi/cgiStageRequest.cpp index ee72b81..c53a172 100644 --- a/project2/cgi/cgiStageRequest.cpp +++ b/project2/cgi/cgiStageRequest.cpp @@ -5,10 +5,10 @@ #include CgiApplicationEngine::RequestStage::RequestStage(const CgiEnvironment * e, const std::string & id) : - XmlScriptParser(e->requestRoot, id, false), - ::CheckHost(e->requestRoot, id), + XmlScriptParser(e->resolveScript(e->requestRoot, id), false), + ::CheckHost(e->resolveScript(e->requestRoot, id)), CgiApplicationEngine::ResponseStage(e), - ::TaskHost(e->requestRoot, id) + ::TaskHost(e->resolveScript(e->requestRoot, id)) { xmlpp::Element * requestRoot = get_document()->get_root_node(); present = requestRoot->get_attribute_value("present"); diff --git a/project2/checkHost.cpp b/project2/checkHost.cpp index cda07fc..a39c176 100644 --- a/project2/checkHost.cpp +++ b/project2/checkHost.cpp @@ -2,13 +2,7 @@ #include "appEngine.h" #include -CheckHost::CheckHost(const std::string & group, const std::string & name) : - XmlScriptParser(group, name, false) -{ - loader.supportedStorers.insert(Storer::into(¶meterChecks)); -} - -CheckHost::CheckHost(const std::string & file) : +CheckHost::CheckHost(const boost::filesystem::path & file) : XmlScriptParser(file, false) { loader.supportedStorers.insert(Storer::into(¶meterChecks)); diff --git a/project2/checkHost.h b/project2/checkHost.h index 759c7a0..54fc96d 100644 --- a/project2/checkHost.h +++ b/project2/checkHost.h @@ -15,8 +15,7 @@ class CheckHost : public virtual XmlScriptParser { ~CheckFailure() throw(); const ParamCheckerCPtr failedCheck; }; - CheckHost(const std::string & group, const std::string & file); - CheckHost(const std::string & file); + CheckHost(const boost::filesystem::path & file); ~CheckHost(); void runChecks() const; diff --git a/project2/commonObjects.cpp b/project2/commonObjects.cpp index 1d0b13e..63d4d1d 100644 --- a/project2/commonObjects.cpp +++ b/project2/commonObjects.cpp @@ -5,8 +5,6 @@ CommonObjects::~CommonObjects() { - rowSets.clear(); - datasources.clear(); } RowSetPtr @@ -22,7 +20,8 @@ CommonObjects::getSource(const std::string & name) const CommonObjects::DataSources::const_iterator CommonObjects::loadDataSource(const std::string & name) const { - XmlScriptParser xml(ApplicationEngine::getCurrent()->env()->getDatasourceRoot(), name, true); + XmlScriptParser xml(Environment::getCurrent()->resolveScript( + Environment::getCurrent()->getDatasourceRoot(), name), true); LoaderBase loader(true); loader.supportedStorers.insert(Storer::into(&datasources)); diff --git a/project2/console/consoleAppEngine.cpp b/project2/console/consoleAppEngine.cpp index dab1c46..49a5842 100644 --- a/project2/console/consoleAppEngine.cpp +++ b/project2/console/consoleAppEngine.cpp @@ -54,11 +54,11 @@ class ConsoleSession : public Session { }; ConsoleApplicationEngine::ConsoleApplicationEngine(const ConsoleEnvironment * env, const boost::filesystem::path & f) : - XmlScriptParser(f.string(), false), - CheckHost(f.string()), + XmlScriptParser(f, false), + CheckHost(f), ApplicationEngine("console/environment"), - TaskHost(f.string()), - ViewHost(f.string()), + TaskHost(f), + ViewHost(f), _env(env), runtime(new ConsoleSession()) { diff --git a/project2/environment.cpp b/project2/environment.cpp index 69cdde7..8a03af9 100644 --- a/project2/environment.cpp +++ b/project2/environment.cpp @@ -3,6 +3,7 @@ #include #include #include +#include namespace po = boost::program_options; @@ -91,3 +92,27 @@ Environment::getCurrent() return currentEnv; } +boost::filesystem::path +Environment::resolveScript(const std::string & group, const std::string & name) const +{ + boost::filesystem::path script(boost::filesystem::current_path() / group); + BOOST_FOREACH(const boost::filesystem::path & e, boost::filesystem::path(name)) { + if (boost::filesystem::is_directory(script / e)) { + script /= e; + } + else { + if (boost::filesystem::is_regular_file((script / e).replace_extension(".xml"))) { + return ((script / e).replace_extension(".xml")); + } + } + } + return script; +} + +boost::filesystem::path +Environment::resolveScript(const std::string & path) const +{ + boost::filesystem::path script(boost::filesystem::current_path()); + return script / path; +} + diff --git a/project2/environment.h b/project2/environment.h index e515741..6a822c7 100644 --- a/project2/environment.h +++ b/project2/environment.h @@ -5,6 +5,7 @@ #include #include #include +#include class Environment { public: @@ -24,6 +25,10 @@ class Environment { virtual std::string getServerName() const = 0; virtual std::string getScriptName() const = 0; + + boost::filesystem::path resolveScript(const std::string & group, const std::string & name) const; + boost::filesystem::path resolveScript(const std::string & path) const; + private: static const Environment * currentEnv; diff --git a/project2/sendmailTask.cpp b/project2/sendmailTask.cpp index 073022f..fa9a4a3 100644 --- a/project2/sendmailTask.cpp +++ b/project2/sendmailTask.cpp @@ -4,6 +4,7 @@ #include #include "xmlObjectLoader.h" #include "viewHost.h" +#include "environment.h" #include #include #include "xmlPresenter.h" @@ -198,7 +199,7 @@ SendMailTask::execute() const parts->parts.insert(new Header("Content-Transfer-Encoding", "binary")); parts->parts.insert(new BoundaryEnd()); - ViewHostPtr vsp = new ViewHost("emails", present); + ViewHostPtr vsp = new ViewHost(Environment::getCurrent()->resolveScript("emails", present)); vsp->executeViews(boost::bind(&SendMailTask::createDefaultPresenter, this, _1)); vsp->doTransforms(); part = parts->parts.begin(); diff --git a/project2/taskHost.cpp b/project2/taskHost.cpp index 20595f9..0fc1453 100644 --- a/project2/taskHost.cpp +++ b/project2/taskHost.cpp @@ -3,14 +3,7 @@ #include "dataSource.h" #include -TaskHost::TaskHost(const std::string & group, const std::string & name) : - XmlScriptParser(group, name, false), - CheckHost(group, name) -{ - loader.supportedStorers.insert(new NOEErrorStorer(&normTasks, &errorTasks)); -} - -TaskHost::TaskHost(const std::string & file) : +TaskHost::TaskHost(const boost::filesystem::path & file) : XmlScriptParser(file, false), CheckHost(file) { diff --git a/project2/taskHost.h b/project2/taskHost.h index 812760c..290c841 100644 --- a/project2/taskHost.h +++ b/project2/taskHost.h @@ -12,8 +12,7 @@ class TaskHost : virtual public XmlScriptParser, virtual public CheckHost { protected: typedef ANONORDEREDSTORAGEOF(NoOutputExecute) Tasks; - TaskHost(const std::string & group, const std::string & name); - TaskHost(const std::string & file); + TaskHost(const boost::filesystem::path & file); virtual ~TaskHost(); void executeTasks() const; diff --git a/project2/viewHost.cpp b/project2/viewHost.cpp index 6bdbe34..c240f76 100644 --- a/project2/viewHost.cpp +++ b/project2/viewHost.cpp @@ -5,15 +5,7 @@ #define FOREACH_PRESENTER BOOST_FOREACH (const PresenterPtr & p, presenters) -ViewHost::ViewHost(const std::string & group, const std::string & name) : - XmlScriptParser(group, name, false), - CheckHost(group, name) -{ - loader.supportedStorers.insert(Storer::into(&views)); - loader.supportedStorers.insert(Storer::into(&pmp.presenters)); -} - -ViewHost::ViewHost(const std::string & file) : +ViewHost::ViewHost(const boost::filesystem::path & file) : XmlScriptParser(file, false), CheckHost(file) { diff --git a/project2/viewHost.h b/project2/viewHost.h index 19ff65f..1428a0e 100644 --- a/project2/viewHost.h +++ b/project2/viewHost.h @@ -28,8 +28,7 @@ class ViewHost : virtual public XmlScriptParser, virtual public CheckHost { }; typedef boost::function1 DefaultPresenterProvider; - ViewHost(const std::string & group, const std::string & file); - ViewHost(const std::string & file); + ViewHost(const boost::filesystem::path & file); ~ViewHost(); void executeViews(const DefaultPresenterProvider &) const; diff --git a/project2/xmlScriptParser.cpp b/project2/xmlScriptParser.cpp index 6d30d67..9b76316 100644 --- a/project2/xmlScriptParser.cpp +++ b/project2/xmlScriptParser.cpp @@ -2,15 +2,7 @@ #include #include -XmlScriptParser::XmlScriptParser(const std::string & group, const std::string & name, bool ii) : - IsInclusion(ii), - loader(true), - documentParsed(false) -{ - loadDocument(group + "/" + name + ".xml"); -} - -XmlScriptParser::XmlScriptParser(const std::string & file, bool ii) : +XmlScriptParser::XmlScriptParser(const boost::filesystem::path & file, bool ii) : IsInclusion(ii), loader(true), documentParsed(false) @@ -19,28 +11,28 @@ XmlScriptParser::XmlScriptParser(const std::string & file, bool ii) : } void -XmlScriptParser::loadDocument(const std::string & file) +XmlScriptParser::loadDocument(const boost::filesystem::path & file) { - loader.supportedStorers.insert(Storer::into(&rowSets)); if (!boost::filesystem::exists(file)) { if (IsInclusion) { - throw DependencyNotFound(file); + throw DependencyNotFound(file.string()); } else { - throw NotFound(file); + throw NotFound(file.string()); } } try { - parse_file(file); + parse_file(file.string()); } catch (const xmlpp::internal_error &) { - throw NotReadable(file); + throw NotReadable(file.string()); } for (int x; (x = xmlXIncludeProcessFlags(get_document()->cobj(), XML_PARSE_NOXINCNODE)); ) { if (x < 0) { - throw IncludesError(file); + throw IncludesError(file.string()); } } + loader.supportedStorers.insert(Storer::into(&rowSets)); } void diff --git a/project2/xmlScriptParser.h b/project2/xmlScriptParser.h index 72d6938..9f1406d 100644 --- a/project2/xmlScriptParser.h +++ b/project2/xmlScriptParser.h @@ -7,6 +7,7 @@ #include "xmlObjectLoader.h" #include #include "commonObjects.h" +#include class XmlScriptParser : public xmlpp::DomParser, virtual public CommonObjects, virtual public IntrusivePtrBase { public: @@ -16,8 +17,7 @@ class XmlScriptParser : public xmlpp::DomParser, virtual public CommonObjects, v SimpleMessageExceptionBase(NotReadable, ParseError); SimpleMessageExceptionBase(IncludesError, ParseError); - XmlScriptParser(const std::string & group, const std::string & name, bool isInclusion); - XmlScriptParser(const std::string & file, bool isInclusion); + XmlScriptParser(const boost::filesystem::path & file, bool isInclusion); const bool IsInclusion; @@ -27,7 +27,7 @@ class XmlScriptParser : public xmlpp::DomParser, virtual public CommonObjects, v void parseDocument() const; private: - void loadDocument(const std::string & file); + void loadDocument(const boost::filesystem::path & file); }; -- cgit v1.2.3