# HG changeset patch # User Jaroslav Tulach # Date 1461341589 -7200 # Node ID 58596208d06df66329dd12815574f8e15d7b4b44 # Parent 6a59fdb91011ffe1256e4c370b780b1b33b40675 Exchanging messages over WebSockets in the default desktop client diff -r 6a59fdb91011 -r 58596208d06d chat/client/src/main/java/org/apidesign/demo/chat/ChatClient.java --- a/chat/client/src/main/java/org/apidesign/demo/chat/ChatClient.java Fri Apr 22 08:58:08 2016 +0200 +++ b/chat/client/src/main/java/org/apidesign/demo/chat/ChatClient.java Fri Apr 22 18:13:09 2016 +0200 @@ -57,21 +57,23 @@ Message msg = new Message(); msg.setUser(m.getUser()); msg.setComment(m.getComment()); - m.socket(m.getUrl(), new Query().assignPost(msg)); + m.socket(m.getUrl(), new Query().requestPost(msg)); } static void cantChat(ChatModel model, Exception err) { model.getMsgs().add(new Message("System", err.getMessage(), 0)); } - @OnReceive(url = "{url}/chat", method = "WebSocket", data = Query.class, onError = "cantChat") static void socket(ChatModel m, Reply reply) { if (reply == null) { m.getMsgs().add(new Message("System", "Connected to server at " + m.getUrl() + "/chat!", 0)); + m.socket(m.getUrl(), new Query().requestAll(true).requestPost(null)); return; } - m.getMsgs().clear(); + if (reply.isAll()) { + m.getMsgs().clear(); + } m.getMsgs().addAll(reply.getMessages()); } diff -r 6a59fdb91011 -r 58596208d06d chat/server/src/main/java/org/apidesign/demo/chat/server/ChatServerResource.java --- a/chat/server/src/main/java/org/apidesign/demo/chat/server/ChatServerResource.java Fri Apr 22 08:58:08 2016 +0200 +++ b/chat/server/src/main/java/org/apidesign/demo/chat/server/ChatServerResource.java Fri Apr 22 18:13:09 2016 +0200 @@ -26,12 +26,16 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.logging.Logger; import net.java.html.BrwsrCtx; import net.java.html.json.Models; import org.apidesign.demo.chat.shared.Message; import org.apidesign.demo.chat.shared.Query; +import org.apidesign.demo.chat.shared.Reply; +import org.glassfish.grizzly.websockets.DataFrame; import org.glassfish.grizzly.websockets.WebSocket; import org.glassfish.grizzly.websockets.WebSocketApplication; @@ -50,8 +54,8 @@ } + private final Set connected = new HashSet<>(); /* - private final Map awaiting = new IdentityHashMap<>(); @Produces(MediaType.APPLICATION_JSON) @GET public synchronized void getResources( @@ -70,38 +74,45 @@ awaiting.put(ar, since); } } - - private void handleAwaiting(long newest) { + */ + private void handleAwaiting(Message msg) { assert Thread.holdsLock(this); - AGAIN: for (;;) { - for (Map.Entry entry : awaiting.entrySet()) { - AsyncResponse ar = entry.getKey(); - Long since = entry.getValue(); - if (since <= newest) { - awaiting.remove(ar); - getResources(since, ar); - continue AGAIN; - } - } - return; + Reply reply = new Reply(); + reply.getMessages().add(msg); + String txt = reply.toString(); + for (WebSocket webSocket : connected) { + webSocket.send(txt); } } - - @POST @Consumes(value = MediaType.APPLICATION_JSON) - public synchronized Message publish(Message msg) { + + private synchronized Message publish(Message msg) { msg.setSince(System.currentTimeMillis() - started); msgs.add(msg); - handleAwaiting(msg.getSince()); + handleAwaiting(msg); return msg; } -*/ + + @Override + public void onConnect(WebSocket socket) { + connected.add(socket); + } + + @Override + public void onClose(WebSocket socket, DataFrame frame) { + connected.remove(socket); + } @Override public void onMessage(WebSocket socket, String text) { try { ByteArrayInputStream is = new ByteArrayInputStream(text.getBytes("UTF-8")); Query q = Models.parse(BrwsrCtx.findDefault(ChatServerResource.class), Query.class, is); - super.onMessage(socket, text); + if (q.getPost() != null) { + publish(q.getPost()); + } + if (q.isAll()) { + socket.send(new Reply(true, msgs.toArray(new Message[0])).toString()); + } } catch (IOException ex) { throw new IllegalStateException(ex); } diff -r 6a59fdb91011 -r 58596208d06d chat/shared/src/main/java/org/apidesign/demo/chat/shared/MessageImpl.java --- a/chat/shared/src/main/java/org/apidesign/demo/chat/shared/MessageImpl.java Fri Apr 22 08:58:08 2016 +0200 +++ b/chat/shared/src/main/java/org/apidesign/demo/chat/shared/MessageImpl.java Fri Apr 22 18:13:09 2016 +0200 @@ -51,15 +51,15 @@ return delta + "min"; } - @Model(className = "Query", builder = "assign", properties = { - @Property(name = "since", type = int.class), + @Model(className = "Query", builder = "request", properties = { + @Property(name = "all", type = boolean.class), @Property(name = "post", type = Message.class), }) class QueryCntrl { } @Model(className = "Reply", properties = { - @Property(name = "since", type = int.class), + @Property(name = "all", type = boolean.class), @Property(name = "messages", type = Message.class, array = true) }) class ReplyCntrl {