package io.lumify.core.bootstrap; import com.fasterxml.jackson.module.guice.ObjectMapperModule; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Module; import io.lumify.core.bootstrap.lib.LibLoader; import io.lumify.core.config.Configuration; import io.lumify.core.exception.LumifyException; import io.lumify.core.util.LumifyLogger; import io.lumify.core.util.LumifyLoggerFactory; import io.lumify.core.util.ServiceLoaderUtil; import java.util.Collection; import java.util.List; import static org.securegraph.util.IterableUtils.toList; public class InjectHelper { private static final LumifyLogger LOGGER = LumifyLoggerFactory.getLogger(InjectHelper.class); private static Injector injector; public static <T> T inject(T o, ModuleMaker moduleMaker, Configuration configuration) { ensureInjectorCreated(moduleMaker, configuration); inject(o); return o; } public static <T> T inject(T o) { if (injector == null) { throw new LumifyException("Could not find injector"); } injector.injectMembers(o); return o; } public static Injector getInjector() { return injector; } public static <T> T getInstance(Class<T> clazz, ModuleMaker moduleMaker, Configuration configuration) { ensureInjectorCreated(moduleMaker, configuration); return injector.getInstance(clazz); } public static <T> T getInstance(Class<? extends T> clazz) { if (injector == null) { throw new LumifyException("Could not find injector"); } return injector.getInstance(clazz); } public static <T> Collection<T> getInjectedServices(Class<T> clazz, Configuration configuration) { List<T> workers = toList(ServiceLoaderUtil.load(clazz, configuration)); for (T worker : workers) { inject(worker); } return workers; } public static void shutdown() { injector = null; } public static boolean hasInjector() { return injector != null; } public static interface ModuleMaker { Module createModule(); Configuration getConfiguration(); } private static void ensureInjectorCreated(ModuleMaker moduleMaker, Configuration configuration) { if (injector == null) { LOGGER.info("Loading libs..."); for (LibLoader libLoader : ServiceLoaderUtil.load(LibLoader.class, configuration)) { libLoader.loadLibs(moduleMaker.getConfiguration()); } injector = Guice.createInjector(moduleMaker.createModule(), new ObjectMapperModule()); } } }