Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 29 additions & 5 deletions src/main/java/com/hubspot/dropwizard/guice/GuiceBundle.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public class GuiceBundle<T extends Configuration> implements ConfiguredBundle<T>

private final AutoConfig autoConfig;
private final List<Module> modules;
private final List<Module> runModules;
private final InjectorFactory injectorFactory;
private Injector baseInjector;
private DropwizardEnvironmentModule dropwizardEnvironmentModule;
Expand All @@ -36,6 +37,7 @@ public class GuiceBundle<T extends Configuration> implements ConfiguredBundle<T>
public static class Builder<T extends Configuration> {
private AutoConfig autoConfig;
private List<Module> modules = Lists.newArrayList();
private List<Module> runModules = Lists.newArrayList();
private Optional<Class<T>> configurationClass = Optional.absent();
private InjectorFactory injectorFactory = new InjectorFactoryImpl();

Expand All @@ -55,6 +57,22 @@ public Builder<T> addModules(Module moduleOne, Module moduleTwo,
return this;
}

public Builder<T> addRunModule(Module module) {
Preconditions.checkNotNull(module);
runModules.add(module);
return this;
}

public Builder<T> addRunModules(Module moduleOne, Module moduleTwo,
Module... moreModules) {
addRunModule(moduleOne);
addRunModule(moduleTwo);
for (Module module : moreModules) {
addRunModule(module);
}
return this;
}

public Builder<T> setConfigClass(Class<T> clazz) {
configurationClass = Optional.of(clazz);
return this;
Expand All @@ -78,7 +96,7 @@ public GuiceBundle<T> build() {
}

public GuiceBundle<T> build(Stage s) {
return new GuiceBundle<>(s, autoConfig, modules, configurationClass, injectorFactory);
return new GuiceBundle<>(s, autoConfig, modules, runModules, configurationClass, injectorFactory);
}

}
Expand All @@ -87,11 +105,13 @@ public static <T extends Configuration> Builder<T> newBuilder() {
return new Builder<>();
}

private GuiceBundle(Stage stage, AutoConfig autoConfig, List<Module> modules, Optional<Class<T>> configurationClass, InjectorFactory injectorFactory) {
private GuiceBundle(Stage stage, AutoConfig autoConfig, List<Module> modules, List<Module> runModules, Optional<Class<T>> configurationClass, InjectorFactory injectorFactory) {
Preconditions.checkNotNull(modules);
Preconditions.checkArgument(!modules.isEmpty());
Preconditions.checkNotNull(runModules);
Preconditions.checkArgument(!modules.isEmpty() || !runModules.isEmpty());
Preconditions.checkNotNull(stage);
this.modules = modules;
this.runModules = runModules;
this.autoConfig = autoConfig;
this.configurationClass = configurationClass;
this.injectorFactory = injectorFactory;
Expand Down Expand Up @@ -129,7 +149,7 @@ public ServiceLocator create(String name, ServiceLocator parent) {
@SuppressFBWarnings("DM_EXIT")
private void initInjector() {
try {
baseInjector = injectorFactory.create(this.stage,ImmutableList.copyOf(this.modules));
baseInjector = injectorFactory.create(this.stage,ImmutableList.copyOf(modules));
} catch(Exception ie) {
logger.error("Exception occurred when creating Guice Injector - exiting", ie);
System.exit(1);
Expand All @@ -154,6 +174,10 @@ private void setEnvironment(final T configuration, final Environment environment

public Injector getInjector() {
Preconditions.checkState(baseInjector != null, "injector is only available after com.hubspot.dropwizard.guice.GuiceBundle.initialize() is called");
return baseInjector.createChildInjector(new JerseyGuiceModule(JerseyGuiceUtils.newServiceLocator()));

List<Module> injectorModules = runModules;
injectorModules.add(new JerseyGuiceModule(JerseyGuiceUtils.newServiceLocator()));

return baseInjector.createChildInjector(ImmutableList.copyOf(injectorModules));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.hubspot.dropwizard.guice;

import com.google.inject.Injector;

import com.codahale.metrics.MetricRegistry;
import com.hubspot.dropwizard.guice.objects.JerseyServicesModule;
import com.squarespace.jersey2.guice.JerseyGuiceUtils;

import org.junit.*;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

import javax.servlet.ServletException;

import io.dropwizard.Configuration;
import io.dropwizard.jackson.Jackson;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;

@RunWith(MockitoJUnitRunner.class)
public class GuiceBundleWithExplicitJerseyServiceTest {

@Mock
Environment environment;

private GuiceBundle<Configuration> guiceBundle;

@After
public void tearDown() {
JerseyGuiceUtils.reset();
}

@Before
public void setUp() {
//given
environment = new Environment("test env", Jackson.newObjectMapper(), null, new MetricRegistry(), null);
guiceBundle = GuiceBundle.newBuilder()
.addRunModule(new JerseyServicesModule())
.build();
Bootstrap bootstrap = mock(Bootstrap.class);
guiceBundle.initialize(bootstrap);
guiceBundle.run(new Configuration(), environment);
}

@Test
public void createsInjectorWhenInit() throws ServletException {
//then
Injector injector = guiceBundle.getInjector();
assertThat(injector).isNotNull();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.hubspot.dropwizard.guice.objects;

import com.google.inject.Inject;
import com.google.inject.Provider;

import javax.ws.rs.core.SecurityContext;

public class ExplicitJerseyService {

private final Provider<SecurityContext> securityContextProvider;

@Inject
public ExplicitJerseyService(Provider<SecurityContext> securityContextProvider) {
this.securityContextProvider = securityContextProvider;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.hubspot.dropwizard.guice.objects;

import com.google.inject.AbstractModule;

public class JerseyServicesModule extends AbstractModule {

@Override
protected void configure() {
bind(ExplicitJerseyService.class);
}
}