/* * 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 com.google.common.base.Function; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.inject.Injector; import com.google.inject.Module; import com.google.inject.Stage; import com.netflix.governator.lifecycle.ClasspathScanner; import java.util.Arrays; import java.util.Collection; import java.util.List; class LifecycleInjectorBuilderImpl implements LifecycleInjectorBuilder { private ModuleListBuilder modules = new ModuleListBuilder(); private Collection<Class<?>> ignoreClasses = Lists.newArrayList(); private Collection<String> basePackages = Lists.newArrayList(); private boolean disableAutoBinding = false; private boolean requireExplicitBindings = false; private List<BootstrapModule> bootstrapModules = Lists.newArrayList(); private ClasspathScanner scanner = null; private Stage stage = Stage.PRODUCTION; @SuppressWarnings("deprecation") private LifecycleInjectorMode lifecycleInjectorMode = LifecycleInjectorMode.REAL_CHILD_INJECTORS; private List<PostInjectorAction> actions = ImmutableList.of(); private List<ModuleTransformer> transformers = ImmutableList.of(); public LifecycleInjectorBuilder withBootstrapModule(BootstrapModule module) { this.bootstrapModules = ImmutableList.of(module); return this; } @Override public LifecycleInjectorBuilder withAdditionalBootstrapModules(BootstrapModule... additionalBootstrapModules) { return withAdditionalBootstrapModules(ImmutableList.copyOf(additionalBootstrapModules)); } @Override public LifecycleInjectorBuilder withAdditionalBootstrapModules(Iterable<? extends BootstrapModule> additionalBootstrapModules) { if (additionalBootstrapModules != null) { this.bootstrapModules = ImmutableList.<BootstrapModule>builder() .addAll(this.bootstrapModules) .addAll(additionalBootstrapModules) .build(); } return this; } @Override public LifecycleInjectorBuilder withModules(Module... modules) { this.modules = new ModuleListBuilder().includeModules(ImmutableList.copyOf(modules)); return this; } @Override public LifecycleInjectorBuilder withModules(Iterable<? extends Module> modules) { if (modules != null) { this.modules = new ModuleListBuilder().includeModules(modules); } return this; } @Override public LifecycleInjectorBuilder withAdditionalModules(Iterable<? extends Module> additionalModules) { if (additionalModules != null) { try { this.modules.includeModules(additionalModules); } catch (Exception e) { throw new RuntimeException(e); } } return this; } @Override public LifecycleInjectorBuilder withAdditionalModules(Module... modules) { return withAdditionalModules(ImmutableList.copyOf(modules)); } @Override public LifecycleInjectorBuilder withRootModule(Class<?> rootModule) { if (rootModule == null) return this; return withModuleClass((Class<? extends Module>) rootModule); } @Override public LifecycleInjectorBuilder withModuleClass(Class<? extends Module> module) { if (module != null) { this.modules.include(module); } return this; } @Override public LifecycleInjectorBuilder withModuleClasses(Iterable<Class<? extends Module>> modules) { if (modules != null) { this.modules.include(modules); } return this; } @Override public LifecycleInjectorBuilder withModuleClasses(Class<?> ... modules) { this.modules.include(ImmutableList.<Class<? extends Module>>copyOf( Iterables.transform(Lists.newArrayList(modules), new Function<Class<?>, Class<? extends Module>>() { @SuppressWarnings("unchecked") @Override public Class<? extends Module> apply(Class<?> input) { return (Class<? extends Module>) input; } } ))); return this; } @Override public LifecycleInjectorBuilder withAdditionalModuleClasses(Iterable<Class<? extends Module>> modules) { this.modules.include(modules); return this; } @Override public LifecycleInjectorBuilder withAdditionalModuleClasses(Class<?> ... modules) { this.modules.include(ImmutableList.<Class<? extends Module>>builder() .addAll(Iterables.transform(Lists.newArrayList(modules), new Function<Class<?>, Class<? extends Module>>() { @SuppressWarnings("unchecked") @Override public Class<? extends Module> apply(Class<?> input) { return (Class<? extends Module>) input; } })) .build()); return this; } @Override public LifecycleInjectorBuilder withoutModuleClasses(Class<? extends Module> ... modules) { this.modules.exclude(ImmutableList.copyOf(modules)); return this; } @Override public LifecycleInjectorBuilder withoutModuleClass(Class<? extends Module> module) { this.modules.exclude(module); return this; } @Override public LifecycleInjectorBuilder withoutModuleClasses(Iterable<Class<? extends Module>> modules) { this.modules.exclude(modules); return this; } @Override public LifecycleInjectorBuilder ignoringAutoBindClasses(Collection<Class<?>> ignoreClasses) { this.ignoreClasses = ImmutableList.copyOf(ignoreClasses); return this; } @Override public LifecycleInjectorBuilder ignoringAllAutoBindClasses() { this.disableAutoBinding = true; return this; } @Override public LifecycleInjectorBuilder requiringExplicitBindings() { this.requireExplicitBindings = true; return this; } @Override public LifecycleInjectorBuilder usingBasePackages(String... basePackages) { return usingBasePackages(Arrays.asList(basePackages)); } @Override public LifecycleInjectorBuilder usingBasePackages(Collection<String> basePackages) { this.basePackages = Lists.newArrayList(basePackages); return this; } @Override public LifecycleInjectorBuilder usingClasspathScanner(ClasspathScanner scanner) { this.scanner = scanner; return this; } @Override public LifecycleInjectorBuilder withMode(LifecycleInjectorMode mode) { this.lifecycleInjectorMode = mode; return this; } @Override public LifecycleInjectorBuilder inStage(Stage stage) { this.stage = stage; return this; } @Override public LifecycleInjectorBuilder withModuleTransformer(ModuleTransformer filter) { if (filter != null) { this.transformers = ImmutableList.<ModuleTransformer>builder() .addAll(this.transformers) .add(filter) .build(); } return this; } @Override public LifecycleInjectorBuilder withModuleTransformer(Collection<? extends ModuleTransformer> filters) { if (this.transformers != null) { this.transformers = ImmutableList.<ModuleTransformer>builder() .addAll(this.transformers) .addAll(filters) .build(); } return this; } @Override public LifecycleInjectorBuilder withModuleTransformer(ModuleTransformer... filters) { if (this.transformers != null) { this.transformers = ImmutableList.<ModuleTransformer>builder() .addAll(this.transformers) .addAll(ImmutableList.copyOf(filters)) .build(); } return this; } @Override public LifecycleInjectorBuilder withPostInjectorAction(PostInjectorAction action) { this.actions = ImmutableList.<PostInjectorAction>builder() .addAll(this.actions) .add(action) .build(); return this; } @Override public LifecycleInjectorBuilder withPostInjectorActions(Collection<? extends PostInjectorAction> actions) { if (actions != null) { this.actions = ImmutableList.<PostInjectorAction>builder() .addAll(this.actions) .addAll(actions) .build(); } return this; } @Override public LifecycleInjectorBuilder withPostInjectorActions(PostInjectorAction... actions) { this.actions = ImmutableList.<PostInjectorAction>builder() .addAll(this.actions) .addAll(ImmutableList.copyOf(actions)) .build(); return this; } @Override public LifecycleInjector build() { try { return new LifecycleInjector(this); } catch (Exception e) { throw new RuntimeException(e); } } @Override @Deprecated public Injector createInjector() { return build().createInjector(); } LifecycleInjectorBuilderImpl() { } ModuleListBuilder getModuleListBuilder() { return modules; } Collection<Class<?>> getIgnoreClasses() { return ignoreClasses; } Collection<String> getBasePackages() { return basePackages; } List<BootstrapModule> getBootstrapModules() { return bootstrapModules; } ClasspathScanner getClasspathScanner() { return scanner; } Stage getStage() { return stage; } LifecycleInjectorMode getLifecycleInjectorMode() { return lifecycleInjectorMode; } List<PostInjectorAction> getPostInjectorActions() { return actions; } List<ModuleTransformer> getModuleTransformers() { return transformers; } boolean isDisableAutoBinding() { return this.disableAutoBinding; } boolean isRequireExplicitBindings() { return this.requireExplicitBindings; } }