diff options
Diffstat (limited to '')
-rw-r--r-- | sca-cpp/trunk/modules/atom/atom.hpp | 85 |
1 files changed, 39 insertions, 46 deletions
diff --git a/sca-cpp/trunk/modules/atom/atom.hpp b/sca-cpp/trunk/modules/atom/atom.hpp index 5de3894214..2f6e688bcb 100644 --- a/sca-cpp/trunk/modules/atom/atom.hpp +++ b/sca-cpp/trunk/modules/atom/atom.hpp @@ -30,7 +30,7 @@ #include "list.hpp" #include "value.hpp" #include "monad.hpp" -#include "xml.hpp" +#include "../xml/xml.hpp" namespace tuscany { namespace atom { @@ -46,24 +46,24 @@ const value entry("entry"); */ const list<value> entryElementValues(const list<value>& e) { const list<value> lt = filter<value>(selector(mklist<value>(element, "title")), e); - const list<value> t = list<value>() + element + value("title") + (isNil(lt)? value(emptyString) : elementValue(car(lt))); + const list<value> t = nilListValue + element + value("title") + (isNil(lt)? value(emptyString) : elementValue(car(lt))); const list<value> li = filter<value>(selector(mklist<value>(element, "id")), e); - const list<value> i = list<value>() + element + value("id") + (isNil(li)? value(emptyString) : elementValue(car(li))); + const list<value> i = nilListValue + element + value("id") + (isNil(li)? value(emptyString) : elementValue(car(li))); const list<value> la = filter<value>(selector(mklist<value>(element, "author")), e); - const list<value> lan = isNil(la)? list<value>() : filter<value>(selector(mklist<value>(element, "name")), car(la)); - const list<value> lae = isNil(la)? list<value>() : filter<value>(selector(mklist<value>(element, "email")), car(la)); + const list<value> lan = isNil(la)? nilListValue : filter<value>(selector(mklist<value>(element, "name")), car(la)); + const list<value> lae = isNil(la)? nilListValue : filter<value>(selector(mklist<value>(element, "email")), car(la)); const list<value> laa = isNil(lan)? lae : lan; - const list<value> a = isNil(laa)? list<value>() : mklist<value>(list<value>() + element + value("author") + elementValue(car(laa))); + const list<value> a = isNil(laa)? nilListValue : mklist<value>(nilListValue + element + value("author") + elementValue(car(laa))); const list<value> lu = filter<value>(selector(mklist<value>(element, "updated")), e); - const list<value> u = isNil(lu)? list<value>() : mklist<value>(list<value>() + element + value("updated") + elementValue(car(lu))); + const list<value> u = isNil(lu)? nilListValue : mklist<value>(nilListValue + element + value("updated") + elementValue(car(lu))); const list<value> lc = filter<value>(selector(mklist<value>(element, "content")), e); - const list<value> c = isNil(lc)? list<value>() : mklist<value>(list<value>() + element + value("content") + elementValue(car(lc))); + const list<value> c = isNil(lc)? nilListValue : mklist<value>(nilListValue + element + value("content") + elementValue(car(lc))); - return append<value>(append<value>(append<value>(list<value>() + element + entry + value(t) + value(i), a), u), c); + return append<value>(append<value>(append<value>(nilListValue + element + entry + value(t) + value(i), a), u), c); } /** @@ -79,7 +79,7 @@ const list<value> entriesElementValues(const list<value>& e) { * Return true if a list of strings contains an ATOM feed. */ const bool isATOMFeed(const list<string>& ls) { - if (!isXML(ls)) + if (!xml::isXML(ls)) return false; return contains(car(ls), "<feed") && contains(car(ls), "=\"http://www.w3.org/2005/Atom\""); } @@ -88,7 +88,7 @@ const bool isATOMFeed(const list<string>& ls) { * Return true if a list of strings contains an ATOM entry. */ const bool isATOMEntry(const list<string>& ls) { - if (!isXML(ls)) + if (!xml::isXML(ls)) return false; return contains(car(ls), "<entry") && !contains(car(ls), "<feed") && contains(car(ls), "=\"http://www.w3.org/2005/Atom\""); } @@ -97,7 +97,7 @@ const bool isATOMEntry(const list<string>& ls) { * Convert a list of strings to a list of values representing an ATOM entry. */ const failable<list<value> > readATOMEntry(const list<string>& ilist) { - const list<value> e = readXML(ilist); + const list<value> e = content(xml::readElements(ilist)); if (isNil(e)) return mkfailure<list<value> >("Empty entry"); return mklist<value>(entryElementValues(car(e))); @@ -107,32 +107,25 @@ const failable<list<value> > readATOMEntry(const list<string>& ilist) { * Convert a list of strings to a list of values representing an ATOM feed. */ const failable<list<value> > readATOMFeed(const list<string>& ilist) { - const list<value> f = readXML(ilist); + const list<value> f = content(xml::readElements(ilist)); if (isNil(f)) return mkfailure<list<value> >("Empty feed"); const list<value> t = filter<value>(selector(mklist<value>(element, "title")), car(f)); const list<value> i = filter<value>(selector(mklist<value>(element, "id")), car(f)); const list<value> e = filter<value>(selector(mklist<value>(element, entry)), car(f)); - return mklist<value>(append<value>(list<value>() + element + feed - + value(list<value>() + element + value("title") + elementValue(car(t))) - + value(list<value>() + element + value("id") + elementValue(car(i))), + return mklist<value>(append<value>(nilListValue + element + feed + + value(nilListValue + element + value("title") + elementValue(car(t))) + + value(nilListValue + element + value("id") + elementValue(car(i))), entriesElementValues(e))); } /** * Returns children of an ATOM content element. */ -struct filterContentElementChildren { - const value type; - filterContentElementChildren() : type("type") { - } - const bool operator()(const value& v) const { - return !(isAttribute(v) && attributeName((list<value>)v) == type); - } -}; - const list<value> contentElementChildren(const value& content) { - return filter<value>(filterContentElementChildren(), elementChildren(content)); + return filter<value>([](const value& v) { + return !(isAttribute(v) && attributeName((list<value>)v) == "type"); + }, elementChildren(content)); } /** @@ -146,18 +139,18 @@ const list<value> entryElement(const list<value>& l) { const value updated = elementChild("updated", l); const value content = elementChild("content", l); const bool text = isNil(content)? false : elementHasValue(content); - return list<value>() - + element + entry + (list<value>() + attribute + "xmlns" + "http://www.w3.org/2005/Atom") - + (list<value>() + element + "title" + (list<value>() + attribute + "type" + "text") + elementValue(title)) - + (list<value>() + element + "id" + elementValue(id)) - + (isNil(author)? list<value>() : (list<value>() + element + "author" + - (email? (list<value>() + element + "email" + elementValue(author)) : (list<value>() + element + "name" + elementValue(author))))) - + (isNil(updated)? list<value>() : (list<value>() + element + "updated" + elementValue(updated))) + return nilListValue + + element + entry + (nilListValue + attribute + "xmlns" + "http://www.w3.org/2005/Atom") + + (nilListValue + element + "title" + (nilListValue + attribute + "type" + "text") + elementValue(title)) + + (nilListValue + element + "id" + elementValue(id)) + + (isNil(author)? nilListValue : (nilListValue + element + "author" + + (email? (nilListValue + element + "email" + elementValue(author)) : (nilListValue + element + "name" + elementValue(author))))) + + (isNil(updated)? nilListValue : (nilListValue + element + "updated" + elementValue(updated))) + (isNil(content)? - list<value>() : - append<value>(list<value>() + element + "content" + (list<value>() + attribute + "type" + (text? "text" : "application/xml")), + nilListValue : + append<value>(nilListValue + element + "content" + (nilListValue + attribute + "type" + (text? "text" : "application/xml")), text? mklist<value>(elementValue(content)) : contentElementChildren(content))) - + (list<value>() + element + "link" + (list<value>() + attribute + "href" + elementValue(id))); + + (nilListValue + element + "link" + (nilListValue + attribute + "href" + elementValue(id))); } /** @@ -172,9 +165,9 @@ const list<value> entriesElements(const list<value>& l) { /** * Convert a list of element values representing an ATOM entry to an ATOM entry. */ -template<typename R> const failable<R> writeATOMEntry(const lambda<R(const string&, const R)>& reduce, const R& initial, const list<value>& ll) { +template<typename R> const failable<R> writeATOMEntry(const lambda<const R(const string&, const R)>& reduce, const R& initial, const list<value>& ll) { const list<value> l = isNil(ll)? ll : (list<value>)car(ll); - return writeXML<R>(reduce, initial, mklist<value>(entryElement(l))); + return xml::writeElements<R>(reduce, initial, mklist<value>(entryElement(l))); } const failable<list<string> > writeATOMEntry(const list<value>& l) { @@ -187,31 +180,31 @@ const failable<list<string> > writeATOMEntry(const list<value>& l) { /** * Convert a list of element values representing an ATOM feed to an ATOM feed. */ -template<typename R> const failable<R> writeATOMFeed(const lambda<R(const string&, const R)>& reduce, const R& initial, const list<value>& ll) { +template<typename R> const failable<R> writeATOMFeed(const lambda<const R(const string&, const R)>& reduce, const R& initial, const list<value>& ll) { const list<value> l = isNil(ll)? ll : (list<value>)car(ll); const list<value> lt = filter<value>(selector(mklist<value>(element, "title")), l); const value t = isNil(lt)? value(emptyString) : elementValue(car(lt)); const list<value> li = filter<value>(selector(mklist<value>(element, "id")), l); const value i = isNil(li)? value(emptyString) : elementValue(car(li)); - const list<value> f = list<value>() - + element + feed + (list<value>() + attribute + "xmlns" + "http://www.w3.org/2005/Atom") - + (list<value>() + element + "title" + (list<value>() + attribute + "type" + "text") + t) - + (list<value>() + element + "id" + i); + const list<value> f = nilListValue + + element + feed + (nilListValue + attribute + "xmlns" + "http://www.w3.org/2005/Atom") + + (nilListValue + element + "title" + (nilListValue + attribute + "type" + "text") + t) + + (nilListValue + element + "id" + i); // Write ATOM entries const list<value> le = filter<value>(selector(mklist<value>(element, entry)), l); if (isNil(le)) - return writeXML<R>(reduce, initial, mklist<value>(f)); + return xml::writeElements<R>(reduce, initial, mklist<value>(f)); // Write a single ATOM entry element with a list of values if (!isNil(le) && !isNil(car(le)) && isList(car<value>(caddr<value>(car(le))))) { const list<value> fe = append(f, entriesElements(caddr<value>(car(le)))); - return writeXML<R>(reduce, initial, mklist<value>(fe)); + return xml::writeElements<R>(reduce, initial, mklist<value>(fe)); } // Write separate ATOM entry elements const list<value> fe = append(f, entriesElements(le)); - return writeXML<R>(reduce, initial, mklist<value>(fe)); + return xml::writeElements<R>(reduce, initial, mklist<value>(fe)); } /** |