package bvira.web;
import bvira.framework.Command;
import bvira.framework.Component;
import bvira.framework.Presenter;
import bvira.framework.RequestContext;
import bvira.framework.ResponseContext;
import bvira.framework.RouteMap;
import bvira.framework.TemplateFactory;
import bvira.util.Container;
public class WebApplication {
private final Container container;
private final RouteMap routeMap;
public WebApplication(Iterable<Component> components, Container container, TemplateFactory templateFactory, Iterable<Class> services) {
this.container = container;
this.routeMap = new WebRouteMap();
this.container.register(this);
this.container.register(templateFactory);
for (Class service : services) {
this.container.register(service);
}
for (Component component : components) {
component.registerClasses(container);
component.registerRoutes(routeMap);
}
}
public final void executePresenter(RequestContext requestContext, ResponseContext responseContext) {
Container requestContainer = container.transientContainer();
Class<? extends Presenter> presenterClass = routeMap.findPresenter(requestContext.getRequestUri());
Presenter presenter = requestContainer.getInstance(presenterClass);
presenter.present(requestContext, responseContext);
requestContainer.dispose();
}
public final void executeCommand(RequestContext requestContext, ResponseContext responseContext) {
Container requestContainer = container.transientContainer();
Class<? extends Command> commandClass = routeMap.findCommand(requestContext.getRequestUri());
Command command = requestContainer.getInstance(commandClass);
command.execute(requestContext, responseContext);
requestContainer.dispose();
}
}