WebServer.java 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. import org.vertx.java.core.Handler;
  2. import org.vertx.java.core.buffer.Buffer;
  3. import org.vertx.java.core.eventbus.Message;
  4. import org.vertx.java.core.http.HttpServerRequest;
  5. import org.vertx.java.core.http.HttpServerResponse;
  6. import org.vertx.java.core.json.JsonArray;
  7. import org.vertx.java.core.json.JsonObject;
  8. import org.vertx.java.core.json.impl.Json;
  9. import org.vertx.java.platform.Verticle;
  10. import java.text.DateFormat;
  11. import java.text.SimpleDateFormat;
  12. import java.util.Collections;
  13. import java.util.Date;
  14. import java.util.Random;
  15. import java.util.concurrent.ThreadLocalRandom;
  16. public class WebServer extends Verticle implements Handler<HttpServerRequest> {
  17. private final Buffer helloWorldBuffer = new Buffer("Hello, World!");
  18. private final String helloWorldContentLength = String.valueOf(helloWorldBuffer.length());
  19. private final DateFormat DATE_FORMAT = new SimpleDateFormat("EEE, dd MMM yyyyy HH:mm:ss z");
  20. private String dateString;
  21. private final String PATH_PLAINTEXT = "/plaintext";
  22. private final String PATH_JSON = "/json";
  23. private final String PATH_DB = "/db";
  24. private final String PATH_QUERIES = "/queries";
  25. private final String RESPONSE_TYPE_PLAIN = "text/plain";
  26. private final String RESPONSE_TYPE_JSON = "application/json";
  27. private final String HEADER_CONTENT_TYPE = "Content-Type";
  28. private final String HEADER_CONTENT_LENGTH = "Content-Length";
  29. private final String HEADER_SERVER = "Server";
  30. private final String HEADER_SERVER_VERTX = "vert.x";
  31. private final String HEADER_DATE = "Date";
  32. private final String MONGO_ADDRESS = "hello.persistor";
  33. private final String UNDERSCORE_ID = "_id";
  34. private final String TEXT_ID = "id";
  35. private final String TEXT_RESULT = "result";
  36. private final String TEXT_QUERIES = "queries";
  37. private final String TEXT_MESSAGE = "message";
  38. private final String TEXT_ACTION = "action";
  39. private final String TEXT_FINDONE = "findone";
  40. private final String TEXT_COLLECTION = "collection";
  41. private final String TEXT_WORLD = "World";
  42. private final String TEXT_MATCHER = "matcher";
  43. @Override
  44. public void start() {
  45. vertx.createHttpServer().requestHandler(WebServer.this).listen(8080);
  46. vertx.setPeriodic(1000, new Handler<Long>() {
  47. @Override
  48. public void handle(Long timerID) {
  49. formatDate();
  50. }
  51. });
  52. formatDate();
  53. }
  54. @Override
  55. public void handle(HttpServerRequest req) {
  56. switch (req.path()) {
  57. case PATH_PLAINTEXT:
  58. handlePlainText(req);
  59. break;
  60. case PATH_JSON:
  61. handleJson(req);
  62. break;
  63. case PATH_DB:
  64. handleDbMongo(req);
  65. break;
  66. case PATH_QUERIES:
  67. handleQueriesMongo(req);
  68. break;
  69. default:
  70. req.response().setStatusCode(404);
  71. req.response().end();
  72. }
  73. }
  74. private void formatDate() {
  75. dateString = DATE_FORMAT.format(new Date());
  76. }
  77. private void handlePlainText(HttpServerRequest req) {
  78. HttpServerResponse resp = req.response();
  79. setHeaders(resp, RESPONSE_TYPE_PLAIN, helloWorldContentLength);
  80. resp.end(helloWorldBuffer);
  81. }
  82. private void handleJson(HttpServerRequest req) {
  83. Buffer buff = new Buffer(Json.encode(Collections.singletonMap(TEXT_MESSAGE, "Hello, world!")));
  84. HttpServerResponse resp = req.response();
  85. setHeaders(resp, RESPONSE_TYPE_JSON, String.valueOf(buff.length()));
  86. resp.end(buff);
  87. }
  88. private void handleDbMongo(final HttpServerRequest req) {
  89. findRandom(ThreadLocalRandom.current(), new Handler<Message<JsonObject>>() {
  90. @Override
  91. public void handle(Message<JsonObject> reply) {
  92. JsonObject world = getResultFromReply(reply);
  93. String result = world.encode();
  94. sendResponse(req, result);
  95. }
  96. });
  97. }
  98. private JsonObject getResultFromReply(Message<JsonObject> reply) {
  99. JsonObject body = reply.body();
  100. JsonObject world = body.getObject(TEXT_RESULT);
  101. Object id = world.removeField(UNDERSCORE_ID);
  102. if (id instanceof Double) {
  103. world.putValue(TEXT_ID, Integer.valueOf(((Double)id).intValue()));
  104. } else {
  105. world.putValue(TEXT_ID, id);
  106. }
  107. return world;
  108. }
  109. private void handleQueriesMongo(final HttpServerRequest req) {
  110. int queriesParam = 1;
  111. try {
  112. queriesParam = Integer.parseInt(req.params().get(TEXT_QUERIES));
  113. } catch (NumberFormatException e) {
  114. queriesParam = 1;
  115. }
  116. if (queriesParam < 1) {
  117. queriesParam = 1;
  118. } else if (queriesParam > 500) {
  119. queriesParam = 500;
  120. }
  121. final MongoHandler dbh = new MongoHandler(req, queriesParam);
  122. final Random random = ThreadLocalRandom.current();
  123. for (int i = 0; i < queriesParam; i++) {
  124. findRandom(random, dbh);
  125. }
  126. }
  127. private void findRandom(Random random, Handler<Message<JsonObject>> handler) {
  128. vertx.eventBus().send(
  129. MONGO_ADDRESS,
  130. new JsonObject()
  131. .putString(TEXT_ACTION, TEXT_FINDONE)
  132. .putString(TEXT_COLLECTION, TEXT_WORLD)
  133. .putObject(TEXT_MATCHER, new JsonObject().putNumber(UNDERSCORE_ID, (random.nextInt(10000) + 1))),
  134. handler);
  135. }
  136. private void sendResponse(HttpServerRequest req, String result) {
  137. Buffer buff = new Buffer(result);
  138. HttpServerResponse resp = req.response();
  139. setHeaders(resp, RESPONSE_TYPE_JSON, String.valueOf(buff.length()));
  140. resp.end(buff);
  141. }
  142. private void setHeaders(HttpServerResponse resp, String contentType, String contentLength) {
  143. resp.putHeader(HEADER_CONTENT_TYPE, contentType);
  144. resp.putHeader(HEADER_CONTENT_LENGTH, contentLength);
  145. resp.putHeader(HEADER_SERVER, HEADER_SERVER_VERTX );
  146. resp.putHeader(HEADER_DATE, dateString);
  147. }
  148. private class MongoHandler implements Handler<Message<JsonObject>> {
  149. private final HttpServerRequest req;
  150. private final int queries;
  151. private final JsonArray worlds;
  152. public MongoHandler(HttpServerRequest request, int queriesParam) {
  153. req = request;
  154. queries = queriesParam;
  155. worlds = new JsonArray();
  156. }
  157. @Override
  158. public void handle(Message<JsonObject> reply) {
  159. JsonObject world = getResultFromReply(reply);
  160. worlds.add(world);
  161. if (worlds.size() == this.queries) {
  162. // All queries have completed; send the response.
  163. String result = worlds.encode();
  164. sendResponse(req, result);
  165. }
  166. }
  167. }
  168. }