package tc.oc.commons.core.inject;
import java.io.PrintStream;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.google.inject.Binding;
import com.google.inject.Key;
import com.google.inject.Module;
import com.google.inject.PrivateBinder;
import com.google.inject.Stage;
import com.google.inject.spi.Element;
import com.google.inject.spi.ElementVisitor;
import com.google.inject.spi.Elements;
public class ElementUtils {
private ElementUtils() {}
public static List<Element> visit(ElementVisitor<?> visitor, Iterable<? extends Module> modules) {
final List<Element> elements = Elements.getElements(Stage.TOOL, modules);
elements.forEach(e -> e.acceptVisitor(visitor));
return elements;
}
public static List<Element> visit(ElementVisitor<?> visitor, Module... modules) {
return visit(visitor, Arrays.asList(modules));
}
public static void print(PrintStream stream, Iterable<? extends Module> modules) {
visit(new ElementPrinter(stream), modules);
}
public static void print(PrintStream stream, Module... modules) {
visit(new ElementPrinter(stream), modules);
}
public static void print(Iterable<? extends Module> modules) {
print(System.out, modules);
}
public static void print(Module... modules) {
print(System.out, modules);
}
public static void log(Module... modules) {
log(Logger.getGlobal(), modules);
}
public static void log(Logger logger, Module... modules) {
log(logger, Level.INFO, modules);
}
public static void log(Logger logger, Level level, Module... modules) {
visit(new ElementLogger(logger, level), modules);
}
public static void log(Logger logger, Level level, Iterable<? extends Module> modules) {
visit(new ElementLogger(logger, level), modules);
}
public static void expose(PrivateBinder binder, Iterable<? extends Module> modules) {
visit(new ElementExposer(binder), modules);
}
public static void expose(PrivateBinder binder, Module... modules) {
visit(new ElementExposer(binder), modules);
}
public static <T> Optional<Binding<T>> findBinding(Iterable<? extends Element> elements, Key<T> key) {
for(Element element : elements) {
if(element instanceof Binding && key.equals(((Binding<?>) element).getKey())) {
return Optional.of((Binding<T>) element);
}
}
return Optional.empty();
}
}