package bvira.web;
import bvira.components.HomePageComponent;
import bvira.components.LoginComponent;
import bvira.components.OfficeComponent;
import bvira.framework.Component;
import bvira.framework.RequestContext;
import bvira.framework.RequestUri;
import bvira.framework.ResponseContext;
import bvira.persistance.StubOfficeFinder;
import bvira.util.DefaultContainer;
import bvira.util.NotFoundException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class HttpRequestHandler extends HttpServlet {
private static final long serialVersionUID = 1L;
private transient WebApplication application;
public static final List<Class> services = new ArrayList<Class>() {{
add(StubOfficeFinder.class);
}};
private static final List<Component> components = new ArrayList<Component>() {{
add(new HomePageComponent());
add(new LoginComponent());
add(new OfficeComponent());
}};
public void init(ServletConfig servletConfig) throws ServletException {
super.init(servletConfig);
application = new WebApplication(components, new DefaultContainer(), new StringTemplateFactory(), services);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
RequestUri requestUri = getRequestUri(request).without(request.getContextPath());
try {
RequestContext webRequest = WebRequestContext.create(request, requestUri);
ResponseContext webResponse = PresenterResponse.create(response, requestUri);
application.executePresenter(webRequest, webResponse);
webResponse.validateResponse();
} catch (RuntimeException e) {
error(requestUri, response, e);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
RequestUri requestUri = getRequestUri(request).without(request.getContextPath());
try {
RequestContext webRequest = WebRequestContext.create(request, requestUri);
ResponseContext webResponse = CommandResponse.create(response, requestUri);
application.executeCommand(webRequest, webResponse);
webResponse.validateResponse();
} catch (RuntimeException e) {
error(requestUri, response, e);
}
}
private static RequestUri getRequestUri(HttpServletRequest request) {
String requestUri = (String) request.getAttribute("javax.servlet.include.request_uri");
String query = (String) request.getAttribute("javax.servlet.include.query_string");
if (requestUri == null) {
requestUri = request.getRequestURI();
query = request.getQueryString();
}
return new RequestUri(requestUri, query);
}
private void error(RequestUri requestUri, HttpServletResponse response, RuntimeException error) throws IOException {
if (error instanceof NotFoundException) {
log(requestUri + " --> " + error);
response.sendError(HttpServletResponse.SC_NOT_FOUND);
} else {
log(requestUri.toString(), error);
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
}
public static Iterable<Component> getComponents() {
return components;
}
public static Iterable<Class> getServices() {
return services;
}
}