//Dstl (c) Crown Copyright 2017 package uk.gov.dstl.baleen.core.web.servlets; import java.io.IOException; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Optional; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.http.HttpMethod; import org.eclipse.jetty.http.HttpStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import uk.gov.dstl.baleen.core.pipelines.BaleenPipeline; import uk.gov.dstl.baleen.core.pipelines.BaleenPipelineManager; import uk.gov.dstl.baleen.core.web.security.WebPermission; import uk.gov.dstl.baleen.exceptions.BaleenException; import uk.gov.dstl.baleen.exceptions.InvalidParameterException; /** * Create, deletes, start and stops pipelines in a {@link BaleenPipelineManager} . * */ public class PipelineManagerServlet extends AbstractApiServlet { private static final long serialVersionUID = 1L; private static final Logger LOGGER = LoggerFactory.getLogger(PipelineManagerServlet.class); private static final String PARAM_NAME = "name"; private static final String PARAM_YAML = "yaml"; private final transient BaleenPipelineManager manager; /** * New instance, which will manage the supplied manager. * * @param manager * the pipeline manager that owns the pipelines */ public PipelineManagerServlet(BaleenPipelineManager manager) { super(LOGGER, PipelineManagerServlet.class); this.manager = manager; } /** * New instance, which will manage the supplied manager. */ public PipelineManagerServlet(Logger logger, Class<?> clazz, BaleenPipelineManager manager) { super(logger, clazz); this.manager = manager; } protected String getType(){ return "pipelines"; } @Override public WebPermission[] getPermissions() { return new WebPermission[] { new WebPermission("Create " + getType(), HttpMethod.POST, getType() + ".create"), new WebPermission("Get/List " + getType(), HttpMethod.GET, getType() + ".list"), new WebPermission("Delete " + getType(), HttpMethod.DELETE, getType() + ".delete"), new WebPermission("Pause/unpause " + getType(), HttpMethod.POST, getType() + ".control"), }; } @Override protected void get(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String[] names = req.getParameterValues(PARAM_NAME); Collection<BaleenPipeline> list; if (names == null || names.length == 0) { list = manager.getAll(); } else { list = new LinkedList<>(); for (String n : names) { if (n == null) { continue; } Optional<BaleenPipeline> p = manager.get(n); if (p.isPresent()) { list.add(p.get()); } } } respondWithJson(resp, list); } @Override protected void post(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String servletPath = req.getRequestURI(); while(servletPath.endsWith("/")) servletPath = servletPath.substring(0, servletPath.length() - 1); String[] parts = servletPath.split("/"); String action = ""; if(parts.length > 4) // <>/<api>/<1>/<pipelines> are first four splits action = parts[parts.length - 1]; if(action.trim().isEmpty()){ //Create pipeline create(req, resp); }else{ String[] names = req.getParameterValues(PARAM_NAME); if (names == null || names.length == 0) { respondWithBadArguments(resp); return; } List<BaleenPipeline> list = new LinkedList<>(); for (String name : names) { Optional<BaleenPipeline> t = manager.get(name); if(!t.isPresent()) continue; BaleenPipeline bop = t.get(); try{ control(bop, action); }catch(InvalidParameterException ipe){ respondWithBadArguments(resp); LOGGER.warn("Bad request received", ipe); } list.add(bop); } respondWithJson(resp, list); } } private void control(BaleenPipeline pipeline, String command) throws InvalidParameterException{ switch(command.toLowerCase()){ case "pause": pipeline.pause(); break; case "unpause": pipeline.unpause(); break; default: throw new InvalidParameterException("Unexpected command '"+command+"'"); } } private void create(HttpServletRequest req, HttpServletResponse resp) throws IOException { String name = req.getParameter(PARAM_NAME); String yaml = req.getParameter(PARAM_YAML); if (!parametersPresent(name, yaml) || manager.has(name)) { respondWithBadArguments(resp); return; } BaleenPipeline t; try { t = manager.create(name, yaml); } catch (BaleenException e) { LOGGER.error("Unable to create", e); respondWithError(resp, HttpStatus.BAD_REQUEST_400, "Creation of pipeline from yaml failed"); return; } respondWithJson(resp, t); } @Override protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String[] names = req.getParameterValues(PARAM_NAME); if (names == null || names.length == 0) { respondWithBadArguments(resp); return; } for (String name : names) { manager.remove(name); } respond(resp, HttpStatus.OK_200); } }