package ru.yandex.market.graphouse.search;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
/**
* @author Dmitry Andreev <a href="mailto:AndreevDm@yandex-team.ru"></a>
* @date 08/04/15
*/
public class MetricSearchServlet extends HttpServlet {
private static final Logger log = LogManager.getLogger();
private final MetricSearch metricSearch;
private final boolean allowColdRun;
public MetricSearchServlet(MetricSearch metricSearch, boolean allowColdRun) {
this.metricSearch = metricSearch;
this.allowColdRun = allowColdRun;
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
if (!allowColdRun && !metricSearch.isMetricTreeLoaded()){
resp.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
resp.getWriter().println("Metric tree not loaded\n");
resp.getWriter().println("Loading status: " + metricSearch.getMetricSearchUnit().toString());
return;
}
switch (req.getRequestURI()) {
case "/search":
search(req, resp);
break;
case "/ban":
modify(req, resp, MetricStatus.BAN);
break;
case "/multiBan":
multiModify(req, resp, MetricStatus.BAN);
break;
case "/approve":
modify(req, resp, MetricStatus.APPROVED);
break;
case "/multiApprove":
multiModify(req, resp, MetricStatus.APPROVED);
break;
case "/hide":
modify(req, resp, MetricStatus.HIDDEN);
break;
case "/multiHide":
multiModify(req, resp, MetricStatus.HIDDEN);
break;
default:
badRequest(resp);
break;
}
}
private void badRequest(HttpServletResponse resp) throws IOException {
resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
resp.getOutputStream().println("Usage:");
resp.getOutputStream().println("/search?query=<pattern>");
resp.getOutputStream().println("/ban?name=<metric>");
resp.getOutputStream().println("/multiBan?query=<pattern>");
resp.getOutputStream().println("/approve?name=<metric>");
resp.getOutputStream().println("/multiApprove?query=<pattern>");
resp.getOutputStream().println("/hide?name=<metric>");
resp.getOutputStream().println("/multiHide?query=<pattern>");
}
private void modify(HttpServletRequest req, HttpServletResponse resp, MetricStatus status) throws IOException {
String metric = req.getParameter("name");
if (metric == null || metric.isEmpty()) {
badRequest(resp);
return;
}
metricSearch.modify(metric, status);
resp.getOutputStream().println("Updated to status " + status + ": " + metric);
}
private void multiModify(HttpServletRequest req, HttpServletResponse resp, MetricStatus status) throws IOException {
String query = req.getParameter("query");
if (query == null || query.isEmpty()) {
badRequest(resp);
return;
}
final PrintWriter writer = resp.getWriter();
writer.println("Status changed to " + status.name() + ":");
writer.println();
int count = metricSearch.multiModify(query, status, writer);
writer.println();
writer.println("Total count: " + count);
}
private void search(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String query = req.getParameter("query");
final PrintWriter writer = resp.getWriter();
if (query == null || query.isEmpty()) {
resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
writer.println("Usage: /search?query=<searchquery>");
return;
}
metricSearch.search(query, writer);
}
}