package com.flextrade.jfixture.builders; import com.flextrade.jfixture.NoSpecimen; import com.flextrade.jfixture.SpecimenBuilder; import com.flextrade.jfixture.SpecimenContext; import com.flextrade.jfixture.exceptions.ObjectCreationException; import com.flextrade.jfixture.requests.FactoryMethodRequest; import com.flextrade.jfixture.utility.ParameterUtils; import java.lang.reflect.Method; import java.util.List; class FactoryMethodRelay implements SpecimenBuilder { @Override public Object create(Object request, SpecimenContext context) { if(!(request instanceof FactoryMethodRequest)) { return new NoSpecimen(); } FactoryMethodRequest factoryMethodRequest = (FactoryMethodRequest)request; Method method = factoryMethodRequest.getMethod(); List<Object> parameters = ParameterUtils.getMethodParameters(method, factoryMethodRequest.getContainingType(), context); if(parameters == null) { return new NoSpecimen(); } try { Object[] paramsArray = parameters.toArray(new Object[parameters.size()]); return method.invoke(null, paramsArray); } catch (Exception e) { throw new ObjectCreationException(String.format("Unable to invoke factory method %s", method), e); } } }