package com.liveramp.hank.ui.controllers; import com.liveramp.hank.coordinator.*; import com.liveramp.hank.ui.URLEnc; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class RingController extends Controller { private final Coordinator coordinator; public RingController(String name, Coordinator coordinator) { super(name); this.coordinator = coordinator; actions.put("add_host", new Action() { @Override protected void action(HttpServletRequest req, HttpServletResponse resp) throws IOException { doAddHost(req, resp); } }); actions.put("delete_host", new Action() { @Override protected void action(HttpServletRequest req, HttpServletResponse resp) throws IOException { doDeleteHost(req, resp); } }); actions.put("command_all", new Action() { @Override protected void action(HttpServletRequest req, HttpServletResponse resp) throws IOException { doCommandAll(req, resp); } }); } protected void doDeleteHost(HttpServletRequest req, HttpServletResponse resp) throws IOException { RingGroup ringGroup = coordinator.getRingGroup(req.getParameter("g")); Ring ring = ringGroup.getRing(Integer.parseInt(req.getParameter("n"))); ring.removeHost(PartitionServerAddress.parse(URLEnc.decode(req.getParameter("h")))); resp.sendRedirect(String.format("/ring.jsp?g=%s&n=%d", ringGroup.getName(), ring.getRingNumber())); } private void doAddHost(HttpServletRequest req, HttpServletResponse resp) throws IOException { String rgName = req.getParameter("rgName"); int ringNum = Integer.parseInt(req.getParameter("ringNum")); String hostname = req.getParameter("hostname"); int portNum = Integer.parseInt(req.getParameter("port")); String flagsStr = req.getParameter("hostFlags"); coordinator.getRingGroup(rgName).getRing(ringNum).addHost( new PartitionServerAddress(hostname, portNum), Hosts.splitHostFlags(flagsStr)); resp.sendRedirect("/ring.jsp?g=" + rgName + "&n=" + ringNum); } private void doCommandAll(HttpServletRequest req, HttpServletResponse resp) throws IOException { String rgName = req.getParameter("rgName"); int ringNum = Integer.parseInt(req.getParameter("ringNum")); HostCommand command = HostCommand.valueOf(req.getParameter("command")); Rings.commandAll(coordinator.getRingGroup(rgName).getRing(ringNum), command); resp.sendRedirect("/ring.jsp?g=" + rgName + "&n=" + ringNum); } }