package com.flextrade.jfixture.behaviours.tracing;
import com.flextrade.jfixture.NoSpecimen;
import com.flextrade.jfixture.SpecimenBuilder;
import com.flextrade.jfixture.SpecimenContext;
import com.flextrade.jfixture.exceptions.ObjectCreationException;
import java.io.IOException;
class SpecimenTracer implements SpecimenBuilder {
private final TracingStrategy tracingStrategy;
private final Appendable traceWriter;
private final SpecimenBuilder builder;
public SpecimenTracer(SpecimenBuilder builder,
TracingStrategy tracingStrategy,
Appendable traceWriter) {
this.tracingStrategy = tracingStrategy;
this.traceWriter = traceWriter;
this.builder = builder;
}
@Override
public Object create(Object request, SpecimenContext context) {
return createAndTraceSpecimen(request, context);
}
private Object createAndTraceSpecimen(Object request, SpecimenContext context) {
Object specimen;
try {
this.tracingStrategy.writeRequest(this.traceWriter, request);
specimen = createSpecimen(request, context);
if (!(specimen instanceof NoSpecimen)) {
this.tracingStrategy.writeCreated(this.traceWriter, request, specimen);
}
} catch (IOException e) {
throw new UnsupportedOperationException(e);
}
return specimen;
}
public Appendable getTraceWriter() {
return this.traceWriter;
}
public TracingStrategy getTracingStrategy() {
return this.tracingStrategy;
}
private Object createSpecimen(Object request, SpecimenContext context) throws IOException {
Object specimen;
try {
specimen = this.builder.create(request, context);
} catch (ObjectCreationException e) {
this.tracingStrategy.writeError(this.traceWriter, e);
throw e;
}
return specimen;
}
}