package com.flextrade.jfixture.builders; import com.flextrade.jfixture.NoSpecimen; import com.flextrade.jfixture.SpecimenBuilder; import com.flextrade.jfixture.SpecimenContext; import com.flextrade.jfixture.requests.SeededRequest; import com.flextrade.jfixture.requests.enrichers.RequestEnricher; import com.flextrade.jfixture.utility.SpecimenType; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Type; class FieldRelay implements SpecimenBuilder { private final RequestEnricher requestEnricher; public FieldRelay(RequestEnricher requestEnricher) { this.requestEnricher = requestEnricher; } @Override public Object create(Object request, SpecimenContext context) { if (!(request instanceof Field)) { return new NoSpecimen(); } Field field = (Field) request; Type genericType = field.getGenericType(); SpecimenType specimenType = SpecimenType.of(genericType); String fieldName = field.getName(); Object actualRequest = getActualRequest(field, specimenType); return context.resolve(new SeededRequest(fieldName, actualRequest)); } private Object getActualRequest(Field field, SpecimenType specimenType) { Object actualRequest = specimenType; Annotation[] annotations = field.getAnnotations(); for (Annotation annotation : annotations) { Object newRequest = requestEnricher.enrich(specimenType, annotation); if (newRequest != null) { actualRequest = newRequest; break; } } return actualRequest; } }