package com.netflix.fabricator.guice.mapping;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.util.Map;
import com.google.inject.Binding;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.Provider;
import com.google.inject.TypeLiteral;
import com.google.inject.util.Types;
import com.netflix.fabricator.ConfigurationNode;
import com.netflix.fabricator.component.ComponentFactory;
public class ComponentFactoryBinding implements BindingReslove {
@Override
public boolean execute(String name, Object obj, ConfigurationNode config, Class<?> argType, Injector injector, Method method) throws Exception {
ParameterizedType componentFactoryProviderType = Types.newParameterizedTypeWithOwner(Provider.class, ComponentFactory.class, argType);
// Look for a MapBinder binding
TypeLiteral<Map<String, ?>> mapLiteral = (TypeLiteral<Map<String, ?>>) TypeLiteral.get(
Types.mapOf(String.class, componentFactoryProviderType));
Binding<Map<String, ?>> mapBinding = injector.getExistingBinding(Key.get(mapLiteral));
if (mapBinding != null) {
Map<String, ?> map = mapBinding.getProvider().get();
if (map.containsKey(name)) {
method.invoke(obj, map.get(name));
return true;
}
}
return false;
}
}