diff -r 0e2b05057c97 -r a0f15cb8c730 chat/server/src/main/java/org/apidesign/bck2brwsr/demo/chatserver/impl/ChatServerResource.java --- a/chat/server/src/main/java/org/apidesign/bck2brwsr/demo/chatserver/impl/ChatServerResource.java Thu Aug 14 07:51:33 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,103 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (C) 2013 Jaroslav Tulach - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package org.apidesign.bck2brwsr.demo.chatserver.impl; - -import java.util.ArrayList; -import java.util.IdentityHashMap; -import java.util.List; -import java.util.Map; -import java.util.logging.Logger; -import javax.inject.Singleton; -import javax.ws.rs.Consumes; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.Suspended; -import javax.ws.rs.core.MediaType; -import org.apidesign.html.chatserver.model.Message; -import org.apidesign.html.chatserver.model.Query; - -/** Server side of the chat application.*/ -@Path("/chat/") @Singleton -public final class ChatServerResource { - private static final Logger LOG = Logger.getLogger(ChatServerResource.class.getName()); - private static final long started = System.currentTimeMillis() - 10; - - private List msgs = new ArrayList<>(); - { - Message welcome = new Message(); - welcome.setUser("system"); - welcome.setComment("Welcome and enjoy!"); - welcome.setSince(10); - msgs.add(welcome); - } - - private final Map awaiting = new IdentityHashMap<>(); - - @Produces(MediaType.APPLICATION_JSON) - @GET public synchronized void getResources( - @QueryParam("since") @DefaultValue("0") long since, - @Suspended AsyncResponse ar - ) { - Query q = new Query(); - for (Message m : msgs) { - if (m.getSince()>= since) { - q.getMessages().add(m); - } - } - if (!q.getMessages().isEmpty()) { - ar.resume(q); - } else { - awaiting.put(ar, since); - } - } - - private void handleAwaiting(long newest) { - 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; - } - } - - @POST @Consumes(value = MediaType.APPLICATION_JSON) - public synchronized Message publish(Message msg) { - msg.setSince(System.currentTimeMillis() - started); - msgs.add(msg); - handleAwaiting(msg.getSince()); - return msg; - } -}