package com.jasonclawson.dropwizardry.guice; import io.dropwizard.Bundle; import io.dropwizard.ConfiguredBundle; import io.dropwizard.lifecycle.Managed; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import com.codahale.metrics.health.HealthCheck; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.inject.AbstractModule; import com.google.inject.multibindings.MapBinder; import com.google.inject.multibindings.Multibinder; import com.google.inject.name.Names; /** * Extend this guice module to get access to come dropwizard configurations like: * - add healthchecks * - register jersey resources * - add lifecycle managed classes * * @author jclawson * */ public abstract class AbstractDropwizardModule extends AbstractModule { private final Set<Class<? extends Bundle>> bundles = Sets.newHashSet(); @SuppressWarnings("rawtypes") private final Set<Class<? extends ConfiguredBundle>> configuredBundles = Sets.newHashSet(); private final Set<Class<?>> jerseyResources = Sets.newHashSet(); private final Set<Class<? extends Managed>> managed = Sets.newHashSet(); private final Map<String, Class<? extends HealthCheck>> healthChecks = Maps.newHashMap(); private GuiceJerseyEnvironment jerseyEnvironment; private GuiceLifecycleEnvironment lifecycleEnvironment; private HealthCheckEnvironment healthCheckEnvironment; /** * Anything added here will only have their run() method called. initialize() will not be called * @param bundleClass */ protected void addBundle(Class<? extends Bundle> bundleClass) { bundles.add(bundleClass); } protected void addConfiguredBundle(@SuppressWarnings("rawtypes") Class<? extends ConfiguredBundle> bundleClass) { configuredBundles.add(bundleClass); } protected GuiceJerseyEnvironment jersey() { if(jerseyEnvironment == null) { jerseyEnvironment = new GuiceJerseyEnvironment(); } return jerseyEnvironment; } protected GuiceLifecycleEnvironment lifecycle() { if(lifecycleEnvironment == null) { lifecycleEnvironment = new GuiceLifecycleEnvironment(); } return lifecycleEnvironment; } protected HealthCheckEnvironment healthChecks() { if(healthCheckEnvironment == null) { healthCheckEnvironment = new HealthCheckEnvironment(); } return healthCheckEnvironment; } @Override protected final void configure() { configureModule(); //bind dropwizard bundles Multibinder<Bundle> engineBinder = Multibinder.newSetBinder(binder(), Bundle.class, Names.named("dw-bundles")); for(Class<? extends Bundle> bundle : bundles) { engineBinder.addBinding().to(bundle); } //bind dropwizard configured bundles @SuppressWarnings("rawtypes") Multibinder<ConfiguredBundle> configuredBundleBinder = Multibinder.newSetBinder(binder(), ConfiguredBundle.class, Names.named("dw-configured-bundles")); for(@SuppressWarnings("rawtypes") Class<? extends ConfiguredBundle> bundle : configuredBundles) { configuredBundleBinder.addBinding().to(bundle); } //bind jersey resources Multibinder<Object> jerseyBinder = Multibinder.newSetBinder(binder(), Object.class, Names.named("dw-jersey-resources")); for(Class<?> resource : jerseyResources) { jerseyBinder.addBinding().to(resource); } //bind managed Multibinder<Managed> managedBinder = Multibinder.newSetBinder(binder(), Managed.class, Names.named("dw-managed")); for(Class<? extends Managed> m : managed) { managedBinder.addBinding().to(m); } //bind healthchecks MapBinder<String, HealthCheck> healthCheckBinder = MapBinder.newMapBinder(binder(), String.class, HealthCheck.class, Names.named("dw-healthchecks")); for(Entry<String, Class<? extends HealthCheck>> entry : this.healthChecks.entrySet()) { healthCheckBinder.addBinding(entry.getKey()).to(entry.getValue()); } } protected abstract void configureModule(); public class GuiceJerseyEnvironment { public GuiceJerseyEnvironment register(Class<?> componentClass) { jerseyResources.add(componentClass); return this; } } public class GuiceLifecycleEnvironment { public GuiceLifecycleEnvironment manage(Class<? extends Managed> managedClass) { managed.add(managedClass); return this; } } public class HealthCheckEnvironment { public HealthCheckEnvironment register(String name, Class<? extends HealthCheck> healthCheck) { healthChecks.put(name, healthCheck); return this; } } //TODO add servlets // public class GuiceServletsEnvironment { // public GuiceServletsEnvironment register(Class<?> componentClass) { // jerseyResources.add(componentClass); // return this; // } // } }