package org.needle4j.injection; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.util.Collection; import java.util.List; import java.util.Map.Entry; import java.util.Set; import org.needle4j.NeedleContext; import org.needle4j.processor.AbstractNeedleProcessor; import org.needle4j.reflection.ReflectionUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TestcaseInjectionProcessor extends AbstractNeedleProcessor { private final Logger logger = LoggerFactory.getLogger(TestcaseInjectionProcessor.class); public TestcaseInjectionProcessor(final InjectionConfiguration configuration) { super(configuration); } @Override public void process(final NeedleContext context) { final Set<Class<? extends Annotation>> supportedAnnotations = configuration.getSupportedAnnotations(); for (Class<? extends Annotation> supportedAnnotation : supportedAnnotations) { processAnnotation(context, configuration, supportedAnnotation); } } private void processAnnotation(final NeedleContext context, final InjectionConfiguration configuration, final Class<? extends Annotation> annotation) { final List<Field> fields = context.getAnnotatedTestcaseFields(annotation); for (Field field : fields) { processField(context, configuration, field); } } private void processField(final NeedleContext context, final InjectionConfiguration configuration, final Field field) { final List<List<InjectionProvider<?>>> injectionProviderList = configuration.getInjectionProvider(); final InjectionTargetInformation injectionTargetInformation = new InjectionTargetInformation(field.getType(), field); for (Collection<InjectionProvider<?>> injectionProvider : injectionProviderList) { Entry<Object, Object> injection = configuration.handleInjectionProvider(injectionProvider, injectionTargetInformation); if (injection != null) { Object contextObject = context.getInjectedObject(injection.getKey()); Object injectedObject = contextObject != null ? contextObject : injection.getValue(); try { ReflectionUtil.setField(field, context.getTest(), injectedObject); return; } catch (Exception e) { logger.error(e.getMessage(), e); } } } } }