package com.vtence.molecule.middlewares;
import com.vtence.molecule.Application;
import com.vtence.molecule.Request;
import com.vtence.molecule.Response;
import com.vtence.molecule.routing.Route;
import com.vtence.molecule.routing.RouteBuilder;
import com.vtence.molecule.routing.RouteSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class Router extends AbstractMiddleware implements RouteSet {
public static Router draw(RouteBuilder routeBuilder) {
Router router = new Router();
routeBuilder.build(router);
return router;
}
private final List<Route> routingTable = new ArrayList<>();
public Router() {
this(new NotFound());
}
public Router(final Application fallback) {
connectTo(fallback);
}
public Router defaultsTo(Application app) {
connectTo(app);
return this;
}
public void add(Route route) {
routingTable.add(route);
}
private Optional<Route> routeFor(Request request) {
return routingTable.stream().filter(route -> route.matches(request)).findFirst();
}
public void handle(Request request, Response response) throws Exception {
Optional<Route> route = routeFor(request);
if (route.isPresent())
route.get().handle(request, response);
else
forward(request, response);
}
}