package com.flextrade.jfixture.behaviours.recursion;
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 RecursionGuard implements SpecimenBuilder {
private final Stack<Object> monitoredRequests = new Stack<Object>();
private final SpecimenBuilder builder;
private final RecursionHandler recursionHandler;
public RecursionGuard(SpecimenBuilder builder, RecursionHandler recursionHandler) {
this.builder = builder;
this.recursionHandler = recursionHandler;
}
@Override
public Object create(Object request, SpecimenContext context) {
for (Object monitoredRequest : this.monitoredRequests) {
if(request.equals(monitoredRequest)) {
return this.handleRecursiveRequest(request);
}
}
this.monitoredRequests.push(request);
try {
return this.builder.create(request, context);
}
finally {
this.monitoredRequests.pop();
}
}
public SpecimenBuilder builder() {
return this.builder;
}
public RecursionHandler handler() {
return this.recursionHandler;
}
private Object handleRecursiveRequest(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.recursionHandler.handleRecursiveRequest(request, filtered);
}
}