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

com.fiestacabin.dropwizard.guice.AutoConfigService Maven / Gradle / Ivy

package com.fiestacabin.dropwizard.guice;

import java.util.Set;

import javax.ws.rs.Path;
import javax.ws.rs.ext.Provider;

import com.yammer.dropwizard.lifecycle.Managed;
import org.reflections.Reflections;
import org.reflections.scanners.SubTypesScanner;
import org.reflections.scanners.TypeAnnotationsScanner;
import org.reflections.util.ClasspathHelper;
import org.reflections.util.ConfigurationBuilder;
import org.reflections.util.FilterBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.inject.Injector;
import com.sun.jersey.spi.inject.InjectableProvider;
import com.yammer.dropwizard.config.Configuration;
import com.yammer.dropwizard.config.Environment;
import com.yammer.dropwizard.tasks.Task;
import com.yammer.metrics.core.HealthCheck;

/**
 * Service which automatically adds items to the service environment, including
 * health checks, resources
 * 
 * @author jstehler
 * 
 */
public abstract class AutoConfigService extends
		GuiceService {
	private static final Logger LOG = LoggerFactory.getLogger(AutoConfigService.class);

	private Reflections reflections;

	protected AutoConfigService(String name, String... basePackages) {
		super(name);

		ConfigurationBuilder cfgBldr = new ConfigurationBuilder();
		FilterBuilder filterBuilder = new FilterBuilder();
		for (String basePkg : basePackages) {
			cfgBldr.addUrls(ClasspathHelper.forPackage(basePkg));
			filterBuilder.include(FilterBuilder.prefix(basePkg));
		}

		cfgBldr.filterInputsBy(filterBuilder).setScanners(
				new SubTypesScanner(), new TypeAnnotationsScanner());
		this.reflections = new Reflections(cfgBldr);
	}

	protected AutoConfigService(String basePackage) {
		this(null, basePackage);
	}

	protected AutoConfigService() {
		super(null);
		this.reflections = new Reflections(getClass().getPackage().getName(),
				new SubTypesScanner(), new TypeAnnotationsScanner());
	}

	@Override
	protected void runWithInjector(T configuration,
			Environment environment, Injector injector) throws Exception {

		addHealthChecks(environment, injector);
		addProviders(environment, injector);
		addInjectableProviders(environment, injector);
		addResources(environment, injector);
		addTasks(environment, injector);
		addManaged(environment, injector);
	}

	private void addManaged(Environment environment, Injector injector) {
		Set> managedClasses = reflections
				.getSubTypesOf(Managed.class);
		for (Class managed : managedClasses) {
			environment.manage(injector.getInstance(managed));
			LOG.info("Added managed: " + managed);
		}
	}

	private void addTasks(Environment environment, Injector injector) {
		Set> taskClasses = reflections
				.getSubTypesOf(Task.class);
		for (Class task : taskClasses) {
			environment.addTask(injector.getInstance(task));
			LOG.info("Added task: " + task);
		}
	}

	private void addHealthChecks(Environment environment, Injector injector) {
		Set> healthCheckClasses = reflections
				.getSubTypesOf(HealthCheck.class);
		for (Class healthCheck : healthCheckClasses) {
			environment.addHealthCheck(injector.getInstance(healthCheck));
			LOG.info("Added healthCheck: " + healthCheck);
		}
	}

	@SuppressWarnings("rawtypes")
	private void addInjectableProviders(Environment environment,
			Injector injector) {
		Set> injectableProviders = reflections
				.getSubTypesOf(InjectableProvider.class);
		for (Class injectableProvider : injectableProviders) {
			environment.addProvider(injector.getInstance(injectableProvider));
			LOG.info("Added injectableProvider: " + injectableProvider);
		}
	}

	private void addProviders(Environment environment, Injector injector) {
		Set> providerClasses = reflections
				.getTypesAnnotatedWith(Provider.class);
		for (Class provider : providerClasses) {
			environment.addProvider(injector.getInstance(provider));
			LOG.info("Added provider class: " + provider);
		}
	}

	private void addResources(Environment environment, Injector injector) {
		Set> resourceClasses = reflections
				.getTypesAnnotatedWith(Path.class);
		for (Class resource : resourceClasses) {
			environment.addResource(injector.getInstance(resource));
			LOG.info("Added resource class: " + resource);
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy