WebServer.java 4.4 KB

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