diff options
author | randomdan <randomdan@localhost> | 2010-11-01 20:18:43 +0000 |
---|---|---|
committer | randomdan <randomdan@localhost> | 2010-11-01 20:18:43 +0000 |
commit | 4dce603e8400ef352ec84382b7e79ab4379115d8 (patch) | |
tree | 0e414072081bdca167231043f0fcbf5bd14b91ee | |
parent | Split up libs even more (diff) | |
download | project2-4dce603e8400ef352ec84382b7e79ab4379115d8.tar.bz2 project2-4dce603e8400ef352ec84382b7e79ab4379115d8.tar.xz project2-4dce603e8400ef352ec84382b7e79ab4379115d8.zip |
Improve XML usage correctness
-rw-r--r-- | project2/cgi/cgiAppEngine.cpp | 4 | ||||
-rw-r--r-- | project2/console/consoleAppEngine.cpp | 5 | ||||
-rw-r--r-- | project2/iHaveParameters.cpp | 11 | ||||
-rw-r--r-- | project2/iterate.cpp | 4 | ||||
-rw-r--r-- | project2/presenter.cpp | 6 | ||||
-rw-r--r-- | project2/sqlMergeTask.cpp | 4 | ||||
-rw-r--r-- | project2/view.cpp | 4 | ||||
-rw-r--r-- | project2/xmlObjectLoader.cpp | 46 | ||||
-rw-r--r-- | project2/xmlObjectLoader.h | 12 |
9 files changed, 62 insertions, 34 deletions
diff --git a/project2/cgi/cgiAppEngine.cpp b/project2/cgi/cgiAppEngine.cpp index e419ddf..94de818 100644 --- a/project2/cgi/cgiAppEngine.cpp +++ b/project2/cgi/cgiAppEngine.cpp @@ -147,11 +147,11 @@ CgiApplicationEngine::RequestStage::RequestStage(const CgiApplicationEngine * e, xmlpp::Element * requestRoot = request.get_document()->get_root_node(); present = requestRoot->get_attribute_value("present"); - LoaderBase loader; + LoaderBase loader("http://project2.randomdan.homeip.net", true); loader.supportedStorers.insert(Storer::into(&appEngine->datasources)); loader.supportedStorers.insert(Storer::into(¶meterChecks)); loader.supportedStorers.insert(Storer::into(&tasks)); - loader.collectAll("project2", requestRoot, true, true); + loader.collectAll(requestRoot, true); } CgiApplicationEngine::RequestStage::~RequestStage() { diff --git a/project2/console/consoleAppEngine.cpp b/project2/console/consoleAppEngine.cpp index d46d091..98d280d 100644 --- a/project2/console/consoleAppEngine.cpp +++ b/project2/console/consoleAppEngine.cpp @@ -55,13 +55,12 @@ ConsoleApplicationEngine::ConsoleApplicationEngine(const ConsoleEnvironment * en { xmlpp::DomParser request(f.string()); while (xmlXIncludeProcessFlags(request.get_document()->cobj(), XML_PARSE_NOXINCNODE) > 0); - xmlpp::Element * requestRoot = request.get_document()->get_root_node(); - LoaderBase loader; + LoaderBase loader("http://project2.randomdan.homeip.net", true); loader.supportedStorers.insert(Storer::into(&this->datasources)); loader.supportedStorers.insert(Storer::into(¶meterChecks)); loader.supportedStorers.insert(Storer::into(&tasks)); - loader.collectAll("project2", requestRoot, true, true); + loader.collectAll(request.get_document()->get_root_node(), true); } ConsoleApplicationEngine::~ConsoleApplicationEngine() diff --git a/project2/iHaveParameters.cpp b/project2/iHaveParameters.cpp index c4006b9..9ba917d 100644 --- a/project2/iHaveParameters.cpp +++ b/project2/iHaveParameters.cpp @@ -4,11 +4,12 @@ IHaveParameters::IHaveParameters(const xmlpp::Element * p) { - xmlpp::NodeSet ps = p->find("parameters"); - BOOST_FOREACH(xmlpp::Node * psi, ps) { - LoaderBase loader; - loader.supportedStorers.insert(Storer::into(¶meters)); - loader.collectAll("", dynamic_cast<const xmlpp::Element *>(psi), false, true); + BOOST_FOREACH(xmlpp::Node * node, p->find("parameters/param")) { + const xmlpp::Element * elem = dynamic_cast<const xmlpp::Element *>(node); + if (elem) { + Parameter p = new _Parameter(elem); + parameters[p->bind] = p; + } } } diff --git a/project2/iterate.cpp b/project2/iterate.cpp index d245536..d114acb 100644 --- a/project2/iterate.cpp +++ b/project2/iterate.cpp @@ -7,9 +7,9 @@ _Iterate::_Iterate(const xmlpp::Element * p) : _SourceObject(p), _NoOutputExecute(p) { - LoaderBase loader; + LoaderBase loader("http://project2.randomdan.homeip.net", true); loader.supportedStorers.insert(Storer::into(&subNOEs)); - loader.collectAll("project2", p, true, true); + loader.collectAll(p, true); } _Iterate::~_Iterate() diff --git a/project2/presenter.cpp b/project2/presenter.cpp index 3743e68..71ed45b 100644 --- a/project2/presenter.cpp +++ b/project2/presenter.cpp @@ -10,11 +10,11 @@ Presenter::Presenter(const std::string & group, const std::string & file) : { while (xmlXIncludeProcessFlags(present.get_document()->cobj(), XML_PARSE_NOXINCNODE) > 0); - LoaderBase loader; + LoaderBase loader("http://project2.randomdan.homeip.net", true); loader.supportedStorers.insert(Storer::into(&ApplicationEngine::getCurrent()->datasources)); loader.supportedStorers.insert(Storer::into(&views)); loader.supportedStorers.insert(Storer::into(¶meterChecks)); - loader.collectAll("project2", present.get_document()->get_root_node(), true, true); + loader.collectAll(present.get_document()->get_root_node(), true); } Presenter::~Presenter() @@ -31,7 +31,7 @@ Presenter::getDataDocument() const s.second->execute(responseRoot); } // These were for debug... but why not pass them on? - xmlNewNs(responseRoot->cobj(), BAD_CAST "http://project2.randomdan.homeip.net/", BAD_CAST "project2"); + xmlNewNs(responseRoot->cobj(), BAD_CAST "http://project2.randomdan.homeip.net", BAD_CAST "project2"); responseRoot->add_child("servername", "project2")->set_child_text(appEngine->env()->getServerName()); responseRoot->add_child("scriptname", "project2")->set_child_text(appEngine->env()->getScriptName()); return responseDoc; diff --git a/project2/sqlMergeTask.cpp b/project2/sqlMergeTask.cpp index f8177d5..318ab4f 100644 --- a/project2/sqlMergeTask.cpp +++ b/project2/sqlMergeTask.cpp @@ -26,9 +26,9 @@ _SqlMergeTask::_SqlMergeTask(const xmlpp::Element * p) : dtable(p->get_attribute_value("targettable")), dtablet(stringf("tmp_%s_%d", dtable.c_str(), getpid())) { - LoaderBase loader; + LoaderBase loader("http://project2.randomdan.homeip.net", true); loader.supportedStorers.insert(Storer::into(&sources)); - loader.collectAll("project2", p, true, true); + loader.collectAll(p, true); if (!sources.empty() && useView) { throw std::runtime_error("useview not supported with iterate fillers"); diff --git a/project2/view.cpp b/project2/view.cpp index 8ed5f65..44a162a 100644 --- a/project2/view.cpp +++ b/project2/view.cpp @@ -5,9 +5,9 @@ _View::_View(const xmlpp::Element * p) : _SourceObject(p), recordName(p->get_attribute_value("recordname")) { - LoaderBase loader; + LoaderBase loader("http://project2.randomdan.homeip.net", true); loader.supportedStorers.insert(Storer::into(&subViews)); - loader.collectAll("project2", p, true, true); + loader.collectAll(p, true); } _View::~_View() diff --git a/project2/xmlObjectLoader.cpp b/project2/xmlObjectLoader.cpp index 9b4b24b..e789275 100644 --- a/project2/xmlObjectLoader.cpp +++ b/project2/xmlObjectLoader.cpp @@ -12,16 +12,26 @@ LoaderBase::getMap() return loaders; } +LoaderBase::LoaderBase(const Glib::ustring & n, bool r) : + recursive(r), + ns(n) +{ +} + +LoaderBase::~LoaderBase() +{ +} + void -LoaderBase::collectAll(const Glib::ustring & ns, const xmlpp::Element * node, bool recursive, bool childrenOnly) const +LoaderBase::collectAll(const xmlpp::Element * node, bool childrenOnly) const { if (!node) { return; } depth += 1; - if (!childrenOnly && ns == node->get_namespace_prefix()) { + unsigned int created = 0; + if (!childrenOnly && node->get_namespace_uri() == ns) { Glib::ustring name = node->get_name(); - unsigned int created = 0; unsigned int stored = 0; for(ElementLoaderMap::const_iterator i = getMap().lower_bound(name); i != getMap().upper_bound(name); i++) { Project2SourceObject o = i->second->go(node); @@ -33,17 +43,13 @@ LoaderBase::collectAll(const Glib::ustring & ns, const xmlpp::Element * node, bo } } } - if (created < 1) { - fprintf(stderr, "Didn't create any objects for %s:%s\n", ns.c_str(), name.c_str()); - throw std::runtime_error("Unknown object"); - } - if (stored < 1) { - throw std::runtime_error("Unsupported object"); + if (stored < created) { + throw std::runtime_error("Unexpected object"); } } - else if (recursive || childrenOnly) { - BOOST_FOREACH(xmlpp::Node * child, node->get_children()) { - collectAll(ns, dynamic_cast<const xmlpp::Element *>(child), recursive, false); + if (created == 0 && (recursive || childrenOnly)) { + BOOST_FOREACH(const xmlpp::Node * child, node->get_children()) { + collectAll(dynamic_cast<const xmlpp::Element *>(child), false); } } depth -= 1; @@ -84,6 +90,22 @@ ElementLoader::onIdle() { } +Glib::ustring +xmlChildText(const xmlpp::Node * p, const Glib::ustring & t) +{ + Glib::ustring rtn; + BOOST_FOREACH(const xmlpp::Node * child, p->get_children(t)) { + const xmlpp::Element * e = dynamic_cast<const xmlpp::Element *>(child); + if (e) { + const xmlpp::ContentNode * cn = e->get_child_text(); + if (cn) { + rtn += cn->get_content(); + } + } + } + return rtn; +} + void ElementLoader::onIteration() { diff --git a/project2/xmlObjectLoader.h b/project2/xmlObjectLoader.h index 56cdfac..8b71561 100644 --- a/project2/xmlObjectLoader.h +++ b/project2/xmlObjectLoader.h @@ -12,7 +12,7 @@ #include "intrusivePtrBase.h" #include "sourceObject.h" -#define xmlChildText(p, t) dynamic_cast<const xmlpp::Element&>(*p->get_children(t).front()).get_child_text()->get_content() +Glib::ustring xmlChildText(const xmlpp::Node * p, const Glib::ustring & n); class ElementLoader; @@ -85,7 +85,9 @@ class LoaderBase { public: typedef std::map<std::string, ElementLoader *> ElementLoaderMap; - void collectAll(const Glib::ustring & ns, const xmlpp::Element * node, bool recursive, bool childrenOnly) const; + LoaderBase(const Glib::ustring & ns, bool recursive); + virtual ~LoaderBase(); + void collectAll(const xmlpp::Element * node, bool childrenOnly) const; static ElementLoaderMap & getMap(); template<class Y> @@ -101,6 +103,10 @@ class LoaderBase { private: static unsigned int depth; static std::set<Project2SourceObject> loadedObjects; + + const bool recursive; + public: + const Glib::ustring ns; }; class ElementLoader { @@ -128,7 +134,7 @@ class ElementLoaderImpl : ElementLoader { return new X(xml); } - const std::string xmlName; + const Glib::ustring xmlName; private: }; |