/tags/1.2/src/main/java/flowersinthesand/test/StreamServlet.java

http://jquery-stream.googlecode.com/ · Java · 203 lines · 166 code · 37 blank · 0 comment · 25 complexity · a26ea4eb27b6b5abd5204e8c57b23c7f MD5 · raw file

  1. package flowersinthesand.test;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import java.util.Map;
  5. import java.util.Timer;
  6. import java.util.TimerTask;
  7. import java.util.UUID;
  8. import java.util.concurrent.ConcurrentHashMap;
  9. import javax.servlet.AsyncContext;
  10. import javax.servlet.AsyncEvent;
  11. import javax.servlet.AsyncListener;
  12. import javax.servlet.ServletException;
  13. import javax.servlet.http.HttpServletRequest;
  14. import javax.servlet.http.HttpServletResponse;
  15. import org.eclipse.jetty.util.UrlEncoded;
  16. import org.eclipse.jetty.websocket.WebSocket;
  17. import org.eclipse.jetty.websocket.WebSocketServlet;
  18. public class StreamServlet extends WebSocketServlet {
  19. private static final long serialVersionUID = -7525476704378017593L;
  20. @Override
  21. protected void service(HttpServletRequest request, HttpServletResponse response)
  22. throws ServletException, IOException {
  23. if (Boolean.valueOf(request.getParameter("error"))) {
  24. response.sendError(HttpServletResponse.SC_BAD_REQUEST);
  25. } else {
  26. super.service(request, response);
  27. }
  28. }
  29. private Map<String, AsyncContext> asyncContexts = new ConcurrentHashMap<String, AsyncContext>();
  30. @Override
  31. protected void doGet(final HttpServletRequest request, HttpServletResponse response)
  32. throws ServletException, IOException {
  33. response.setCharacterEncoding("utf-8");
  34. final boolean htmlContent = Boolean.valueOf(request.getParameter("htmlContent"));
  35. response.setContentType(htmlContent ? "text/html" : "text/plain");
  36. response.setHeader("Access-Control-Allow-Origin", "*");
  37. final boolean differentFormat = Boolean.valueOf(request.getParameter("differentFormat"));
  38. final String id = UUID.randomUUID().toString();
  39. final PrintWriter writer = response.getWriter();
  40. writer.print(id);
  41. writer.print(differentFormat ? "\r\n" : ";");
  42. for (int i = 0; i < 1024; i++) {
  43. writer.print(' ');
  44. }
  45. writer.print(differentFormat ? "\r\n" : ";");
  46. writer.flush();
  47. final AsyncContext ac = request.startAsync();
  48. ac.addListener(new AsyncListener() {
  49. public void onComplete(AsyncEvent event) throws IOException {
  50. asyncContexts.remove(id);
  51. }
  52. public void onTimeout(AsyncEvent event) throws IOException {
  53. asyncContexts.remove(id);
  54. }
  55. public void onError(AsyncEvent event) throws IOException {
  56. asyncContexts.remove(id);
  57. }
  58. public void onStartAsync(AsyncEvent event) throws IOException {
  59. }
  60. });
  61. asyncContexts.put(id, ac);
  62. if (Boolean.valueOf(request.getParameter("delayOpen"))) {
  63. new Timer().schedule(new TimerTask() {
  64. @Override
  65. public void run() {
  66. writer.print("OPEN");
  67. writer.flush();
  68. }
  69. }, 100);
  70. }
  71. if (Boolean.valueOf(request.getParameter("message"))) {
  72. new Timer().schedule(new TimerTask() {
  73. @Override
  74. public void run() {
  75. if (htmlContent) {
  76. writer.print("<script>app.handle('Hello World')</script>");
  77. writer.flush();
  78. } else {
  79. sendMessage(writer, createMessage(request.getParameter("dataType")),
  80. differentFormat);
  81. }
  82. }
  83. }, 100);
  84. }
  85. if (Boolean.valueOf(request.getParameter("close"))) {
  86. ac.setTimeout(150);
  87. }
  88. }
  89. @Override
  90. protected void doPost(HttpServletRequest request, HttpServletResponse response)
  91. throws ServletException, IOException {
  92. request.setCharacterEncoding("utf-8");
  93. AsyncContext ac = asyncContexts.get(request.getParameter("metadata.id"));
  94. if (ac == null) {
  95. return;
  96. }
  97. if ("close".equals(request.getParameter("metadata.type"))) {
  98. ac.complete();
  99. return;
  100. }
  101. sendMessage(ac.getResponse().getWriter(), request.getParameter("message"));
  102. }
  103. private void sendMessage(PrintWriter writer, String message) {
  104. sendMessage(writer, message, false);
  105. }
  106. private void sendMessage(PrintWriter writer, String message, boolean differentFormat) {
  107. if (!differentFormat) {
  108. writer.print(message.length() + ";" + message + ";");
  109. } else {
  110. writer.print(message + "\r\n");
  111. }
  112. writer.flush();
  113. }
  114. @Override
  115. public WebSocket doWebSocketConnect(final HttpServletRequest request, String protocol) {
  116. return new WebSocket.OnTextMessage() {
  117. Connection connection;
  118. @Override
  119. public void onOpen(Connection connection) {
  120. this.connection = connection;
  121. if (Boolean.valueOf(request.getParameter("message"))) {
  122. try {
  123. connection.sendMessage(createMessage(request.getParameter("dataType")));
  124. } catch (IOException e) {
  125. throw new RuntimeException(e);
  126. }
  127. }
  128. if (connection.getProtocol() != null) {
  129. try {
  130. connection.sendMessage(connection.getProtocol());
  131. } catch (IOException e) {
  132. throw new RuntimeException(e);
  133. }
  134. }
  135. if (Boolean.valueOf(request.getParameter("close"))) {
  136. connection.disconnect();
  137. }
  138. }
  139. @Override
  140. public void onClose(int closeCode, String message) {
  141. }
  142. @Override
  143. public void onMessage(String data) {
  144. UrlEncoded parameters = new UrlEncoded(data);
  145. try {
  146. connection.sendMessage(parameters.getString("message"));
  147. } catch (IOException e) {
  148. throw new RuntimeException(e);
  149. }
  150. }
  151. };
  152. }
  153. private String createMessage(String dataType) {
  154. if ("text".equals(dataType)) {
  155. return "data";
  156. } else if ("json".equals(dataType)) {
  157. return "{\"data\":\"data\"}";
  158. } else if ("xml".equals(dataType)) {
  159. return "<data>data</data>";
  160. } else if ("csv".equals(dataType)) {
  161. return "data1,data2,data3";
  162. } else {
  163. return "data";
  164. }
  165. }
  166. }