package uk.ac.imperial.lsds.seep.infrastructure.api;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.eclipse.jetty.util.MultiMap;
import com.fasterxml.jackson.databind.ObjectMapper;
public class RestAPIHandler extends AbstractHandler {
public static final ObjectMapper mapper = new ObjectMapper();
private Map<String, RestAPIRegistryEntry> restAPIRegistry;
public RestAPIHandler(Map<String, RestAPIRegistryEntry> restAPIRegistry) {
this.restAPIRegistry = restAPIRegistry;
}
public static Map<String, String> getReqParameter(String query) {
String[] params = query.split("&");
Map<String, String> map = new HashMap<>();
for (String param : params) {
String name = param.split("=")[0];
String value = param.split("=")[1];
map.put(name, value);
}
return map;
}
@Override
public void handle(String target, Request baseRequest,
HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
String callback = request.getParameter("callback");
response.setContentType("application/json;charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
if (!this.restAPIRegistry.containsKey(target)) {
baseRequest.setHandled(true);
if (callback != null)
response.getWriter().println(callback + "(" + mapper.writeValueAsString(this.restAPIRegistry.keySet()) + ")");
else
response.getWriter().println(mapper.writeValueAsString(this.restAPIRegistry.keySet()));
}
else {
if (baseRequest.getMethod().equals("GET")) {
baseRequest.setHandled(true);
if (callback != null)
response.getWriter().println(callback + "(" + mapper.writeValueAsString(this.restAPIRegistry.get(target).getAnswer(baseRequest.getParameters())) + ")");
else
response.getWriter().println(mapper.writeValueAsString(this.restAPIRegistry.get(target).getAnswer(baseRequest.getParameters())));
}
else if (baseRequest.getMethod().equals("POST")) {
baseRequest.setHandled(true);
if (callback != null)
response.getWriter().println(callback + "(" + mapper.writeValueAsString(this.restAPIRegistry.get(target).getAnswer(baseRequest.getParameters())) + ")");
else
response.getWriter().println(mapper.writeValueAsString(this.restAPIRegistry.get(target).getAnswer(baseRequest.getParameters())));
}
}
}
}