#250503: Make sure the String format of a message is still available even if the text forms a valid version of JSON
authorJaroslav Tulach <jtulach@netbeans.org>
Wed, 18 Feb 2015 19:14:14 +0100
changeset 92950ee036959f5
parent 928 d43e9d5342dc
child 930 bf81793e4239
#250503: Make sure the String format of a message is still available even if the text forms a valid version of JSON
json-tck/src/main/java/net/java/html/json/tests/JSONTest.java
ko4j/src/main/java/org/netbeans/html/ko4j/KOTransfer.java
ko4j/src/main/java/org/netbeans/html/ko4j/LoadJSON.java
src/main/javadoc/overview.html
     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>