package com.flextrade.jfixture.utility; import com.flextrade.jfixture.NoSpecimen; import com.flextrade.jfixture.SpecimenContext; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; public class ParameterUtils { public static List<Object> getConstructorArguments(Constructor constructor, SpecimenType specimenType, SpecimenContext context) { Type[] parameterTypes = getParameterTypes(constructor.getGenericParameterTypes(), specimenType); return convertTypesToInstances(parameterTypes ,context); } public static List<Object> getMethodParameters(Method method, SpecimenType specimenType, SpecimenContext context) { Type[] parameterTypes = getParameterTypes(method.getGenericParameterTypes(), specimenType); return convertTypesToInstances(parameterTypes, context); } private static List<Object> convertTypesToInstances(Type[] parameterTypes, SpecimenContext context) { List<Object> parameters = new ArrayList<Object>(); for (Type parameterType : parameterTypes) { Object parameterInstance = context.resolve(parameterType); if (parameterInstance instanceof NoSpecimen) return null; parameters.add(parameterInstance); } return parameters; } private static Type[] getParameterTypes(Type[] originalGenericParameterTypes, SpecimenType specimenType) { Type[] safeParameterTypes = new Type[originalGenericParameterTypes.length]; for (int i = 0; i < originalGenericParameterTypes.length; i++) { Type unsafeType = originalGenericParameterTypes[i]; safeParameterTypes[i] = convertPossibleGenericTypeToSpecimenType(unsafeType, specimenType); } return safeParameterTypes; } public static SpecimenType convertPossibleGenericTypeToSpecimenType(Type originalType, final SpecimenType contextualType) { return SpecimenType.withGenericContext(originalType, contextualType); } }