#250503: Make sure the String format of a message is still available even if the text forms a valid version of JSON
1.1 --- a/json-tck/src/main/java/net/java/html/json/tests/JSONTest.java Mon Jan 26 19:56:12 2015 +0100
1.2 +++ b/json-tck/src/main/java/net/java/html/json/tests/JSONTest.java Wed Feb 18 19:14:14 2015 +0100
1.3 @@ -160,6 +160,12 @@
1.4 onCallback = BrwsrCtx.findDefault(model.getClass());
1.5 }
1.6
1.7 + @OnReceive(url="{url}")
1.8 + static void fetchPlain(JSONik model, String p) {
1.9 + onCallback = BrwsrCtx.findDefault(model.getClass());
1.10 + model.setFetchedResponse(p);
1.11 + }
1.12 +
1.13 @OnReceive(url="{url}", onError = "setMessage")
1.14 static void fetchArray(JSONik model, Person[] p) {
1.15 model.setFetchedCount(p.length);
1.16 @@ -214,6 +220,64 @@
1.17 assert ctx == onCallback;
1.18 }
1.19
1.20 + @KOTest public void loadAndParsePlainText() throws Exception {
1.21 + if (js == null) {
1.22 + url = Utils.prepareURL(
1.23 + JSONTest.class, "{'firstName': 'Sitar', 'sex': 'MALE'}",
1.24 + "text/plain"
1.25 + );
1.26 + js = Models.bind(new JSONik(), ctx = newContext());
1.27 + js.applyBindings();
1.28 +
1.29 + js.setFetched(null);
1.30 + js.fetchPlain(url);
1.31 + }
1.32 +
1.33 + String s = js.getFetchedResponse();
1.34 + if (s == null) {
1.35 + throw new InterruptedException();
1.36 + }
1.37 +
1.38 + assert s.contains("Sitar") : "The text contains Sitar value: " + s;
1.39 + assert s.contains("MALE") : "The text contains MALE value: " + s;
1.40 +
1.41 + Person p = Models.parse(ctx, Person.class, new ByteArrayInputStream(s.getBytes()));
1.42 +
1.43 + assert "Sitar".equals(p.getFirstName()) : "Expecting Sitar: " + p.getFirstName();
1.44 + assert Sex.MALE.equals(p.getSex()) : "Expecting MALE: " + p.getSex();
1.45 +
1.46 + assert ctx == onCallback;
1.47 + }
1.48 +
1.49 + @KOTest public void loadAndParsePlainTextOnArray() throws Exception {
1.50 + if (js == null) {
1.51 + url = Utils.prepareURL(
1.52 + JSONTest.class, "[ {'firstName': 'Sitar', 'sex': 'MALE'} ]",
1.53 + "text/plain"
1.54 + );
1.55 + js = Models.bind(new JSONik(), ctx = newContext());
1.56 + js.applyBindings();
1.57 +
1.58 + js.setFetched(null);
1.59 + js.fetchPlain(url);
1.60 + }
1.61 +
1.62 + String s = js.getFetchedResponse();
1.63 + if (s == null) {
1.64 + throw new InterruptedException();
1.65 + }
1.66 +
1.67 + assert s.contains("Sitar") : "The text contains Sitar value: " + s;
1.68 + assert s.contains("MALE") : "The text contains MALE value: " + s;
1.69 +
1.70 + Person p = Models.parse(ctx, Person.class, new ByteArrayInputStream(s.getBytes()));
1.71 +
1.72 + assert "Sitar".equals(p.getFirstName()) : "Expecting Sitar: " + p.getFirstName();
1.73 + assert Sex.MALE.equals(p.getSex()) : "Expecting MALE: " + p.getSex();
1.74 +
1.75 + assert ctx == onCallback;
1.76 + }
1.77 +
1.78 @OnReceive(url="{url}?callme={me}", jsonp = "me")
1.79 static void fetchViaJSONP(JSONik model, Person p) {
1.80 model.setFetched(p);
2.1 --- a/ko4j/src/main/java/org/netbeans/html/ko4j/KOTransfer.java Mon Jan 26 19:56:12 2015 +0100
2.2 +++ b/ko4j/src/main/java/org/netbeans/html/ko4j/KOTransfer.java Wed Feb 18 19:14:14 2015 +0100
2.3 @@ -65,6 +65,9 @@
2.4
2.5 @Override
2.6 public void extract(Object obj, String[] props, Object[] values) {
2.7 + if (obj instanceof JSObjToStr) {
2.8 + obj = ((JSObjToStr)obj).obj;
2.9 + }
2.10 LoadJSON.extractJSON(obj, props, values);
2.11 }
2.12
2.13 @@ -101,4 +104,37 @@
2.14 }
2.15 return LoadJSON.parse(sb.toString());
2.16 }
2.17 +
2.18 + static void notifySuccess(Object done, Object str, Object data) {
2.19 + Object notifyObj;
2.20 + if (data instanceof Object[]) {
2.21 + Object[] arr = (Object[]) data;
2.22 + for (int i = 0; i < arr.length; i++) {
2.23 + arr[i] = new JSObjToStr(str, arr[i]);
2.24 + }
2.25 + notifyObj = arr;
2.26 + } else {
2.27 + notifyObj = new JSObjToStr(str, data);
2.28 + }
2.29 + ((JSONCall)done).notifySuccess(notifyObj);
2.30 + }
2.31 +
2.32 + static void notifyError(Object done, Object msg) {
2.33 + ((JSONCall)done).notifyError(new Exception(msg.toString()));
2.34 + }
2.35 +
2.36 + private static final class JSObjToStr {
2.37 + final String str;
2.38 + final Object obj;
2.39 +
2.40 + public JSObjToStr(Object str, Object obj) {
2.41 + this.str = str == null ? "" : str.toString();
2.42 + this.obj = obj;
2.43 + }
2.44 +
2.45 + @Override
2.46 + public String toString() {
2.47 + return str;
2.48 + }
2.49 + }
2.50 }
3.1 --- a/ko4j/src/main/java/org/netbeans/html/ko4j/LoadJSON.java Mon Jan 26 19:56:12 2015 +0100
3.2 +++ b/ko4j/src/main/java/org/netbeans/html/ko4j/LoadJSON.java Wed Feb 18 19:14:14 2015 +0100
3.3 @@ -166,17 +166,17 @@
3.4 + " if (request.readyState !== 4) return;\n"
3.5 + " var r = request.response || request.responseText;\n"
3.6 + " try {\n"
3.7 + + " var str = r;\n"
3.8 + " if (request.status !== 0)\n"
3.9 + " if (request.status < 100 || request.status >= 400) throw request.status + ': ' + request.statusText;"
3.10 + " try { r = eval('(' + r + ')'); } catch (ignore) { }"
3.11 - + " done.@org.netbeans.html.json.spi.JSONCall::notifySuccess(Ljava/lang/Object;)(r);\n"
3.12 + + " @org.netbeans.html.ko4j.KOTransfer::notifySuccess(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)(done, str, r);\n"
3.13 + " } catch (error) {;\n"
3.14 - + " @org.netbeans.html.ko4j.LoadJSON::notifyError(Ljava/lang/Object;Ljava/lang/Object;)(done, error);\n"
3.15 + + " @org.netbeans.html.ko4j.KOTransfer::notifyError(Ljava/lang/Object;Ljava/lang/Object;)(done, error);\n"
3.16 + " }\n"
3.17 + "};\n"
3.18 + "request.onerror = function (e) {\n"
3.19 - + " console.log('error loading :' + url + ' props: ' + Object.getOwnPropertyNames(e));\n"
3.20 - + " @org.netbeans.html.ko4j.LoadJSON::notifyError(Ljava/lang/Object;Ljava/lang/Object;)(done, e);\n"
3.21 + + " @org.netbeans.html.ko4j.KOTransfer::notifyError(Ljava/lang/Object;Ljava/lang/Object;)(done, e.type + ' status ' + request.status);\n"
3.22 + "}\n"
3.23 + "if (data) request.send(data);"
3.24 + "else request.send();"
3.25 @@ -186,10 +186,6 @@
3.26 ) {
3.27 }
3.28
3.29 - static void notifyError(Object done, Object msg) {
3.30 - ((JSONCall)done).notifyError(new Exception(msg.toString()));
3.31 - }
3.32 -
3.33 @JavaScriptBody(args = {"url", "jsonp"}, body
3.34 = "var scrpt = window.document.createElement('script');\n "
3.35 + "scrpt.setAttribute('src', url);\n "
4.1 --- a/src/main/javadoc/overview.html Mon Jan 26 19:56:12 2015 +0100
4.2 +++ b/src/main/javadoc/overview.html Wed Feb 18 19:14:14 2015 +0100
4.3 @@ -75,6 +75,10 @@
4.4 yet the application code can be written in Java.
4.5 </p>
4.6
4.7 + <h3>What's Been Improved in Version 1.2?</h3>
4.8 +
4.9 + Bugfix of issue <a target="_blank" href='https://netbeans.org/bugzilla/show_bug.cgi?id=250503'>250503</a>.
4.10 +
4.11 <h3>What's New in Version 1.1?</h3>
4.12
4.13 <p>