package com.liveramp.hank.ui.controllers; import com.liveramp.hank.coordinator.Coordinator; import com.liveramp.hank.coordinator.Ring; import com.liveramp.hank.coordinator.RingGroup; import com.liveramp.hank.ring_group_conductor.RingGroupConductorMode; import com.liveramp.hank.ui.URLEnc; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class RingGroupController extends Controller { private final Coordinator coordinator; public RingGroupController(String name, Coordinator coordinator) { super(name); this.coordinator = coordinator; actions.put("create", new Action() { @Override protected void action(HttpServletRequest req, HttpServletResponse resp) throws IOException { doCreate(req, resp); } }); actions.put("add_ring", new Action() { @Override protected void action(HttpServletRequest req, HttpServletResponse resp) throws IOException { doAddRing(req, resp); } }); actions.put("delete_ring", new Action() { @Override protected void action(HttpServletRequest req, HttpServletResponse resp) throws IOException { doDeleteRing(req, resp); } }); actions.put("delete_ring_group", new Action() { @Override protected void action(HttpServletRequest req, HttpServletResponse resp) throws IOException { doDeleteRingGroup(req, resp); } }); actions.put("set_ring_group_conductor_mode", new Action() { @Override protected void action(HttpServletRequest req, HttpServletResponse resp) throws IOException { doSetRingGroupConductorMode(req, resp); } }); } protected void doDeleteRing(HttpServletRequest req, HttpServletResponse resp) throws IOException { RingGroup ringGroup; String encodedRingGroupName = req.getParameter("g"); ringGroup = coordinator.getRingGroup(URLEnc.decode(encodedRingGroupName)); if (ringGroup == null) { throw new IOException("couldn't find any ring group called " + URLEnc.decode(encodedRingGroupName)); } ringGroup.removeRing(Integer.parseInt(req.getParameter("n"))); resp.sendRedirect("/ring_group.jsp?name=" + encodedRingGroupName); } private void doAddRing(HttpServletRequest req, HttpServletResponse resp) throws IOException { RingGroup ringGroup; String encodedRingGroupName = req.getParameter("g"); ringGroup = coordinator.getRingGroup(URLEnc.decode(encodedRingGroupName)); if (ringGroup == null) { throw new IOException("couldn't find any ring group called " + URLEnc.decode(encodedRingGroupName)); } // Find new ring ID (largest ID + 1) int newRingID = 0; for (Ring ring : ringGroup.getRings()) { if (ring.getRingNumber() >= newRingID) { newRingID = ring.getRingNumber() + 1; } } ringGroup.addRing(newRingID); resp.sendRedirect("/ring_group.jsp?name=" + encodedRingGroupName); } private void doCreate(HttpServletRequest req, HttpServletResponse resp) throws IOException { coordinator.addRingGroup(req.getParameter("rgName"), req.getParameter("dgName")); // could log the rg... resp.sendRedirect("/ring_groups.jsp"); } protected void doDeleteRingGroup(HttpServletRequest req, HttpServletResponse resp) throws IOException { String encodedRingGroupName = req.getParameter("g"); coordinator.deleteRingGroup(URLEnc.decode(encodedRingGroupName)); resp.sendRedirect("/ring_groups.jsp"); } protected void doSetRingGroupConductorMode(HttpServletRequest req, HttpServletResponse resp) throws IOException { String encodedRingGroupName = req.getParameter("g"); RingGroup ringGroup = coordinator.getRingGroup(URLEnc.decode(encodedRingGroupName)); // Only change the mode if it's not OFFLINE if (ringGroup.getRingGroupConductorMode() != null && ringGroup.getRingGroupConductorMode() != RingGroupConductorMode.OFFLINE) { ringGroup.setRingGroupConductorMode(RingGroupConductorMode.valueOf(URLEnc.decode(req.getParameter("mode")))); } resp.sendRedirect("/ring_group.jsp?name=" + encodedRingGroupName); } public static String getRingGroupUrl(RingGroup ringGroup) { return "ring_group.jsp?name=" + URLEnc.encode(ringGroup.getName()); } }