package com.flextrade.jfixture.behaviours.intercept; import com.flextrade.jfixture.SpecimenBuilder; import com.flextrade.jfixture.SpecimenContext; import com.flextrade.jfixture.utility.Interceptor; import java.lang.reflect.Type; public class InterceptingBuilder<T> implements SpecimenBuilder { private final SpecimenBuilder builder; private final Class<T> classToIntercept; private final Interceptor<T> interceptor; public InterceptingBuilder(SpecimenBuilder builder, Class<T> classToIntercept, Interceptor<T> interceptor) { this.builder = builder; this.classToIntercept = classToIntercept; this.interceptor = interceptor; } @Override public Object create(Object request, SpecimenContext context) { Object specimen = this.builder.create(request, context); if(requestIsForAType(request) && specimenIsOfInterceptedType(specimen)) { interceptor.intercept((T) specimen); } return specimen; } private boolean specimenIsOfInterceptedType(Object specimen) { return specimen != null && specimen.getClass().equals(classToIntercept); } private boolean requestIsForAType(Object request) { return request instanceof Type; } }