package com.netflix.fabricator.doc; import java.util.Map.Entry; import javax.annotation.PostConstruct; import com.google.inject.Binding; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.Singleton; import com.google.inject.multibindings.MapBinderBinding; import com.google.inject.multibindings.MultibinderBinding; import com.google.inject.multibindings.MultibindingsTargetVisitor; import com.google.inject.multibindings.OptionalBinderBinding; import com.google.inject.spi.DefaultBindingTargetVisitor; import com.netflix.fabricator.PropertyInfo; import com.netflix.fabricator.component.ComponentFactory; @Singleton public class OutputStreamConfigDocumenter { private final Injector injector; @Inject public OutputStreamConfigDocumenter(Injector injector) { this.injector = injector; } public static class Visitor extends DefaultBindingTargetVisitor<Object, MapBinderBinding<?>> implements MultibindingsTargetVisitor<Object, MapBinderBinding<?>> { @Override public MapBinderBinding<?> visit( MultibinderBinding<? extends Object> multibinding) { // TODO Auto-generated method stub return null; } @Override public MapBinderBinding<?> visit( MapBinderBinding<? extends Object> mapBinder) { if (mapBinder.getValueTypeLiteral().getRawType().isAssignableFrom(ComponentFactory.class)) { System.out.println(mapBinder.getValueTypeLiteral()); for (Entry<?, Binding<?>> entry : mapBinder.getEntries()) { ComponentFactory<?> factory = (ComponentFactory<?>) entry.getValue().getProvider().get(); System.out.println(String.format(" for type='%s' use class '%s' with properties: ", entry.getKey(), factory.getRawType().getSimpleName())); for (Entry<String, PropertyInfo> propEntry : factory.getProperties().entrySet()) { PropertyInfo prop = propEntry.getValue(); String name = propEntry.getKey(); // System.out.println(String.format(" %-20s %-10s %-10s", name, prop.getType().getSimpleName(), prop.isDynamic() ? "(dynamic)" : "")); } } } return mapBinder; } @Override public MapBinderBinding<?> visit( OptionalBinderBinding<? extends Object> optionalbinding) { // TODO Auto-generated method stub return null; } } @PostConstruct public void init() { for (Entry<Key<?>, Binding<?>> entry : this.injector.getAllBindings().entrySet()) { Key<?> key = entry.getKey(); Binding<?> binding = entry.getValue(); binding.acceptTargetVisitor(new Visitor()); } } }