From 37d329e8c3a8113e2571e3835c6eb826298b9ad3 Mon Sep 17 00:00:00 2001 From: randomdan Date: Thu, 10 Feb 2011 22:00:22 +0000 Subject: Add an 'if' component that works with views and iterators Give some control to the behaviour of unsupported items when loading from XML Make regexcheck's regex a variable --- project2/Jamfile.jam | 2 +- project2/if.cpp | 71 ++++++++++++++++++++++++++++++++++++++++++++ project2/if.h | 29 ++++++++++++++++++ project2/iterate.cpp | 2 +- project2/regexCheck.cpp | 4 +-- project2/regexCheck.h | 3 +- project2/rowView.cpp | 2 +- project2/xmlObjectLoader.cpp | 16 ++++++---- project2/xmlObjectLoader.h | 6 ++-- 9 files changed, 121 insertions(+), 14 deletions(-) create mode 100644 project2/if.cpp create mode 100644 project2/if.h diff --git a/project2/Jamfile.jam b/project2/Jamfile.jam index cdba0d3..3b8e1e8 100644 --- a/project2/Jamfile.jam +++ b/project2/Jamfile.jam @@ -48,7 +48,7 @@ lib p2uuid : lib p2common : appEngine.cpp dataSource.cpp environment.cpp fileStarGlibIoChannel.cpp iHaveParameters.cpp - iterate.cpp paramChecker.cpp presenter.cpp rawView.cpp dumpTask.cpp logger.cpp + iterate.cpp paramChecker.cpp presenter.cpp rawView.cpp dumpTask.cpp logger.cpp if.cpp sourceObject.cpp task.cpp variables.cpp variableConvert.cpp view.cpp xmlObjectLoader.cpp exceptions.cpp sessionClearTask.cpp session.cpp sessionSetTask.cpp commonObjects.cpp xmlPresenter.cpp rowView.cpp rowSet.cpp rowUser.cpp rowProcessor.cpp config.cpp diff --git a/project2/if.cpp b/project2/if.cpp new file mode 100644 index 0000000..647c0d0 --- /dev/null +++ b/project2/if.cpp @@ -0,0 +1,71 @@ +#include "if.h" +#include "logger.h" +#include "xmlObjectLoader.h" + +ElementLoaderImpl ifLoader("if"); + +class IfModeIsNonsense : public std::exception { }; + +IfSet::IfSet(const xmlpp::Element * e) : + mode(e->get_attribute_value("mode") == "or" ? Or : And) +{ + LoaderBase loader("http://project2.randomdan.homeip.net", true); + loader.supportedStorers.insert(Storer::into(&checks)); + loader.collectAll(e, true, IgnoreUnsupported); +} + +bool +IfSet::passes() const +{ + if (mode == And) { + BOOST_FOREACH(OrderedParamCheckers::value_type pc, checks) { + if (!pc.second->performCheck()) { + return false; + } + } + return true; + } + else { + BOOST_FOREACH(OrderedParamCheckers::value_type pc, checks) { + if (pc.second->performCheck()) { + return true; + } + } + return false; + } + throw IfModeIsNonsense(); +} + +If::If(const xmlpp::Element * e) : + SourceObject(e), + Iterate(e), + RowView(e), + IfSet(e) +{ +} + +void If::loadComplete(const CommonObjects*) +{ +} + +void If::execute(const Presenter * presenter) const +{ + if (passes()) { + Logger()->messagef(LOG_DEBUG, "IfSet passed, showing %zu views", subViews.size()); + BOOST_FOREACH(Views::value_type sq, subViews) { + sq.second->execute(presenter); + } + } +} + +void If::execute() const +{ + if (passes()) { + Logger()->message(LOG_DEBUG, "IfSet passed"); + BOOST_FOREACH(NoOutputExecutes::value_type sq, subNOEs) { + sq.second->execute(); + } + } +} + + diff --git a/project2/if.h b/project2/if.h new file mode 100644 index 0000000..403f4b0 --- /dev/null +++ b/project2/if.h @@ -0,0 +1,29 @@ +#ifndef IF_H +#define IF_H + +#include "iterate.h" +#include "rowView.h" +#include "paramChecker.h" + +class IfSet : public virtual IntrusivePtrBase { + public: + IfSet(const xmlpp::Element *); + bool passes() const; + + private: + enum Mode { And, Or }; + Mode mode; + OrderedParamCheckers checks; +}; + +class If : public Iterate, public RowView, public IfSet { + public: + If(const xmlpp::Element *); + + virtual void loadComplete(const CommonObjects*); + virtual void execute(const Presenter*) const; + virtual void execute() const; +}; + +#endif + diff --git a/project2/iterate.cpp b/project2/iterate.cpp index d56fd31..cdb0cc6 100644 --- a/project2/iterate.cpp +++ b/project2/iterate.cpp @@ -11,7 +11,7 @@ Iterate::Iterate(const xmlpp::Element * p) : { LoaderBase loader("http://project2.randomdan.homeip.net", true); loader.supportedStorers.insert(Storer::into(&subNOEs)); - loader.collectAll(p, true); + loader.collectAll(p, true, IgnoreUnsupported); } Iterate::~Iterate() diff --git a/project2/regexCheck.cpp b/project2/regexCheck.cpp index 0412145..08b1e75 100644 --- a/project2/regexCheck.cpp +++ b/project2/regexCheck.cpp @@ -9,7 +9,7 @@ RegexCheck::RegexCheck(const xmlpp::Element * p) : SourceObject(p), ParamChecker(p), applyTo(p, "apply-to"), - regex(xmlChildText(p, "regex").raw()) + regex(p, "regex") { } @@ -31,6 +31,6 @@ RegexCheck::performCheck() const bool RegexCheck::checkString(const Glib::ustring & str) const { - return boost::regex_match(str.begin(), str.end(), regex); + return boost::regex_match(str.begin(), str.end(), boost::regex(regex())); } diff --git a/project2/regexCheck.h b/project2/regexCheck.h index e2d5bc1..be55e9b 100644 --- a/project2/regexCheck.h +++ b/project2/regexCheck.h @@ -2,7 +2,6 @@ #define REGEXCHECK_H #include "paramChecker.h" -#include class RegexCheck : public ParamChecker { public: @@ -13,7 +12,7 @@ class RegexCheck : public ParamChecker { bool performCheck() const; const Variable applyTo; - const boost::regex regex; + const Variable regex; private: bool checkString(const Glib::ustring & str) const; }; diff --git a/project2/rowView.cpp b/project2/rowView.cpp index 2306474..9d69e9a 100644 --- a/project2/rowView.cpp +++ b/project2/rowView.cpp @@ -20,7 +20,7 @@ RowView::RowView(const xmlpp::Element * p) : } LoaderBase loader("http://project2.randomdan.homeip.net", true); loader.supportedStorers.insert(Storer::into(&subViews)); - loader.collectAll(p, true); + loader.collectAll(p, true, IgnoreUnsupported); } RowView::~RowView() diff --git a/project2/xmlObjectLoader.cpp b/project2/xmlObjectLoader.cpp index aa1873b..4b291da 100644 --- a/project2/xmlObjectLoader.cpp +++ b/project2/xmlObjectLoader.cpp @@ -1,5 +1,6 @@ #include "xmlObjectLoader.h" #include "exceptions.h" +#include "logger.h" #include unsigned int LoaderBase::depth = 0; @@ -23,7 +24,7 @@ LoaderBase::~LoaderBase() } void -LoaderBase::collectAll(const xmlpp::Element * node, bool childrenOnly) const +LoaderBase::collectAll(const xmlpp::Element * node, bool childrenOnly, UnsupportedHandling uh) const { if (!node) { return; @@ -47,24 +48,29 @@ LoaderBase::collectAll(const xmlpp::Element * node, bool childrenOnly) const throw NotSupported(name); } if (stored < created) { - throw NotSupported(name); + if (uh == ErrorOnUnsupported) { + throw NotSupported(name); + } + else if (uh == WarnOnUnsupported) { + Logger()->messagef(LOG_WARNING, "'%s' unsupported in this location", name.c_str()); + } } } if (created == 0 && (recursive || childrenOnly)) { BOOST_FOREACH(const xmlpp::Node * child, node->get_children()) { - collectAll(dynamic_cast(child), false); + collectAll(dynamic_cast(child), false, uh); } } depth -= 1; } void -LoaderBase::collectAll(const CommonObjects * co, const xmlpp::Element * node, bool childrenOnly) const +LoaderBase::collectAll(const CommonObjects * co, const xmlpp::Element * node, bool childrenOnly, UnsupportedHandling uh) const { if (depth != 0) { throw std::logic_error("Cannot set CommonObjects in subloader"); } - collectAll(node, childrenOnly); + collectAll(node, childrenOnly, uh); BOOST_FOREACH(SourceObjectPtr o, loadedObjects) { o->loadComplete(co); } diff --git a/project2/xmlObjectLoader.h b/project2/xmlObjectLoader.h index 1ebc154..aaab310 100644 --- a/project2/xmlObjectLoader.h +++ b/project2/xmlObjectLoader.h @@ -82,14 +82,16 @@ Storer::into(std::map > * map) return new StorerImpl(map); } +enum UnsupportedHandling { ErrorOnUnsupported, WarnOnUnsupported, IgnoreUnsupported }; + class LoaderBase { public: typedef std::map ElementLoaderMap; LoaderBase(const Glib::ustring & ns, bool recursive); virtual ~LoaderBase(); - void collectAll(const CommonObjects * co, const xmlpp::Element * node, bool childrenOnly) const; - void collectAll(const xmlpp::Element * node, bool childrenOnly) const; + void collectAll(const CommonObjects * co, const xmlpp::Element * node, bool childrenOnly, UnsupportedHandling uh = ErrorOnUnsupported) const; + void collectAll(const xmlpp::Element * node, bool childrenOnly, UnsupportedHandling uh = ErrorOnUnsupported) const; static ElementLoaderMap & getMap(); template -- cgit v1.2.3