From 49b878b1b0f2e52bbd5282c22ac32a68e1e8736c Mon Sep 17 00:00:00 2001 From: jsdelfino Date: Tue, 8 Mar 2011 08:18:07 +0000 Subject: 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 --- sca-cpp/trunk/modules/atom/atom-test.cpp | 63 ++++--- sca-cpp/trunk/modules/atom/atom.hpp | 137 +++++++--------- sca-cpp/trunk/modules/edit/apps.py | 11 +- .../trunk/modules/edit/apps/me360/app.composite | 64 ++++++++ sca-cpp/trunk/modules/edit/apps/me360/app.html | 45 +++++ .../modules/edit/apps/myprofile/app.composite | 64 -------- sca-cpp/trunk/modules/edit/apps/myprofile/app.html | 45 ----- .../modules/edit/apps/myprofile2/app.composite | 118 -------------- .../trunk/modules/edit/apps/myprofile2/app.html | 45 ----- .../trunk/modules/edit/apps/nearme2/app.composite | 123 -------------- sca-cpp/trunk/modules/edit/apps/nearme2/app.html | 20 --- .../trunk/modules/edit/apps/store/app.composite | 60 ------- sca-cpp/trunk/modules/edit/apps/store/app.html | 47 ------ .../trunk/modules/edit/apps/store2/app.composite | 60 ------- sca-cpp/trunk/modules/edit/apps/store2/app.html | 47 ------ .../trunk/modules/edit/apps/store3/app.composite | 60 ------- sca-cpp/trunk/modules/edit/apps/store3/app.html | 47 ------ .../trunk/modules/edit/apps/travel/app.composite | 181 --------------------- sca-cpp/trunk/modules/edit/apps/travel/app.html | 27 --- sca-cpp/trunk/modules/edit/dashboard.py | 17 +- .../trunk/modules/edit/dashboards/joe@localhost | 2 +- .../modules/edit/dashboards/joe@sca-store.com | 2 +- sca-cpp/trunk/modules/edit/htdocs/app/app.html | 21 ++- .../trunk/modules/edit/htdocs/dash/dashboard.html | 20 +-- sca-cpp/trunk/modules/edit/htdocs/graph/graph.html | 16 +- sca-cpp/trunk/modules/edit/htdocs/page/page.html | 16 +- sca-cpp/trunk/modules/edit/pages.py | 11 +- sca-cpp/trunk/modules/edit/palettes.py | 4 +- sca-cpp/trunk/modules/edit/util.py | 6 + sca-cpp/trunk/modules/http/http.hpp | 10 +- .../java/org/apache/tuscany/IterableUtil.java | 30 ++++ sca-cpp/trunk/modules/java/test/ServerImpl.java | 16 +- sca-cpp/trunk/modules/js/htdocs/atomutil.js | 98 +++++------ sca-cpp/trunk/modules/js/htdocs/component.js | 64 +------- sca-cpp/trunk/modules/js/htdocs/util.js | 27 ++- sca-cpp/trunk/modules/python/eval.hpp | 11 +- sca-cpp/trunk/modules/python/server-test.py | 14 +- sca-cpp/trunk/modules/rss/rss-test.cpp | 63 ++++--- sca-cpp/trunk/modules/rss/rss.hpp | 127 ++++++++------- sca-cpp/trunk/modules/scheme/json-value.cpp | 3 +- sca-cpp/trunk/modules/scheme/primitive.hpp | 16 +- sca-cpp/trunk/modules/scheme/value-json.cpp | 2 +- sca-cpp/trunk/modules/scheme/value-xml.cpp | 2 +- sca-cpp/trunk/modules/scheme/xml-value.cpp | 2 +- sca-cpp/trunk/modules/server/client-test.hpp | 58 ++++--- sca-cpp/trunk/modules/server/mod-eval.hpp | 29 ++-- sca-cpp/trunk/modules/server/server-test.scm | 10 +- sca-cpp/trunk/modules/wsgi/atom-test.py | 36 ++-- sca-cpp/trunk/modules/wsgi/atomutil.py | 88 +++++----- sca-cpp/trunk/modules/wsgi/composite.py | 32 +++- sca-cpp/trunk/modules/wsgi/server-test.py | 15 +- sca-cpp/trunk/modules/wsgi/util.py | 6 + 52 files changed, 667 insertions(+), 1471 deletions(-) create mode 100644 sca-cpp/trunk/modules/edit/apps/me360/app.composite create mode 100644 sca-cpp/trunk/modules/edit/apps/me360/app.html delete mode 100644 sca-cpp/trunk/modules/edit/apps/myprofile/app.composite delete mode 100644 sca-cpp/trunk/modules/edit/apps/myprofile/app.html delete mode 100644 sca-cpp/trunk/modules/edit/apps/myprofile2/app.composite delete mode 100644 sca-cpp/trunk/modules/edit/apps/myprofile2/app.html delete mode 100644 sca-cpp/trunk/modules/edit/apps/nearme2/app.composite delete mode 100644 sca-cpp/trunk/modules/edit/apps/nearme2/app.html delete mode 100644 sca-cpp/trunk/modules/edit/apps/store/app.composite delete mode 100644 sca-cpp/trunk/modules/edit/apps/store/app.html delete mode 100644 sca-cpp/trunk/modules/edit/apps/store2/app.composite delete mode 100644 sca-cpp/trunk/modules/edit/apps/store2/app.html delete mode 100644 sca-cpp/trunk/modules/edit/apps/store3/app.composite delete mode 100644 sca-cpp/trunk/modules/edit/apps/store3/app.html delete mode 100644 sca-cpp/trunk/modules/edit/apps/travel/app.composite delete mode 100644 sca-cpp/trunk/modules/edit/apps/travel/app.html (limited to 'sca-cpp/trunk/modules') diff --git a/sca-cpp/trunk/modules/atom/atom-test.cpp b/sca-cpp/trunk/modules/atom/atom-test.cpp index 5503c0f9b4..3030777b87 100644 --- a/sca-cpp/trunk/modules/atom/atom-test.cpp +++ b/sca-cpp/trunk/modules/atom/atom-test.cpp @@ -93,19 +93,27 @@ bool testEntry() { const list i = list() + element + value("item") + value(list() + element + value("name") + value(string("Apple"))) + value(list() + element + value("price") + value(string("$2.99"))); - const list a = mklist(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i); + const list a = list() + (list() + element + value("entry") + + value(list() + element + value("title") + value(string("item"))) + + value(list() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))) + + value(list() + element + value("content") + value(i))); ostringstream os; writeATOMEntry(writer, &os, a); assert(str(os) == itemEntry); } { - const list a = mklist(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), string("Apple")); + const list a = list() + (list() + element + value("entry") + + value(list() + element + value("title") + value(string("item"))) + + value(list() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))) + + value(list() + element + value("content") + value(string("Apple")))); ostringstream os; writeATOMEntry(writer, &os, a); assert(str(os) == itemTextEntry); } { - const list a = mklist(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), list()); + const list a = list() + (list() + element + value("entry") + + value(list() + element + value("title") + value(string("item"))) + + value(list() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")))); ostringstream os; writeATOMEntry(writer, &os, a); assert(str(os) == itemNoContentEntry); @@ -173,8 +181,11 @@ const string itemFeed("\n" bool testFeed() { { + const list a = list() + (list() + element + value("feed") + + value(list() + element + value("title") + value(string("Feed"))) + + value(list() + element + value("id") + value(string("1234")))); ostringstream os; - writeATOMFeed(writer, &os, mklist("Feed", "1234")); + writeATOMFeed(writer, &os, a); assert(str(os) == emptyFeed); } { @@ -184,39 +195,43 @@ bool testFeed() { assert(str(os) == emptyFeed); } { - const list i = list() - + (list() + "item" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b" - + (list() + element + "item" + const list i1 = list() + element + "item" + (list() + element + "name" + "Apple") - + (list() + element + "price" + "$2.99"))) - + (list() + "item" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c" - + (list() + element + "item" + + (list() + element + "price" + "$2.99"); + + const list i2 = list() + element + "item" + (list() + element + "name" + "Orange") - + (list() + element + "price" + "$3.55"))); - const list a = cons("Feed", cons("1234", i)); + + (list() + element + "price" + "$3.55"); + + const list i = list() + + value(list() + element + value("entry") + + value(list() + element + value("title") + value(string("item"))) + + value(list() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))) + + value(list() + element + value("content") + value(i1))) + + value(list() + element + value("entry") + + value(list() + element + value("title") + value(string("item"))) + + value(list() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c"))) + + value(list() + element + value("content") + value(i2))); + + const list a = list() + (append(list() + element + value("feed") + + value(list() + element + value("title") + value(string("Feed"))) + + value(list() + element + value("id") + value("1234")), + i)); + ostringstream os; writeATOMFeed(writer, &os, a); assert(str(os) == itemFeed); } { - const list i = list() - + (list() + "item" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b" - + valueToElement(list() + "item" - + (list() + "name" + "Apple") - + (list() + "price" + "$2.99"))) - + (list() + "item" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c" - + valueToElement(list() + "item" - + (list() + "name" + "Orange") - + (list() + "price" + "$3.55"))); - const list a = cons("Feed", cons("1234", i)); + const list a = content(readATOMFeed(mklist(itemFeed))); ostringstream os; writeATOMFeed(writer, &os, a); assert(str(os) == itemFeed); } { - const list a = content(readATOMFeed(mklist(itemFeed))); + const list a = elementsToValues(content(readATOMFeed(mklist(itemFeed)))); ostringstream os; - writeATOMFeed(writer, &os, a); + writeATOMFeed(writer, &os, valuesToElements(a)); assert(str(os) == itemFeed); } return true; diff --git a/sca-cpp/trunk/modules/atom/atom.hpp b/sca-cpp/trunk/modules/atom/atom.hpp index 0201995f9c..1d4a12a867 100644 --- a/sca-cpp/trunk/modules/atom/atom.hpp +++ b/sca-cpp/trunk/modules/atom/atom.hpp @@ -36,24 +36,33 @@ namespace tuscany { namespace atom { /** - * Convert a list of elements to a list of values representing an ATOM entry. + * Tags used to tag feed and entry elements. */ -const list entryElementsToValues(const list& e) { +const value feed("feed"); +const value entry("entry"); + +/** + * Convert a list of elements to a list of element values representing an ATOM entry. + */ +const list entryElementValues(const list& e) { const list lt = filter(selector(mklist(element, "title")), e); const value t = isNil(lt)? value(emptyString) : elementValue(car(lt)); const list li = filter(selector(mklist(element, "id")), e); const value i = isNil(li)? value(emptyString) : elementValue(car(li)); const list lc = filter(selector(mklist(element, "content")), e); - return mklist(t, i, isNil(lc)? (value)list() : elementValue(car(lc))); + return append(list() + element + entry + + value(list() + element + value("title") + t) + + value(list() + element + value("id") + i), + isNil(lc)? list() : mklist(value(list() + element + value("content") + elementValue(car(lc))))); } /** - * Convert a list of elements to a list of values representing ATOM entries. + * Convert a list of elements to a list of element values representing ATOM entries. */ -const list entriesElementsToValues(const list& e) { +const list entriesElementValues(const list& e) { if (isNil(e)) return e; - return cons(entryElementsToValues(car(e)), entriesElementsToValues(cdr(e))); + return cons(entryElementValues(car(e)), entriesElementValues(cdr(e))); } /** @@ -81,15 +90,7 @@ const failable > readATOMEntry(const list& ilist) { const list e = readXML(ilist); if (isNil(e)) return mkfailure >("Empty entry"); - return entryElementsToValues(car(e)); -} - -/** - * Convert a list of values representing an ATOM entry to a value. - */ -const value entryValue(const list& e) { - const list v = elementsToValues(mklist(caddr(e))); - return cons(car(e), mklist(cadr(e), isList(car(v))? (isNil((list)car(v))? car(v) : (value)cdr(car(v))) : car(v))); + return mklist(entryElementValues(car(e))); } /** @@ -101,42 +102,34 @@ const failable > readATOMFeed(const list& ilist) { return mkfailure >("Empty feed"); const list t = filter(selector(mklist(element, "title")), car(f)); const list i = filter(selector(mklist(element, "id")), car(f)); - const list e = filter(selector(mklist(element, "entry")), car(f)); - if (isNil(e)) - return mklist(elementValue(car(t)), elementValue(car(i))); - return cons(elementValue(car(t)), cons(elementValue(car(i)), entriesElementsToValues(e))); -} - -/** - * Convert an ATOM feed containing elements to an ATOM feed containing values. - */ -const list feedValuesLoop(const list e) { - if (isNil(e)) - return e; - return cons(entryValue(car(e)), feedValuesLoop(cdr(e))); -} - -const list feedValues(const list& e) { - return cons(car(e), cons(cadr(e), feedValuesLoop(cddr(e)))); + const list e = filter(selector(mklist(element, entry)), car(f)); + return mklist(append(list() + element + feed + + value(list() + element + value("title") + elementValue(car(t))) + + value(list() + element + value("id") + elementValue(car(i))), + entriesElementValues(e))); } /** - * Convert a list of values representing an ATOM 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 ATOM entry to a list of elements. */ const list entryElement(const list& l) { + 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 list() - + element + "entry" + (list() + attribute + "xmlns" + "http://www.w3.org/2005/Atom") - + (list() + element + "title" + (list() + attribute + "type" + "text") + car(l)) - + (list() + element + "id" + cadr(l)) - + (isNil(cddr(l))? + + element + entry + (list() + attribute + "xmlns" + "http://www.w3.org/2005/Atom") + + (list() + element + "title" + (list() + attribute + "type" + "text") + title) + + (list() + element + "id" + id) + + (isNil(content)? list() : - list() + element + "content" + (list() + attribute + "type" + (isList(caddr(l))? "application/xml" : "text")) + caddr(l)) - + (list() + element + "link" + (list() + attribute + "href" + cadr(l))); + append(list() + element + "content" + (list() + attribute + "type" + (text? "text" : "application/xml")), + text? mklist(elementValue(content)) : elementChildren(content))) + + (list() + element + "link" + (list() + attribute + "href" + id)); } /** - * Convert a list of values representing ATOM entries to a list of elements. + * Convert a list of element values representing ATOM entries to a list of elements. */ const list entriesElements(const list& l) { if (isNil(l)) @@ -145,10 +138,10 @@ const list entriesElements(const list& l) { } /** - * Convert a list of values representing an ATOM entry to an ATOM entry. - * The first two values in the list are the entry id and title. + * Convert a list of element values representing an ATOM entry to an ATOM entry. */ -template const failable writeATOMEntry(const lambda& reduce, const R& initial, const list& l) { +template const failable writeATOMEntry(const lambda& reduce, const R& initial, const list& ll) { + const list l = isNil(ll)? ll : (list)car(ll); return writeXML(reduce, initial, mklist(entryElement(l))); } @@ -160,23 +153,37 @@ const failable > writeATOMEntry(const list& l) { } /** - * Convert a list of values representing an ATOM feed to an ATOM feed. - * The first two values in the list are the feed id and title. + * Convert a list of element values representing an ATOM feed to an ATOM feed. */ -template const failable writeATOMFeed(const lambda& reduce, const R& initial, const list& l) { +template const failable writeATOMFeed(const lambda& reduce, const R& initial, const list& ll) { + const list l = isNil(ll)? ll : (list)car(ll); + const list lt = filter(selector(mklist(element, "title")), l); + const value t = isNil(lt)? value(emptyString) : elementValue(car(lt)); + const list li = filter(selector(mklist(element, "id")), l); + const value i = isNil(li)? value(emptyString) : elementValue(car(li)); const list f = list() - + element + "feed" + (list() + attribute + "xmlns" + "http://www.w3.org/2005/Atom") - + (list() + element + "title" + (list() + attribute + "type" + "text") + car(l)) - + (list() + element + "id" + cadr(l)); - if (isNil(cddr(l))) + + element + feed + (list() + attribute + "xmlns" + "http://www.w3.org/2005/Atom") + + (list() + element + "title" + (list() + attribute + "type" + "text") + t) + + (list() + element + "id" + i); + + // Write ATOM entries + const list le = filter(selector(mklist(element, entry)), l); + if (isNil(le)) return writeXML(reduce, initial, mklist(f)); - const list fe = append(f, entriesElements(cddr(l))); + + // Write a single ATOM entry element with a list of values + if (!isNil(le) && !isNil(car(le)) && isList(car(caddr(car(le))))) { + const list fe = append(f, entriesElements(caddr(car(le)))); + return writeXML(reduce, initial, mklist(fe)); + } + + // Write separate ATOM entry elements + const list fe = append(f, entriesElements(le)); return writeXML(reduce, initial, mklist(fe)); } /** - * Convert a list of values representing an ATOM feed to a list of strings. - * The first two values in the list are the feed id and title. + * Convert a list of element values representing an ATOM feed to a list of strings. */ const failable > writeATOMFeed(const list& l) { const failable > ls = writeATOMFeed>(rcons, list(), l); @@ -185,28 +192,6 @@ const failable > writeATOMFeed(const list& l) { return reverse(list(content(ls))); } -/** - * Convert an ATOM entry containing a value to an ATOM entry containing an item element. - */ -const list entryValuesToElements(const list val) { - if (isList(caddr(val))) - return cons(car(val), cons(cadr(val), valuesToElements(mklist(cons("item", (list)caddr(val)))))); - return cons(car(val), cons(cadr(val), valuesToElements(mklist(mklist("item", caddr(val)))))); -} - -/** - * Convert an ATOM feed containing values to an ATOM feed containing elements. - */ -const list feedValuesToElementsLoop(const list val) { - if (isNil(val)) - return val; - return cons(entryValuesToElements(car(val)), feedValuesToElementsLoop(cdr(val))); -} - -const list feedValuesToElements(const list& val) { - return cons(car(val), cons(cadr(val), feedValuesToElementsLoop(cddr(val)))); -} - } } diff --git a/sca-cpp/trunk/modules/edit/apps.py b/sca-cpp/trunk/modules/edit/apps.py index d0a54ac7ed..2980a9e5e3 100644 --- a/sca-cpp/trunk/modules/edit/apps.py +++ b/sca-cpp/trunk/modules/edit/apps.py @@ -39,14 +39,14 @@ def mkapplink(id): # Post a new app to the apps db def post(collection, app, cache): id = appid((str(uuid.uuid1()),)) - comp = caddr(app) + comp = cdr(cadddr(car(app))) cache.put((id,), comp) mkapplink((id,)) return id # Put an app into the apps db def put(id, app, cache): - comp = caddr(app) + comp = cdr(cadddr(car(app))) cache.put(appid(id), comp) mkapplink(id) return True @@ -54,8 +54,11 @@ def put(id, app, cache): # Get an app from the apps db def get(id, cache): if isNil(id): - return ("Apps", "apps") - return (car(id), car(id), cache.get(appid(id))) + return (("'feed", ("'title", "Apps"), ("'id", "apps")),) + app = cache.get(appid(id)); + if (isNil(app) or app is None): + return (("'entry", ("'title", car(id)), ("'id", car(id))),) + return (("'entry", ("'title", car(id)), ("'id", car(id)), ("'content", car(app))),) # Delete an app from the apps db def delete(id, cache): diff --git a/sca-cpp/trunk/modules/edit/apps/me360/app.composite b/sca-cpp/trunk/modules/edit/apps/me360/app.composite new file mode 100644 index 0000000000..c75b7c7179 --- /dev/null +++ b/sca-cpp/trunk/modules/edit/apps/me360/app.composite @@ -0,0 +1,64 @@ + + + + + + + 12345678 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + profiles + + + + + joe + + diff --git a/sca-cpp/trunk/modules/edit/apps/me360/app.html b/sca-cpp/trunk/modules/edit/apps/me360/app.html new file mode 100644 index 0000000000..b09564dc5c --- /dev/null +++ b/sca-cpp/trunk/modules/edit/apps/me360/app.html @@ -0,0 +1,45 @@ + + +
+ +

My social profiles

+
+ + + + +

Facebook profile

+
+ + text + + +

Twitter profile

+
+ + text + + + + + + + +
diff --git a/sca-cpp/trunk/modules/edit/apps/myprofile/app.composite b/sca-cpp/trunk/modules/edit/apps/myprofile/app.composite deleted file mode 100644 index c75b7c7179..0000000000 --- a/sca-cpp/trunk/modules/edit/apps/myprofile/app.composite +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - 12345678 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - profiles - - - - - joe - - diff --git a/sca-cpp/trunk/modules/edit/apps/myprofile/app.html b/sca-cpp/trunk/modules/edit/apps/myprofile/app.html deleted file mode 100644 index b09564dc5c..0000000000 --- a/sca-cpp/trunk/modules/edit/apps/myprofile/app.html +++ /dev/null @@ -1,45 +0,0 @@ - - -
- -

My social profiles

-
- - - - -

Facebook profile

-
- - text - - -

Twitter profile

-
- - text - - - - - - - -
diff --git a/sca-cpp/trunk/modules/edit/apps/myprofile2/app.composite b/sca-cpp/trunk/modules/edit/apps/myprofile2/app.composite deleted file mode 100644 index 86a6ce6cd1..0000000000 --- a/sca-cpp/trunk/modules/edit/apps/myprofile2/app.composite +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - - - - - - - - - - - getProfiles - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - fbid - - - - - - - - - - - twid - - - - - fbprofile - - - - - - - - - - - - - - - twprofile - - - - - fbid=1234567&twid=joe - - - - - fbid=1234567&twid=joe - - diff --git a/sca-cpp/trunk/modules/edit/apps/myprofile2/app.html b/sca-cpp/trunk/modules/edit/apps/myprofile2/app.html deleted file mode 100644 index b09564dc5c..0000000000 --- a/sca-cpp/trunk/modules/edit/apps/myprofile2/app.html +++ /dev/null @@ -1,45 +0,0 @@ - - -
- -

My social profiles

-
- - - - -

Facebook profile

-
- - text - - -

Twitter profile

-
- - text - - - - - - - -
diff --git a/sca-cpp/trunk/modules/edit/apps/nearme2/app.composite b/sca-cpp/trunk/modules/edit/apps/nearme2/app.composite deleted file mode 100644 index 11c967111a..0000000000 --- a/sca-cpp/trunk/modules/edit/apps/nearme2/app.composite +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - 60 - - - - - - - - - - - - - - - - - - Hey I'm here! - - - - - - - - - - - - - - - - - - - - - - - - - - - - fbid - - - - - fbid=1234567 - - - - - - - - - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - id - - diff --git a/sca-cpp/trunk/modules/edit/apps/nearme2/app.html b/sca-cpp/trunk/modules/edit/apps/nearme2/app.html deleted file mode 100644 index 5c7c7219bb..0000000000 --- a/sca-cpp/trunk/modules/edit/apps/nearme2/app.html +++ /dev/null @@ -1,20 +0,0 @@ - - -
diff --git a/sca-cpp/trunk/modules/edit/apps/store/app.composite b/sca-cpp/trunk/modules/edit/apps/store/app.composite deleted file mode 100644 index 0c676c19b9..0000000000 --- a/sca-cpp/trunk/modules/edit/apps/store/app.composite +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - USD - - - - - - - - - - - - - - - - - - - - - - - - localhost:11211 - - diff --git a/sca-cpp/trunk/modules/edit/apps/store/app.html b/sca-cpp/trunk/modules/edit/apps/store/app.html deleted file mode 100644 index 593d0a6648..0000000000 --- a/sca-cpp/trunk/modules/edit/apps/store/app.html +++ /dev/null @@ -1,47 +0,0 @@ - - -
- -

Store

-
- -

Catalog

-
- - - - -

Your Shopping Cart

-
- - total - - - - - - - - - - (feed) - - -
diff --git a/sca-cpp/trunk/modules/edit/apps/store2/app.composite b/sca-cpp/trunk/modules/edit/apps/store2/app.composite deleted file mode 100644 index b75877c67f..0000000000 --- a/sca-cpp/trunk/modules/edit/apps/store2/app.composite +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - USD - - - - - - - - - - - - - - - - - - - - - - - - localhost:11211 - - diff --git a/sca-cpp/trunk/modules/edit/apps/store2/app.html b/sca-cpp/trunk/modules/edit/apps/store2/app.html deleted file mode 100644 index 593d0a6648..0000000000 --- a/sca-cpp/trunk/modules/edit/apps/store2/app.html +++ /dev/null @@ -1,47 +0,0 @@ - - -
- -

Store

-
- -

Catalog

-
- - - - -

Your Shopping Cart

-
- - total - - - - - - - - - - (feed) - - -
diff --git a/sca-cpp/trunk/modules/edit/apps/store3/app.composite b/sca-cpp/trunk/modules/edit/apps/store3/app.composite deleted file mode 100644 index 735052fe03..0000000000 --- a/sca-cpp/trunk/modules/edit/apps/store3/app.composite +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - USD - - - - - - - - - - - - - - - - - - - - - - - - localhost:11211 - - diff --git a/sca-cpp/trunk/modules/edit/apps/store3/app.html b/sca-cpp/trunk/modules/edit/apps/store3/app.html deleted file mode 100644 index 593d0a6648..0000000000 --- a/sca-cpp/trunk/modules/edit/apps/store3/app.html +++ /dev/null @@ -1,47 +0,0 @@ - - -
- -

Store

-
- -

Catalog

-
- - - - -

Your Shopping Cart

-
- - total - - - - - - - - - - (feed) - - -
diff --git a/sca-cpp/trunk/modules/edit/apps/travel/app.composite b/sca-cpp/trunk/modules/edit/apps/travel/app.composite deleted file mode 100644 index 40a260e0a9..0000000000 --- a/sca-cpp/trunk/modules/edit/apps/travel/app.composite +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GBP - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.23 - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sca-cpp/trunk/modules/edit/apps/travel/app.html b/sca-cpp/trunk/modules/edit/apps/travel/app.html deleted file mode 100644 index ff320ac5b0..0000000000 --- a/sca-cpp/trunk/modules/edit/apps/travel/app.html +++ /dev/null @@ -1,27 +0,0 @@ - - -
- -

Welcome to SCATours Online Travel

-
- - - -
diff --git a/sca-cpp/trunk/modules/edit/dashboard.py b/sca-cpp/trunk/modules/edit/dashboard.py index 825bf8b405..4dd48ccc17 100644 --- a/sca-cpp/trunk/modules/edit/dashboard.py +++ b/sca-cpp/trunk/modules/edit/dashboard.py @@ -34,7 +34,8 @@ def getdashboard(id, cache): # Post a new app to the user's dashboard def post(collection, app, user, cache): id = (str(uuid.uuid1()),) - dashboard = cons((car(app), car(id), caddr(app)), getdashboard(dashboardid(user), cache)) + newapp = list("'entry", cadr(car(app)), list("'id", id), cadddr(car(app))) + dashboard = cons(newapp, getdashboard(dashboardid(user), cache)) cache.put(dashboardid(user), dashboard) return id @@ -42,9 +43,9 @@ def post(collection, app, user, cache): def put(id, app, user, cache): def putapp(app, dashboard): if isNil(dashboard): - return (app,) - if cadr(app) == cadr(car(dashboard)): - return cons(app, cdr(dashboard)) + return app + if cadr(caddr(car(app))) == cadr(caddr(car(dashboard))): + return cons(car(app), cdr(dashboard)) return cons(car(dashboard), putapp(app, cdr(dashboard))) dashboard = putapp(app, getdashboard(dashboardid(user), cache)) @@ -56,12 +57,12 @@ def get(id, user, cache): def findapp(id, dashboard): if isNil(dashboard): return None - if car(id) == cadr(car(dashboard)): - return car(dashboard) + if car(id) == cadr(caddr(car(dashboard))): + return (car(dashboard),) return findapp(id, cdr(dashboard)) if isNil(id): - return ("Your Apps", user.id()) + getdashboard(dashboardid(user), cache) + return ((("'feed", ("'title", "Your Apps"), ("'id", user.id())) + getdashboard(dashboardid(user), cache)),) return findapp(id, getdashboard(dashboardid(user), cache)) # Delete apps from the user's dashboard @@ -72,7 +73,7 @@ def delete(id, user, cache): def deleteapp(id, dashboard): if isNil(dashboard): return () - if car(id) == cadr(car(dashboard)): + if car(id) == cadr(caddr(car(dashboard))): return cdr(dashboard) return cons(car(dashboard), deleteapp(id, cdr(dashboard))) diff --git a/sca-cpp/trunk/modules/edit/dashboards/joe@localhost b/sca-cpp/trunk/modules/edit/dashboards/joe@localhost index 0d5faf04f6..5771c2f9de 100644 --- a/sca-cpp/trunk/modules/edit/dashboards/joe@localhost +++ b/sca-cpp/trunk/modules/edit/dashboards/joe@localhost @@ -1 +1 @@ -(("An App that shows my Aggregated Social Profile" "myprofile" ()) ("An advanced version of the Aggregated Social Profile App" "myprofile2" ()) ("An App that shows Friends Near Me" "nearme" ()) ("An advanced version of the Friends Near Me App" "nearme2" ()) ("Sample Online Store App" "store" ()) ("Layout Variation of the Online Store App" "store2" ()) ("Another Variation of the Online Store App" "store3" ()) ("Travel Tutorial App" "travel" ()) ("An Empty Test App" "test" ()) ("Test Values and Lists" "testvalues" ()) ("Test Social Components" "testsocial" ()) ("Test URL Components" "testurl" ()) ("Test Logic Components" "testlogic" ()) ("Test Text Processing Components" "testtext" ())) \ No newline at end of file +((entry (title "An Empty Test App") (id "test")) (entry (title "Test Values and Lists") (id "testvalues")) (entry (title "Test Social Components") (id "testsocial")) (entry (title "Test URL Components") (id "testurl")) (entry (title "Test Logic Components") (id "testlogic")) (entry (title "Test Text Processing Components") (id "testtext")) (entry (title "An App that shows my Social Profiles") (id "me360")) (entry (title "An App that shows Friends Near Me") (id "nearme"))) diff --git a/sca-cpp/trunk/modules/edit/dashboards/joe@sca-store.com b/sca-cpp/trunk/modules/edit/dashboards/joe@sca-store.com index 0d5faf04f6..5771c2f9de 100644 --- a/sca-cpp/trunk/modules/edit/dashboards/joe@sca-store.com +++ b/sca-cpp/trunk/modules/edit/dashboards/joe@sca-store.com @@ -1 +1 @@ -(("An App that shows my Aggregated Social Profile" "myprofile" ()) ("An advanced version of the Aggregated Social Profile App" "myprofile2" ()) ("An App that shows Friends Near Me" "nearme" ()) ("An advanced version of the Friends Near Me App" "nearme2" ()) ("Sample Online Store App" "store" ()) ("Layout Variation of the Online Store App" "store2" ()) ("Another Variation of the Online Store App" "store3" ()) ("Travel Tutorial App" "travel" ()) ("An Empty Test App" "test" ()) ("Test Values and Lists" "testvalues" ()) ("Test Social Components" "testsocial" ()) ("Test URL Components" "testurl" ()) ("Test Logic Components" "testlogic" ()) ("Test Text Processing Components" "testtext" ())) \ No newline at end of file +((entry (title "An Empty Test App") (id "test")) (entry (title "Test Values and Lists") (id "testvalues")) (entry (title "Test Social Components") (id "testsocial")) (entry (title "Test URL Components") (id "testurl")) (entry (title "Test Logic Components") (id "testlogic")) (entry (title "Test Text Processing Components") (id "testtext")) (entry (title "An App that shows my Social Profiles") (id "me360")) (entry (title "An App that shows Friends Near Me") (id "nearme"))) diff --git a/sca-cpp/trunk/modules/edit/htdocs/app/app.html b/sca-cpp/trunk/modules/edit/htdocs/app/app.html index c4bc54a8d7..faf0372179 100644 --- a/sca-cpp/trunk/modules/edit/htdocs/app/app.html +++ b/sca-cpp/trunk/modules/edit/htdocs/app/app.html @@ -36,7 +36,6 @@ Settings -[atom] @@ -71,7 +70,6 @@ var dashboard = sca.reference(editWidget, "dashboard"); * The current app name. */ var appname = ui.queryParams()['app']; -$('source').innerHTML = '[atom]'; /** * The current app entry and corresponding saved XML content. @@ -92,12 +90,13 @@ var defdesc = 'Enter a short description of your app here'; */ function getapp(name) { dashboard.get(name, function(doc) { - appentry = doc != null? atom.readATOMEntryDocument(doc) : mklist('', name); - $('appTitle').value = car(appentry) != ''? car(appentry) : deftitle; + appentry = doc != null? car(elementsToValues(atom.readATOMEntry(mklist(doc)))) : mklist("'entry", mklist("'title", ''), mklist("'id", name)); + var title = cadr(assoc("'title", cdr(appentry))); + $('appTitle').value = title != ''? title : deftitle; $('appCategory').value = defcategory; $('appUpdated').innerHTML = defdate; $('appDescription').innerHTML = defdesc; - savedappentryxml = car(atom.writeATOMEntry(appentry)); + savedappentryxml = car(atom.writeATOMEntry(valuesToElements(mklist(appentry)))); }); } @@ -114,10 +113,10 @@ $('saveButton').onclick = function() { function save() { $('saveButton').value = 'Saving'; var title = $('appTitle').value; - appentry = mklist(title != deftitle && title != ''? title : appname, appname, mklist()); - savedappentryxml = car(atom.writeATOMEntry(appentry)); + var appentry = mklist("'entry", mklist("'title", title != deftitle && title != ''? title : appname), mklist("'id", appname)); + savedappentryxml = car(atom.writeATOMEntry(valuesToElements(mklist(appentry)))); dashboard.put(appname, savedappentryxml, function() { - if (savedappentryxml == car(atom.writeATOMEntry(appentry))) + if (savedappentryxml == car(atom.writeATOMEntry(valuesToElements(mklist(appentry))))) $('saveButton').value = 'Saved'; return true; }); @@ -129,14 +128,14 @@ function save() { */ function onappchange() { var title = $('appTitle').value; - appentry = mklist(title != deftitle && title != ''? title : appname, appname, mklist()); - if (savedappentryxml == car(atom.writeATOMEntry(appentry))) + var appentry = mklist("'entry", mklist("'title", title != deftitle && title != ''? title : appname), mklist("'id", appname)); + if (savedappentryxml == car(atom.writeATOMEntry(valuesToElements(mklist(appentry))))) return false; $('saveButton').value = 'Save now'; // Autosave after 3 seconds setTimeout(function() { - if (savedappentryxml == car(atom.writeATOMEntry(appentry))) + if (savedappentryxml == car(atom.writeATOMEntry(valuesToElements(mklist(appentry))))) return false; return save(); }, 3000); diff --git a/sca-cpp/trunk/modules/edit/htdocs/dash/dashboard.html b/sca-cpp/trunk/modules/edit/htdocs/dash/dashboard.html index 3307d193ca..a261f75057 100644 --- a/sca-cpp/trunk/modules/edit/htdocs/dash/dashboard.html +++ b/sca-cpp/trunk/modules/edit/htdocs/dash/dashboard.html @@ -79,20 +79,14 @@ function getapps(sync) { var apps = ''; apps += '' + '' + - ''; + ''; - var entries = cddr(atom.readATOMFeedDocument(doc)); + var feed = car(elementsToValues(atom.readATOMFeed(mklist(doc)))); + var entries = cadr(assoc("'entry", cdr(feed))); for (var i = 0; i < length(entries); i++) { var entry = entries[i]; - var item = caddr(entry); - var composite = cddr(item); - var comps = scdl.components(composite); - - name = cadr(entry); - title = car(entry); + title = cadr(assoc("'title", entry)) + name = cadr(assoc("'id", entry)) apps += ''; apps += ''; @@ -142,8 +136,8 @@ $('createAppOKButton').onclick = function() { if (name == '') return false; var title = $('appTitle').value; - var app = mklist(title != deftitle && title != ''? title : name, name, mklist()); - var entry = atom.writeATOMEntry(app); + var app = mklist(mklist("'entry", mklist("'title", title != deftitle && title != ''? title : name), mklist("'id", name))); + var entry = atom.writeATOMEntry(valuesToElements(app)); dashboard.put(name, car(entry)); getapps(); $('newApp').style.visibility = 'hidden'; diff --git a/sca-cpp/trunk/modules/edit/htdocs/graph/graph.html b/sca-cpp/trunk/modules/edit/htdocs/graph/graph.html index 2a92a5d11e..4a973a1ed6 100644 --- a/sca-cpp/trunk/modules/edit/htdocs/graph/graph.html +++ b/sca-cpp/trunk/modules/edit/htdocs/graph/graph.html @@ -43,7 +43,6 @@ @@ -67,7 +66,6 @@ var apps = sca.reference(editWidget, "apps"); * The current app name. */ var appname = ui.queryParams()['app']; -$('source').innerHTML = '[atomjson]'; /** * The current app composite and corresponding saved XML content. @@ -79,9 +77,13 @@ var composite; * Return the composite in an ATOM entry. */ function atomcomposite(doc) { - var entry = atom.readATOMEntryDocument(doc); - var item = caddr(entry); - return cddr(item); + var entry = atom.readATOMEntry(mklist(doc)); + if (isNil(entry)) + return mklist(); + var content = namedElementChild("'content", car(entry)); + if (content == null) + return mklist(); + return elementChildren(content); } /** @@ -151,8 +153,8 @@ function save() { $('saveButton').value = 'Saving'; savedcomposxml = car(writeXML(composite, false)); var entry = '' + - '' + appname + '' + appname + '' + - savedcomposxml + ''; + '' + appname + '' + appname + '' + + savedcomposxml + ''; apps.put(appname, entry, function() { if (savedcomposxml == car(writeXML(composite, false))) $('saveButton').value = 'Saved'; diff --git a/sca-cpp/trunk/modules/edit/htdocs/page/page.html b/sca-cpp/trunk/modules/edit/htdocs/page/page.html index 7ace732526..297e5c5a69 100644 --- a/sca-cpp/trunk/modules/edit/htdocs/page/page.html +++ b/sca-cpp/trunk/modules/edit/htdocs/page/page.html @@ -42,7 +42,6 @@ @@ -80,15 +79,18 @@ var pages = sca.reference(editWidget, "pages"); * The current app name. */ var appname = ui.queryParams()['app']; -$('source').innerHTML = '[atomjson]'; /** * Return the page in an ATOM entry. */ function atompage(doc) { - var entry = atom.readATOMEntryDocument(doc); - var item = caddr(entry); - return cddr(item); + var entry = atom.readATOMEntry(mklist(doc)); + if (isNil(entry)) + return mklist(); + var content = namedElementChild("'content", car(entry)); + if (content == null) + return mklist(); + return elementChildren(content); } /** @@ -180,8 +182,8 @@ function save() { // Update the page ATOM entry var entry = '' + - '' + appname + '' + appname + '' + - savedpagexhtml + ''; + '' + appname + '' + appname + '' + + savedpagexhtml + ''; pages.put(appname, entry, function(e) { if (savedpagexhtml == pagexhtml()) diff --git a/sca-cpp/trunk/modules/edit/pages.py b/sca-cpp/trunk/modules/edit/pages.py index e96e503730..1fe475b67e 100644 --- a/sca-cpp/trunk/modules/edit/pages.py +++ b/sca-cpp/trunk/modules/edit/pages.py @@ -28,21 +28,24 @@ def appid(id): # Post a new app page to the apps db def post(collection, app, cache): id = appid((str(uuid.uuid1()),)) - xhtml = caddr(app); + xhtml = cdr(cadddr(car(app))) cache.put((id,), xhtml) return id # Put an app page into the apps db def put(id, app, cache): - xhtml = caddr(app); + xhtml = cdr(cadddr(car(app))) cache.put(appid(id), xhtml) return True # Get an app page from the apps db def get(id, cache): if isNil(id): - return ("Pages", "pages") - return (car(id), car(id), cache.get(appid(id))) + return (("'feed", ("'title", "Pages"), ("'id", "pages")),) + xhtml = cache.get(appid(id)) + if (isNil(xhtml) or xhtml is None): + return (("'entry", ("'title", car(id)), ("'id", car(id))),) + return (("'entry", ("'title", car(id)), ("'id", car(id)), ("'content", car(xhtml))),) # Delete an app page from the apps db def delete(id, cache): diff --git a/sca-cpp/trunk/modules/edit/palettes.py b/sca-cpp/trunk/modules/edit/palettes.py index 9d07973cef..7872bb3db7 100644 --- a/sca-cpp/trunk/modules/edit/palettes.py +++ b/sca-cpp/trunk/modules/edit/palettes.py @@ -27,6 +27,6 @@ def paletteid(id): # Get a palette from the palettes db def get(id, cache): if isNil(id): - return ("Palettes", "palettes") - return (car(id), car(id), cache.get(paletteid(id))) + return (("'feed", ("'title", "Palettes"), ("'id", "palettes")),) + return (("'entry", ("'title", car(id)), ("'id", car(id)), ("'content", car(cache.get(paletteid(id))))),) diff --git a/sca-cpp/trunk/modules/edit/util.py b/sca-cpp/trunk/modules/edit/util.py index 80bc7db101..24467fd2cb 100644 --- a/sca-cpp/trunk/modules/edit/util.py +++ b/sca-cpp/trunk/modules/edit/util.py @@ -43,6 +43,12 @@ def cddr(l): def caddr(l): return car(cddr(l)) +def cdddr(l): + return cdr(cdr(cdr(l))) + +def cadddr(l): + return car(cdddr(l)) + def append(a, b): return a + b diff --git a/sca-cpp/trunk/modules/http/http.hpp b/sca-cpp/trunk/modules/http/http.hpp index e2327be40a..7050021fb9 100644 --- a/sca-cpp/trunk/modules/http/http.hpp +++ b/sca-cpp/trunk/modules/http/http.hpp @@ -407,19 +407,19 @@ const failable get(const string& url, const CURLSession& cs) { if (atom::isATOMEntry(ls)) { // Read an ATOM entry - const value val(atom::entryValue(content(atom::readATOMEntry(ls)))); + const value val(elementsToValues(content(atom::readATOMEntry(ls)))); debug(val, "http::get::result"); return val; } if (contains(ct, "application/atom+xml") || atom::isATOMFeed(ls)) { // Read an ATOM feed - const value val(atom::feedValues(content(atom::readATOMFeed(ls)))); + const value val(elementsToValues(content(atom::readATOMFeed(ls)))); debug(val, "http::get::result"); return val; } if (contains(ct, "application/rss+xml") || rss::isRSSFeed(ls)) { // Read an RSS feed - const value val(rss::feedValues(content(rss::readRSSFeed(ls)))); + const value val(elementsToValues(content(rss::readRSSFeed(ls)))); debug(val, "http::get::result"); return val; } @@ -449,7 +449,7 @@ const failable get(const string& url, const CURLSession& cs) { const failable post(const value& val, const string& url, const CURLSession& cs) { // Convert value to an ATOM entry - const failable > entry = atom::writeATOMEntry(atom::entryValuesToElements(val)); + const failable > entry = atom::writeATOMEntry(valuesToElements(val)); if (!hasContent(entry)) return mkfailure(reason(entry)); debug(url, "http::post::url"); @@ -474,7 +474,7 @@ const failable post(const value& val, const string& url, const CURLSessio const failable put(const value& val, const string& url, const CURLSession& cs) { // Convert value to an ATOM entry - const failable > entry = atom::writeATOMEntry(atom::entryValuesToElements(val)); + const failable > entry = atom::writeATOMEntry(valuesToElements(val)); if (!hasContent(entry)) return mkfailure(reason(entry)); debug(url, "http::put::url"); diff --git a/sca-cpp/trunk/modules/java/org/apache/tuscany/IterableUtil.java b/sca-cpp/trunk/modules/java/org/apache/tuscany/IterableUtil.java index 6d559f370a..2366d79af6 100644 --- a/sca-cpp/trunk/modules/java/org/apache/tuscany/IterableUtil.java +++ b/sca-cpp/trunk/modules/java/org/apache/tuscany/IterableUtil.java @@ -116,6 +116,13 @@ public class IterableUtil { return cdr(cdr(l)); } + /** + * Return the cdr of the cdr of the cdr of a list. + */ + public static Iterable cdddr(final Object l) { + return cdr(cdr(cdr(l))); + } + /** * Return the car of the cdr of the cdr of a list. */ @@ -124,6 +131,24 @@ public class IterableUtil { return (T)car(cddr(l)); } + /** + * Return the car of the cdr of the cdr of the cdr of a list. + */ + @SuppressWarnings("unchecked") + public static T cadddr(final Object l) { + return (T)car(cdddr(l)); + } + + /** + * Appends a list and another list. + */ + @SuppressWarnings("unchecked") + public static Iterable append(final Object a, final Object b) { + if (isNil(a)) + return (Iterable)b; + return cons(car(a), append(cdr(a), b)); + } + /** * Return the first pair matching a key from a list of key value pairs. */ @@ -352,6 +377,11 @@ public class IterableUtil { assert car(al) == Integer.valueOf(1); assert cadr(al) == Integer.valueOf(2); assert caddr(al) == Integer.valueOf(3); + + final Iterable a = list(0, 1, 2); + final Iterable b = list(3, 4); + final Iterable ab = append(a, b); + assert ab.toString().equals("[0, 1, 2, 3, 4]"); return true; } } diff --git a/sca-cpp/trunk/modules/java/test/ServerImpl.java b/sca-cpp/trunk/modules/java/test/ServerImpl.java index 9de68fdb75..ee25cf7bf8 100644 --- a/sca-cpp/trunk/modules/java/test/ServerImpl.java +++ b/sca-cpp/trunk/modules/java/test/ServerImpl.java @@ -29,12 +29,16 @@ public class ServerImpl { public Iterable get(final Iterable id) { if (isNil(id)) - return list("Sample Feed", "123456789", - list("Item", "111", list(list("'name", "Apple"), list("'currencyCode", "USD"), list("'currencySymbol", "$"), list("'price", 2.99))), - list("Item", "222", list(list("'name", "Orange"), list("'currencyCode", "USD"), list("'currencySymbol", "$"), list("'price", 3.55))), - list("Item", "333", list(list("'name", "Pear"), list("'currencyCode", "USD"), list("'currencySymbol", "$"), list("'price", 1.55)))); - final Iterable entry = list(list("'name", "Apple"), list("'currencyCode", "USD"), list("'currencySymbol", "$"), list("'price", 2.99)); - return list("Item", car(id), entry); + return list(list("'feed", list("'title", "Sample Feed"), list("'id", "123456789"), list("'entry", list( + list(list("'title", "Item"), list("'id", "111"), + list("'content", list("'item", list("'name", "Apple"), list("'currencyCode", "USD"), list("'currencySymbol", "$"), list("'price", 2.99)))), + list(list("'title", "Item"), list("'id", "222"), + list("'content", list("'item", list("'name", "Orange"), list("'currencyCode", "USD"), list("'currencySymbol", "$"), list("'price", 3.55)))), + list(list("'title", "Item"), list("'id", "333"), + list("'content", list("'item", list("'name", "Pear"), list("'currencyCode", "USD"), list("'currencySymbol", "$"), list("'price", 1.55)))))))); + + final Iterable content = list("'content", list("'item", list("'name", "Apple"), list("'currencyCode", "USD"), list("'currencySymbol", "$"), list("'price", 2.99))); + return list(list("'entry", list("'title", "Item"), list("'id", car(id)), content)); } public Iterable post(final Iterable collection, final Iterable item) { diff --git a/sca-cpp/trunk/modules/js/htdocs/atomutil.js b/sca-cpp/trunk/modules/js/htdocs/atomutil.js index 21aa16e0fc..182b698596 100644 --- a/sca-cpp/trunk/modules/js/htdocs/atomutil.js +++ b/sca-cpp/trunk/modules/js/htdocs/atomutil.js @@ -25,22 +25,23 @@ var atom = {}; /** * Convert a list of elements to a list of values representing an ATOM entry. */ -atom.entryElementsToValues = function(e) { +atom.entryElementValues = function(e) { var lt = filter(selector(mklist(element, "'title")), e); var t = isNil(lt)? '' : elementValue(car(lt)); var li = filter(selector(mklist(element, "'id")), e); var i = isNil(li)? '' : elementValue(car(li)); var lc = filter(selector(mklist(element, "'content")), e); - return mklist(t, i, elementValue(car(lc))); + return append(mklist(element, "'entry", mklist(element, "'title", t), mklist(element, "'id", i)), + isNil(lc)? mklist() : mklist(mklist(element, "'content", elementValue(car(lc))))) }; /** * Convert a list of elements to a list of values representing ATOM entries. */ -atom.entriesElementsToValues = function(e) { +atom.entriesElementValues = function(e) { if (isNil(e)) return e; - return cons(atom.entryElementsToValues(car(e)), atom.entriesElementsToValues(cdr(e))); + return cons(atom.entryElementValues(car(e)), atom.entriesElementValues(cdr(e))); }; /** @@ -59,7 +60,7 @@ atom.readATOMEntryDocument = function(doc) { var e = readXMLDocument(doc); if (isNil(e)) return mklist(); - return atom.entryElementsToValues(car(e)); + return mklist(atom.entryElementValues(car(e))); }; /** @@ -69,14 +70,6 @@ atom.readATOMEntry = function(l) { return atom.readATOMEntryDocument(parseXML(l)); }; -/** - * Convert a list of values representy an ATOM entry to a value. - */ -atom.entryValue = function(e) { - var v = elementsToValues(mklist(caddr(e))); - return cons(car(e), (cadr(e), cdr(car(v)))); -}; - /** * Return true if a list of strings represents an ATOM feed. */ @@ -96,40 +89,32 @@ atom.readATOMFeedDocument = function(doc) { var t = filter(selector(mklist(element, "'title")), car(f)); var i = filter(selector(mklist(element, "'id")), car(f)); var e = filter(selector(mklist(element, "'entry")), car(f)); - if (isNil(e)) - return mklist(elementValue(car(t)), elementValue(car(i))); - return cons(elementValue(car(t)), cons(elementValue(car(i)), atom.entriesElementsToValues(e))); + return mklist(append( + mklist(element, "'feed", mklist(element, "'title", elementValue(car(t))), mklist(element, "'id", elementValue(car(i)))), + atom.entriesElementValues(e))); }; /** * Convert a list of strings to a list of values representing an ATOM feed. */ atom.readATOMFeed = function(l) { - return atom.readAtomFeedDocument(parseXML(l)); -}; - -/** - * Convert an ATOM feed containing elements to an ATOM feed containing values. - */ -atom.feedValues = function(e) { - function feedValuesLoop(e) { - if (isNil(e)) - return e; - return cons(entryValue(car(e)), feedValuesLoop(cdr(e))); - } - - return cons(car(e), cons(cadr(e), feedValuesLoop(cddr(e)))); + return atom.readATOMFeedDocument(parseXML(l)); }; /** * Convert a list of values representy an ATOM entry to a list of elements. */ atom.entryElement = function(l) { - return mklist(element, "'entry", mklist(attribute, "'xmlns", "http://www.w3.org/2005/Atom"), - mklist(element, "'title", mklist(attribute, "'type", "text"), car(l)), - mklist(element, "'id", cadr(l)), - mklist(element, "'content", mklist(attribute, "'type", (isList(caddr(l))? "application/xml" : "text")), caddr(l)), - mklist(element, "'link", mklist(attribute, "'href", cadr(l)))); + var title = elementValue(namedElementChild("'title", l)); + var id = elementValue(namedElementChild("'id", l)); + var content = namedElementChild("'content", l); + var text = isNil(content)? false : elementHasValue(content); + return append(append( + mklist(element, "'entry", mklist(attribute, "'xmlns", "http://www.w3.org/2005/Atom"), + mklist(element, "'title", mklist(attribute, "'type", "text"), title), mklist(element, "'id", id)), + isNil(content)? mklist() : + append(mklist(element, "'content", mklist(attribute, "'type", text? "text" : "application/xml")), text? mklist(elementValue(content)) : elementChildren(content))), + mklist(element, "'link", mklist(attribute, "'href", id))); }; /** @@ -144,42 +129,37 @@ atom.entriesElements = function(l) { /** * Convert a list of values representing an ATOM entry to an ATOM entry. */ -atom.writeATOMEntry = function(l) { +atom.writeATOMEntry = function(ll) { + var l = isNil(ll)? ll : car(ll); return writeXML(mklist(atom.entryElement(l)), true); }; /** * Convert a list of values representing an ATOM feed to an ATOM feed. */ -atom.writeATOMFeed = function(l) { +atom.writeATOMFeed = function(ll) { + var l = isNil(ll)? ll : car(ll); + var lt = filter(selector(mklist(element, "'title")), l); + var t = isNil(lt)? '' : elementValue(car(lt)); + var li = filter(selector(mklist(element, "'id")), l); + var i = isNil(li)? '' : elementValue(car(li)); var f = mklist(element, "'feed", mklist(attribute, "'xmlns", "http://www.w3.org/2005/Atom"), mklist(element, "'title", mklist(attribute, "'type", "text"), car(l)), mklist(element, "'id", cadr(l))); - if (isNil(cddr(l))) - return writeXML(mklist(f), true); - var fe = append(f, atom.entriesElements(cddr(l))); - return writeXML(mklist(fe), true); -}; -/** - * Convert an ATOM entry containing a value to an ATOM entry containing an item element. - */ -atom.entryValuesToElements = function(v) { - if (isList(caddr(v))) - return cons(car(v), cons(cadr(v), valuesToElements(mklist(cons("'item", caddr(v)))))); - return cons(car(v), cons(cadr(v), valuesToElements(mklist(mklist("'item", caddr(v)))))); -}; + // Write ATOM entries + var le = filter(selector(mklist(element, "'entry")), l); + if (isNil(le)) + return writeXML(mklist(f), true); -/** - * Convert an ATOM feed containing values to an ATOM feed containing elements. - */ -atom.feedValuesToElements = function(v) { - function feedValuesToElementsLoop(v) { - if (isNil(v)) - return v; - return cons(atom.entryValuesToElements(car(v)), feedValuesToElementsLoop(cdr(v))); + // Write a single ATOM entry element with a list of values + if (!isNil(le) && !isNil(car(le)) && isList(car(caddr(car(le))))) { + var fe = append(f, atom.entriesElements(caddr(car(le)))); + return writeXML(mklist(fe), true); } - return cons(car(v), cons(cadr(v), feedValuesToElementsLoop(cddr(v)))); + // Write separate ATOM entry elements + var fe = append(f, atom.entriesElements(le)); + return writeXML(mklist(fe), true); }; diff --git a/sca-cpp/trunk/modules/js/htdocs/component.js b/sca-cpp/trunk/modules/js/htdocs/component.js index 835cc148c2..ecbcdeda5b 100644 --- a/sca-cpp/trunk/modules/js/htdocs/component.js +++ b/sca-cpp/trunk/modules/js/htdocs/component.js @@ -174,9 +174,8 @@ HTTPBindingClient.jsonResult = function(http) { HTTPBindingClient.charset = httpCharset(http); // Unmarshall the JSON response - var data = http.responseText; var obj; - eval("obj = " + data); + eval("obj = " + http.responseText); if(obj.error) throw new HTTPBindingClient.Exception(obj.error.code, obj.error.msg); var res = obj.result; @@ -223,15 +222,6 @@ HTTPBindingClient.prototype.jsonApply = function(req) { throw new HTTPBindingClient.Exception(http.status, http.statusText); }; -/** - * Return the XML Document result from an XMLHTTPRequest. - */ -HTTPBindingClient.xmlResult = function(http) { - if(!http.responseXML || http.responseXML.childNodes.length == 0) - return (new DOMParser()).parseFromString(http.responseText, "text/xml"); - return http.responseXML; -} - /** * REST ATOMPub GET method. */ @@ -246,15 +236,9 @@ HTTPBindingClient.prototype.get = function(id, cb) { http.onreadystatechange = function() { if (http.readyState == 4) { // Pass the result or exception - if (http.status == 200) { - var res = null; - try { - res = HTTPBindingClient.xmlResult(http); - } catch (e) { - cb(null, e); - } - cb(res); - } else + if (http.status == 200) + cb(http.responseText); + else cb(null, new HTTPBindingClient.Exception(http.status, http.statusText)); } }; @@ -267,7 +251,7 @@ HTTPBindingClient.prototype.get = function(id, cb) { // Send the request and return the result or exception http.send(null); if (http.status == 200) - return HTTPBindingClient.xmlResult(http); + return http.responseText; throw new HTTPBindingClient.Exception(http.status, http.statusText); }; @@ -286,15 +270,9 @@ HTTPBindingClient.prototype.post = function (entry, cb) { http.onreadystatechange = function() { // Pass the result or exception if (http.readyState == 4) { - if (http.status == 201) { - var res = null; - try { - res = HTTPBindingClient.xmlResult(http); - } catch (e) { - cb(null, e); - } - cb(res); - } else + if (http.status == 201) + cb(http.responseText); + else cb(null, new HTTPBindingClient.Exception(http.status, http.statusText)); } }; @@ -306,7 +284,7 @@ HTTPBindingClient.prototype.post = function (entry, cb) { // Send the request and return the result or exception http.send(entry); if (http.status == 201) - return HTTPBindingClient.xmlResult(http); + return http.responseText; throw new HTTPBindingClient.Exception(http.status, http.statusText); }; @@ -422,30 +400,6 @@ HTTPBindingClient.getHTTPRequest = function() { throw new HTTPBindingClient.Exception(0, "Can't create XMLHttpRequest object"); }; -/** - * DOM parser wrapper. - */ -if (typeof DOMParser == "undefined") { - DOMParser = function() {} - - DOMParser.prototype.parseFromString = function (str, contentType) { - if (typeof ActiveXObject != "undefined") { - var d = new ActiveXObject("MSXML.DomDocument"); - d.loadXML(str); - return d; - } else if (typeof XMLHttpRequest != "undefined") { - var req = new XMLHttpRequest; - req.open("GET", "data:" + (contentType || "application/xml") + - ";charset=utf-8," + encodeURIComponent(str), false); - if (req.overrideMimeType) { - req.overrideMimeType(contentType); - } - req.send(null); - return req.responseXML; - } - } -} - /** * Public API. */ diff --git a/sca-cpp/trunk/modules/js/htdocs/util.js b/sca-cpp/trunk/modules/js/htdocs/util.js index 336248d34c..20af741c6d 100644 --- a/sca-cpp/trunk/modules/js/htdocs/util.js +++ b/sca-cpp/trunk/modules/js/htdocs/util.js @@ -52,14 +52,14 @@ function cddr(l) { return cdr(cdr(l)); } -function cdddr(l) { - return cdr(cdr(cdr(l))); -} - function caddr(l) { return car(cddr(l)); } +function cdddr(l) { + return cdr(cdr(cdr(l))); +} + function cadddr(l) { return car(cdddr(l)); } @@ -164,13 +164,22 @@ function tokens(path) { var rconsole; function log(v) { - if (rconsole) { + try { + var s = ''; + for (i = 0; i < arguments.length; i++) { + s = s + writeValue(arguments[i]); + if (i < arguments.length) + s = s + ' '; + } + + if (rconsole) { + try { + rconsole.log(s); + } catch (e) {} + } try { - rconsole.log(v); + console.log(s); } catch (e) {} - } - try { - console.log(v); } catch (e) {} return true; } diff --git a/sca-cpp/trunk/modules/python/eval.hpp b/sca-cpp/trunk/modules/python/eval.hpp index bf539faa38..65cd7f0ef7 100644 --- a/sca-cpp/trunk/modules/python/eval.hpp +++ b/sca-cpp/trunk/modules/python/eval.hpp @@ -66,17 +66,12 @@ const string lastError() { PyObject* sval = PyObject_Str(val); string msg = string() + PyString_AsString(stype) + " : " + PyString_AsString(sval); Py_DECREF(stype); - Py_DECREF(sval); - Py_DECREF(type); - Py_DECREF(val); - Py_XDECREF(trace); + Py_DECREF(sval); + PyErr_Restore(type, val, trace); PyErr_Print(); return msg; } - PyErr_Print(); - Py_XDECREF(type); - Py_XDECREF(val); - Py_XDECREF(trace); + PyErr_Restore(type, val, trace); PyErr_Print(); return "Unknown Python error"; } diff --git a/sca-cpp/trunk/modules/python/server-test.py b/sca-cpp/trunk/modules/python/server-test.py index 29404c3753..da5d216da5 100644 --- a/sca-cpp/trunk/modules/python/server-test.py +++ b/sca-cpp/trunk/modules/python/server-test.py @@ -24,13 +24,13 @@ def echo(x): def get(id): if id == (): - return ("Sample Feed", "123456789", - ("Item", "111", (("'name", "Apple"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 2.99))), - ("Item", "222", (("'name", "Orange"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 3.55))), - ("Item", "333", (("'name", "Pear"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 1.55)))) - - entry = (("'name", "Apple"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 2.99)) - return ("Item", id[0], entry) + return (("'feed", ("'title", "Sample Feed"), ("'id", "123456789"), ("'entry", + ((("'title", "Item"), ("'id", "111"), ("'content", ("'item", ("'name", "Apple"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 2.99)))), + (("'title", "Item"), ("'id", "222"), ("'content", ("'item", ("'name", "Orange"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 3.55)))), + (("'title", "Item"), ("'id", "333"), ("'content", ("'item", ("'name", "Pear"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 1.55))))))),) + + content = ("'content", ("'item", ("'name", "Apple"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 2.99))) + return (("'entry", ("'title", "Item"), ("'id", id[0]), content),) def post(collection, item): return ("123456789",) 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 i = list() + element + value("item") + value(list() + element + value("name") + value(string("Apple"))) + value(list() + element + value("price") + value(string("$2.99"))); - const list a = mklist(string("fruit"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i); + const list a = list() + (list() + element + value("entry") + + value(list() + element + value("title") + value(string("fruit"))) + + value(list() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))) + + value(list() + element + value("content") + value(i))); ostringstream os; writeRSSEntry(writer, &os, a); assert(str(os) == itemEntry); } { - const list a = mklist(string("fruit"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), "Apple"); + const list a = list() + (list() + element + value("entry") + + value(list() + element + value("title") + value(string("fruit"))) + + value(list() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))) + + value(list() + element + value("content") + value(string("Apple")))); ostringstream os; writeRSSEntry(writer, &os, a); assert(str(os) == itemTextEntry); } { - const list a = mklist(string("fruit"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), list()); + const list a = list() + (list() + element + value("entry") + + value(list() + element + value("title") + value(string("fruit"))) + + value(list() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")))); ostringstream os; writeRSSEntry(writer, &os, a); assert(str(os) == itemNoDescriptionEntry); @@ -172,8 +180,11 @@ const string itemFeed("\n" bool testFeed() { { + const list a = list() + (list() + element + value("feed") + + value(list() + element + value("title") + value(string("Feed"))) + + value(list() + element + value("id") + value(string("1234")))); ostringstream os; - writeRSSFeed(writer, &os, mklist("Feed", "1234")); + writeRSSFeed(writer, &os, a); assert(str(os) == emptyFeed); } { @@ -183,39 +194,43 @@ bool testFeed() { assert(str(os) == emptyFeed); } { - const list i = list() - + (list() + "fruit" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b" - + (list() + element + "item" + const list i1 = list() + element + "item" + (list() + element + "name" + "Apple") - + (list() + element + "price" + "$2.99"))) - + (list() + "fruit" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c" - + (list() + element + "item" + + (list() + element + "price" + "$2.99"); + + const list i2 = list() + element + "item" + (list() + element + "name" + "Orange") - + (list() + element + "price" + "$3.55"))); - const list a = cons("Feed", cons("1234", i)); + + (list() + element + "price" + "$3.55"); + + const list i = list() + + value(list() + element + value("entry") + + value(list() + element + value("title") + value(string("fruit"))) + + value(list() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))) + + value(list() + element + value("content") + value(i1))) + + value(list() + element + value("entry") + + value(list() + element + value("title") + value(string("fruit"))) + + value(list() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c"))) + + value(list() + element + value("content") + value(i2))); + + const list a = list() + (append(list() + element + value("feed") + + value(list() + element + value("title") + value(string("Feed"))) + + value(list() + element + value("id") + value("1234")), + i)); + ostringstream os; writeRSSFeed(writer, &os, a); assert(str(os) == itemFeed); } { - const list i = list() - + (list() + "fruit" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b" - + valueToElement(list() + "item" - + (list() + "name" + "Apple") - + (list() + "price" + "$2.99"))) - + (list() + "fruit" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c" - + valueToElement(list() + "item" - + (list() + "name" + "Orange") - + (list() + "price" + "$3.55"))); - const list a = cons("Feed", cons("1234", i)); + const list a = content(readRSSFeed(mklist(itemFeed))); ostringstream os; writeRSSFeed(writer, &os, a); assert(str(os) == itemFeed); } { - const list a = content(readRSSFeed(mklist(itemFeed))); + const list a = elementsToValues(content(readRSSFeed(mklist(itemFeed)))); ostringstream os; - writeRSSFeed(writer, &os, a); + writeRSSFeed(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 entryElementsToValues(const list& 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 entryElementValues(const list& e) { const list lt = filter(selector(mklist(element, "title")), e); const value t = isNil(lt)? value(emptyString) : elementValue(car(lt)); const list li = filter(selector(mklist(element, "link")), e); const value i = isNil(li)? value(emptyString) : elementValue(car(li)); const list ld = filter(selector(mklist(element, "description")), e); - return mklist(t, i, isNil(ld)? (value)list() : elementValue(car(ld))); + return append(list() + element + entry + + value(list() + element + value("title") + t) + + value(list() + element + value("id") + i), + isNil(ld)? list() : mklist(value(list() + 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 entriesElementsToValues(const list& e) { +const list entriesElementValues(const list& e) { if (isNil(e)) return e; - return cons(entryElementsToValues(car(e)), entriesElementsToValues(cdr(e))); + return cons(entryElementValues(car(e)), entriesElementValues(cdr(e))); } /** @@ -72,15 +81,7 @@ const failable > readRSSEntry(const list& ilist) { const list e = readXML(ilist); if (isNil(e)) return mkfailure >("Empty entry"); - return entryElementsToValues(car(e)); -} - -/** - * Convert a list of values representing an RSS entry to a value. - */ -const value entryValue(const list& e) { - const list v = elementsToValues(mklist(caddr(e))); - return cons(car(e), mklist(cadr(e), isList(car(v))? (isNil((list)car(v))? car(v) : (value)cdr(car(v))) : car(v))); + return mklist(entryElementValues(car(e))); } /** @@ -94,34 +95,28 @@ const failable > readRSSFeed(const list& ilist) { const list t = filter(selector(mklist(element, "title")), car(c)); const list i = filter(selector(mklist(element, "link")), car(c)); const list e = filter(selector(mklist(element, "item")), car(c)); - if (isNil(e)) - return mklist(elementValue(car(t)), elementValue(car(i))); - return cons(elementValue(car(t)), cons(elementValue(car(i)), entriesElementsToValues(e))); -} - -/** - * Convert an RSS feed containing elements to an RSS feed containing values. - */ -const list feedValuesLoop(const list e) { - if (isNil(e)) - return e; - return cons(entryValue(car(e)), feedValuesLoop(cdr(e))); -} - -const list feedValues(const list& e) { - return cons(car(e), cons(cadr(e), feedValuesLoop(cddr(e)))); + return mklist(append(list() + element + feed + + value(list() + element + value("title") + elementValue(car(t))) + + value(list() + 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 entryElement(const list& l) { - return list() + 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(list() + element + "item" - + (list() + element + "title" + car(l)) - + (list() + element + "link" + cadr(l)) - + (isNil(cddr(l))? list() : list() + element + "description" + caddr(l)); + + (list() + element + "title" + title) + + (list() + element + "link" + id), + isNil(content)? + list() : + mklist(append(list() + element + "description", + text? mklist(elementValue(content)) : elementChildren(content)))); } /** @@ -137,7 +132,8 @@ const list entriesElements(const list& 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 const failable writeRSSEntry(const lambda& reduce, const R& initial, const list& l) { +template const failable writeRSSEntry(const lambda& reduce, const R& initial, const list& ll) { + const list l = isNil(ll)? ll : (list)car(ll); return writeXML(reduce, initial, mklist(entryElement(l))); } @@ -152,12 +148,37 @@ const failable > writeRSSEntry(const list& 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 const failable writeRSSFeed(const lambda& reduce, const R& initial, const list& l) { +template const failable writeRSSFeed(const lambda& reduce, const R& initial, const list& ll) { + const list l = isNil(ll)? ll : (list)car(ll); + const list lt = filter(selector(mklist(element, "title")), l); + const value t = isNil(lt)? value(emptyString) : elementValue(car(lt)); + const list li = filter(selector(mklist(element, "id")), l); + const value i = isNil(li)? value(emptyString) : elementValue(car(li)); const list c = list() - + (list() + element + "title" + car(l)) - + (list() + element + "link" + cadr(l)) - + (list() + element + "description" + car(l)); - const list ce = isNil(cddr(l))? c : append(c, entriesElements(cddr(l))); + + (list() + element + "title" + t) + + (list() + element + "link" + i) + + (list() + element + "description" + t); + + // Write RSS entries + const list le = filter(selector(mklist(element, entry)), l); + if (isNil(le)) { + const list fe = list() + + element + "rss" + (list() + attribute + "version" + "2.0") + + append(list() + element + "channel", c); + return writeXML(reduce, initial, mklist(fe)); + } + + // Write a single RSS entry element with a list of values + if (!isNil(le) && !isNil(car(le)) && isList(car(caddr(car(le))))) { + const list ce = append(c, entriesElements(caddr(car(le)))); + const list fe = list() + + element + "rss" + (list() + attribute + "version" + "2.0") + + append(list() + element + "channel", ce); + return writeXML(reduce, initial, mklist(fe)); + } + + // Write separate RSS entry elements + const list ce = append(c, entriesElements(le)); const list fe = list() + element + "rss" + (list() + attribute + "version" + "2.0") + append(list() + element + "channel", ce); @@ -175,26 +196,6 @@ const failable > writeRSSFeed(const list& l) { return reverse(list(content(ls))); } -/** - * Convert an RSS entry containing a value to an RSS entry containing an item element. - */ -const list entryValuesToElements(const list val) { - return cons(car(val), cons(cadr(val), valuesToElements(mklist(cons("item", (list)caddr(val)))))); -} - -/** - * Convert an RSS feed containing values to an RSS feed containing elements. - */ -const list feedValuesToElementsLoop(const list val) { - if (isNil(val)) - return val; - return cons(entryValuesToElements(car(val)), feedValuesToElementsLoop(cdr(val))); -} - -const list feedValuesToElements(const list& val) { - return cons(car(val), cons(cadr(val), feedValuesToElementsLoop(cddr(val)))); -} - } } diff --git a/sca-cpp/trunk/modules/scheme/json-value.cpp b/sca-cpp/trunk/modules/scheme/json-value.cpp index 0ab9c85854..d7ffc2b37b 100644 --- a/sca-cpp/trunk/modules/scheme/json-value.cpp +++ b/sca-cpp/trunk/modules/scheme/json-value.cpp @@ -39,8 +39,7 @@ int jsonValue() { cerr << reason(lv); return 1; } - const value v = elementsToValues(content(lv)); - cout << writeValue(v); + cout << writeValue(content(lv)); return 0; } diff --git a/sca-cpp/trunk/modules/scheme/primitive.hpp b/sca-cpp/trunk/modules/scheme/primitive.hpp index 6f3f71f4cd..899d6f83da 100644 --- a/sca-cpp/trunk/modules/scheme/primitive.hpp +++ b/sca-cpp/trunk/modules/scheme/primitive.hpp @@ -145,26 +145,30 @@ const value uuidProc(unused const list& args) { return mkuuid(); } -const value cadrProc(unused const list& args) { +const value cadrProc(const list& args) { return cadr((list )car(args)); } -const value caddrProc(unused const list& args) { +const value caddrProc(const list& args) { return caddr((list )car(args)); } -const value cadddrProc(unused const list& args) { +const value cadddrProc(const list& args) { return cadddr((list )car(args)); } -const value cddrProc(unused const list& args) { +const value cddrProc(const list& args) { return cddr((list )car(args)); } -const value cdddrProc(unused const list& args) { +const value cdddrProc(const list& args) { return cdddr((list )car(args)); } +const value appendProc(const list& args) { + return append((list )car(args), (list)cadr(args)); +} + const value startProc(unused const list& args) { return lambda&)>(); } @@ -222,6 +226,7 @@ const list primitiveProcedureNames() { + "cadddr" + "cddr" + "cdddr" + + "append" + "display" + "log" + "uuid" @@ -247,6 +252,7 @@ const list primitiveProcedureObjects() { + primitiveProcedure(cadddrProc) + primitiveProcedure(cddrProc) + primitiveProcedure(cdddrProc) + + primitiveProcedure(appendProc) + primitiveProcedure(displayProc) + primitiveProcedure(logProc) + primitiveProcedure(uuidProc) diff --git a/sca-cpp/trunk/modules/scheme/value-json.cpp b/sca-cpp/trunk/modules/scheme/value-json.cpp index 40cc8891dd..5045226db9 100644 --- a/sca-cpp/trunk/modules/scheme/value-json.cpp +++ b/sca-cpp/trunk/modules/scheme/value-json.cpp @@ -34,7 +34,7 @@ namespace scheme { int valueJSON() { const js::JSContext cx; - failable > s = json::writeJSON(valuesToElements(readValue(cin)), cx); + failable > s = json::writeJSON(readValue(cin), cx); if (!hasContent(s)) { cerr << reason(s); return 1; diff --git a/sca-cpp/trunk/modules/scheme/value-xml.cpp b/sca-cpp/trunk/modules/scheme/value-xml.cpp index 1508f7b516..7091d5c8ba 100644 --- a/sca-cpp/trunk/modules/scheme/value-xml.cpp +++ b/sca-cpp/trunk/modules/scheme/value-xml.cpp @@ -33,7 +33,7 @@ namespace tuscany { namespace scheme { int valueXML() { - failable > s = writeXML(valuesToElements(readValue(cin))); + failable > s = writeXML(readValue(cin)); if (!hasContent(s)) { cerr << reason(s); return 1; diff --git a/sca-cpp/trunk/modules/scheme/xml-value.cpp b/sca-cpp/trunk/modules/scheme/xml-value.cpp index 0b95174e33..d88f754aa5 100644 --- a/sca-cpp/trunk/modules/scheme/xml-value.cpp +++ b/sca-cpp/trunk/modules/scheme/xml-value.cpp @@ -33,7 +33,7 @@ namespace tuscany { namespace scheme { int xmlValue() { - const value v = elementsToValues(readXML(streamList(cin))); + const value v = readXML(streamList(cin)); cout << writeValue(v); return 0; } diff --git a/sca-cpp/trunk/modules/server/client-test.hpp b/sca-cpp/trunk/modules/server/client-test.hpp index c17f012012..dffdb8977d 100644 --- a/sca-cpp/trunk/modules/server/client-test.hpp +++ b/sca-cpp/trunk/modules/server/client-test.hpp @@ -132,10 +132,13 @@ const bool testEvalPerf() { bool testPost() { gc_scoped_pool pool; - const list i = list() + const list i = list() + "content" + (list() + "item" + (list() + "name" + string("Apple")) - + (list() + "price" + string("$2.99")); - const list a = mklist(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i); + + (list() + "price" + string("$2.99"))); + const list a = list() + (list() + "entry" + + (list() + "title" + string("item")) + + (list() + "id" + string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")) + + i); http::CURLSession ch("", "", ""); const failable id = http::post(a, testURI, ch); assert(hasContent(id)); @@ -173,20 +176,26 @@ const bool testPostPerf() { gc_scoped_pool pool; http::CURLSession ch("", "", ""); { - const list i = list() + const list i = list() + "content" + (list() + "item" + (list() + "name" + string("Apple")) - + (list() + "price" + string("$2.99")); - const list val = mklist(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i); + + (list() + "price" + string("$2.99"))); + const list val = list() + (list() + "entry" + + (list() + "title" + string("item")) + + (list() + "id" + string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")) + + i); const lambda pl = postLoop(testURI, val, ch); cout << "ATOMPub POST small test " << time(pl, 5, 200) << " ms" << endl; } if (testBlobs) { - const list i = list() + const list i = list() + "content" + (list() + "item" + (list() + "name" + string("Apple")) + (list() + "blob1" + blob) + (list() + "blob2" + blob) - + (list() + "price" + string("$2.99")); - const list val = mklist(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i); + + (list() + "price" + string("$2.99"))); + const list val = list() + (list() + "entry" + + (list() + "title" + string("item")) + + (list() + "id" + string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")) + + i); const lambda pl = postBlobLoop(testURI, val, ch); cout << "ATOMPub POST blob test " << time(pl, 5, 200) << " ms" << endl; } @@ -234,10 +243,13 @@ const bool testPostThreadPerf() { const int count = 50; const int threads = 10; - const list i = list() - + (list() + "name" + string("Apple")) - + (list() + "price" + string("$2.99")); - const value val = mklist(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i); + const list i = list() + "content" + (list() + "item" + + (list() + "name" + string("Apple")) + + (list() + "price" + string("$2.99"))); + const value val = list() + (list() + "entry" + + (list() + "title" + string("item")) + + (list() + "id" + string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")) + + i); const lambda pl= curry(lambda(postThread), testURI, count, val); const lambda ptl = postThreadLoop(pl, threads); @@ -294,10 +306,13 @@ const bool testPostForkPerf() { const int count = 50; const int procs = 10; - const list i = list() - + (list() + "name" + string("Apple")) - + (list() + "price" + string("$2.99")); - const value val = mklist(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i); + const list i = list() + "content" + (list() + "item" + + (list() + "name" + string("Apple")) + + (list() + "price" + string("$2.99"))); + const list val = list() + (list() + "entry" + + (list() + "title" + string("item")) + + (list() + "id" + string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")) + + i); const lambda pl= curry(lambda(postProc), testURI, count, val); const lambda ptl = postForkLoop(pl, procs); @@ -311,10 +326,13 @@ const bool testPostForkPerf() { const bool testPut() { gc_scoped_pool pool; - const list i = list() + const list i = list() + "content" + (list() + "item" + (list() + "name" + string("Apple")) - + (list() + "price" + string("$2.99")); - const list a = mklist(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i); + + (list() + "price" + string("$2.99"))); + const list a = list() + (list() + "entry" + + (list() + "title" + string("item")) + + (list() + "id" + string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")) + + i); http::CURLSession ch("", "", ""); value rc = content(http::put(a, testURI + "/111", ch)); assert(rc == value(true)); diff --git a/sca-cpp/trunk/modules/server/mod-eval.hpp b/sca-cpp/trunk/modules/server/mod-eval.hpp index 8047015cbc..634bc5999f 100644 --- a/sca-cpp/trunk/modules/server/mod-eval.hpp +++ b/sca-cpp/trunk/modules/server/mod-eval.hpp @@ -143,27 +143,34 @@ const failable get(request_rec* r, const lambda&)>& return httpd::writeResult(json::writeJSON(list(), cx), "application/json", r); } + // Write content-type / content-list pair + if (isString(car(c)) && !isNil(cdr(c)) && isList(cadr(c))) + return httpd::writeResult(convertValues(cadr(c)), car(c), r); + // Write an assoc value as a JSON result if (isSymbol(car(c)) && !isNil(cdr(c))) { js::JSContext cx; return httpd::writeResult(json::writeJSON(valuesToElements(mklist(c)), cx), "application/json", r); } - // Write content-type / content-list pair - if (isString(car(c)) && !isNil(cdr(c)) && isList(cadr(c))) - return httpd::writeResult(convertValues(cadr(c)), car(c), r); + // Convert list of values to element values + const list e = valuesToElements(c); + debug(e, "modeval::get::elements"); // Write an ATOM feed or entry - if (isString(car(c)) && !isNil(cdr(c)) && isString(cadr(c))) { - if (isNil(cddr(path))) - return httpd::writeResult(atom::writeATOMFeed(atom::feedValuesToElements(c)), "application/atom+xml", r); - else - return httpd::writeResult(atom::writeATOMEntry(atom::entryValuesToElements(c)), "application/atom+xml", r); + if (isList(car(e)) && !isNil(car(e))) { + const list el = car(e); + if (isSymbol(car(el)) && car(el) == element && !isNil(cdr(el)) && isSymbol(cadr(el))) { + if (cadr(el) == atom::feed) + return httpd::writeResult(atom::writeATOMFeed(e), "application/atom+xml", r); + if (cadr(el) == atom::entry) + return httpd::writeResult(atom::writeATOMEntry(e), "application/atom+xml", r); + } } // Write any other compound value as a JSON value js::JSContext cx; - return httpd::writeResult(json::writeJSON(valuesToElements(c), cx), "application/json", r); + return httpd::writeResult(json::writeJSON(e, cx), "application/json", r); } /** @@ -210,7 +217,7 @@ const failable post(request_rec* r, const lambda&)> return rc; const list ls = httpd::read(r); debug(ls, "modeval::post::input"); - const value entry = atom::entryValue(content(atom::readATOMEntry(ls))); + const value entry = elementsToValues(content(atom::readATOMEntry(ls))); // Evaluate the POST expression const failable val = failableResult(impl(cons("post", mklist(cddr(path), entry)))); @@ -245,7 +252,7 @@ const failable put(request_rec* r, const lambda&)>& return rc; const list ls = httpd::read(r); debug(ls, "modeval::put::input"); - const value entry = atom::entryValue(content(atom::readATOMEntry(ls))); + const value entry = elementsToValues(content(atom::readATOMEntry(ls))); // Evaluate the PUT expression and update the corresponding resource const failable val = failableResult(impl(cons("put", mklist(cddr(path), entry)))); diff --git a/sca-cpp/trunk/modules/server/server-test.scm b/sca-cpp/trunk/modules/server/server-test.scm index c23adb7f51..4bbff6e5c2 100644 --- a/sca-cpp/trunk/modules/server/server-test.scm +++ b/sca-cpp/trunk/modules/server/server-test.scm @@ -23,12 +23,12 @@ (define (get id) (if (nul id) - '("Sample Feed" "123456789" - ("Item" "111" ((name "Apple") (currencyCode "USD") (currencySymbol "$") (price 2.99))) - ("Item" "222" ((name "Orange") (currencyCode "USD") (currencySymbol "$") (price 3.55))) - ("Item" "333" ((name "Pear") (currencyCode "USD") (currencySymbol "$") (price 1.55)))) + '((feed (title "Sample Feed") (id "123456789") (entry + (((title "Item") (id "111") (content (item (name "Apple") (currencyCode "USD") (currencySymbol "$") (price 2.99)))) + ((title "Item") (id "222") (content (item (name "Orange") (currencyCode "USD") (currencySymbol "$") (price 3.55)))) + ((title "Item") (id "333") (content (item (name "Pear") (currencyCode "USD") (currencySymbol "$") (price 1.55)))))))) - (list "Item" (car id) '((name "Apple") (currencyCode "USD") (currencySymbol "$") (price 2.99)))) + (list (list 'entry '(title "Item") (list 'id (car id)) '(content (item (name "Apple") (currencyCode "USD") (currencySymbol "$") (price 2.99)))))) ) (define (post collection item) diff --git a/sca-cpp/trunk/modules/wsgi/atom-test.py b/sca-cpp/trunk/modules/wsgi/atom-test.py index 81a6106519..9ada53bea5 100755 --- a/sca-cpp/trunk/modules/wsgi/atom-test.py +++ b/sca-cpp/trunk/modules/wsgi/atom-test.py @@ -71,7 +71,7 @@ completedEntry = \ def testEntry(): i = (element, "'item", (element, "'name", "Apple"), (element, "'price", "$2.99")) - a = ("item", "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b", i) + a = ((element, "'entry", (element, "'title", "item"), (element, "'id", "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), (element, "'content", i)),) s = writeATOMEntry(a); assert car(s) == itemEntry @@ -123,41 +123,29 @@ itemFeed = \ "\n" def testFeed(): - s = writeATOMFeed(("Feed", "1234")) + a = ((element, "'feed", (element, "'title", "Feed"), (element, "'id", "1234")),) + s = writeATOMFeed(a) assert car(s) == emptyFeed a2 = readATOMFeed((emptyFeed,)) s2 = writeATOMFeed(a2) assert car(s2) == emptyFeed - i3 = (("item", "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b", - (element, "'item", (element, "'name", "Apple"), (element, "'price", "$2.99"))), - ("item", "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c", - (element, "'item", (element, "'name", "Orange"), (element, "'price", "$3.55")))) - a3 = cons("Feed", cons("1234", i3)) + i3 = ((element, "'entry", (element, "'title", "item"), (element, "'id", "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), + (element, "'content", (element, "'item", (element, "'name", "Apple"), (element, "'price", "$2.99")))), + (element, "'entry", (element, "'title", "item"), (element, "'id", "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c"), + (element, "'content", (element, "'item", (element, "'name", "Orange"), (element, "'price", "$3.55"))))) + a3 = (append((element, "'feed", (element, "'title", "Feed"), (element, "'id", "1234")), i3),) s3 = writeATOMFeed(a3) assert car(s3) == itemFeed - i4 = (("item", "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b", - valueToElement(("'item", ("'name", "Apple"), ("'price", "$2.99")))), - ("item", "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c", - valueToElement(("'item", ("'name", "Orange"), ("'price", "$3.55"))))) - a4 = cons("Feed", cons("1234", i4)) - s4 = writeATOMFeed(a4) + a4 = readATOMFeed((itemFeed,)); + s4 = writeATOMFeed(a4); assert car(s4) == itemFeed - a5 = readATOMFeed((itemFeed,)); - s5 = writeATOMFeed(a5); + a5 = elementsToValues(readATOMFeed((itemFeed,))); + s5 = writeATOMFeed(valuesToElements(a5)); assert car(s5) == itemFeed - - i6 = (("item", "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b", - (("'name", "Apple"), ("'price", "$2.99"))), - ("item", "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c", - (("'name", "Orange"), ("'price", "$3.55")))) - a6 = cons("Feed", cons("1234", i6)) - s6 = writeATOMFeed(feedValuesToElements(a6)) - assert car(s6) == itemFeed - return True if __name__ == "__main__": diff --git a/sca-cpp/trunk/modules/wsgi/atomutil.py b/sca-cpp/trunk/modules/wsgi/atomutil.py index 8e812abbe9..ad6425f062 100644 --- a/sca-cpp/trunk/modules/wsgi/atomutil.py +++ b/sca-cpp/trunk/modules/wsgi/atomutil.py @@ -22,31 +22,27 @@ from elemutil import * from xmlutil import * # Convert a list of elements to a list of values representing an ATOM entry -def entryElementsToValues(e): +def entryElementValues(e): lt = filter(selector((element, "'title")), e) t = "" if isNil(lt) else elementValue(car(lt)) li = filter(selector((element, "'id")), e) i = "" if isNil(li) else elementValue(car(li)) lc = filter(selector((element, "'content")), e) - return (t, i, elementValue(car(lc))) + return append((element, "'entry", (element, "'title", t), (element, "'id", i)), + () if isNil(lc) else ((element, "'content", elementValue(car(lc))),)) # Convert a list of elements to a list of values representing ATOM entries -def entriesElementsToValues(e): +def entriesElementValues(e): if isNil(e): return e - return cons(entryElementsToValues(car(e)), entriesElementsToValues(cdr(e))) + return cons(entryElementValues(car(e)), entriesElementValues(cdr(e))) # Convert a list of strings to a list of values representing an ATOM entry def readATOMEntry(l): e = readXML(l) if isNil(e): return () - return entryElementsToValues(car(e)) - -# Convert a list of values representing an ATOM entry to a value -def entryValue(e): - v = elementsToValues((caddr(e),)) - return cons(car(e), (cadr(e), cdr(car(v)))) + return (entryElementValues(car(e)),) # Return true if a list of strings represents an ATOM feed def isATOMFeed(l): @@ -68,26 +64,23 @@ def readATOMFeed(l): t = filter(selector((element, "'title")), car(f)) i = filter(selector((element, "'id")), car(f)) e = filter(selector((element, "'entry")), car(f)) - if isNil(e): - return (elementValue(car(t)), elementValue(car(i))) - return cons(elementValue(car(t)), cons(elementValue(car(i)), entriesElementsToValues(e))) - -# Convert an ATOM feed containing elements to an ATOM feed containing values -def feedValuesLoop(e): - if (isNil(e)): - return e - return cons(entryValue(car(e)), feedValuesLoop(cdr(e))) - -def feedValues(e): - return cons(car(e), cons(cadr(e), feedValuesLoop(cddr(e)))) + return (append( + (element, "'feed", (element, "'title", elementValue(car(t))), (element, "'id", elementValue(car(i)))), + entriesElementValues(e)),) # Convert a list of values representy an ATOM entry to a list of elements def entryElement(l): - return (element, "'entry", (attribute, "'xmlns", "http://www.w3.org/2005/Atom"), - (element, "'title", (attribute, "'type", "text"), car(l)), - (element, "'id", cadr(l)), - (element, "'content", (attribute, "'type", ("application/xml" if isList(caddr(l)) else "text")), caddr(l)), - (element, "'link", (attribute, "'href", cadr(l)))) + title = elementValue(namedElementChild("'title", l)) + id = elementValue(namedElementChild("'id", l)) + content = namedElementChild("'content", l) + text = False if isNil(content) else elementHasValue(content) + return append(append( + (element, "'entry", (attribute, "'xmlns", "http://www.w3.org/2005/Atom"), + (element, "'title", (attribute, "'type", "text"), title), + (element, "'id", id)), + () if isNil(content) else (append( + (element, "'content", (attribute, "'type", "text" if text else "application/xml")), (elementValue(content),) if text else elementChildren(content)),)), + ((element, "'link", (attribute, "'href", id)),)) # Convert a list of values representing ATOM entries to a list of elements def entriesElements(l): @@ -96,31 +89,32 @@ def entriesElements(l): return cons(entryElement(car(l)), entriesElements(cdr(l))) # Convert a list of values representing an ATOM entry to an ATOM entry -def writeATOMEntry(l): +def writeATOMEntry(ll): + l = ll if isNil(ll) else car(ll) return writeXML((entryElement(l),), True) # Convert a list of values representing an ATOM feed to an ATOM feed -def writeATOMFeed(l): +def writeATOMFeed(ll): + l = ll if isNil(ll) else car(ll) + lt = filter(selector((element, "'title")), l) + t = '' if isNil(lt) else elementValue(car(lt)) + li = filter(selector((element, "'id")), l) + i = '' if isNil(li) else elementValue(car(li)) f = (element, "'feed", (attribute, "'xmlns", "http://www.w3.org/2005/Atom"), - (element, "'title", (attribute, "'type", "text"), car(l)), - (element, "'id", cadr(l))) - if isNil(cddr(l)): - return writeXML((f,), True) - fe = append(f, entriesElements(cddr(l))) - return writeXML((fe,), True) + (element, "'title", (attribute, "'type", "text"), t), + (element, "'id", i)) -# Convert an ATOM entry containing a value to an ATOM entry containing an item element -def entryValuesToElements(v): - if isList(caddr(v)): - return cons(car(v), cons(cadr(v), valuesToElements((cons("'item", caddr(v)),)))) - return cons(car(v), cons(cadr(v), valuesToElements((("'item", caddr(v)),)))) + # Write ATOM entries + le = filter(selector((element, "'entry")), l) + if isNil(le): + return writeXML((f,), True) -# Convert an ATOM feed containing values to an ATOM feed containing elements -def feedValuesToElementsLoop(v): - if isNil(v): - return v - return cons(entryValuesToElements(car(v)), feedValuesToElementsLoop(cdr(v))) + # Write a single ATOM entry element with a list of values + if not isNil(le) and not isNil(car(le)) and isList(car(caddr(car(le)))): + fe = append(f, entriesElements(caddr(car(le)))) + return writeXML((fe,), True) -def feedValuesToElements(v): - return cons(car(v), cons(cadr(v), feedValuesToElementsLoop(cddr(v)))) + # Write separate ATOM entry elements + fe = append(f, entriesElements(le)) + return writeXML((fe,), True) diff --git a/sca-cpp/trunk/modules/wsgi/composite.py b/sca-cpp/trunk/modules/wsgi/composite.py index 28a38ad386..baea7aa053 100755 --- a/sca-cpp/trunk/modules/wsgi/composite.py +++ b/sca-cpp/trunk/modules/wsgi/composite.py @@ -179,18 +179,32 @@ def application(e, r): if m == "GET": v = comp("get", id) + # Write a simple value as a JSON value + if not isList(v): + return result(e, r, 200, (("Content-type", "application/json"),), writeJSON(valuesToElements((("'value", v),)))) + + # Write an empty list as a JSON empty value + if not isList(v): + return result(e, r, 200, (("Content-type", "application/json"),), writeJSON(())) + # Write content-type / content-list pair - if isString(car(v)) and isList(cadr(v)): + if isString(car(v)) and not isNil(cdr(v)) and isList(cadr(v)): return result(e, r, 200, (("Content-type", car(v)),), cadr(v)) - # Write an ATOM feed or entry - if isString(car(v)) and isString(cadr(v)): - if isNil(id): - return result(e, r, 200, (("Content-type", "application/atom+xml"),), writeATOMFeed(feedValuesToElements(v))) - return result(e, r, 200, (("Content-type", "application/atom+xml"),), writeATOMEntry(entryValuesToElements(v))) + # Convert list of values to element values + ve = valuesToElements(v) + + # Write an assoc result as a JSON value + if isList(car(ve)) and not isNil(car(ve)): + el = car(ve) + if isSymbol(car(el)) and car(el) == element and not isNil(cdr(el)) and isSymbol(cadr(el)): + if cadr(el) == "'feed": + return result(e, r, 200, (("Content-type", "application/atom+xml"),), writeATOMFeed(ve)) + if cadr(el) == "'entry": + return result(e, r, 200, (("Content-type", "application/atom+xml"),), writeATOMEntry(ve)) # Write a JSON value - return result(e, r, 200, (("Content-type", "application/json"),), writeJSON(valuesToElements(v))) + return result(e, r, 200, (("Content-type", "application/json"),), writeJSON(ve)) if m == "POST": ct = requestContentType(e) @@ -208,7 +222,7 @@ def application(e, r): # Handle an ATOM entry POST if contains(ct, "application/atom+xml"): - ae = entryValue(readATOMEntry(requestBody(e))) + ae = elementsToValues(readATOMEntry(requestBody(e))) v = comp("post", id, ae) if isNil(v): return failure(e, r, 500) @@ -217,7 +231,7 @@ def application(e, r): if m == "PUT": # Handle an ATOM entry PUT - ae = entryValue(readATOMEntry(requestBody(e))) + ae = elementsToValues(readATOMEntry(requestBody(e))) v = comp("put", id, ae) if v == False: return failure(e, r, 404) diff --git a/sca-cpp/trunk/modules/wsgi/server-test.py b/sca-cpp/trunk/modules/wsgi/server-test.py index 28f88efefc..610ec05075 100644 --- a/sca-cpp/trunk/modules/wsgi/server-test.py +++ b/sca-cpp/trunk/modules/wsgi/server-test.py @@ -25,14 +25,15 @@ def echo(x): def get(id): if id == ("index.html",): return ("text/plain", ("It works!",)) + if id == (): - return ("Sample Feed", "123456789", - ("Item", "111", (("'name", "Apple"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 2.99))), - ("Item", "222", (("'name", "Orange"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 3.55))), - ("Item", "333", (("'name", "Pear"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 1.55)))) - - entry = (("'name", "Apple"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 2.99)) - return ("Item", id[0], entry) + return (("'feed", ("'title", "Sample Feed"), ("'id", "123456789"), ("'entry", + ((("'title", "Item"), ("'id", "111"), ("'content", ("'item", ("'name", "Apple"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 2.99)))), + (("'title", "Item"), ("'id", "222"), ("'content", ("'item", ("'name", "Orange"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 3.55)))), + (("'title", "Item"), ("'id", "333"), ("'content", ("'item", ("'name", "Pear"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 1.55))))))),) + + content = ("'content", ("'item", ("'name", "Apple"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 2.99))) + return (("'entry", ("'title", "Item"), ("'id", id[0]), content),) def post(collection, item): return ("123456789",) diff --git a/sca-cpp/trunk/modules/wsgi/util.py b/sca-cpp/trunk/modules/wsgi/util.py index 80bc7db101..24467fd2cb 100644 --- a/sca-cpp/trunk/modules/wsgi/util.py +++ b/sca-cpp/trunk/modules/wsgi/util.py @@ -43,6 +43,12 @@ def cddr(l): def caddr(l): return car(cddr(l)) +def cdddr(l): + return cdr(cdr(cdr(l))) + +def cadddr(l): + return car(cdddr(l)) + def append(a, b): return a + b -- cgit v1.2.3
AppTitle' + - '' + - '[atom json]' + - '
' + name + ' -[atom json]
-[atom json]