Author: jsdelfino
Date: Mon Feb 27 03:26:51 2012
New Revision: 1294006

URL: http://svn.apache.org/viewvc?rev=1294006&view=rev
Log:
Fix mapping between repeating XML elements, S-expression lists, and JSON array 
cells.

Modified:
    tuscany/sca-cpp/trunk/kernel/element.hpp
    tuscany/sca-cpp/trunk/kernel/xml-test.cpp
    tuscany/sca-cpp/trunk/kernel/xml.hpp
    tuscany/sca-cpp/trunk/modules/json/json-test.cpp
    tuscany/sca-cpp/trunk/modules/json/json.hpp

Modified: tuscany/sca-cpp/trunk/kernel/element.hpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/kernel/element.hpp?rev=1294006&r1=1294005&r2=1294006&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/kernel/element.hpp (original)
+++ tuscany/sca-cpp/trunk/kernel/element.hpp Mon Feb 27 03:26:51 2012
@@ -172,10 +172,10 @@ const list<value> elementToValueGroupVal
     if (car<value>(car(l)) != car<value>(v))
         return cons(v, l);
     if (!elementToValueIsList(cadr<value>(car(l)))) {
-        const value g = mklist<value>(car<value>(v), 
mklist<value>(cdr<value>(v), cdr<value>(car(l))));
+        const value g = mklist<value>(car<value>(v), 
mklist<value>(isList(cadr<value>(v))? (value)cdr<value>(v) : cadr<value>(v), 
isList(cadr<value>(car(l)))? (value)cdr<value>(car(l)) : cadr<value>(car(l))));
         return elementToValueGroupValues(g, cdr(l));
     }
-    const value g = mklist<value>(car<value>(v), cons<value>(cdr<value>(v), 
(list<value>)cadr<value>(car(l))));
+    const value g = mklist<value>(car<value>(v), 
cons<value>(isList(cadr<value>(v))? (value)cdr<value>(v) : cadr<value>(v), 
(list<value>)cadr<value>(car(l))));
     return elementToValueGroupValues(g, cdr(l));
 
 }

Modified: tuscany/sca-cpp/trunk/kernel/xml-test.cpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/kernel/xml-test.cpp?rev=1294006&r1=1294005&r2=1294006&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/kernel/xml-test.cpp (original)
+++ tuscany/sca-cpp/trunk/kernel/xml-test.cpp Mon Feb 27 03:26:51 2012
@@ -73,6 +73,35 @@ const string customerXML =
 " </account>\n"
 "</customer>\n";
 
+const string abcXML =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<a>\n"
+" <m>abc</m>\n"
+" <m>def</m>\n"
+" <m>xyz</m>\n"
+" <m>tuv</m>\n"
+"</a>\n";
+
+const string xyzXML =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<a>\n"
+" <m>\n"
+"  <id>123</id>\n"
+"  <name>abc</name>\n"
+" </m>\n"
+" <m>\n"
+"  <id>234</id>\n"
+"  <name>def</name>\n"
+" </m>\n"
+" <m>\n"
+"  <id>345</id>\n"
+"  <name>xyz</name>\n"
+" </m>\n"
+" <m>\n"
+"  <id>456</id>\n"
+"  <name>tuv</name>\n"
+" </m>\n"
+"</a>\n";
 
 const bool isName(const value& token) {
     return isTaggedList(token, attribute) && attributeName(token) == "name";
@@ -145,6 +174,24 @@ bool testElements() {
         }
     }
     {
+        istringstream is(abcXML);
+        const list<value> c = readXML(streamList(is));
+        const list<value> v = elementsToValues(c);
+        const list<value> e = valuesToElements(v);
+        ostringstream os;
+        writeXML<ostream*>(xmlWriter, &os, e);
+        assert(str(os) == abcXML);
+    }
+    {
+        istringstream is(xyzXML);
+        const list<value> c = readXML(streamList(is));
+        const list<value> v = elementsToValues(c);
+        const list<value> e = valuesToElements(v);
+        ostringstream os;
+        writeXML<ostream*>(xmlWriter, &os, e);
+        assert(str(os) == xyzXML);
+    }
+    {
         istringstream is(customerXML);
         const list<value> c = readXML(streamList(is));
         const list<value> v = elementsToValues(c);

Modified: tuscany/sca-cpp/trunk/kernel/xml.hpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/kernel/xml.hpp?rev=1294006&r1=1294005&r2=1294006&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/kernel/xml.hpp (original)
+++ tuscany/sca-cpp/trunk/kernel/xml.hpp Mon Feb 27 03:26:51 2012
@@ -253,7 +253,7 @@ const char* encoding = "UTF-8";
 const list<value> expandElementValues(const value& n, const list<value>& l) {
     if (isNil(l))
         return l;
-    return cons<value>(value(cons<value>(element, cons<value>(n, 
(list<value>)car(l)))), expandElementValues(n, cdr(l)));
+    return cons<value>(value(cons<value>(element, cons<value>(n, 
isList(car(l))? (list<value>)car(l) : mklist(car(l))))), expandElementValues(n, 
cdr(l)));
 }
 
 const failable<bool> writeList(const list<value>& l, const xmlTextWriterPtr 
xml) {

Modified: tuscany/sca-cpp/trunk/modules/json/json-test.cpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/json/json-test.cpp?rev=1294006&r1=1294005&r2=1294006&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/json/json-test.cpp (original)
+++ tuscany/sca-cpp/trunk/modules/json/json-test.cpp Mon Feb 27 03:26:51 2012
@@ -66,6 +66,13 @@ const string jsecho("{\n"
     " }\n"
     "}");
 
+const string jsarray("{\n"
+    " \"fruit\": [\n"
+    "  \"Apple\",\n"
+    "  \"Orange\"\n"
+    " ]\n"
+    "}");
+
 bool testJSON() {
     const js::JSContext cx;
 
@@ -107,6 +114,17 @@ bool testJSON() {
         const list<value> r = elementsToValues(content(readJSON(il, cx)));
         assert(r == l);
     }
+    {
+        const list<value> l = mklist<value>((list<value>() + "fruit" + 
string("Apple")), (list<value>() + "fruit" + string("Orange")));
+        ostringstream wos;
+        write(content(writeJSON(valuesToElements(l), cx)), wos);
+        assert(str(wos) == jsarray);
+
+        istringstream is(str(wos));
+        const list<string> il = streamList(is);
+        const list<value> r = elementsToValues(content(readJSON(il, cx)));
+        assert(r == l);
+    }
     return true;
 }
 

Modified: tuscany/sca-cpp/trunk/modules/json/json.hpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/json/json.hpp?rev=1294006&r1=1294005&r2=1294006&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/json/json.hpp (original)
+++ tuscany/sca-cpp/trunk/modules/json/json.hpp Mon Feb 27 03:26:51 2012
@@ -122,7 +122,7 @@ template<typename R> const failable<R> w
  * Convert a list of values to a list of strings representing a JSON document.
  */
 const failable<list<string> > writeJSON(const list<value>& l, const 
js::JSContext& cx) {
-    const failable<list<string> > ls = writeJSON<list<string>>(rcons<string>, 
list<string>(), l, cx);
+    const failable<list<string> > ls = writeJSON<list<string>>(rcons<string>, 
list<string>(), valuesToElements(elementsToValues(l)), cx);
     if (!hasContent(ls))
         return ls;
     return reverse(list<string>(content(ls)));


Reply via email to