content: package com.github.aesteve.vertx.nubes;
  
  import io.vertx.core.AbstractVerticle;
  import io.vertx.core.Context;
  import io.vertx.core.Future;
  import io.vertx.core.Vertx;
  import io.vertx.core.http.HttpServer;
  import io.vertx.core.http.HttpServerOptions;
  import io.vertx.core.json.JsonObject;
  import io.vertx.core.logging.Logger;
  import io.vertx.core.logging.LoggerFactory;
  
  import static com.github.aesteve.vertx.nubes.utils.async.AsyncUtils.*;
  
  public class NubesServer extends AbstractVerticle {
  
    private static final Logger LOG = LoggerFactory.getLogger(NubesServer.class);
  
    protected HttpServer server;
    protected HttpServerOptions options;
    protected VertxNubes nubes;
  
    @Override
    public void init(Vertx vertx, Context context) {
      super.init(vertx, context);
      JsonObject config = context.config();
      options = new HttpServerOptions();
      options.setHost(config.getString("host", "localhost"));
      options.setPort(config.getInteger("port", 9000));
      nubes = new VertxNubes(vertx, config);
    }
  
    @Override
    public void start(Future<Void> future) {
      server = vertx.createHttpServer(options);
      nubes.bootstrap(onSuccessOnly(future, router -> {
        server.requestHandler(router::accept);
        server.listen(ignoreResult(future));
        LOG.info("Server listening on port : " + options.getPort());
      }));
    }
  
    @Override
    public void stop(Future<Void> future) {
      nubes.stop(nubesRes -> closeServer(future));
    }
  
    private void closeServer(Future<Void> future) {
      if (server != null) {
        LOG.info("Closing HTTP server");
        server.close(completeOrFail(future));
      } else {
        future.complete();
      }
    }
  
  }
  