All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hubspot.blazar.guice.ConfigurationAwareModule Maven / Gradle / Ivy

The newest version!
package com.hubspot.blazar.guice;

import com.google.inject.Binder;
import com.google.inject.Binding;
import com.google.inject.Key;
import com.google.inject.MembersInjector;
import com.google.inject.Module;
import com.google.inject.PrivateBinder;
import com.google.inject.Provider;
import com.google.inject.Scope;
import com.google.inject.Stage;
import com.google.inject.TypeLiteral;
import com.google.inject.binder.AnnotatedBindingBuilder;
import com.google.inject.binder.AnnotatedConstantBindingBuilder;
import com.google.inject.binder.LinkedBindingBuilder;
import com.google.inject.matcher.Matcher;
import com.google.inject.spi.Dependency;
import com.google.inject.spi.Message;
import com.google.inject.spi.ModuleAnnotatedMethodScanner;
import com.google.inject.spi.ProvisionListener;
import com.google.inject.spi.TypeConverter;
import com.google.inject.spi.TypeListener;
import org.aopalliance.intercept.MethodInterceptor;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;

public abstract class ConfigurationAwareModule implements Module {
  private volatile Configuration configuration = null;

  @Override
  public final void configure(Binder binder) {
    configure(decorate(binder), getConfiguration());
  }

  public void setConfiguration(Configuration configuration) {
    checkState(this.configuration == null, "configuration was already set!");
    this.configuration = checkNotNull(configuration, "configuration is null");
  }

  protected Configuration getConfiguration() {
    return checkNotNull(this.configuration, "configuration was not set!");
  }

  protected abstract void configure(final Binder binder, final Configuration configuration);

  private Binder decorate(final Binder binder) {
    return new Binder() {

      @Override
      @SuppressWarnings("unchecked")
      public void install(Module module) {
        if (module instanceof ConfigurationAwareModule) {
          ((ConfigurationAwareModule) module).setConfiguration(getConfiguration());
        }
        binder.install(module);
      }

      @Override
      public void bindInterceptor(Matcher> classMatcher,
                                  Matcher methodMatcher,
                                  MethodInterceptor... interceptors) {
        binder.bindInterceptor(classMatcher, methodMatcher, interceptors);
      }

      @Override
      public void bindScope(Class annotationType, Scope scope) {
        binder.bindScope(annotationType, scope);
      }

      @Override
      public  LinkedBindingBuilder bind(Key key) {
        return binder.bind(key);
      }

      @Override
      public  AnnotatedBindingBuilder bind(TypeLiteral typeLiteral) {
        return binder.bind(typeLiteral);
      }

      @Override
      public  AnnotatedBindingBuilder bind(Class type) {
        return binder.bind(type);
      }

      @Override
      public AnnotatedConstantBindingBuilder bindConstant() {
        return binder.bindConstant();
      }

      @Override
      public  void requestInjection(TypeLiteral type, T instance) {
        binder.requestInjection(type, instance);
      }

      @Override
      public void requestInjection(Object instance) {
        binder.requestInjection(instance);
      }

      @Override
      public void requestStaticInjection(Class... types) {
        binder.requestStaticInjection(types);
      }

      @Override
      public Stage currentStage() {
        return binder.currentStage();
      }

      @Override
      public void addError(String message, Object... arguments) {
        binder.addError(message, arguments);
      }

      @Override
      public void addError(Throwable t) {
        binder.addError(t);
      }

      @Override
      public void addError(Message message) {
        binder.addError(message);
      }

      @Override
      public  Provider getProvider(Key key) {
        return binder.getProvider(key);
      }

      @Override
      public  Provider getProvider(Dependency dependency) {
        return binder.getProvider(dependency);
      }

      @Override
      public  Provider getProvider(Class type) {
        return binder.getProvider(type);
      }

      @Override
      public  MembersInjector getMembersInjector(TypeLiteral typeLiteral) {
        return binder.getMembersInjector(typeLiteral);
      }

      @Override
      public  MembersInjector getMembersInjector(Class type) {
        return binder.getMembersInjector(type);
      }

      @Override
      public void convertToTypes(Matcher> typeMatcher, TypeConverter converter) {
        binder.convertToTypes(typeMatcher, converter);
      }

      @Override
      public void bindListener(Matcher> typeMatcher, TypeListener listener) {
        binder.bindListener(typeMatcher, listener);
      }

      @Override
      public void bindListener(Matcher> bindingMatcher, ProvisionListener... listeners) {
        binder.bindListener(bindingMatcher, listeners);
      }

      @Override
      public Binder withSource(Object source) {
        return binder.withSource(source);
      }

      @Override
      public Binder skipSources(Class... classesToSkip) {
        return binder.skipSources(classesToSkip);
      }

      @Override
      public PrivateBinder newPrivateBinder() {
        return binder.newPrivateBinder();
      }

      @Override
      public void requireExplicitBindings() {
        binder.requireExplicitBindings();
      }

      @Override
      public void disableCircularProxies() {
        binder.disableCircularProxies();
      }

      @Override
      public void requireAtInjectOnConstructors() {
        binder.requireAtInjectOnConstructors();
      }

      @Override
      public void requireExactBindingAnnotations() {
        binder.requireExactBindingAnnotations();
      }

      @Override
      public void scanModulesForAnnotatedMethods(ModuleAnnotatedMethodScanner scanner) {
        binder.scanModulesForAnnotatedMethods(scanner);
      }
    };
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy