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

no.mnemonic.commons.container.providers.GuiceBeanProvider Maven / Gradle / Ivy

package no.mnemonic.commons.container.providers;

import com.google.inject.*;
import com.google.inject.Module;
import com.google.inject.name.Names;
import com.google.inject.spi.DefaultBindingScopingVisitor;
import no.mnemonic.commons.utilities.collections.SetUtils;

import java.util.*;
import java.util.stream.Collectors;

public class GuiceBeanProvider implements BeanProvider{

  private final Injector injector;

  public GuiceBeanProvider(Module... modules) {
    this(null, modules);
  }

  public GuiceBeanProvider(Properties properties, Module... modules) {
    Set moduleSet = SetUtils.set(modules).stream().filter(m->m!=null).collect(Collectors.toSet());
    if (properties != null) {
      moduleSet.add(createPropertiesModule(properties));
    }
    injector = Guice.createInjector(moduleSet);
  }

  @Override
  public  Optional getBean(Class ofType) {
    Map beans = getBeans(ofType);
    if (beans.isEmpty()) return Optional.empty();
    if (beans.size() > 1) throw new IllegalStateException("Multiple implementations found for this class: " + ofType);
    return Optional.of(beans.values().iterator().next());
  }

  @Override
  public  Map getBeans(Class searchType) {
    Map result = new HashMap<>();
    injector.getAllBindings().values().stream()
        .forEach(b-> b.acceptScopingVisitor(new DefaultBindingScopingVisitor(){
          @Override
          public Object visitScope(Scope scope) {
            if (scope == Scopes.SINGLETON) {
              Object obj = b.getProvider().get();
              if (searchType.isInstance(obj)) {
                //noinspection unchecked
                result.put(createKey(b.getKey()), (T) obj);
              }
            }
            return null;
          }
        }));
    return result;
  }

  public Injector getInjector() {
    return injector;
  }

  @Override
  public Map getBeans() {
    return getBeans(Object.class);
  }

  private String createKey(Key nameKey) {
    String result = nameKey.getTypeLiteral().getRawType().getSimpleName();
    if (nameKey.getAnnotationType() != null) result = result + "-" + nameKey.getAnnotationType().getSimpleName();
    return result;
  }

  private Module createPropertiesModule(Properties properties) {
    return new AbstractModule() {
      @Override
      protected void configure() {
        Names.bindProperties(binder(), properties);
      }
    };
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy