package chapter3.recipe6;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import chapter3.recipe6.functions.Decorator;
import chapter3.recipe6.functions.Filter;
import chapter3.recipe6.functions.FinalProcessor;
public class FunctionPipeline {
List<Filter> filterFunctions = new ArrayList<>();
public FunctionPipeline apply(Filter f){
filterFunctions.add(f);
return this;
}
List<Function<SimpleHttpRequest , SimpleHttpResponse>> processorFunctions = new ArrayList<>();
public FunctionPipeline apply(Function<SimpleHttpRequest , SimpleHttpResponse> f){
processorFunctions.add(f);
return this;
}
List<Decorator> decoratorFunctions = new ArrayList<>();
public FunctionPipeline apply(Decorator f){
decoratorFunctions.add(f);
return this;
}
SimpleHttpResponse apply(SimpleHttpRequest req){
SimpleHttpResponse resp = null;
int s = 0;
//apply all filter functions
s = filterFunctions.size();
int i = 0;
while(s > 0){
req = filterFunctions.get(i).apply(req);
if(req.isNotAuthorized()){
return new SimpleHttpResponse("Not Authorized Request");
}
i++;
if(i >= s){
break;
}
}
//apply all Event Processor functions
s = processorFunctions.size();
int j = 0;
while(s > 0){
resp = processorFunctions.get(j).apply(req);
if(resp == null){
return new SimpleHttpResponse("empty data");
}
j++;
if(j >= s){
break;
}
}
//apply all decorator functions (backward to first)
s = decoratorFunctions.size();
while(s > 0){
s--;
resp = decoratorFunctions.get(s).apply(resp);
if(resp == null){
return new SimpleHttpResponse("empty data");
}
if(s == 0){
break;
}
}
return resp;
}
public static void main(String[] args) throws Exception {
FunctionPipeline processor = new FunctionPipeline();
// SimpleHttpRequest httpRequest = new SimpleHttpRequest();
// httpRequest.setUri("/get/123");
//
// SimpleHttpResponse resp1 = processor.process(httpRequest);
// System.out.println(resp1.getData());
//System.out.println(resp.getTime());
Filter filterAccessAdmin = req -> {
req.setNotAuthorized(req.getUri().contains("admin"));
return req;
};
FinalProcessor logic123Function = req -> {
if(req.getUri().contains("123")){
return new SimpleHttpResponse("123 data");
}
return new SimpleHttpResponse();
};
Decorator formatingResult = resp -> {
resp.setBody("(" + resp.getBody() + ")");
return resp;
};
processor.apply(filterAccessAdmin).apply(logic123Function).apply(formatingResult);
System.out.println(processor.apply(new SimpleHttpRequest("admin/edit/123")));
System.out.println(processor.apply(new SimpleHttpRequest("user/edit/123")));
System.out.println(processor.apply(new SimpleHttpRequest("user/edit/456")));
FinalProcessor logic456Function = req -> {
if(req.getUri().contains("456")){
return new SimpleHttpResponse("456 data");
}
return null;
};
processor.apply(logic456Function);
System.out.println(processor.apply(new SimpleHttpRequest("user/edit/456")));
}
}