diff options
author | randomdan <randomdan@localhost> | 2011-11-29 13:22:48 +0000 |
---|---|---|
committer | randomdan <randomdan@localhost> | 2011-11-29 13:22:48 +0000 |
commit | bc09819f292fcb9ba051bc06c9683ba75fe9494f (patch) | |
tree | 3a1c5ed7fbe6fd838ddae64e2575e9f08c22bf1f | |
parent | Serialize JSON objects to a stream, removes need to temp string in transform (diff) | |
download | project2-bc09819f292fcb9ba051bc06c9683ba75fe9494f.tar.bz2 project2-bc09819f292fcb9ba051bc06c9683ba75fe9494f.tar.xz project2-bc09819f292fcb9ba051bc06c9683ba75fe9494f.zip |
Allow specifying different loader classes when setting up script parsers (allows defining presenter modules from within a script)
-rw-r--r-- | project2/common/checkHost.cpp | 2 | ||||
-rw-r--r-- | project2/common/commonObjects.cpp | 2 | ||||
-rw-r--r-- | project2/common/if.cpp | 6 | ||||
-rw-r--r-- | project2/common/iterate.cpp | 2 | ||||
-rw-r--r-- | project2/common/rowProcessor.cpp | 2 | ||||
-rw-r--r-- | project2/common/rowView.cpp | 2 | ||||
-rw-r--r-- | project2/common/structExceptHandling.cpp | 2 | ||||
-rw-r--r-- | project2/common/taskHost.cpp | 2 | ||||
-rw-r--r-- | project2/common/variables-modlookup.cpp | 2 | ||||
-rw-r--r-- | project2/common/viewHost.cpp | 4 | ||||
-rw-r--r-- | project2/common/xmlObjectLoader.cpp | 12 | ||||
-rw-r--r-- | project2/common/xmlObjectLoader.h | 4 | ||||
-rw-r--r-- | project2/common/xmlScriptParser.cpp | 2 | ||||
-rw-r--r-- | project2/common/xmlStorage.h | 68 | ||||
-rw-r--r-- | project2/sql/sqlMergeTask.cpp | 2 | ||||
-rw-r--r-- | project2/sql/sqlTask.cpp | 2 |
16 files changed, 62 insertions, 54 deletions
diff --git a/project2/common/checkHost.cpp b/project2/common/checkHost.cpp index 7f908c0..343b255 100644 --- a/project2/common/checkHost.cpp +++ b/project2/common/checkHost.cpp @@ -6,7 +6,7 @@ CheckHost::CheckHost(const boost::filesystem::path & file) : XmlScriptParser(file, false) { - loader.supportedStorers.insert(Storer::into(¶meterChecks)); + loader.supportedStorers.insert(Storer::into<ElementLoader>(¶meterChecks)); } CheckHost::~CheckHost() diff --git a/project2/common/commonObjects.cpp b/project2/common/commonObjects.cpp index 8ad1a97..4ce8c82 100644 --- a/project2/common/commonObjects.cpp +++ b/project2/common/commonObjects.cpp @@ -22,7 +22,7 @@ CommonObjects::loadDataSource(const std::string & name) const Environment::getCurrent()->datasourceRoot, name), true); LoaderBase loader(true); - loader.supportedStorers.insert(Storer::into(&datasources)); + loader.supportedStorers.insert(Storer::into<ElementLoader>(&datasources)); loader.collectAll(xml.get_document()->get_root_node(), false); return safeMapFind<DataSourceNotFound>(datasources, name); diff --git a/project2/common/if.cpp b/project2/common/if.cpp index f3c7102..a810146 100644 --- a/project2/common/if.cpp +++ b/project2/common/if.cpp @@ -14,7 +14,7 @@ IfSet::IfSet(const xmlpp::Element * e) : mode(e->get_attribute_value("mode") == "or" ? Or : And) { LoaderBase loader(true); - loader.supportedStorers.insert(Storer::into(&checks)); + loader.supportedStorers.insert(Storer::into<ElementLoader>(&checks)); loader.collectAll(e, true, IgnoreUnsupported); } @@ -48,8 +48,8 @@ If::If(const xmlpp::Element * e) : IfSet(e) { LoaderBase loader(true); - loader.supportedStorers.insert(Storer::into(&normal)); - loader.supportedStorers.insert(Storer::into(&subViews)); + loader.supportedStorers.insert(Storer::into<ElementLoader>(&normal)); + loader.supportedStorers.insert(Storer::into<ElementLoader>(&subViews)); loader.collectAll(e, true, IgnoreUnsupported); } diff --git a/project2/common/iterate.cpp b/project2/common/iterate.cpp index ddde42c..ba8a4b9 100644 --- a/project2/common/iterate.cpp +++ b/project2/common/iterate.cpp @@ -14,7 +14,7 @@ Iterate::Iterate(const xmlpp::Element * p) : RowProcessor(p) { LoaderBase loader(true); - loader.supportedStorers.insert(Storer::into(&normal)); + loader.supportedStorers.insert(Storer::into<ElementLoader>(&normal)); loader.collectAll(p, true, IgnoreUnsupported); } diff --git a/project2/common/rowProcessor.cpp b/project2/common/rowProcessor.cpp index b2d3cbd..e186c43 100644 --- a/project2/common/rowProcessor.cpp +++ b/project2/common/rowProcessor.cpp @@ -13,7 +13,7 @@ RowProcessor::RowProcessor(const xmlpp::Element * p) : IRSE(Variable(p, "ignoreRowSourceError", false, false)()) { LoaderBase loader(true); - loader.supportedStorers.insert(Storer::into(&caches)); + loader.supportedStorers.insert(Storer::into<ElementLoader>(&caches)); loader.collectAll(p, true, IgnoreUnsupported); } diff --git a/project2/common/rowView.cpp b/project2/common/rowView.cpp index a35619d..6b0bbed 100644 --- a/project2/common/rowView.cpp +++ b/project2/common/rowView.cpp @@ -23,7 +23,7 @@ RowView::RowView(const xmlpp::Element * p) : } } LoaderBase loader(true); - loader.supportedStorers.insert(Storer::into(&subViews)); + loader.supportedStorers.insert(Storer::into<ElementLoader>(&subViews)); loader.collectAll(p, true, IgnoreUnsupported); } diff --git a/project2/common/structExceptHandling.cpp b/project2/common/structExceptHandling.cpp index 5b5f1f5..0f176c9 100644 --- a/project2/common/structExceptHandling.cpp +++ b/project2/common/structExceptHandling.cpp @@ -10,7 +10,7 @@ static void loadHelper(const char * name, const xmlpp::Element * root, ANONORDEREDSTORAGEOF(NoOutputExecute) * noes) { LoaderBase loader(true); - loader.supportedStorers.insert(Storer::into(noes)); + loader.supportedStorers.insert(Storer::into<ElementLoader>(noes)); BOOST_FOREACH(const xmlpp::Node * node, root->find(name)) { const xmlpp::Element * elem = dynamic_cast<const xmlpp::Element *>(node); if (elem) { diff --git a/project2/common/taskHost.cpp b/project2/common/taskHost.cpp index cecc883..98a1fa5 100644 --- a/project2/common/taskHost.cpp +++ b/project2/common/taskHost.cpp @@ -11,7 +11,7 @@ TaskHost::TaskHost(const boost::filesystem::path & file) : CheckHost(file), IHaveSubTasks(get_document()->get_root_node()) { - loader.supportedStorers.insert(Storer::into(&tasks)); + loader.supportedStorers.insert(Storer::into<ElementLoader>(&tasks)); } TaskHost::~TaskHost() diff --git a/project2/common/variables-modlookup.cpp b/project2/common/variables-modlookup.cpp index 408c98b..82c3539 100644 --- a/project2/common/variables-modlookup.cpp +++ b/project2/common/variables-modlookup.cpp @@ -36,7 +36,7 @@ class VariableLookup : public VariableImplDyn, public RowProcessor { name(e->get_attribute_value("name")) { LoaderBase loader(true); - loader.supportedStorers.insert(Storer::into(&rowSets)); + loader.supportedStorers.insert(Storer::into<ElementLoader>(&rowSets)); loader.collectAll(e, false); } VariableType value() const diff --git a/project2/common/viewHost.cpp b/project2/common/viewHost.cpp index 01cf966..9d3c14b 100644 --- a/project2/common/viewHost.cpp +++ b/project2/common/viewHost.cpp @@ -10,8 +10,8 @@ ViewHost::ViewHost(const boost::filesystem::path & file) : XmlScriptParser(file, false), CheckHost(file) { - loader.supportedStorers.insert(Storer::into(&views)); - loader.supportedStorers.insert(Storer::into(&presenter)); + loader.supportedStorers.insert(Storer::into<ElementLoader>(&views)); + loader.supportedStorers.insert(Storer::into<PresenterLoader>(&presenter)); } ViewHost::~ViewHost() diff --git a/project2/common/xmlObjectLoader.cpp b/project2/common/xmlObjectLoader.cpp index 6859f22..0e55cb4 100644 --- a/project2/common/xmlObjectLoader.cpp +++ b/project2/common/xmlObjectLoader.cpp @@ -30,14 +30,14 @@ LoaderBase::LoaderBase(bool r) : recursive(r), ns(Environment::getCurrent()->xmlNamespace) { - supportedStorers.insert(Storer::into(&libraries)); + supportedStorers.insert(Storer::into<ElementLoader>(&libraries)); } LoaderBase::LoaderBase(const Glib::ustring & n, bool r) : recursive(r), ns(n) { - supportedStorers.insert(Storer::into(&libraries)); + supportedStorers.insert(Storer::into<ElementLoader>(&libraries)); } LoaderBase::~LoaderBase() @@ -65,11 +65,13 @@ LoaderBase::collectAll(const xmlpp::Element * node, bool childrenOnly, Unsupport if (!childrenOnly && node->get_namespace_uri() == ns) { Glib::ustring name = node->get_name(); unsigned int stored = 0; - SourceObjectPtr o = getLoader<ElementLoader, NotSupported>(name)->go(node); created += 1; - loadedObjects.insert(o); BOOST_FOREACH(std::set<boost::intrusive_ptr<Storer> >::value_type s, supportedStorers) { - if (s->save(o, node)) { + boost::intrusive_ptr<IntrusivePtrBase> o = s->save(node); + if (boost::intrusive_ptr<SourceObject> t = boost::dynamic_pointer_cast<SourceObject>(o)) { + loadedObjects.insert(t); + } + if (o) { stored += 1; } } diff --git a/project2/common/xmlObjectLoader.h b/project2/common/xmlObjectLoader.h index 4795717..202dbeb 100644 --- a/project2/common/xmlObjectLoader.h +++ b/project2/common/xmlObjectLoader.h @@ -120,14 +120,14 @@ class ComponentLoader { /// Helper for loading and maintaining Project2 script components class ElementLoader : public ComponentLoader { public: - virtual SourceObjectPtr go(const xmlpp::Element * xml) const = 0; + virtual SourceObjectPtr createFrom(const xmlpp::Element * xml) const = 0; }; /// Helper for loading and maintaining Project2 script components (typed implementation) template <class X> class ElementLoaderImpl : public ElementLoader { public: - SourceObjectPtr go(const xmlpp::Element * xml) const + SourceObjectPtr createFrom(const xmlpp::Element * xml) const { return new X(xml); } diff --git a/project2/common/xmlScriptParser.cpp b/project2/common/xmlScriptParser.cpp index 762618a..1db1841 100644 --- a/project2/common/xmlScriptParser.cpp +++ b/project2/common/xmlScriptParser.cpp @@ -33,7 +33,7 @@ XmlScriptParser::loadDocument(const boost::filesystem::path & file) throw IncludesError(file.string()); } } - loader.supportedStorers.insert(Storer::into(&rowSets)); + loader.supportedStorers.insert(Storer::into<ElementLoader>(&rowSets)); } void diff --git a/project2/common/xmlStorage.h b/project2/common/xmlStorage.h index a700c64..ceae899 100644 --- a/project2/common/xmlStorage.h +++ b/project2/common/xmlStorage.h @@ -2,6 +2,7 @@ #define XMLSTORAGE_H #include "sourceObject.h" +#include "xmlObjectLoader.h" #include "exceptions.h" #include <set> #include <list> @@ -23,43 +24,48 @@ class Storer; typedef boost::intrusive_ptr<Storer> StorerPtr; class Storer : public virtual IntrusivePtrBase { public: - template <class X> + template <class L, class X> static StorerPtr into(SINGLE(X) * obj); - template <class X> + template <class L, class X> static StorerPtr into(STORAGEOF(X) * map); - template <class X> + template <class L, class X> static StorerPtr into(ANONSTORAGEOF(X) * set); - template <class X> + template <class L, class X> static StorerPtr into(ANONORDEREDSTORAGEOF(X) * list); - virtual bool save(SourceObjectPtr o, const xmlpp::Element *) = 0; + virtual boost::intrusive_ptr<IntrusivePtrBase> save(const xmlpp::Element *) = 0; }; -template <class X, class M = STORAGEOF(X)> +template <class X, class M, class L> class StorerBase : public Storer { public: typedef M * Map; - bool save(SourceObjectPtr obj, const xmlpp::Element * p) { - boost::intrusive_ptr<X> O = boost::dynamic_pointer_cast<X>(obj); - if (O) { - if (insert(p, O)) { - return true; + boost::intrusive_ptr<IntrusivePtrBase> save(const xmlpp::Element * p) { + try { + boost::intrusive_ptr<X> O = boost::dynamic_pointer_cast<X>( + LoaderBase::getLoader<L, NotSupported>(p->get_name())->createFrom(p)); + if (O) { + if (!insert(p, O)) { + throw StoreFailed(p->get_attribute_value("name")); + } } - throw StoreFailed(obj->name); + return O; + } + catch (NotSupported) { + return NULL; } - return false; } virtual bool insert(const xmlpp::Element *, boost::intrusive_ptr<X>) = 0; }; -template <class X, class M = STORAGEOF(X)> -class StorerImpl : public StorerBase<X, M> { +template <class X, class M, class L> +class StorerImpl : public StorerBase<X, M, L> { public: StorerImpl(M * m); bool insert(const xmlpp::Element *, boost::intrusive_ptr<X> O); }; -template <class X> -class StorerImpl<X, SINGLE(X)> : public StorerBase<X, SINGLE(X)> { +template <class X, class L> +class StorerImpl<X, SINGLE(X), L> : public StorerBase<X, SINGLE(X), L> { public: typedef SINGLE(X) Obj; StorerImpl(SINGLE(X) * o) : obj(o) @@ -72,8 +78,8 @@ class StorerImpl<X, SINGLE(X)> : public StorerBase<X, SINGLE(X)> { } Obj * obj; }; -template <class X> -class StorerImpl<X, STORAGEOF(X)> : public StorerBase<X, STORAGEOF(X)> { +template <class X, class L> +class StorerImpl<X, STORAGEOF(X), L> : public StorerBase<X, STORAGEOF(X), L> { public: typedef STORAGEOF(X) Map; StorerImpl(STORAGEOF(X) * m) : map(m) @@ -85,8 +91,8 @@ class StorerImpl<X, STORAGEOF(X)> : public StorerBase<X, STORAGEOF(X)> { } Map * map; }; -template <class X> -class StorerImpl<X, ANONSTORAGEOF(X)> : public StorerBase<X, ANONSTORAGEOF(X)> { +template <class X, class L> +class StorerImpl<X, ANONSTORAGEOF(X), L> : public StorerBase<X, ANONSTORAGEOF(X), L> { public: typedef ANONSTORAGEOF(X) Map; StorerImpl(ANONSTORAGEOF(X) * m) : map(m) @@ -99,8 +105,8 @@ class StorerImpl<X, ANONSTORAGEOF(X)> : public StorerBase<X, ANONSTORAGEOF(X)> { } Map * map; }; -template <class X> -class StorerImpl<X, ANONORDEREDSTORAGEOF(X)> : public StorerBase<X, ANONORDEREDSTORAGEOF(X)> { +template <class X, class L> +class StorerImpl<X, ANONORDEREDSTORAGEOF(X), L> : public StorerBase<X, ANONORDEREDSTORAGEOF(X), L> { public: typedef ANONORDEREDSTORAGEOF(X) Map; StorerImpl(ANONORDEREDSTORAGEOF(X) * m) : map(m) @@ -114,28 +120,28 @@ class StorerImpl<X, ANONORDEREDSTORAGEOF(X)> : public StorerBase<X, ANONORDEREDS Map * map; }; -template <class X> +template <class L, class X> StorerPtr Storer::into(SINGLE(X) * obj) { - return new StorerImpl<X, SINGLE(X)>(obj); + return new StorerImpl<X, SINGLE(X), L>(obj); } -template <class X> +template <class L, class X> StorerPtr Storer::into(STORAGEOF(X) * map) { - return new StorerImpl<X, STORAGEOF(X)>(map); + return new StorerImpl<X, STORAGEOF(X), L>(map); } -template <class X> +template <class L, class X> StorerPtr Storer::into(ANONSTORAGEOF(X) * set) { - return new StorerImpl<X, ANONSTORAGEOF(X)>(set); + return new StorerImpl<X, ANONSTORAGEOF(X), L>(set); } -template <class X> +template <class L, class X> StorerPtr Storer::into(ANONORDEREDSTORAGEOF(X) * list) { - return new StorerImpl<X, ANONORDEREDSTORAGEOF(X)>(list); + return new StorerImpl<X, ANONORDEREDSTORAGEOF(X), L>(list); } #endif diff --git a/project2/sql/sqlMergeTask.cpp b/project2/sql/sqlMergeTask.cpp index f98d57e..96a895a 100644 --- a/project2/sql/sqlMergeTask.cpp +++ b/project2/sql/sqlMergeTask.cpp @@ -58,7 +58,7 @@ SqlMergeTask::SqlMergeTask(const xmlpp::Element * p) : dtablet(stringf("tmp_%s_%d", dtable.c_str(), getpid())) { LoaderBase loader(true); - loader.supportedStorers.insert(Storer::into(&sources)); + loader.supportedStorers.insert(Storer::into<ElementLoader>(&sources)); loader.collectAll(p, true); if (!sources.empty() && useView()) { diff --git a/project2/sql/sqlTask.cpp b/project2/sql/sqlTask.cpp index 63f73a9..9f881de 100644 --- a/project2/sql/sqlTask.cpp +++ b/project2/sql/sqlTask.cpp @@ -10,7 +10,7 @@ DECLARE_LOADER("sqltask", SqlTask); StaticMessageException(RunOnNotSpecified, "runon attribute must be specified"); -class SqlIfChangesStorer : public StorerBase<NoOutputExecute, ANONORDEREDSTORAGEOF(NoOutputExecute)> { +class SqlIfChangesStorer : public StorerBase<NoOutputExecute, ANONORDEREDSTORAGEOF(NoOutputExecute), ElementLoader> { public: SqlIfChangesStorer(Map c, Map nc) : changes(c), |