All callback calls are rescheduled to browser thread automatically
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Sun, 25 Aug 2013 17:41:21 +0200
changeset 26230b03f2c82af
parent 261 58b5ca16bf59
child 263 e52df26d579b
All callback calls are rescheduled to browser thread automatically
json/src/main/java/org/apidesign/html/json/impl/JSON.java
json/src/main/java/org/apidesign/html/json/impl/ModelProcessor.java
json/src/main/java/org/apidesign/html/json/impl/PropertyBindingAccessor.java
json/src/main/java/org/apidesign/html/json/impl/RcvrJSON.java
json/src/main/java/org/apidesign/html/json/spi/JSONCall.java
json/src/main/java/org/apidesign/html/json/spi/PropertyBinding.java
ko-fx/src/main/java/org/apidesign/html/kofx/FXContext.java
ko-ws-tyrus/src/main/java/org/apidesign/html/wstyrus/TyrusContext.java
     1.1 --- a/json/src/main/java/org/apidesign/html/json/impl/JSON.java	Sun Aug 25 15:43:30 2013 +0200
     1.2 +++ b/json/src/main/java/org/apidesign/html/json/impl/JSON.java	Sun Aug 25 17:41:21 2013 +0200
     1.3 @@ -151,7 +151,7 @@
     1.4          String urlBefore, String urlAfter, String method,
     1.5          Object data
     1.6      ) {
     1.7 -        JSONCall call = PropertyBindingAccessor.createCall(callback, urlBefore, urlAfter, method, data);
     1.8 +        JSONCall call = PropertyBindingAccessor.createCall(c, callback, urlBefore, urlAfter, method, data);
     1.9          Transfer t = findTransfer(c);
    1.10          t.loadJSON(call);
    1.11      }
    1.12 @@ -159,7 +159,7 @@
    1.13          BrwsrCtx c, RcvrJSON r, String url, Object data
    1.14      ) {
    1.15          WS ws = WSImpl.create(findWSTransfer(c), r);
    1.16 -        ws.send(url, data);
    1.17 +        ws.send(c, url, data);
    1.18          return ws;
    1.19      }
    1.20      
    1.21 @@ -167,7 +167,7 @@
    1.22          private WS() {
    1.23          }
    1.24          
    1.25 -        public abstract void send(String url, Object model);
    1.26 +        public abstract void send(BrwsrCtx ctx, String url, Object model);
    1.27      }
    1.28      
    1.29      private static final class WSImpl<Socket> extends WS {
    1.30 @@ -187,13 +187,13 @@
    1.31          }
    1.32  
    1.33          @Override
    1.34 -        public void send(String url, Object data) {
    1.35 +        public void send(BrwsrCtx ctx, String url, Object data) {
    1.36              Socket s = socket;
    1.37              if (s == null) {
    1.38                  if (data != null) {
    1.39                      throw new IllegalStateException("WebSocket is not opened yet. Call with null data, was: " + data);
    1.40                  }
    1.41 -                JSONCall call = PropertyBindingAccessor.createCall(rcvr, url, null, "WebSocket", null);
    1.42 +                JSONCall call = PropertyBindingAccessor.createCall(ctx, rcvr, url, null, "WebSocket", null);
    1.43                  socket = trans.open(url, call);
    1.44                  prevURL = url;
    1.45                  return;
    1.46 @@ -209,7 +209,7 @@
    1.47                      + " Close the socket by calling it will null data first!"
    1.48                  );
    1.49              }
    1.50 -            JSONCall call = PropertyBindingAccessor.createCall(rcvr, prevURL, null, "WebSocket", data);
    1.51 +            JSONCall call = PropertyBindingAccessor.createCall(ctx, rcvr, prevURL, null, "WebSocket", data);
    1.52              trans.send(s, call);
    1.53          }
    1.54          
     2.1 --- a/json/src/main/java/org/apidesign/html/json/impl/ModelProcessor.java	Sun Aug 25 15:43:30 2013 +0200
     2.2 +++ b/json/src/main/java/org/apidesign/html/json/impl/ModelProcessor.java	Sun Aug 25 17:41:21 2013 +0200
     2.3 @@ -1155,7 +1155,7 @@
     2.4          body.append("= org.apidesign.html.json.impl.JSON.openWS(context, pr,\n        ");
     2.5          body.append(urlBefore).append(", data);\n");
     2.6          body.append("    } else {\n");
     2.7 -        body.append("      this.ws_").append(e.getSimpleName()).append(".send(").append(urlBefore).append(", data);\n");
     2.8 +        body.append("      this.ws_").append(e.getSimpleName()).append(".send(context, ").append(urlBefore).append(", data);\n");
     2.9          body.append("    }\n");
    2.10          return false;
    2.11      }
     3.1 --- a/json/src/main/java/org/apidesign/html/json/impl/PropertyBindingAccessor.java	Sun Aug 25 15:43:30 2013 +0200
     3.2 +++ b/json/src/main/java/org/apidesign/html/json/impl/PropertyBindingAccessor.java	Sun Aug 25 17:41:21 2013 +0200
     3.3 @@ -20,6 +20,7 @@
     3.4   */
     3.5  package org.apidesign.html.json.impl;
     3.6  
     3.7 +import net.java.html.BrwsrCtx;
     3.8  import org.apidesign.html.json.spi.FunctionBinding;
     3.9  import org.apidesign.html.json.spi.JSONCall;
    3.10  import org.apidesign.html.json.spi.PropertyBinding;
    3.11 @@ -43,7 +44,9 @@
    3.12      protected abstract <M> PropertyBinding newBinding(PBData<M> d);
    3.13      protected abstract <M> FunctionBinding newFunction(FBData<M> d);
    3.14      protected abstract JSONCall newCall(
    3.15 -        RcvrJSON callback, String urlBefore, String urlAfter, String method, Object data);
    3.16 +        BrwsrCtx ctx, RcvrJSON callback, String urlBefore, String urlAfter,
    3.17 +        String method, Object data
    3.18 +    );
    3.19  
    3.20      
    3.21      static <M> PropertyBinding create(PBData<M> d) {
    3.22 @@ -53,8 +56,10 @@
    3.23          return DEFAULT.newFunction(d);
    3.24      }
    3.25      static JSONCall createCall(
    3.26 -        RcvrJSON callback, String urlBefore, String urlAfter, String method, Object data) {
    3.27 -        return DEFAULT.newCall(callback, urlBefore, urlAfter, method, data);
    3.28 +        BrwsrCtx ctx, RcvrJSON callback, String urlBefore, String urlAfter, 
    3.29 +        String method, Object data
    3.30 +    ) {
    3.31 +        return DEFAULT.newCall(ctx, callback, urlBefore, urlAfter, method, data);
    3.32      }
    3.33  
    3.34      public static final class PBData<M> {
     4.1 --- a/json/src/main/java/org/apidesign/html/json/impl/RcvrJSON.java	Sun Aug 25 15:43:30 2013 +0200
     4.2 +++ b/json/src/main/java/org/apidesign/html/json/impl/RcvrJSON.java	Sun Aug 25 17:41:21 2013 +0200
     4.3 @@ -57,7 +57,7 @@
     4.4          
     4.5          public <Data> void dataRead(BrwsrCtx ctx, Class<? extends Data> type, Data[] fillTheArray) {
     4.6          }
     4.7 -        
     4.8 +
     4.9          public abstract void dispatch(RcvrJSON r);
    4.10          
    4.11          public static MsgEvnt createError(final Throwable t) {
     5.1 --- a/json/src/main/java/org/apidesign/html/json/spi/JSONCall.java	Sun Aug 25 15:43:30 2013 +0200
     5.2 +++ b/json/src/main/java/org/apidesign/html/json/spi/JSONCall.java	Sun Aug 25 17:41:21 2013 +0200
     5.3 @@ -23,6 +23,7 @@
     5.4  
     5.5  import java.io.IOException;
     5.6  import java.io.OutputStream;
     5.7 +import net.java.html.BrwsrCtx;
     5.8  import org.apidesign.html.json.impl.JSON;
     5.9  import org.apidesign.html.json.impl.RcvrJSON;
    5.10  
    5.11 @@ -37,8 +38,10 @@
    5.12      private final String urlAfter;
    5.13      private final String method;
    5.14      private final Object data;
    5.15 +    private final BrwsrCtx ctx;
    5.16  
    5.17 -    JSONCall(RcvrJSON whenDone, String urlBefore, String urlAfter, String method, Object data) {
    5.18 +    JSONCall(BrwsrCtx ctx, RcvrJSON whenDone, String urlBefore, String urlAfter, String method, Object data) {
    5.19 +        this.ctx = ctx;
    5.20          this.whenDone = whenDone;
    5.21          this.urlBefore = urlBefore;
    5.22          this.urlAfter = urlAfter;
    5.23 @@ -84,19 +87,28 @@
    5.24  
    5.25      public void notifySuccess(Object result) {
    5.26          if (result == null) {
    5.27 -            RcvrJSON.MsgEvnt.createOpen().dispatch(whenDone);
    5.28 +            dispatch(RcvrJSON.MsgEvnt.createOpen());
    5.29          } else {
    5.30 -            RcvrJSON.MsgEvnt.createMessage(result).dispatch(whenDone);
    5.31 +            dispatch(RcvrJSON.MsgEvnt.createMessage(result));
    5.32          }
    5.33      }
    5.34      
    5.35      public void notifyError(Throwable error) {
    5.36          if (error == null) {
    5.37 -            RcvrJSON.MsgEvnt.createClose().dispatch(whenDone);
    5.38 +            dispatch(RcvrJSON.MsgEvnt.createClose());
    5.39          } else {
    5.40 -            RcvrJSON.MsgEvnt.createError(error).dispatch(whenDone);
    5.41 +            dispatch(RcvrJSON.MsgEvnt.createError(error));
    5.42          }
    5.43      }
    5.44 +    
    5.45 +    private void dispatch(final RcvrJSON.MsgEvnt ev) {
    5.46 +        JSON.runInBrowser(ctx, new Runnable() {
    5.47 +            @Override
    5.48 +            public void run() {
    5.49 +                ev.dispatch(whenDone);
    5.50 +            }
    5.51 +        });
    5.52 +    }
    5.53  
    5.54      public String getMessage() {
    5.55          return this.data.toString();
     6.1 --- a/json/src/main/java/org/apidesign/html/json/spi/PropertyBinding.java	Sun Aug 25 15:43:30 2013 +0200
     6.2 +++ b/json/src/main/java/org/apidesign/html/json/spi/PropertyBinding.java	Sun Aug 25 17:41:21 2013 +0200
     6.3 @@ -20,6 +20,7 @@
     6.4   */
     6.5  package org.apidesign.html.json.spi;
     6.6  
     6.7 +import net.java.html.BrwsrCtx;
     6.8  import org.apidesign.html.json.impl.PropertyBindingAccessor;
     6.9  import org.apidesign.html.json.impl.PropertyBindingAccessor.PBData;
    6.10  import org.apidesign.html.json.impl.RcvrJSON;
    6.11 @@ -50,8 +51,8 @@
    6.12              }
    6.13  
    6.14              @Override
    6.15 -            protected JSONCall newCall(RcvrJSON callback, String urlBefore, String urlAfter, String method, Object data) {
    6.16 -                return new JSONCall(callback, urlBefore, urlAfter, method, data);
    6.17 +            protected JSONCall newCall(BrwsrCtx ctx, RcvrJSON callback, String urlBefore, String urlAfter, String method, Object data) {
    6.18 +                return new JSONCall(ctx, callback, urlBefore, urlAfter, method, data);
    6.19              }
    6.20          };
    6.21      }
     7.1 --- a/ko-fx/src/main/java/org/apidesign/html/kofx/FXContext.java	Sun Aug 25 15:43:30 2013 +0200
     7.2 +++ b/ko-fx/src/main/java/org/apidesign/html/kofx/FXContext.java	Sun Aug 25 17:41:21 2013 +0200
     7.3 @@ -134,7 +134,11 @@
     7.4  
     7.5      @Override
     7.6      public void runSafe(Runnable r) {
     7.7 -        Platform.runLater(r);
     7.8 +        if (Platform.isFxApplicationThread()) {
     7.9 +            r.run();
    7.10 +        } else {
    7.11 +            Platform.runLater(r);
    7.12 +        }
    7.13      }
    7.14  
    7.15      @Override
     8.1 --- a/ko-ws-tyrus/src/main/java/org/apidesign/html/wstyrus/TyrusContext.java	Sun Aug 25 15:43:30 2013 +0200
     8.2 +++ b/ko-ws-tyrus/src/main/java/org/apidesign/html/wstyrus/TyrusContext.java	Sun Aug 25 17:41:21 2013 +0200
     8.3 @@ -24,7 +24,6 @@
     8.4  import java.net.URI;
     8.5  import java.net.URISyntaxException;
     8.6  import java.util.Iterator;
     8.7 -import javafx.application.Platform;
     8.8  import javax.websocket.ClientEndpoint;
     8.9  import javax.websocket.ContainerProvider;
    8.10  import javax.websocket.DeploymentException;
    8.11 @@ -109,24 +108,16 @@
    8.12  
    8.13          @OnMessage
    8.14          public void message(final String orig, Session s) {
    8.15 -            class R implements Runnable {
    8.16 -                Object json;
    8.17 -                public R() {
    8.18 -                    String data = orig.trim();
    8.19 -                    try {
    8.20 -                        JSONTokener tok = new JSONTokener(data);
    8.21 -                        Object obj = data.startsWith("[") ? new JSONArray(tok) : new JSONObject(tok);
    8.22 -                        json = convertToArray(obj);
    8.23 -                    } catch (JSONException ex) {
    8.24 -                        json = data;
    8.25 -                    }
    8.26 -                }
    8.27 -                @Override
    8.28 -                public void run() {
    8.29 -                    callback.notifySuccess(json);
    8.30 -                }
    8.31 +            Object json;
    8.32 +            String data = orig.trim();
    8.33 +            try {
    8.34 +                JSONTokener tok = new JSONTokener(data);
    8.35 +                Object obj = data.startsWith("[") ? new JSONArray(tok) : new JSONObject(tok);
    8.36 +                json = convertToArray(obj);
    8.37 +            } catch (JSONException ex) {
    8.38 +                json = data;
    8.39              }
    8.40 -            Platform.runLater(new R());
    8.41 +            callback.notifySuccess(json);
    8.42          }
    8.43  
    8.44          @OnError