Convert wild characters to something more sane model
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Wed, 03 Apr 2013 10:20:17 +0200
branchmodel
changeset 920e2977ec1ef6e
parent 919 166924de6454
child 921 cd0a40987abb
Convert wild characters to something more sane
javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/ConvertTypes.java
javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java
javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/JSONTest.java
     1.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/ConvertTypes.java	Wed Apr 03 10:04:24 2013 +0200
     1.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/ConvertTypes.java	Wed Apr 03 10:20:17 2013 +0200
     1.3 @@ -50,6 +50,22 @@
     1.4          throw new IllegalStateException("Value " + ret + " is not of type " + modelClass);
     1.5      }
     1.6      
     1.7 +    public static String toJSON(Object value) {
     1.8 +        if (value == null) {
     1.9 +            return "null";
    1.10 +        }
    1.11 +        if (value instanceof String) {
    1.12 +            return '"' + 
    1.13 +                ((String)value).
    1.14 +                    replace("\"", "\\\"").
    1.15 +                    replace("\n", "\\n").
    1.16 +                    replace("\r", "\\r").
    1.17 +                    replace("\t", "\\t")
    1.18 +                + '"';
    1.19 +        }
    1.20 +        return value.toString();
    1.21 +    }
    1.22 +    
    1.23      @JavaScriptBody(args = { "object", "property" },
    1.24          body = "if (property === null) return object;\n"
    1.25          + "var p = object[property]; return p ? p : null;"
     2.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java	Wed Apr 03 10:04:24 2013 +0200
     2.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java	Wed Apr 03 10:20:17 2013 +0200
     2.3 @@ -777,9 +777,8 @@
     2.4          for (Property p : props) {
     2.5              w.write(sep);
     2.6              w.append("    sb.append(\"" + p.name() + ": \");\n");
     2.7 -            w.append("    sb.append('\"');");
     2.8 -            w.append("    sb.append(prop_").append(p.name()).append(");\n");
     2.9 -            w.append("    sb.append('\"');");
    2.10 +            w.append("    sb.append(org.apidesign.bck2brwsr.htmlpage.ConvertTypes.toJSON(prop_");
    2.11 +            w.append(p.name()).append("));\n");
    2.12              sep =    "    sb.append(',');\n";
    2.13          }
    2.14          w.write("    sb.append('}');\n");
     3.1 --- a/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/JSONTest.java	Wed Apr 03 10:04:24 2013 +0200
     3.2 +++ b/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/JSONTest.java	Wed Apr 03 10:20:17 2013 +0200
     3.3 @@ -54,5 +54,28 @@
     3.4          assertEquals(o.getString("sex"), "MALE");
     3.5      }
     3.6      
     3.7 +    @Test public void personWithWildCharactersAndNulls() throws JSONException {
     3.8 +        Person p = new Person();
     3.9 +        p.setFirstName("'\"\n");
    3.10 +        p.setLastName("\t\r\u0002");
    3.11 +        
    3.12 +        JSONTokener t = new JSONTokener(p.toString());
    3.13 +        JSONObject o;
    3.14 +        try {
    3.15 +            o = new JSONObject(t);
    3.16 +        } catch (JSONException ex) {
    3.17 +            throw new AssertionError("Can't parse " + p.toString(), ex);
    3.18 +        }
    3.19 +        
    3.20 +        Iterator it = o.sortedKeys();
    3.21 +        assertEquals(it.next(), "firstName");
    3.22 +        assertEquals(it.next(), "lastName");
    3.23 +        assertEquals(it.next(), "sex");
    3.24 +        
    3.25 +        assertEquals(o.getString("firstName"), p.getFirstName());
    3.26 +        assertEquals(o.getString("lastName"), p.getLastName());
    3.27 +        assertEquals(o.get("sex"), JSONObject.NULL);
    3.28 +    }
    3.29 +    
    3.30      
    3.31  }