VertxServer.java 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package cz.senslog.analyzer.ws.vertx;
  2. import cz.senslog.analyzer.ws.Server;
  3. import cz.senslog.analyzer.ws.handler.GroupsHandler;
  4. import cz.senslog.analyzer.ws.handler.InfoHandler;
  5. import cz.senslog.analyzer.ws.handler.StatisticsHandler;
  6. import io.vertx.core.*;
  7. import io.vertx.core.http.HttpServerResponse;
  8. import io.vertx.core.json.JsonObject;
  9. import io.vertx.ext.web.Router;
  10. import org.apache.logging.log4j.LogManager;
  11. import org.apache.logging.log4j.Logger;
  12. import javax.inject.Inject;
  13. import java.util.HashMap;
  14. import java.util.Map;
  15. import static cz.senslog.analyzer.util.StringUtils.getOrDefault;
  16. import static io.vertx.core.http.HttpHeaders.CONTENT_TYPE;
  17. public class VertxServer extends AbstractVerticle implements Server {
  18. private static final Logger logger = LogManager.getLogger(VertxServer.class);
  19. private final Map<String, AbstractRestHandler> restHandlers;
  20. @Inject
  21. public VertxServer(
  22. InfoHandler infoHandler,
  23. StatisticsHandler statisticsHandler,
  24. GroupsHandler groupsHandler
  25. ) {
  26. this.restHandlers = new HashMap<>();
  27. registerRestHandler("info", infoHandler);
  28. registerRestHandler("analytics", statisticsHandler);
  29. registerRestHandler("groups", groupsHandler);
  30. }
  31. private void registerRestHandler(String id, AbstractRestHandler handler) {
  32. id = id.charAt(0) == '/' ? id : "/" + id;
  33. restHandlers.put(id, handler);
  34. }
  35. @Override
  36. public void start(final Promise<Void> promise) {
  37. Router router = Router.router(vertx);
  38. router.route().handler(ctx -> {
  39. String origin = getOrDefault(ctx.request().getHeader("origin"), "*");
  40. ctx.response().putHeader("Access-Control-Allow-Origin", origin);
  41. ctx.next();
  42. });
  43. for (Map.Entry<String, AbstractRestHandler> handlerEntry : restHandlers.entrySet()) {
  44. router.route(handlerEntry.getKey()).subRouter(handlerEntry.getValue().start(vertx));
  45. }
  46. router.route().failureHandler(ctx -> {
  47. logger.catching(ctx.failure());
  48. HttpServerResponse response = ctx.response();
  49. response.putHeader(CONTENT_TYPE, "application/json");
  50. JsonObject error = new JsonObject()
  51. .put("timestamp", System.nanoTime())
  52. .put("message", ctx.failure().getMessage())
  53. .put("path", ctx.request().path());
  54. int code = ctx.statusCode() > 0 ? ctx.statusCode() : 400;
  55. response.setStatusCode(code).end(error.encode());
  56. });
  57. vertx.createHttpServer()
  58. .requestHandler(router)
  59. .listen(config().getInteger("http.server.port"), result -> {
  60. if (result.succeeded()) { promise.complete(); }
  61. else { promise.fail(result.cause()); }
  62. });
  63. }
  64. @Override
  65. public void stop() {
  66. this.vertx.close();
  67. }
  68. @Override
  69. public void start(int port) {
  70. vertx = Vertx.vertx();
  71. DeploymentOptions options = new DeploymentOptions().setConfig(new JsonObject()
  72. .put("http.server.port", port)
  73. );
  74. vertx.deployVerticle(this, options, res -> {
  75. if (res.succeeded()) {
  76. logger.info("Deployment id is {} ", res.result());
  77. logger.info("The HTTP server running on port {}.", port);
  78. } else {
  79. logger.error("Could not start the HTTP server: " + res.cause());
  80. }
  81. });
  82. }
  83. }