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

io.graceland.Platform Maven / Gradle / Ivy

package io.graceland;

import java.util.List;
import javax.servlet.FilterRegistration;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.codahale.metrics.health.HealthCheck;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;

import io.dropwizard.Bundle;
import io.dropwizard.cli.Command;
import io.dropwizard.lifecycle.Managed;
import io.dropwizard.servlets.tasks.Task;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import io.graceland.application.Application;
import io.graceland.dropwizard.Configurator;
import io.graceland.dropwizard.DropwizardModule;
import io.graceland.dropwizard.Initializer;
import io.graceland.filter.FilterPattern;
import io.graceland.filter.FilterSpec;
import io.graceland.inject.InjectorWrapper;

/**
 * The platform is the foundation for Graceland. It's where an {@link io.graceland.application.Application}
 * is ran, providing the underlying functionality using a Dropwizard service (via an {@link io.dropwizard.Application}).
 */
public class Platform extends io.dropwizard.Application {

    private static final Logger LOGGER = LoggerFactory.getLogger(Platform.class);
    private final InjectorWrapper wrapper;
    private final DropwizardModule dropwizardModule = new DropwizardModule();

    Platform(Application application) {
        Preconditions.checkNotNull(application, "Application cannot be null.");

        List modules = ImmutableList.builder()
                .addAll(application.getPlugins())
                .add(dropwizardModule)
                .build();

        Injector injector = Guice.createInjector(modules);
        this.wrapper = InjectorWrapper.wrap(injector);
    }

    /**
     * The simplest use case.
     *
     * @param application The application to use.
     * @return A working Platform.
     */
    public static Platform forApplication(Application application) {
        Preconditions.checkNotNull(application, "Application cannot be null.");
        return new Platform(application);
    }

    /**
     * Starts the platform.
     * 

* It will start up the Dropwizard service, calling {@link io.dropwizard.Application#run(String[])} with the * arguments passed in. * * @param args The command line arguments. * @throws Exception Starting up a Dropwizard service may throw an exception. */ public void start(String[] args) throws Exception { Preconditions.checkNotNull(args, "Arguments cannot be null."); run(args); } /** * Ran when the Dropwizard service initializes. This method is responsible for setting up the * {@link io.dropwizard.Bundle}s and {@link io.dropwizard.cli.Command}s. * * @param bootstrap Provided by Dropwizard. */ @Override public void initialize(Bootstrap bootstrap) { for (Initializer initializer : wrapper.getInitializers()) { initializer.initialize(bootstrap); LOGGER.debug("Registered Initializer: {}", initializer.getClass().getCanonicalName()); } for (Bundle bundle : wrapper.getBundles()) { bootstrap.addBundle(bundle); LOGGER.debug("Registered Bundle: {}", bundle.getClass().getCanonicalName()); } for (Command command : wrapper.getCommands()) { bootstrap.addCommand(command); LOGGER.debug("Registered Command: {}", command.getClass().getCanonicalName()); } } /** * Ran when the Dropwizard service starts up. This method is responsible for setting up the * {@link io.dropwizard.setup.Environment} using the bindings from the loaded * {@link io.graceland.plugin.Plugin}s. * * @param configuration Provided by Dropwizard. * @param environment Provided by Dropwizard. * @throws Exception Thrown by Dropwizard. */ @Override public void run(PlatformConfiguration configuration, Environment environment) throws Exception { dropwizardModule.setup(configuration, environment); for (Configurator configurator : wrapper.getConfigurators()) { configurator.configure(configuration, environment); LOGGER.debug("Registered Configurator: {}", configurator.getClass().getCanonicalName()); } for (Object jerseyComponent : wrapper.getJerseyComponents()) { environment.jersey().register(jerseyComponent); LOGGER.debug("Registered Jersey Component: {}", jerseyComponent.getClass().getCanonicalName()); } for (Managed managed : wrapper.getManaged()) { environment.lifecycle().manage(managed); LOGGER.debug("Registered Managed Object: {}", managed.getClass().getCanonicalName()); } for (HealthCheck healthCheck : wrapper.getHealthChecks()) { environment.healthChecks().register(healthCheck.toString(), healthCheck); LOGGER.debug("Registered Health Check: {}", healthCheck.getClass().getCanonicalName()); } for (Task task : wrapper.getTasks()) { environment.admin().addTask(task); LOGGER.debug("Registered Task: {}", task.getClass().getCanonicalName()); } for (FilterSpec filterSpec : wrapper.getFilterSpecs()) { registerFilterSpec(environment, filterSpec); LOGGER.debug("Registered Filter {}: {}", filterSpec.getName(), filterSpec.getFilter().getClass().getCanonicalName()); } } private void registerFilterSpec(Environment environment, FilterSpec filterSpec) { FilterRegistration.Dynamic dynamic = environment.servlets().addFilter( filterSpec.getName(), filterSpec.getFilter()); for (FilterPattern pattern : filterSpec.getPatterns()) { for (String urlPattern : pattern.getUrlPatterns()) { dynamic.addMappingForUrlPatterns(pattern.getDispatcherTypes(), pattern.isMatchAfter(), urlPattern); } } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy