From 42f3c90a7c544258a62f8392cd971e403a525bec Mon Sep 17 00:00:00 2001 From: randomdan Date: Thu, 10 Mar 2011 13:53:07 +0000 Subject: Allow scripts to propergate messages from parameter checks into the presentation layer Also allow variables to be constructed from a child element's text --- project2/appEngine.cpp | 31 +++++++++++++++++++++++++++++++ project2/appEngine.h | 18 ++++++++++++++++++ project2/cgi/cgiAppEngine.cpp | 1 + project2/cgi/cgiStageInitial.cpp | 6 ++++++ project2/cgi/cgiStagePresent.cpp | 1 + project2/cgi/cgiStageRequest.cpp | 1 + project2/console/consoleAppEngine.cpp | 1 + project2/exceptions.h | 5 +++++ project2/paramChecker.cpp | 3 ++- project2/paramChecker.h | 8 +++----- project2/variables.cpp | 14 ++++++++++++-- 11 files changed, 81 insertions(+), 8 deletions(-) diff --git a/project2/appEngine.cpp b/project2/appEngine.cpp index 1489cd1..9abe834 100644 --- a/project2/appEngine.cpp +++ b/project2/appEngine.cpp @@ -1,5 +1,7 @@ #include "appEngine.h" +#include "logger.h" #include +#include ApplicationEngine * ApplicationEngine::currentEngine = NULL; @@ -17,3 +19,32 @@ ApplicationEngine::~ApplicationEngine() currentEngine = NULL; } +void +ApplicationEngine::logMessage(bool writeLog, const Glib::ustring & g, const Glib::ustring & m) +{ + if (writeLog) { + Logger()->messagef(LOG_NOTICE, "%s: %s: %s", __PRETTY_FUNCTION__, g.c_str(), m.c_str()); + } + appMessages.push_back(new Message(g, m)); +} + +void +ApplicationEngine::addCoreAppData(const Presenter * p) const +{ + // Message log + p->pushSub("messages", env()->getXmlPrefix()); + BOOST_FOREACH(const Messages::value_type & m, appMessages) { + p->pushSub("message"); + p->addAttr("group", m->group); + p->addAttr("text", m->message); + p->popSub(); + } + p->popSub(); +} + +ApplicationEngine::Message::Message(const Glib::ustring & g, const Glib::ustring & m) : + group(g), + message(m) +{ +} + diff --git a/project2/appEngine.h b/project2/appEngine.h index a9df07e..689f1b5 100644 --- a/project2/appEngine.h +++ b/project2/appEngine.h @@ -8,9 +8,21 @@ class ApplicationEngine : public Configuration { public: + class Message : public IntrusivePtrBase { + public: + Message(const Glib::ustring & g, const Glib::ustring & m); + + const Glib::ustring group; + const Glib::ustring message; + }; + typedef boost::intrusive_ptr MessagePtr; + typedef std::list Messages; + ApplicationEngine(const Glib::ustring & engineKeys); virtual ~ApplicationEngine() = 0; + void logMessage(bool writeLog, const Glib::ustring & g, const Glib::ustring & m); + virtual void process() const = 0; virtual const Environment * env() const = 0; virtual SessionPtr session() const = 0; @@ -18,6 +30,12 @@ class ApplicationEngine : public Configuration { virtual void addEnvData(const Presenter * p) const = 0; static ApplicationEngine * getCurrent() { return currentEngine; } + + protected: + void addCoreAppData(const Presenter * p) const; + + Messages appMessages; + private: static ApplicationEngine * currentEngine; }; diff --git a/project2/cgi/cgiAppEngine.cpp b/project2/cgi/cgiAppEngine.cpp index 547506d..52e69cf 100644 --- a/project2/cgi/cgiAppEngine.cpp +++ b/project2/cgi/cgiAppEngine.cpp @@ -155,6 +155,7 @@ CgiApplicationEngine::addEnvData(const Presenter * p) const void CgiApplicationEngine::addAppData(const Presenter * p) const { + addCoreAppData(p); // Sessions variables if (!sessionID.is_nil()) { p->pushSub("session", env()->getXmlPrefix()); diff --git a/project2/cgi/cgiStageInitial.cpp b/project2/cgi/cgiStageInitial.cpp index a9315bc..d302971 100644 --- a/project2/cgi/cgiStageInitial.cpp +++ b/project2/cgi/cgiStageInitial.cpp @@ -1,5 +1,8 @@ #include "cgiAppEngine.h" #include "cgiEnvironment.h" +#include "../exceptions.h" + +StaticMessageException(EmptyRequestURL, "Request URL cannot be empty"); CgiApplicationEngine::InitialStage::InitialStage(const CgiEnvironment * env) : CgiApplicationEngine::Stage(env) @@ -10,6 +13,9 @@ CgiApplicationEngine::StagePtr CgiApplicationEngine::InitialStage::run() { if (e->getRequestMethod() == "POST") { + if (e->elems.empty()) { + throw EmptyRequestURL(); + } return new RequestStage(e, e->elems[0]); } else { diff --git a/project2/cgi/cgiStagePresent.cpp b/project2/cgi/cgiStagePresent.cpp index 9dcf124..47db567 100644 --- a/project2/cgi/cgiStagePresent.cpp +++ b/project2/cgi/cgiStagePresent.cpp @@ -20,6 +20,7 @@ CgiApplicationEngine::PresentStage::run() { BOOST_FOREACH(ParamCheckers::value_type pc, parameterChecks.get()) { if (!pc->performCheck()) { + ApplicationEngine::getCurrent()->logMessage(false, pc->group(), pc->message()); return new PresentStage(e, pc->present); } } diff --git a/project2/cgi/cgiStageRequest.cpp b/project2/cgi/cgiStageRequest.cpp index 6602527..6f877f7 100644 --- a/project2/cgi/cgiStageRequest.cpp +++ b/project2/cgi/cgiStageRequest.cpp @@ -25,6 +25,7 @@ CgiApplicationEngine::RequestStage::run() { BOOST_FOREACH(const ParamCheckers::value_type & pc, parameterChecks.get()) { if (!pc->performCheck()) { + ApplicationEngine::getCurrent()->logMessage(false, pc->group(), pc->message()); return new PresentStage(e, pc->present); } } diff --git a/project2/console/consoleAppEngine.cpp b/project2/console/consoleAppEngine.cpp index 7a08f69..769add6 100644 --- a/project2/console/consoleAppEngine.cpp +++ b/project2/console/consoleAppEngine.cpp @@ -81,6 +81,7 @@ ConsoleApplicationEngine::process() const { BOOST_FOREACH(const ParamCheckers::value_type & pc, parameterChecks.get()) { if (!pc->performCheck()) { + ApplicationEngine::getCurrent()->logMessage(false, pc->group(), pc->message()); throw std::runtime_error("Check failed"); } } diff --git a/project2/exceptions.h b/project2/exceptions.h index 23faafc..a9d4952 100644 --- a/project2/exceptions.h +++ b/project2/exceptions.h @@ -12,6 +12,11 @@ class numeric_error : public std::exception { int err; mutable char * buf; }; +#define StaticMessageException(Name, Text) \ +class Name : public std::runtime_error { \ + public: \ + Name() : std::runtime_error(Text) { } \ +} #define SimpleMessageException(Name) \ class Name : public std::runtime_error { \ public: \ diff --git a/project2/paramChecker.cpp b/project2/paramChecker.cpp index aa1dbff..0781e90 100644 --- a/project2/paramChecker.cpp +++ b/project2/paramChecker.cpp @@ -3,7 +3,8 @@ ParamChecker::ParamChecker(const xmlpp::Element * p) : SourceObject(p), - message(xmlChildText(p, "message")), + message(p, "message", false, "Check failed"), + group(p, "group", false, "default"), present(p->get_attribute_value("present")) { } diff --git a/project2/paramChecker.h b/project2/paramChecker.h index 465b8e9..57addbc 100644 --- a/project2/paramChecker.h +++ b/project2/paramChecker.h @@ -3,10 +3,7 @@ #include #include "sourceObject.h" - -class ApplicationEngine; -class ParamChecker; -typedef boost::intrusive_ptr ParamCheckerPtr; +#include "variables.h" /// Base class for Project2 compoments that perform tests/checks class ParamChecker : public SourceObject { @@ -16,7 +13,8 @@ class ParamChecker : public SourceObject { virtual bool performCheck() const = 0; - const Glib::ustring message; + const Variable message; + const Variable group; const std::string present; }; diff --git a/project2/variables.cpp b/project2/variables.cpp index 2b2872d..a5cfa0d 100644 --- a/project2/variables.cpp +++ b/project2/variables.cpp @@ -1,4 +1,5 @@ #include "variables.h" +#include "xmlObjectLoader.h" #include "exceptions.h" #include "appEngine.h" #include "session.h" @@ -389,8 +390,17 @@ Variable::Variable(const xmlpp::Element * e, const Glib::ustring & n, bool requi var = new VariableParam(c); else if (source == "config") var = new VariableConfig(c); - else if (source == "literal" || source.empty()) - var = new VariableLiteral(c->get_attribute_value("value"), getVariableTypeFromName(c->get_attribute_value("type"))); + else if (source == "literal" || source.empty()) { + if (const xmlpp::Attribute * la = c->get_attribute("value")) { + var = new VariableLiteral(la->get_value(), getVariableTypeFromName(c->get_attribute_value("type"))); + } + else if (const xmlpp::TextNode * t = c->get_child_text()) { + var = new VariableLiteral(t->get_content(), getVariableTypeFromName(c->get_attribute_value("type"))); + } + else { + var = new VariableLiteral(VariableType()); + } + } else throw UnknownVariableSource(source); return; -- cgit v1.2.3