/sub-projects/jquery-stream-play/trunk/app/controllers/Application.java

http://jquery-stream.googlecode.com/ · Java · 98 lines · 65 code · 22 blank · 11 comment · 6 complexity · 4a9d55834113b190308f89a68c8c7426 MD5 · raw file

  1. package controllers;
  2. import java.util.Arrays;
  3. import java.util.LinkedHashMap;
  4. import java.util.Map;
  5. import play.data.parsing.UrlEncodedParser;
  6. import play.libs.Codec;
  7. import play.libs.F.Either;
  8. import play.libs.F.EventStream;
  9. import play.libs.F.Matcher;
  10. import play.libs.F.Promise;
  11. import play.mvc.Controller;
  12. import play.mvc.Http.WebSocketClose;
  13. import play.mvc.Http.WebSocketEvent;
  14. import play.mvc.WebSocketController;
  15. import com.google.gson.Gson;
  16. public class Application extends Controller {
  17. final static EventStream<String> eventStream = new EventStream<String>();
  18. public static void index() {
  19. render();
  20. }
  21. public static void open() {
  22. // Content-Type header
  23. response.contentType = "text/plain";
  24. response.writeChunk(
  25. // Id
  26. Codec.UUID() + ";" +
  27. // Padding
  28. Arrays.toString(new float[200]).replaceAll(".", " ") + ";");
  29. while (true) {
  30. try {
  31. // Waits until a message arrives
  32. String message = await(eventStream.nextEvent());
  33. // default message format is message-size ; message-data ;
  34. response.writeChunk(message.length() + ";" + message + ";");
  35. } catch (Exception e) {
  36. break;
  37. }
  38. }
  39. }
  40. public static void handle(Map<String, String> metadata, String username, String message) {
  41. if ("close".equals(metadata.get("type"))) {
  42. return;
  43. }
  44. // send-request
  45. doHandle(username, message);
  46. }
  47. public static class WebSocket extends WebSocketController {
  48. public static void open() {
  49. while (inbound.isOpen()) {
  50. Either<WebSocketEvent, String> either = await(Promise.waitEither(
  51. inbound.nextEvent(), eventStream.nextEvent()));
  52. // EventStream
  53. for (String message : Matcher.ClassOf(String.class).match(either._2)) {
  54. outbound.send(message);
  55. }
  56. // WebSocketEvent - message
  57. for (String message : WebSocketEvent.TextFrame.match(either._1)) {
  58. // Parses query string
  59. Map<String, String[]> params = UrlEncodedParser.parse(message);
  60. doHandle(params.get("username")[0], params.get("message")[0]);
  61. }
  62. // WebSocketEvent - close
  63. for (WebSocketClose closed : WebSocketEvent.SocketClosed.match(either._1)) {
  64. disconnect();
  65. }
  66. }
  67. }
  68. }
  69. // Request handler
  70. static void doHandle(String username, String message) {
  71. Map<String, String> data = new LinkedHashMap<String, String>();
  72. data.put("username", username);
  73. data.put("message", message);
  74. eventStream.publish(new Gson().toJson(data));
  75. }
  76. }