summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrandomdan <randomdan@localhost>2012-04-20 09:23:42 +0000
committerrandomdan <randomdan@localhost>2012-04-20 09:23:42 +0000
commitfc9107c0dd68f7b42dd99147a145c6c068fdad5a (patch)
treebee13b6ea8cbfeacf9a1a2353e8e54de6b0776e1
parentView to stream... and stream to file (diff)
downloadproject2-fc9107c0dd68f7b42dd99147a145c6c068fdad5a.tar.bz2
project2-fc9107c0dd68f7b42dd99147a145c6c068fdad5a.tar.xz
project2-fc9107c0dd68f7b42dd99147a145c6c068fdad5a.zip
Add support for simple mutations of XML output (node rearrangement)
-rw-r--r--project2/common/presenter.cpp5
-rw-r--r--project2/common/presenter.h1
-rw-r--r--project2/common/viewHost.cpp1
-rw-r--r--project2/xml/Jamfile.jam2
-rw-r--r--project2/xml/mutators/copy.cpp30
-rw-r--r--project2/xml/mutators/copyToAttr.cpp35
-rw-r--r--project2/xml/mutators/create.cpp22
-rw-r--r--project2/xml/mutators/delete.cpp22
-rw-r--r--project2/xml/mutators/rename.cpp25
-rw-r--r--project2/xml/xmlPresenter.cpp15
-rw-r--r--project2/xml/xmlPresenter.h12
11 files changed, 169 insertions, 1 deletions
diff --git a/project2/common/presenter.cpp b/project2/common/presenter.cpp
index b8fc545..becfb50 100644
--- a/project2/common/presenter.cpp
+++ b/project2/common/presenter.cpp
@@ -115,3 +115,8 @@ MultiRowSetPresenter::setNamespace(const Glib::ustring &, const Glib::ustring &)
{
}
+void
+MultiRowSetPresenter::finalizeContent() const
+{
+}
+
diff --git a/project2/common/presenter.h b/project2/common/presenter.h
index e1a78dd..ebcbe93 100644
--- a/project2/common/presenter.h
+++ b/project2/common/presenter.h
@@ -40,6 +40,7 @@ class MultiRowSetPresenter : public RowSetPresenter {
virtual void addNewArray(const Glib::ustring & name, bool objects) const = 0;
virtual void finishArray(bool objects) const = 0;
virtual void init() = 0;
+ virtual void finalizeContent() const;
};
class Presenter : public MultiRowSetPresenter {
diff --git a/project2/common/viewHost.cpp b/project2/common/viewHost.cpp
index cbae417..04e0d88 100644
--- a/project2/common/viewHost.cpp
+++ b/project2/common/viewHost.cpp
@@ -30,6 +30,7 @@ ViewHost::executeViews() const
BOOST_FOREACH(const CommonObjects::DataSources::value_type & ds, CommonObjects::datasources) {
ds.second->commit();
}
+ presenter->finalizeContent();
}
void
diff --git a/project2/xml/Jamfile.jam b/project2/xml/Jamfile.jam
index 1e8fcf7..2adadaf 100644
--- a/project2/xml/Jamfile.jam
+++ b/project2/xml/Jamfile.jam
@@ -14,7 +14,7 @@ cpp-pch pch : pch.hpp :
;
lib p2xml :
pch
- [ glob *.cpp ]
+ [ glob-tree *.cpp ]
:
<include>../libmisc
<library>libxmlpp
diff --git a/project2/xml/mutators/copy.cpp b/project2/xml/mutators/copy.cpp
new file mode 100644
index 0000000..d7170e6
--- /dev/null
+++ b/project2/xml/mutators/copy.cpp
@@ -0,0 +1,30 @@
+#include "../pch.hpp"
+#include "../xmlPresenter.h"
+
+class Copy : public XmlDocMutator {
+ public:
+ Copy(ScriptNodePtr s) :
+ XmlDocMutator(s),
+ from(s, "fromxpath"),
+ to(s, "toxpath"),
+ delAfter(s, "delete", false)
+ {
+ }
+ void mutateElement(xmlpp::Element * root) const
+ {
+ BOOST_FOREACH(xmlpp::Node * e, root->find(from())) {
+ BOOST_FOREACH(xmlpp::Node * t, e->find(to())) {
+ t->import_node(e);
+ if (delAfter()) {
+ e->get_parent()->remove_child(e);
+ }
+ }
+ }
+ }
+ Variable from;
+ Variable to;
+ Variable delAfter;
+};
+
+DECLARE_GENERIC_LOADER("copy", XmlDocMutatorLoader, Copy);
+
diff --git a/project2/xml/mutators/copyToAttr.cpp b/project2/xml/mutators/copyToAttr.cpp
new file mode 100644
index 0000000..c8b32d5
--- /dev/null
+++ b/project2/xml/mutators/copyToAttr.cpp
@@ -0,0 +1,35 @@
+#include "../pch.hpp"
+#include "../xmlPresenter.h"
+
+class CopyToAttr : public XmlDocMutator {
+ public:
+ CopyToAttr(ScriptNodePtr s) :
+ XmlDocMutator(s),
+ from(s, "fromxpath"),
+ to(s, "toxpath"),
+ delAfter(s, "delete", false)
+ {
+ }
+ void mutateElement(xmlpp::Element * root) const
+ {
+ BOOST_FOREACH(xmlpp::Node * e, root->find(from())) {
+ if (xmlpp::Element * ee = dynamic_cast<xmlpp::Element *>(e)) {
+ BOOST_FOREACH(xmlpp::Node * t, e->find(to())) {
+ if (xmlpp::Element * te = dynamic_cast<xmlpp::Element *>(t)) {
+ te->set_attribute(e->get_name(), ee->get_child_text()->get_content());
+ if (delAfter()) {
+ e->get_parent()->remove_child(e);
+ }
+ }
+ }
+ }
+ }
+ }
+ Variable from;
+ Variable to;
+ Variable delAfter;
+};
+
+DECLARE_GENERIC_LOADER("copytoattr", XmlDocMutatorLoader, CopyToAttr);
+
+
diff --git a/project2/xml/mutators/create.cpp b/project2/xml/mutators/create.cpp
new file mode 100644
index 0000000..812da24
--- /dev/null
+++ b/project2/xml/mutators/create.cpp
@@ -0,0 +1,22 @@
+#include "../pch.hpp"
+#include "../xmlPresenter.h"
+
+class Create : public XmlDocMutator {
+ public:
+ Create(ScriptNodePtr s) :
+ XmlDocMutator(s),
+ xpath(s, "xpath"),
+ name(s, "name")
+ {
+ }
+ void mutateElement(xmlpp::Element * root) const
+ {
+ BOOST_FOREACH(xmlpp::Node * e, root->find(xpath())) {
+ e->add_child(name());
+ }
+ }
+ Variable xpath;
+ Variable name;
+};
+
+DECLARE_GENERIC_LOADER("create", XmlDocMutatorLoader, Create);
diff --git a/project2/xml/mutators/delete.cpp b/project2/xml/mutators/delete.cpp
new file mode 100644
index 0000000..8cc3a94
--- /dev/null
+++ b/project2/xml/mutators/delete.cpp
@@ -0,0 +1,22 @@
+#include "../pch.hpp"
+#include "../xmlPresenter.h"
+
+class Delete : public XmlDocMutator {
+ public:
+ Delete(ScriptNodePtr s) :
+ XmlDocMutator(s),
+ xpath(s, "xpath")
+ {
+ }
+ void mutateElement(xmlpp::Element * root) const
+ {
+ BOOST_FOREACH(xmlpp::Node * e, root->find(xpath())) {
+ e->get_parent()->remove_child(e);
+ }
+ }
+ Variable xpath;
+};
+
+DECLARE_GENERIC_LOADER("delete", XmlDocMutatorLoader, Delete);
+
+
diff --git a/project2/xml/mutators/rename.cpp b/project2/xml/mutators/rename.cpp
new file mode 100644
index 0000000..ceb7627
--- /dev/null
+++ b/project2/xml/mutators/rename.cpp
@@ -0,0 +1,25 @@
+#include "../pch.hpp"
+#include "../xmlPresenter.h"
+
+class Rename : public XmlDocMutator {
+ public:
+ Rename(ScriptNodePtr s) :
+ XmlDocMutator(s),
+ xpath(s, "xpath"),
+ newname(s, "newname")
+ {
+ }
+ void mutateElement(xmlpp::Element * root) const
+ {
+ BOOST_FOREACH(xmlpp::Node * e, root->find(xpath())) {
+ e->set_name(newname());
+ }
+ }
+ Variable xpath;
+ Variable newname;
+};
+
+DECLARE_GENERIC_LOADER("rename", XmlDocMutatorLoader, Rename);
+
+
+
diff --git a/project2/xml/xmlPresenter.cpp b/project2/xml/xmlPresenter.cpp
index a6d6f40..1d77959 100644
--- a/project2/xml/xmlPresenter.cpp
+++ b/project2/xml/xmlPresenter.cpp
@@ -1,6 +1,7 @@
#include <pch.hpp>
#include "xmlPresenter.h"
#include "scriptLoader.h"
+#include "scriptStorage.h"
#include "variables.h"
#include "appEngine.h"
#include <libxml++/document.h>
@@ -77,6 +78,7 @@ XmlPresenter::XmlPresenter(ScriptNodePtr e) :
root(e, "root"),
style(e, "style", Null())
{
+ e->script->loader.addLoadTarget(e, Storer::into<XmlDocMutatorLoader>(&mutators));
}
XmlPresenter::~XmlPresenter()
@@ -235,3 +237,16 @@ void
XmlPresenter::writeTo(std::ostream & o, const std::string & enc) const {
responseDoc->write_to_stream_formatted(o, enc);
}
+
+void
+XmlPresenter::finalizeContent() const
+{
+ BOOST_FOREACH(const XmlDocMutatorPtr & m, mutators) {
+ m->mutateElement(responseDoc->get_root_node());
+ }
+}
+
+XmlDocMutator::XmlDocMutator(ScriptNodePtr)
+{
+}
+
diff --git a/project2/xml/xmlPresenter.h b/project2/xml/xmlPresenter.h
index dc88fa9..e2e0b84 100644
--- a/project2/xml/xmlPresenter.h
+++ b/project2/xml/xmlPresenter.h
@@ -10,6 +10,14 @@ namespace xmlpp {
class Element;
}
+class XmlDocMutator : public IntrusivePtrBase {
+ public:
+ XmlDocMutator(ScriptNodePtr);
+ virtual void mutateElement(xmlpp::Element *) const = 0;
+};
+typedef boost::intrusive_ptr<XmlDocMutator> XmlDocMutatorPtr;
+typedef GenLoader<XmlDocMutator, ScriptNodePtr> XmlDocMutatorLoader;
+
class XmlPresenter : public Presenter, public ContentPresenter, public SourceOf<xmlpp::Document>, public SourceOf<xmlDoc>, public SourceOf<boost::shared_ptr<xmlpp::Document> >, public WritableContent, public SourceOf<WritableContent> {
public:
typedef boost::shared_ptr<xmlpp::Document> XmlDocumentPtr;
@@ -33,6 +41,7 @@ class XmlPresenter : public Presenter, public ContentPresenter, public SourceOf<
Class getContentClass() const;
Glib::ustring getContentType() const;
void writeTo(std::ostream &, const std::string & enc) const;
+ void finalizeContent() const;
void init();
private:
@@ -41,6 +50,9 @@ class XmlPresenter : public Presenter, public ContentPresenter, public SourceOf<
mutable std::vector<xmlpp::Element *> nodeStack;
const Variable root;
const Variable style;
+
+ typedef ANONORDEREDSTORAGEOF(XmlDocMutator) Mutators;
+ Mutators mutators;
};
typedef boost::intrusive_ptr<XmlPresenter> XmlPresenterPtr;