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.FieldRequest; import com.flextrade.jfixture.requests.SeededRequest; import com.flextrade.jfixture.utility.ParameterUtils; import com.flextrade.jfixture.utility.SpecimenType; import java.lang.reflect.Field; import java.lang.reflect.Type; class GenericFieldRelay implements SpecimenBuilder { @Override public Object create(Object request, SpecimenContext context) { if (!(request instanceof FieldRequest)) { return new NoSpecimen(); } FieldRequest genericTypeRequest = (FieldRequest) request; SpecimenType contextualType = genericTypeRequest.getContainingType(); Field field = genericTypeRequest.getField(); Type parameterType = getMethodReturnType(field, contextualType); String fieldName = field.getName(); SeededRequest seededRequest = new SeededRequest(fieldName, parameterType); return context.resolve(seededRequest); } private Type getMethodReturnType(Field field, SpecimenType contextualType) { return ParameterUtils.convertPossibleGenericTypeToSpecimenType(field.getGenericType(), contextualType); } }