WebServer.java 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import java.nio.charset.*;
  2. import java.text.DateFormat;
  3. import java.text.SimpleDateFormat;
  4. import java.util.*;
  5. import java.util.concurrent.ThreadLocalRandom;
  6. import org.vertx.java.core.Handler;
  7. import org.vertx.java.core.buffer.Buffer;
  8. import org.vertx.java.core.eventbus.Message;
  9. import org.vertx.java.core.http.HttpServerRequest;
  10. import org.vertx.java.core.http.HttpServerResponse;
  11. import org.vertx.java.core.json.JsonObject;
  12. import org.vertx.java.core.json.JsonArray;
  13. import org.vertx.java.core.json.impl.Json;
  14. import org.vertx.java.platform.Verticle;
  15. public class WebServer extends Verticle implements Handler<HttpServerRequest> {
  16. private static String helloWorld = "Hello, World!";
  17. private static Buffer helloWorldBuffer = new Buffer(helloWorld);
  18. private static String helloWorldContentLength = String.valueOf(helloWorldBuffer.length());
  19. private static DateFormat DATE_FORMAT = new SimpleDateFormat("EEE, dd MMM yyyyy HH:mm:ss z");
  20. private String dateString;
  21. @Override
  22. public void start() {
  23. vertx.createHttpServer().requestHandler(WebServer.this).listen(8080);
  24. vertx.setPeriodic(1000, new Handler<Long>() {
  25. @Override
  26. public void handle(Long timerID) {
  27. formatDate();
  28. }
  29. });
  30. formatDate();
  31. }
  32. private void formatDate() {
  33. dateString = DATE_FORMAT.format(new Date());
  34. }
  35. @Override
  36. public void handle(HttpServerRequest req) {
  37. String path = req.path();
  38. switch (path) {
  39. case "/plaintext":
  40. handlePlainText(req);
  41. break;
  42. case "/json":
  43. handleJson(req);
  44. break;
  45. case "/db":
  46. handleDbMongo(req);
  47. break;
  48. case "/queries":
  49. handleQueriesMongo(req);
  50. break;
  51. default:
  52. req.response().setStatusCode(404);
  53. req.response().end();
  54. }
  55. }
  56. private void handlePlainText(HttpServerRequest req) {
  57. HttpServerResponse resp = req.response();
  58. resp.putHeader("Content-Type", "application/json; charset=UTF-8");
  59. resp.putHeader("Content-Length", helloWorldContentLength);
  60. resp.putHeader("Server", "vert.x");
  61. resp.putHeader("Date", dateString);
  62. resp.end(helloWorldBuffer);
  63. }
  64. private void handleJson(HttpServerRequest req) {
  65. String result = Json.encode(Collections.singletonMap("message", "Hello, world!"));
  66. sendResponse(req, result);
  67. }
  68. private void handleDbMongo(final HttpServerRequest req) {
  69. final Random random = ThreadLocalRandom.current();
  70. vertx.eventBus().send(
  71. "hello.persistor",
  72. new JsonObject()
  73. .putString("action", "findone")
  74. .putString("collection", "world")
  75. .putObject("matcher", new JsonObject().putNumber("id", (random.nextInt(10000) + 1))),
  76. new Handler<Message<JsonObject>>() {
  77. @Override
  78. public void handle(Message<JsonObject> reply) {
  79. JsonObject body = reply.body();
  80. if ("ok".equals(body.getString("status"))) {
  81. JsonObject world = body.getObject("result");
  82. world.removeField("_id");
  83. String result = world.encode();
  84. sendResponse(req, result);
  85. } else {
  86. System.err.println("Failed to execute query");
  87. }
  88. }
  89. });
  90. }
  91. private void handleQueriesMongo(final HttpServerRequest req) {
  92. int queriesParam = 1;
  93. try {
  94. queriesParam = Integer.parseInt(req.params().get("queries"));
  95. } catch (NumberFormatException e) {
  96. e.printStackTrace();
  97. }
  98. final MongoHandler dbh = new MongoHandler(req, queriesParam);
  99. final Random random = ThreadLocalRandom.current();
  100. for (int i = 0; i < queriesParam; i++) {
  101. vertx.eventBus().send(
  102. "hello.persistor",
  103. new JsonObject()
  104. .putString("action", "findone")
  105. .putString("collection", "world")
  106. .putObject("matcher", new JsonObject().putNumber("id", (random.nextInt(10000) + 1))),
  107. dbh);
  108. }
  109. }
  110. private class MongoHandler implements Handler<Message<JsonObject>> {
  111. private final HttpServerRequest req;
  112. private final int queries;
  113. private final JsonArray worlds;
  114. public MongoHandler(HttpServerRequest request, int queriesParam) {
  115. req = request;
  116. queries = queriesParam;
  117. worlds = new JsonArray();
  118. }
  119. @Override
  120. public void handle(Message<JsonObject> reply) {
  121. JsonObject body = reply.body();
  122. if ("ok".equals(body.getString("status"))) {
  123. body.getObject("result").removeField("_id");
  124. worlds.add(body.getObject("result"));
  125. if (worlds.size() == this.queries) {
  126. // All queries have completed; send the response.
  127. String result = worlds.encode();
  128. sendResponse(req, result);
  129. }
  130. } else {
  131. System.err.println("Failed to execute query");
  132. }
  133. }
  134. }
  135. private void sendResponse(HttpServerRequest req, String result) {
  136. int contentLength = result.getBytes(StandardCharsets.UTF_8).length;
  137. HttpServerResponse resp = req.response();
  138. resp.putHeader("Content-Type", "application/json; charset=UTF-8");
  139. resp.putHeader("Content-Length", String.valueOf(contentLength));
  140. resp.putHeader("Server", "vert.x");
  141. resp.putHeader("Date", dateString);
  142. resp.end(result);
  143. }
  144. }