package com.flextrade.jfixture.behaviours.noresolution;
import com.flextrade.jfixture.NoSpecimen;
import com.flextrade.jfixture.SpecimenBuilder;
import com.flextrade.jfixture.SpecimenContext;
import com.flextrade.jfixture.utility.RequestFilter;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
class NoResolutionGuard implements SpecimenBuilder {
private final SpecimenBuilder builder;
private final NoResolutionHandler noResolutionHandler;
private final Stack<Object> monitoredRequests = new Stack<Object>();
public NoResolutionGuard(SpecimenBuilder builder, NoResolutionHandler noResolutionHandler) {
this.builder = builder;
this.noResolutionHandler = noResolutionHandler;
}
@Override
public Object create(Object request, SpecimenContext context) {
this.monitoredRequests.push(request);
Object specimen = this.builder.create(request, context);
if (specimen instanceof NoSpecimen) {
return handleNoResolutionForRequest(request);
}
this.monitoredRequests.pop();
return specimen;
}
public SpecimenBuilder builder() {
return this.builder;
}
public NoResolutionHandler handler() {
return this.noResolutionHandler;
}
private Object handleNoResolutionForRequest(Object request) {
List<Object> filtered = new ArrayList<Object>();
RequestFilter filter = RequestFilter.onlyDefault();
for (Object mr : this.monitoredRequests) {
if (filter.allow(mr))
filtered.add(mr);
}
return this.noResolutionHandler.handleNoResolution(request, filtered);
}
}