package org.needle4j; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.needle4j.annotation.ObjectUnderTest; import org.needle4j.reflection.ReflectionUtil; public class NeedleContext { private final Object test; private final Map<String, Object> objectUnderTestMap = new HashMap<String, Object>(); private final Map<String, ObjectUnderTest> objectUnderTestAnnotationMap = new HashMap<String, ObjectUnderTest>(); private final Map<Object, Object> injectedObjectMap = new HashMap<Object, Object>(); private final Map<Class<? extends Annotation>, List<Field>> annotatedTestcaseFieldMap; public NeedleContext(final Object test) { this.test = test; annotatedTestcaseFieldMap = ReflectionUtil.getAllAnnotatedFields(test.getClass()); } public Object getTest() { return test; } @SuppressWarnings("unchecked") public <X> X getInjectedObject(final Object key) { return (X) injectedObjectMap.get(key); } public Collection<Object> getInjectedObjects() { return injectedObjectMap.values(); } public void addInjectedObject(final Object key, final Object instance) { injectedObjectMap.put(key, instance); } public Object getObjectUnderTest(final String id) { return objectUnderTestMap.get(id); } public ObjectUnderTest getObjectUnderTestAnnotation(final String id) { return objectUnderTestAnnotationMap.get(id); } public void addObjectUnderTest(final String id, final Object instance, final ObjectUnderTest objectUnderTestAnnotation) { objectUnderTestMap.put(id, instance); objectUnderTestAnnotationMap.put(id, objectUnderTestAnnotation); } public Collection<Object> getObjectsUnderTest() { return objectUnderTestMap.values(); } public Set<String> getObjectsUnderTestIds() { return objectUnderTestMap.keySet(); } public List<Field> getAnnotatedTestcaseFields(final Class<? extends Annotation> annotationClass) { final List<Field> value = annotatedTestcaseFieldMap.get(annotationClass); return value != null ? value : new ArrayList<Field>(); } }