/*
* Copyright 2016 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.robotframework.ide.eclipse.main.plugin.mockeclipse;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.inject.Inject;
/**
* @author Michal Anglart
*
*/
public class ContextInjector {
private final Map<Class<?>, Object> objectsToInject = new HashMap<>();
private ContextInjector() {
// just hiding
}
public static ContextInjector prepareContext() {
return new ContextInjector();
}
public ContextInjector inWhich(final Object object) {
objectsToInject.put(object.getClass(), object);
return this;
}
public <T> T isInjectedInto(final T object) {
Class<?> clazz = object.getClass();
try {
while (clazz != Object.class) {
for (final Field field : clazz.getDeclaredFields()) {
if (field.getAnnotation(Inject.class) != null) {
field.setAccessible(true);
for (final Entry<Class<?>, Object> binding : objectsToInject.entrySet()) {
final Class<?> actualClass = field.getType();
if (actualClass.isAssignableFrom(binding.getKey())) {
field.set(object, binding.getValue());
break;
}
}
}
}
clazz = clazz.getSuperclass();
}
} catch (IllegalArgumentException | IllegalAccessException e) {
throw new IllegalStateException("Unable to bind fields", e);
}
return object;
}
public <T> T areInjectedInto(final T object) {
return isInjectedInto(object);
}
}