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.MethodRequest;
import com.flextrade.jfixture.requests.SeededRequest;
import com.flextrade.jfixture.utility.ParameterUtils;
import com.flextrade.jfixture.utility.PropertyUtil;
import com.flextrade.jfixture.utility.SpecimenType;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
class GenericMethodBuilder implements SpecimenBuilder {
@Override
public Object create(Object request, SpecimenContext context) {
if (!(request instanceof MethodRequest)) {
return new NoSpecimen();
}
MethodRequest genericTypeRequest = (MethodRequest) request;
SpecimenType contextualType = genericTypeRequest.getContainingType();
Method method = genericTypeRequest.getMethod();
Type parameterType = getMethodReturnType(method, contextualType);
String propertyName = PropertyUtil.getMemberNameFromMethod(method);
SeededRequest seededRequest = new SeededRequest(propertyName, parameterType);
return context.resolve(seededRequest);
}
private Type getMethodReturnType(Method method, SpecimenType contextualType) {
Type originalReturnType = method.getGenericParameterTypes()[0]; // Previous checks ensure we will have only one value
return ParameterUtils.convertPossibleGenericTypeToSpecimenType(originalReturnType, contextualType);
}
}