package org.testfun.jee.runner.inject; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; public abstract class BaseInjector implements Injector { private Map<Class, Object> instanceByClass = new HashMap<>(); private MockRegistrar mockRegistrar; public BaseInjector withMocking(MockRegistrar mockRegistrar) { this.mockRegistrar = mockRegistrar; return this; } abstract Class<? extends Annotation> getAnnotation(); @Override public final <T> void inject(T target, Field field) { if (field.isAnnotationPresent(getAnnotation())) { doInject(target, field); } } public Object findInstanceByClass(Class<?> clazz) { Object instance = instanceByClass.get(clazz); return instance != null || mockRegistrar == null ? instance : mockRegistrar.findInstanceByClass(clazz); } abstract <T> void doInject(T target, Field field); protected void registerByImplementedInterfaces(Object instance) { Class<?>[] interfaces = instance.getClass().getInterfaces(); for (Class<?> implementedInterface : interfaces) { instanceByClass.put(implementedInterface, instance); } } protected void registerByClass(Class clazz, Object instance) { instanceByClass.put(clazz, instance); } @Override public void reset() { instanceByClass.clear(); } }