package triaina.injector.internal;
import java.lang.reflect.Field;
import java.util.List;
import triaina.commons.utils.ClassUtils;
import triaina.commons.utils.FieldUtils;
import triaina.injector.TriainaEnvironment;
import triaina.injector.binder.BinderContainer;
import triaina.injector.binder.DynamicBinder;
import com.google.inject.Injector;
import com.google.inject.MembersInjector;
public class DynamicMembersInjector<T> implements MembersInjector<T> {
private Field mField;
private Injector mInjector;
public DynamicMembersInjector(Field field, Injector injector) {
field.setAccessible(true);
mField = field;
mInjector = injector;
}
@Override
public void injectMembers(T instance) {
Class<?> type = mField.getType();
List<DynamicBinder> list = BinderContainer.get(type);
if (list.size() < 1)
return;
String value = getEnviromentValue(list.get(0).getName());
for (DynamicBinder binder : list) {
if (value.equals(binder.getValue()))
FieldUtils.setNoException(instance, mField, ClassUtils.newInstance(binder.getImplementClass()));
}
}
private String getEnviromentValue(String name) {
TriainaEnvironment env = mInjector.getInstance(TriainaEnvironment.class);
String value = env.get(name);
if (value == null)
value = DynamicBinder.DEFAULT_VALUE;
return value;
}
}