package com.netflix.fabricator.guice.mapping;
import java.lang.reflect.Method;
import com.google.inject.Binding;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.TypeLiteral;
import com.google.inject.util.Types;
import com.netflix.fabricator.ConfigurationNode;
import com.netflix.fabricator.component.ComponentManager;
/**
* Look for a binding of type : ComponentManager<T>
*
* @author elandau
*/
public class EmbeddedComponentManagerBinding implements BindingReslove {
private String propertyName;
public EmbeddedComponentManagerBinding(String propertyName) {
this.propertyName = propertyName;
}
@Override
public boolean execute(String name, Object obj, ConfigurationNode node, Class<?> argType, Injector injector, Method method) throws Exception {
TypeLiteral<ComponentManager<?>> managerLiteral = (TypeLiteral<ComponentManager<?>>) TypeLiteral.get(Types.newParameterizedType(ComponentManager.class, argType));
Binding<ComponentManager<?>> managerBinding = injector.getExistingBinding(Key.get(managerLiteral));
if (managerBinding != null) {
ComponentManager<?> manager = managerBinding.getProvider().get();
try {
method.invoke(obj, manager.create(node));
return true;
}
catch (Exception e) {
throw new Exception(String.format(
"Unable to get component '%s' (%s) for property '%s' must be one of %s",
name, argType.getSimpleName(), propertyName, manager.getIds()), e);
}
}
return false;
}
}