From 00b33cb69910d70f5699f4c76acfa4515342c3a0 Mon Sep 17 00:00:00 2001 From: Vojtech Vondra Date: Sun, 22 Jan 2017 22:19:58 +0100 Subject: [PATCH] Make it possible to inject modules initialized when Jersey and Environment is ready --- .../hubspot/dropwizard/guice/GuiceBundle.java | 34 ++++++++++-- ...ceBundleWithExplicitJerseyServiceTest.java | 55 +++++++++++++++++++ .../guice/objects/ExplicitJerseyService.java | 16 ++++++ .../guice/objects/JerseyServicesModule.java | 11 ++++ 4 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 src/test/java/com/hubspot/dropwizard/guice/GuiceBundleWithExplicitJerseyServiceTest.java create mode 100644 src/test/java/com/hubspot/dropwizard/guice/objects/ExplicitJerseyService.java create mode 100644 src/test/java/com/hubspot/dropwizard/guice/objects/JerseyServicesModule.java diff --git a/src/main/java/com/hubspot/dropwizard/guice/GuiceBundle.java b/src/main/java/com/hubspot/dropwizard/guice/GuiceBundle.java index 2cdbe13..7a93d66 100644 --- a/src/main/java/com/hubspot/dropwizard/guice/GuiceBundle.java +++ b/src/main/java/com/hubspot/dropwizard/guice/GuiceBundle.java @@ -27,6 +27,7 @@ public class GuiceBundle implements ConfiguredBundle private final AutoConfig autoConfig; private final List modules; + private final List runModules; private final InjectorFactory injectorFactory; private Injector baseInjector; private DropwizardEnvironmentModule dropwizardEnvironmentModule; @@ -36,6 +37,7 @@ public class GuiceBundle implements ConfiguredBundle public static class Builder { private AutoConfig autoConfig; private List modules = Lists.newArrayList(); + private List runModules = Lists.newArrayList(); private Optional> configurationClass = Optional.absent(); private InjectorFactory injectorFactory = new InjectorFactoryImpl(); @@ -55,6 +57,22 @@ public Builder addModules(Module moduleOne, Module moduleTwo, return this; } + public Builder addRunModule(Module module) { + Preconditions.checkNotNull(module); + runModules.add(module); + return this; + } + + public Builder addRunModules(Module moduleOne, Module moduleTwo, + Module... moreModules) { + addRunModule(moduleOne); + addRunModule(moduleTwo); + for (Module module : moreModules) { + addRunModule(module); + } + return this; + } + public Builder setConfigClass(Class clazz) { configurationClass = Optional.of(clazz); return this; @@ -78,7 +96,7 @@ public GuiceBundle build() { } public GuiceBundle build(Stage s) { - return new GuiceBundle<>(s, autoConfig, modules, configurationClass, injectorFactory); + return new GuiceBundle<>(s, autoConfig, modules, runModules, configurationClass, injectorFactory); } } @@ -87,11 +105,13 @@ public static Builder newBuilder() { return new Builder<>(); } - private GuiceBundle(Stage stage, AutoConfig autoConfig, List modules, Optional> configurationClass, InjectorFactory injectorFactory) { + private GuiceBundle(Stage stage, AutoConfig autoConfig, List modules, List runModules, Optional> 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; @@ -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); @@ -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 injectorModules = runModules; + injectorModules.add(new JerseyGuiceModule(JerseyGuiceUtils.newServiceLocator())); + + return baseInjector.createChildInjector(ImmutableList.copyOf(injectorModules)); } } diff --git a/src/test/java/com/hubspot/dropwizard/guice/GuiceBundleWithExplicitJerseyServiceTest.java b/src/test/java/com/hubspot/dropwizard/guice/GuiceBundleWithExplicitJerseyServiceTest.java new file mode 100644 index 0000000..0326789 --- /dev/null +++ b/src/test/java/com/hubspot/dropwizard/guice/GuiceBundleWithExplicitJerseyServiceTest.java @@ -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 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(); + } +} diff --git a/src/test/java/com/hubspot/dropwizard/guice/objects/ExplicitJerseyService.java b/src/test/java/com/hubspot/dropwizard/guice/objects/ExplicitJerseyService.java new file mode 100644 index 0000000..5ec5825 --- /dev/null +++ b/src/test/java/com/hubspot/dropwizard/guice/objects/ExplicitJerseyService.java @@ -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 securityContextProvider; + + @Inject + public ExplicitJerseyService(Provider securityContextProvider) { + this.securityContextProvider = securityContextProvider; + } +} diff --git a/src/test/java/com/hubspot/dropwizard/guice/objects/JerseyServicesModule.java b/src/test/java/com/hubspot/dropwizard/guice/objects/JerseyServicesModule.java new file mode 100644 index 0000000..4a3ab1d --- /dev/null +++ b/src/test/java/com/hubspot/dropwizard/guice/objects/JerseyServicesModule.java @@ -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); + } +}