THRIFT-1202 Malformed JSON for map<string,type> services parameters
Patch: Henrique Mendonca


git-svn-id: https://svn.apache.org/repos/asf/thrift/trunk@1135763 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/java/test/org/apache/thrift/server/ServerTestBase.java b/lib/java/test/org/apache/thrift/server/ServerTestBase.java
index 802aed9..13a8be6 100644
--- a/lib/java/test/org/apache/thrift/server/ServerTestBase.java
+++ b/lib/java/test/org/apache/thrift/server/ServerTestBase.java
@@ -38,13 +38,7 @@
 import org.apache.thrift.transport.TSocket;
 import org.apache.thrift.transport.TTransport;
 
-import thrift.test.Insanity;
-import thrift.test.Numberz;
-import thrift.test.ThriftTest;
-import thrift.test.Xception;
-import thrift.test.Xception2;
-import thrift.test.Xtruct;
-import thrift.test.Xtruct2;
+import thrift.test.*;
 
 public abstract class ServerTestBase extends TestCase {
 
@@ -104,15 +98,14 @@
   
     public Map<Integer,Integer> testMap(Map<Integer,Integer> thing) {
       System.out.print("testMap({");
-      boolean first = true;
-      for (int key : thing.keySet()) {
-        if (first) {
-          first = false;
-        } else {
-          System.out.print(", ");
-        }
-        System.out.print(key + " => " + thing.get(key));
-      }
+      System.out.print(thing);
+      System.out.print("})\n");
+      return thing;
+    }
+
+    public Map<String,String> testStringMap(Map<String,String> thing) {
+      System.out.print("testStringMap({");
+      System.out.print(thing);
       System.out.print("})\n");
       return thing;
     }
diff --git a/lib/js/test/test.html b/lib/js/test/test.html
index 505991f..bd124af 100644
--- a/lib/js/test/test.html
+++ b/lib/js/test/test.html
@@ -43,15 +43,16 @@
     var protocol  = new Thrift.Protocol(transport);
     var client    = new ThriftTest.ThriftTestClient(protocol);
 
+    // all Languages in UTF-8
+    var stringTest = "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語";
+
 
     module("Base Types");
-    
+
     test("Void", function() {
       equals(client.testVoid(), undefined);
     });
     test("String", function() {
-      // all Languages in UTF-8
-      var stringTest = "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語";
       equals(client.testString(stringTest), stringTest);
 
       var specialCharacters = 'quote: \" backslash:' +
@@ -117,20 +118,30 @@
       
       equals(JSON.stringify(nestTestOutput), JSON.stringify(nestTestInput))
     });
-    
+
     test("Map", function() {
       var mapTestInput = {7:77, 8:88, 9:99};
 
       var mapTestOutput = client.testMap(mapTestInput)
-      
+
       for (var key in mapTestOutput) {
         equals(mapTestOutput[key], mapTestInput[key]);
       }
-
-      //HACK: content is OK but Java server returns JSON items in the wrong order {"8":88,"9":99,"7":77}
-      //equals(JSON.stringify(mapTestOutput), JSON.stringify(mapTestInput))
     });
-    
+
+    test("StringMap", function() {
+      var mapTestInput = {
+        "a":"123", "a b":"with spaces ", "same":"same", "0":"numeric key",
+        "longValue":stringTest, stringTest:"long key"
+      };
+
+      var mapTestOutput = client.testStringMap(mapTestInput)
+
+      for (var key in mapTestOutput) {
+        equals(mapTestOutput[key], mapTestInput[key]);
+      }
+    });
+
     test("Set", function() {
       var setTestInput = new Array(1,2,3)
       ok(client.testSet(setTestInput), setTestInput);
diff --git a/lib/js/thrift.js b/lib/js/thrift.js
index c7a46fd..f4e7235 100644
--- a/lib/js/thrift.js
+++ b/lib/js/thrift.js
@@ -460,7 +460,8 @@
                 map = ',' + map;
             }
 
-            map = '"' + k + '":' + v + map;
+            if ( ! isNaN(k)) { k = '"' + k + '"'; } //json "keys" need to be strings
+            map = k + ':' + v + map;
         }
         map = '{' + map;
 
diff --git a/test/ThriftTest.thrift b/test/ThriftTest.thrift
index da2aaf7..b6cd939 100644
--- a/test/ThriftTest.thrift
+++ b/test/ThriftTest.thrift
@@ -129,6 +129,7 @@
   Xtruct       testStruct(1: Xtruct thing),
   Xtruct2      testNest(1: Xtruct2 thing),
   map<i32,i32> testMap(1: map<i32,i32> thing),
+  map<string,string> testStringMap(1: map<string,string> thing),
   set<i32>     testSet(1: set<i32> thing),
   list<i32>    testList(1: list<i32> thing),
   Numberz      testEnum(1: Numberz thing),