package com.liveramp.hank.ui.controllers;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
public abstract class Controller extends HttpServlet {
private final String name;
protected final Map<String, Action> actions = new HashMap<String, Action>();
public Controller(String name) {
this.name = name;
}
public void addServlet(ServletContextHandler servletContextHandler) {
servletContextHandler.addServlet(new ServletHolder(this), "/" + name + "/*");
}
@Override
protected final void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doAction(request, response);
}
@Override
protected final void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doAction(request, response);
}
private final void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String[] uriSplits = request.getRequestURI().split("/");
if (uriSplits.length < 3) {
invalidRequestFormat(request, response);
return;
}
String actionStr = uriSplits[2];
Action action = actions.get(actionStr);
if (action == null) {
unknownAction(actionStr, response);
return;
} else {
response.setStatus(HttpServletResponse.SC_OK);
action.action(request, response);
}
}
private final void invalidRequestFormat(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.sendError(400, "Incorrectly formatted request: " + request.getRequestURI());
}
private final void unknownAction(String action, HttpServletResponse response) throws IOException {
response.sendError(404, "Unknown action: " + action);
}
}