summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/modules/rss
diff options
context:
space:
mode:
authorjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2011-03-08 08:18:07 +0000
committerjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2011-03-08 08:18:07 +0000
commit49b878b1b0f2e52bbd5282c22ac32a68e1e8736c (patch)
tree1eb26926f9d703c61b329a0f07178090b57cd55d /sca-cpp/trunk/modules/rss
parent5b33dc5c5a87fff146951ca0543bf558454c331d (diff)
Change ATOM and RSS feed representations to use name value pairs instead of just strings, to allow support for all ATOM and RSS attributes and avoid confusion with non-feed string results.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1079292 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-cpp/trunk/modules/rss')
-rw-r--r--sca-cpp/trunk/modules/rss/rss-test.cpp63
-rw-r--r--sca-cpp/trunk/modules/rss/rss.hpp127
2 files changed, 103 insertions, 87 deletions
diff --git a/sca-cpp/trunk/modules/rss/rss-test.cpp b/sca-cpp/trunk/modules/rss/rss-test.cpp
index c2c3eb9e8f..b30792bfe1 100644
--- a/sca-cpp/trunk/modules/rss/rss-test.cpp
+++ b/sca-cpp/trunk/modules/rss/rss-test.cpp
@@ -88,19 +88,27 @@ bool testEntry() {
const list<value> i = list<value>() + element + value("item")
+ value(list<value>() + element + value("name") + value(string("Apple")))
+ value(list<value>() + element + value("price") + value(string("$2.99")));
- const list<value> a = mklist<value>(string("fruit"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i);
+ const list<value> a = list<value>() + (list<value>() + element + value("entry")
+ + value(list<value>() + element + value("title") + value(string("fruit")))
+ + value(list<value>() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")))
+ + value(list<value>() + element + value("content") + value(i)));
ostringstream os;
writeRSSEntry<ostream*>(writer, &os, a);
assert(str(os) == itemEntry);
}
{
- const list<value> a = mklist<value>(string("fruit"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), "Apple");
+ const list<value> a = list<value>() + (list<value>() + element + value("entry")
+ + value(list<value>() + element + value("title") + value(string("fruit")))
+ + value(list<value>() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")))
+ + value(list<value>() + element + value("content") + value(string("Apple"))));
ostringstream os;
writeRSSEntry<ostream*>(writer, &os, a);
assert(str(os) == itemTextEntry);
}
{
- const list<value> a = mklist<value>(string("fruit"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), list<value>());
+ const list<value> a = list<value>() + (list<value>() + element + value("entry")
+ + value(list<value>() + element + value("title") + value(string("fruit")))
+ + value(list<value>() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))));
ostringstream os;
writeRSSEntry<ostream*>(writer, &os, a);
assert(str(os) == itemNoDescriptionEntry);
@@ -172,8 +180,11 @@ const string itemFeed("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
bool testFeed() {
{
+ const list<value> a = list<value>() + (list<value>() + element + value("feed")
+ + value(list<value>() + element + value("title") + value(string("Feed")))
+ + value(list<value>() + element + value("id") + value(string("1234"))));
ostringstream os;
- writeRSSFeed<ostream*>(writer, &os, mklist<value>("Feed", "1234"));
+ writeRSSFeed<ostream*>(writer, &os, a);
assert(str(os) == emptyFeed);
}
{
@@ -183,39 +194,43 @@ bool testFeed() {
assert(str(os) == emptyFeed);
}
{
- const list<value> i = list<value>()
- + (list<value>() + "fruit" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"
- + (list<value>() + element + "item"
+ const list<value> i1 = list<value>() + element + "item"
+ (list<value>() + element + "name" + "Apple")
- + (list<value>() + element + "price" + "$2.99")))
- + (list<value>() + "fruit" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c"
- + (list<value>() + element + "item"
+ + (list<value>() + element + "price" + "$2.99");
+
+ const list<value> i2 = list<value>() + element + "item"
+ (list<value>() + element + "name" + "Orange")
- + (list<value>() + element + "price" + "$3.55")));
- const list<value> a = cons<value>("Feed", cons<value>("1234", i));
+ + (list<value>() + element + "price" + "$3.55");
+
+ const list<value> i = list<value>()
+ + value(list<value>() + element + value("entry")
+ + value(list<value>() + element + value("title") + value(string("fruit")))
+ + value(list<value>() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")))
+ + value(list<value>() + element + value("content") + value(i1)))
+ + value(list<value>() + element + value("entry")
+ + value(list<value>() + element + value("title") + value(string("fruit")))
+ + value(list<value>() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c")))
+ + value(list<value>() + element + value("content") + value(i2)));
+
+ const list<value> a = list<value>() + (append<value>(list<value>() + element + value("feed")
+ + value(list<value>() + element + value("title") + value(string("Feed")))
+ + value(list<value>() + element + value("id") + value("1234")),
+ i));
+
ostringstream os;
writeRSSFeed<ostream*>(writer, &os, a);
assert(str(os) == itemFeed);
}
{
- const list<value> i = list<value>()
- + (list<value>() + "fruit" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"
- + valueToElement(list<value>() + "item"
- + (list<value>() + "name" + "Apple")
- + (list<value>() + "price" + "$2.99")))
- + (list<value>() + "fruit" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c"
- + valueToElement(list<value>() + "item"
- + (list<value>() + "name" + "Orange")
- + (list<value>() + "price" + "$3.55")));
- const list<value> a = cons<value>("Feed", cons<value>("1234", i));
+ const list<value> a = content(readRSSFeed(mklist(itemFeed)));
ostringstream os;
writeRSSFeed<ostream*>(writer, &os, a);
assert(str(os) == itemFeed);
}
{
- const list<value> a = content(readRSSFeed(mklist(itemFeed)));
+ const list<value> a = elementsToValues(content(readRSSFeed(mklist(itemFeed))));
ostringstream os;
- writeRSSFeed<ostream*>(writer, &os, a);
+ writeRSSFeed<ostream*>(writer, &os, valuesToElements(a));
assert(str(os) == itemFeed);
}
return true;
diff --git a/sca-cpp/trunk/modules/rss/rss.hpp b/sca-cpp/trunk/modules/rss/rss.hpp
index 646a8fd030..c62d137adc 100644
--- a/sca-cpp/trunk/modules/rss/rss.hpp
+++ b/sca-cpp/trunk/modules/rss/rss.hpp
@@ -36,24 +36,33 @@ namespace tuscany {
namespace rss {
/**
- * Convert a list of elements to a list of values representing an RSS entry.
+ * Tags used to tag feed and entry elements.
*/
-const list<value> entryElementsToValues(const list<value>& e) {
+const value feed("feed");
+const value entry("entry");
+
+/**
+ * Convert a list of elements to a list of element values representing an RSS entry.
+ */
+const list<value> entryElementValues(const list<value>& e) {
const list<value> lt = filter<value>(selector(mklist<value>(element, "title")), e);
const value t = isNil(lt)? value(emptyString) : elementValue(car(lt));
const list<value> li = filter<value>(selector(mklist<value>(element, "link")), e);
const value i = isNil(li)? value(emptyString) : elementValue(car(li));
const list<value> ld = filter<value>(selector(mklist<value>(element, "description")), e);
- return mklist<value>(t, i, isNil(ld)? (value)list<value>() : elementValue(car(ld)));
+ return append<value>(list<value>() + element + entry
+ + value(list<value>() + element + value("title") + t)
+ + value(list<value>() + element + value("id") + i),
+ isNil(ld)? list<value>() : mklist<value>(value(list<value>() + element + value("content") + elementValue(car(ld)))));
}
/**
- * Convert a list of elements to a list of values representing RSS entries.
+ * Convert a list of elements to a list of element values representing ATOM entries.
*/
-const list<value> entriesElementsToValues(const list<value>& e) {
+const list<value> entriesElementValues(const list<value>& e) {
if (isNil(e))
return e;
- return cons<value>(entryElementsToValues(car(e)), entriesElementsToValues(cdr(e)));
+ return cons<value>(entryElementValues(car(e)), entriesElementValues(cdr(e)));
}
/**
@@ -72,15 +81,7 @@ const failable<list<value> > readRSSEntry(const list<string>& ilist) {
const list<value> e = readXML(ilist);
if (isNil(e))
return mkfailure<list<value> >("Empty entry");
- return entryElementsToValues(car(e));
-}
-
-/**
- * Convert a list of values representing an RSS entry to a value.
- */
-const value entryValue(const list<value>& e) {
- const list<value> v = elementsToValues(mklist<value>(caddr(e)));
- return cons(car(e), mklist<value>(cadr(e), isList(car(v))? (isNil((list<value>)car(v))? car(v) : (value)cdr<value>(car(v))) : car(v)));
+ return mklist<value>(entryElementValues(car(e)));
}
/**
@@ -94,34 +95,28 @@ const failable<list<value> > readRSSFeed(const list<string>& ilist) {
const list<value> t = filter<value>(selector(mklist<value>(element, "title")), car(c));
const list<value> i = filter<value>(selector(mklist<value>(element, "link")), car(c));
const list<value> e = filter<value>(selector(mklist<value>(element, "item")), car(c));
- if (isNil(e))
- return mklist<value>(elementValue(car(t)), elementValue(car(i)));
- return cons<value>(elementValue(car(t)), cons(elementValue(car(i)), entriesElementsToValues(e)));
-}
-
-/**
- * Convert an RSS feed containing elements to an RSS feed containing values.
- */
-const list<value> feedValuesLoop(const list<value> e) {
- if (isNil(e))
- return e;
- return cons<value>(entryValue(car(e)), feedValuesLoop(cdr(e)));
-}
-
-const list<value> feedValues(const list<value>& e) {
- return cons(car<value>(e), cons<value>(cadr<value>(e), feedValuesLoop(cddr<value>(e))));
+ 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))),
+ entriesElementValues(e)));
}
/**
- * Convert a list of values representing an RSS entry to a list of elements.
- * The first two values in the list are the entry title and id.
+ * Convert a list of element values representing an RSS entry to a list of elements.
*/
const list<value> entryElement(const list<value>& l) {
- return list<value>()
+ const value title = elementValue(elementChild("title", l));
+ const value id = elementValue(elementChild("id", l));
+ const value content = elementChild("content", l);
+ const bool text = isNil(content)? false : elementHasValue(content);
+ return append<value>(list<value>()
+ element + "item"
- + (list<value>() + element + "title" + car(l))
- + (list<value>() + element + "link" + cadr(l))
- + (isNil(cddr(l))? list<value>() : list<value>() + element + "description" + caddr(l));
+ + (list<value>() + element + "title" + title)
+ + (list<value>() + element + "link" + id),
+ isNil(content)?
+ list<value>() :
+ mklist<value>(append<value>(list<value>() + element + "description",
+ text? mklist<value>(elementValue(content)) : elementChildren(content))));
}
/**
@@ -137,7 +132,8 @@ const list<value> entriesElements(const list<value>& l) {
* Convert a list of values representing an RSS entry to an RSS entry.
* The first two values in the list are the entry id and title.
*/
-template<typename R> const failable<R> writeRSSEntry(const lambda<R(const string&, const R)>& reduce, const R& initial, const list<value>& l) {
+template<typename R> const failable<R> writeRSSEntry(const lambda<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)));
}
@@ -152,12 +148,37 @@ const failable<list<string> > writeRSSEntry(const list<value>& l) {
* Convert a list of values representing an RSS feed to an RSS feed.
* The first two values in the list are the feed id and title.
*/
-template<typename R> const failable<R> writeRSSFeed(const lambda<R(const string&, const R)>& reduce, const R& initial, const list<value>& l) {
+template<typename R> const failable<R> writeRSSFeed(const lambda<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> c = list<value>()
- + (list<value>() + element + "title" + car(l))
- + (list<value>() + element + "link" + cadr(l))
- + (list<value>() + element + "description" + car(l));
- const list<value> ce = isNil(cddr(l))? c : append(c, entriesElements(cddr(l)));
+ + (list<value>() + element + "title" + t)
+ + (list<value>() + element + "link" + i)
+ + (list<value>() + element + "description" + t);
+
+ // Write RSS entries
+ const list<value> le = filter<value>(selector(mklist<value>(element, entry)), l);
+ if (isNil(le)) {
+ const list<value> fe = list<value>()
+ + element + "rss" + (list<value>() + attribute + "version" + "2.0")
+ + append(list<value>() + element + "channel", c);
+ return writeXML<R>(reduce, initial, mklist<value>(fe));
+ }
+
+ // Write a single RSS entry element with a list of values
+ if (!isNil(le) && !isNil(car(le)) && isList(car<value>(caddr<value>(car(le))))) {
+ const list<value> ce = append(c, entriesElements(caddr<value>(car(le))));
+ const list<value> fe = list<value>()
+ + element + "rss" + (list<value>() + attribute + "version" + "2.0")
+ + append(list<value>() + element + "channel", ce);
+ return writeXML<R>(reduce, initial, mklist<value>(fe));
+ }
+
+ // Write separate RSS entry elements
+ const list<value> ce = append(c, entriesElements(le));
const list<value> fe = list<value>()
+ element + "rss" + (list<value>() + attribute + "version" + "2.0")
+ append(list<value>() + element + "channel", ce);
@@ -175,26 +196,6 @@ const failable<list<string> > writeRSSFeed(const list<value>& l) {
return reverse(list<string>(content(ls)));
}
-/**
- * Convert an RSS entry containing a value to an RSS entry containing an item element.
- */
-const list<value> entryValuesToElements(const list<value> val) {
- return cons(car(val), cons(cadr(val), valuesToElements(mklist<value>(cons<value>("item", (list<value>)caddr(val))))));
-}
-
-/**
- * Convert an RSS feed containing values to an RSS feed containing elements.
- */
-const list<value> feedValuesToElementsLoop(const list<value> val) {
- if (isNil(val))
- return val;
- return cons<value>(entryValuesToElements(car(val)), feedValuesToElementsLoop(cdr(val)));
-}
-
-const list<value> feedValuesToElements(const list<value>& val) {
- return cons(car<value>(val), cons<value>(cadr<value>(val), feedValuesToElementsLoop(cddr<value>(val))));
-}
-
}
}