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

org.swisspush.reststorage.RestStorageMod Maven / Gradle / Ivy

package org.swisspush.reststorage;
;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Future;
import io.vertx.core.Handler;
import io.vertx.core.Promise;
import io.vertx.core.Vertx;
import io.vertx.core.http.HttpServerOptions;
import io.vertx.core.http.HttpServerRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.swisspush.reststorage.exception.RestStorageExceptionFactory;
import org.swisspush.reststorage.redis.DefaultRedisProvider;
import org.swisspush.reststorage.redis.RedisProvider;
import org.swisspush.reststorage.redis.RedisStorage;
import org.swisspush.reststorage.s3.S3FileSystemStorage;
import org.swisspush.reststorage.util.ModuleConfiguration;

import static org.swisspush.reststorage.exception.RestStorageExceptionFactory.newRestStorageThriftyExceptionFactory;

public class RestStorageMod extends AbstractVerticle {

    private final Logger log = LoggerFactory.getLogger(RestStorageMod.class);

    private RedisProvider redisProvider;
    private final RestStorageExceptionFactory exceptionFactory;

    public RestStorageMod() {
        this.exceptionFactory = newRestStorageThriftyExceptionFactory();
    }

    public RestStorageMod(
        RedisProvider redisProvider,
        RestStorageExceptionFactory exceptionFactory
    ) {
        assert exceptionFactory != null;
        this.redisProvider = redisProvider;
        this.exceptionFactory = exceptionFactory;
    }

    @Override
    public void start(Promise promise) {
        ModuleConfiguration modConfig = ModuleConfiguration.fromJsonObject(config());
        log.info("Starting RestStorageMod with configuration: {}", modConfig);

        createStorage(modConfig).onComplete(event -> {
            if (event.failed()) {
                promise.fail(event.cause());
            } else {
                Handler handler = new RestStorageHandler(
                    vertx, log, event.result(), exceptionFactory, modConfig);

                if(modConfig.isHttpRequestHandlerEnabled()) {
                    // in Vert.x 2x 100-continues was activated per default, in vert.x 3x it is off per default.
                    HttpServerOptions options = new HttpServerOptions().setHandle100ContinueAutomatically(true);

                    vertx.createHttpServer(options).requestHandler(handler).listen(modConfig.getPort(), result -> {
                        if (result.succeeded()) {
                            new EventBusAdapter(exceptionFactory).init(vertx, modConfig.getStorageAddress(), handler);
                            promise.complete();
                        } else {
                            promise.fail(exceptionFactory.newException(
                                "vertx.HttpServer.listen(" + modConfig.getPort() + ") failed", result.cause()));
                        }
                    });
                } else {
                    new EventBusAdapter(exceptionFactory).init(vertx, modConfig.getStorageAddress(), handler);
                    promise.complete();
                }
            }
        });
    }

    private Future createStorage(ModuleConfiguration moduleConfiguration) {
        Promise promise = Promise.promise();

        switch (moduleConfiguration.getStorageType()) {
            case filesystem:
                promise.complete(new FileSystemStorage(vertx, exceptionFactory, moduleConfiguration.getRoot()));
                break;
            case s3:
                promise.complete(new S3FileSystemStorage(vertx, exceptionFactory, moduleConfiguration.getRoot(),
                        moduleConfiguration.getAwsS3Region(), moduleConfiguration.getS3BucketName(),
                        moduleConfiguration.getS3AccessKeyId(), moduleConfiguration.getS3SecretAccessKey(),
                        moduleConfiguration.getS3UseTlsConnection(), moduleConfiguration.isLocalS3(),
                        moduleConfiguration.getLocalS3Endpoint(), moduleConfiguration.getLocalS3Port(),
                        moduleConfiguration.getCreateBucketIfNotPresentYet()));
                break;
            case redis:
                createRedisStorage(vertx, moduleConfiguration).onComplete(event -> {
                    if(event.succeeded()){
                        promise.complete(event.result());
                    } else {
                        promise.fail(exceptionFactory.newException("createRedisStorage() failed", event.cause()));
                    }
                });
                break;
            default:
                promise.fail(exceptionFactory.newException("Storage not supported: " + moduleConfiguration.getStorageType()));
        }

        return promise.future();
    }

    private Future createRedisStorage(Vertx vertx, ModuleConfiguration moduleConfiguration) {
        Promise initPromise = Promise.promise();

        if(redisProvider == null) {
            redisProvider = new DefaultRedisProvider(vertx, moduleConfiguration, exceptionFactory);
        }

        redisProvider.redis().onComplete(event -> {
            if(event.succeeded()) {
                initPromise.complete(new RedisStorage(vertx, moduleConfiguration, redisProvider, exceptionFactory));
            } else {
                initPromise.fail(exceptionFactory.newException("redisProvider.redis() failed", event.cause()));
            }
        });

        return initPromise.future();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy