package bvira.web;
import bvira.framework.Command;
import bvira.framework.Navigable;
import bvira.framework.Presenter;
import bvira.framework.Route;
import bvira.framework.RouteMap;
import bvira.util.Lists;
import bvira.util.Maps;
import bvira.util.NotFoundException;
import java.util.List;
import java.util.Map;
public class WebRouteMap implements RouteMap {
private final List<Route> routes = Lists.create();
private final Map<Route, Class<? extends Presenter>> presenterRoutes = Maps.create();
private final Map<Route, Class<? extends Command>> commandRoutes = Maps.create();
public void registerPresenter(Route route, Class<? extends Presenter> presenterClass) {
presenterRoutes.put(findOrCreate(route), presenterClass);
}
public void registerRoute(Route route, Class<? extends Presenter> presenterClass, Class<? extends Command> commandClass) {
Route localRoute = findOrCreate(route);
presenterRoutes.put(localRoute, presenterClass);
commandRoutes.put(localRoute, commandClass);
}
public void registerRoute(Route route, Class<? extends Command> commandClass) {
commandRoutes.put(findOrCreate(route), commandClass);
}
public Class<? extends Presenter> findPresenter(Navigable requestUri) {
return presenterRoutes.get(findRoute(requestUri.getPath()));
}
public Class<? extends Command> findCommand(Navigable requestUri) {
return commandRoutes.get(findRoute(requestUri.getPath()));
}
private Route findOrCreate(Route path) {
for (Route route : routes) {
if (route.match(path)) {
return route;
}
}
routes.add(path);
return path;
}
private Route findRoute(String path) {
for (Route route : routes) {
if (route.match(path)) {
return route;
}
}
throw new NotFoundException("Cannot find route for " + path);
}
}