/*
* Copyright 2013 Netflix, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.netflix.governator.guice;
import java.util.Collection;
import java.util.Set;
import com.google.common.collect.Sets;
import com.google.inject.AbstractModule;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Provides;
import com.google.inject.Scopes;
import com.google.inject.Singleton;
import com.google.inject.Stage;
import com.netflix.governator.configuration.ConfigurationDocumentation;
import com.netflix.governator.configuration.ConfigurationMapper;
import com.netflix.governator.configuration.ConfigurationProvider;
import com.netflix.governator.guice.lazy.FineGrainedLazySingleton;
import com.netflix.governator.guice.lazy.FineGrainedLazySingletonScope;
import com.netflix.governator.guice.lazy.LazySingleton;
import com.netflix.governator.guice.lazy.LazySingletonScope;
import com.netflix.governator.lifecycle.ClasspathScanner;
import com.netflix.governator.lifecycle.LifecycleConfigurationProviders;
import com.netflix.governator.lifecycle.LifecycleManager;
import com.netflix.governator.lifecycle.LifecycleManagerArguments;
class InternalBootstrapModule extends AbstractModule
{
private BootstrapBinder bootstrapBinder;
private ClasspathScanner scanner;
private Stage stage;
private LifecycleInjectorMode mode;
private ModuleListBuilder modules;
private Collection<PostInjectorAction> actions;
private Collection<ModuleTransformer> transformers;
private boolean disableAutoBinding;
private final Collection<BootstrapModule> bootstrapModules;
private static class LifecycleConfigurationProvidersProvider implements Provider<LifecycleConfigurationProviders>
{
@Inject(optional = true)
private Set<ConfigurationProvider> configurationProviders = Sets.newHashSet();
@Override
public LifecycleConfigurationProviders get()
{
return new LifecycleConfigurationProviders(configurationProviders);
}
}
public InternalBootstrapModule(Collection<BootstrapModule> bootstrapModules, ClasspathScanner scanner, Stage stage, LifecycleInjectorMode mode, ModuleListBuilder modules, Collection<PostInjectorAction> actions, Collection<ModuleTransformer> transformers, boolean disableAutoBinding) {
this.scanner = scanner;
this.stage = stage;
this.mode = mode;
this.modules = modules;
this.actions = actions;
this.transformers = transformers;
this.bootstrapModules = bootstrapModules;
this.disableAutoBinding = disableAutoBinding;
}
BootstrapBinder getBootstrapBinder()
{
return bootstrapBinder;
}
@Override
protected void configure()
{
bind(ConfigurationDocumentation.class).in(Scopes.SINGLETON);
bindScope(LazySingleton.class, LazySingletonScope.get());
bindScope(FineGrainedLazySingleton.class, FineGrainedLazySingletonScope.get());
bootstrapBinder = new BootstrapBinder(binder(), stage, mode, modules, actions, transformers, disableAutoBinding);
if ( bootstrapModules != null )
{
for (BootstrapModule bootstrapModule : bootstrapModules) {
bootstrapModule.configure(bootstrapBinder);
}
}
bind(com.netflix.governator.LifecycleManager.class).in(Scopes.SINGLETON);
binder().bind(LifecycleManagerArguments.class).in(Scopes.SINGLETON);
binder().bind(LifecycleManager.class).asEagerSingleton();
binder().bind(LifecycleConfigurationProviders.class).toProvider(LifecycleConfigurationProvidersProvider.class).asEagerSingleton();
this.stage = bootstrapBinder.getStage();
this.mode = bootstrapBinder.getMode();
}
Stage getStage() {
return stage;
}
LifecycleInjectorMode getMode() {
return mode;
}
boolean isDisableAutoBinding() {
return disableAutoBinding;
}
ModuleListBuilder getModuleListBuilder() {
return modules;
}
@Provides
@Singleton
public ClasspathScanner getClasspathScanner()
{
return scanner;
}
}