All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.simplaex.sugar.vertx.web.WebServiceVerticle Maven / Gradle / Ivy

package com.simplaex.sugar.vertx.web;

import com.google.inject.Binding;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.simplaex.bedrock.Strings;
import com.simplaex.sugar.vertx.VertxInjector;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Future;
import io.vertx.core.http.HttpServer;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.BodyHandler;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;

import java.util.Map;

import static com.simplaex.bedrock.Control.typeOf;
import static com.simplaex.bedrock.Control.type_;

@Log4j2
@RequiredArgsConstructor
public class WebServiceVerticle extends AbstractVerticle {

  private WebServiceConfig getConfig(final Injector injector) {
    try {
      return injector.getProvider(WebServiceConfig.class).get();
    } catch (final Exception exc) {
      log.warn("No config was bound in injector", exc);
      // if no config was bound
      return new WebServiceConfig() {
        @Override
        public String getWebServiceApiPrefix() {
          return "";
        }

        @Override
        public int getWebServicePort() {
          return 8080;
        }
      };
    }
  }

  @Override
  public final void start(final Future startFuture) {
    final Injector injector = VertxInjector.injector(vertx);
    final WebServiceConfig config = getConfig(injector);
    final Router router = Router.router(vertx);
    router.route().handler(BodyHandler.create());
    for (Map.Entry, Binding> entry : injector.getBindings().entrySet()) {
      final Binding binding = entry.getValue();
      typeOf(binding.getProvider().get(),
        type_(WebServiceRoute.class, route -> {
          route.handles().forEach(p -> {
            final String path = config.getWebServiceApiPrefix() + p;
            log.info("Registering route {} on {}", path, route.getClass());
            router.route(path).handler(route);
          });
          route.redirects().forEach((from, to) -> {
            final String pathFrom = config.getWebServiceApiPrefix() + from;
            final String pathTo = config.getWebServiceApiPrefix() + to;
            log.info("Registering redirect from {} to {}", pathFrom, pathTo);
            final Strings.Template template = Strings.template(":([a-zA-Z](_?[a-zA-Z0-9]+))*", pathTo);
            router.get(pathFrom).handler(context -> {
              final String path = template.apply(k -> context.request().getParam(k.substring(1)));
              final String query = context.request().query();
              final String pathWithQuery = query == null || query.isEmpty() ? path : path + "?" + query;
              log.info("Redirecting to {}", pathWithQuery);
              RouteUtil.redirect(context, pathWithQuery);
            });
          });
        }));
    }
    final HttpServer httpServer = vertx.createHttpServer();
    httpServer.requestHandler(router).listen(config.getWebServicePort(), result -> {
      if (result.succeeded()) {
        log.info("Listening on port 8080");
        startFuture.complete();
      } else {
        log.error("Failed to start webserver", result.cause());
        startFuture.fail(result.cause());
      }
    });
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy