Checkstyle fixes for datarouter prov
[dmaap/datarouter.git] / datarouter-prov / src / main / java / org / onap / dmaap / datarouter / provisioning / RouteServlet.java
index ab7aff8..8506530 100644 (file)
@@ -7,9 +7,9 @@
  * * Licensed under the Apache License, Version 2.0 (the "License");\r
  * * you may not use this file except in compliance with the License.\r
  * * You may obtain a copy of the License at\r
- * * \r
+ * *\r
  *  *      http://www.apache.org/licenses/LICENSE-2.0\r
- * * \r
+ * *\r
  *  * Unless required by applicable law or agreed to in writing, software\r
  * * distributed under the License is distributed on an "AS IS" BASIS,\r
  * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
 \r
 package org.onap.dmaap.datarouter.provisioning;\r
 \r
+import static org.onap.dmaap.datarouter.provisioning.utils.HttpServletUtils.sendResponseError;\r
+\r
 import java.io.IOException;\r
 import java.util.Set;\r
-\r
 import javax.servlet.http.HttpServletRequest;\r
 import javax.servlet.http.HttpServletResponse;\r
-\r
+import org.json.JSONException;\r
 import org.json.JSONObject;\r
+\r
 import org.onap.dmaap.datarouter.provisioning.beans.Deleteable;\r
 import org.onap.dmaap.datarouter.provisioning.beans.EgressRoute;\r
 import org.onap.dmaap.datarouter.provisioning.beans.EventLogRecord;\r
@@ -39,6 +41,8 @@ import org.onap.dmaap.datarouter.provisioning.beans.Insertable;
 import org.onap.dmaap.datarouter.provisioning.beans.NetworkRoute;\r
 import org.onap.dmaap.datarouter.provisioning.beans.NodeClass;\r
 \r
+\r
+\r
 /**\r
  * <p>\r
  * This servlet handles requests to URLs under /internal/route/ on the provisioning server.\r
@@ -47,7 +51,10 @@ import org.onap.dmaap.datarouter.provisioning.beans.NodeClass;
  * </p>\r
  * <div class="contentContainer">\r
  * <table class="packageSummary" border="0" cellpadding="3" cellspacing="0">\r
- * <caption><span>URL Path Summary</span><span class="tabEnd">&nbsp;</span></caption>\r
+ * <caption>\r
+ *     <span>URL Path Summary</span>\r
+ *     <span class="tabEnd">&nbsp;</span>\r
+ * </caption>\r
  * <tr>\r
  *   <th class="colFirst" width="35%">URL Path</th>\r
  *   <th class="colOne">Method</th>\r
@@ -106,6 +113,7 @@ import org.onap.dmaap.datarouter.provisioning.beans.NodeClass;
  *   and <i>tonode</i>.</td>\r
  * </tr>\r
  * </table>\r
+ * </div>\r
  * <p>\r
  * Authorization to use these URLs is a little different than for other URLs on the provisioning server.\r
  * For the most part, the IP address that the request comes from should be either:\r
@@ -125,304 +133,339 @@ import org.onap.dmaap.datarouter.provisioning.beans.NodeClass;
  * @version $Id$\r
  */\r
 @SuppressWarnings("serial")\r
+\r
 public class RouteServlet extends ProxyServlet {\r
-       /**\r
-        * DELETE route table entries by deleting part of the route table tree.\r
-        */\r
-       @Override\r
-       public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {\r
-               EventLogRecord elr = new EventLogRecord(req);\r
-               if (!isAuthorizedForInternal(req)) {\r
-                       elr.setMessage("Unauthorized.");\r
-                       elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
-                       eventlogger.info(elr);\r
-                       resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized.");\r
-                       return;\r
-               }\r
-               if (isProxyOK(req) && isProxyServer()) {\r
-                       super.doDelete(req, resp);\r
-                       return;\r
-               }\r
 \r
-               String path = req.getPathInfo();\r
-               String[] parts = path.substring(1).split("/");\r
-               Deleteable[] d = null;\r
-               if (parts[0].equals("ingress")) {\r
-                       if (parts.length == 4) {\r
-                               // /internal/route/ingress/<feed>/<user>/<subnet>\r
-                               try {\r
-                                       int feedid = Integer.parseInt(parts[1]);\r
-                                       IngressRoute er = IngressRoute.getIngressRoute(feedid, parts[2], parts[3].replaceAll("!", "/"));\r
-                                       if (er == null) {\r
-                                               resp.sendError(HttpServletResponse.SC_NOT_FOUND, "The specified ingress route does not exist.");\r
-                                               return;\r
-                                       }\r
-                                       d = new Deleteable[] { er };\r
-                               } catch (NumberFormatException e) {\r
-                                       resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid feed ID in 'delete ingress' command.");\r
-                                       return;\r
-                               }\r
-                       } else if (parts.length == 2) {\r
-                               // /internal/route/ingress/<seq>\r
-                               try {\r
-                                       int seq = Integer.parseInt(parts[1]);\r
-                                       Set<IngressRoute> set = IngressRoute.getIngressRoutesForSeq(seq);\r
-                                       d = set.toArray(new Deleteable[0]);\r
-                               } catch (NumberFormatException e) {\r
-                                       resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid sequence number in 'delete ingress' command.");\r
-                                       return;\r
-                               }\r
-                       } else {\r
-                               resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid number of arguments in 'delete ingress' command.");\r
-                               return;\r
-                       }\r
-               } else if (parts[0].equals("egress")) {\r
-                       if (parts.length == 2) {\r
-                               // /internal/route/egress/<sub>\r
-                               try {\r
-                                       int subid = Integer.parseInt(parts[1]);\r
-                                       EgressRoute er = EgressRoute.getEgressRoute(subid);\r
-                                       if (er == null) {\r
-                                               resp.sendError(HttpServletResponse.SC_NOT_FOUND, "The specified egress route does not exist.");\r
-                                               return;\r
-                                       }\r
-                                       d = new Deleteable[] { er };\r
-                               } catch (NumberFormatException e) {\r
-                                       resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid sub ID in 'delete egress' command.");\r
-                                       return;\r
-                               }\r
-                       } else {\r
-                               resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid number of arguments in 'delete egress' command.");\r
-                               return;\r
-                       }\r
-               } else if (parts[0].equals("network")) {\r
-                       if (parts.length == 3) {\r
-                               // /internal/route/network/<from>/<to>\r
-                               try {//\r
-                                       NetworkRoute nr = new NetworkRoute(\r
-                                               NodeClass.normalizeNodename(parts[1]),\r
-                                               NodeClass.normalizeNodename(parts[2])\r
-                                       );\r
-                                       d = new Deleteable[] { nr };\r
-                               } catch (IllegalArgumentException e) {\r
-                                       resp.sendError(HttpServletResponse.SC_NOT_FOUND, "The specified network route does not exist.");\r
-                                       return;\r
-                               }\r
-                       } else {\r
-                               resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid number of arguments in 'delete network' command.");\r
-                               return;\r
-                       }\r
-               }\r
-               if (d == null) {\r
-                       resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Bad URL.");\r
-                       return;\r
-               }\r
-               boolean rv = true;\r
-               for (Deleteable dd : d) {\r
-                       rv &= doDelete(dd);\r
-               }\r
-               if (rv) {\r
-                       elr.setResult(HttpServletResponse.SC_OK);\r
-                       eventlogger.info(elr);\r
-                       resp.setStatus(HttpServletResponse.SC_OK);\r
-                       provisioningDataChanged();\r
-                       provisioningParametersChanged();\r
-               } else {\r
-                       // Something went wrong with the DELETE\r
-                       elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);\r
-                       eventlogger.info(elr);\r
-                       resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);\r
-               }\r
-       }\r
-       /**\r
-        * GET route table entries from the route table tree specified by the URL path.\r
-        */\r
-       @Override\r
-       public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {\r
-               EventLogRecord elr = new EventLogRecord(req);\r
-               if (!isAuthorizedForInternal(req)) {\r
-                       elr.setMessage("Unauthorized.");\r
-                       elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
-                       eventlogger.info(elr);\r
-                       resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized.");\r
-                       return;\r
-               }\r
-               if (isProxyOK(req) && isProxyServer()) {\r
-                       super.doGet(req, resp);\r
-                       return;\r
-               }\r
+    /**\r
+     * DELETE route table entries by deleting part of the route table tree.\r
+     */\r
+    @Override\r
+    public void doDelete(HttpServletRequest req, HttpServletResponse resp) {\r
+        EventLogRecord elr = new EventLogRecord(req);\r
+        if (!isAuthorizedForInternal(req)) {\r
+            elr.setMessage(UNAUTHORIZED);\r
+            elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
+            eventlogger.error(elr.toString());\r
+            sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, UNAUTHORIZED, eventlogger);\r
+            return;\r
+        }\r
+        if (isProxyOK(req) && isProxyServer()) {\r
+            super.doDelete(req, resp);\r
+            return;\r
+        }\r
+\r
+        String path = req.getPathInfo();\r
+        String[] parts = path.substring(1).split("/");\r
+        Deleteable[] deleteables = null;\r
+        if ("ingress".equals(parts[0])) {\r
+            if (parts.length == 4) {\r
+                // /internal/route/ingress/<feed>/<user>/<subnet>\r
+                try {\r
+                    int feedid = Integer.parseInt(parts[1]);\r
+                    IngressRoute er = IngressRoute.getIngressRoute(feedid, parts[2], parts[3].replaceAll("!", "/"));\r
+                    if (er == null) {\r
+                        sendResponseError(resp,\r
+                            HttpServletResponse.SC_NOT_FOUND, "The specified ingress route does not exist.",\r
+                                eventlogger);\r
+                        return;\r
+                    }\r
+                    deleteables = new Deleteable[] { er };\r
+                } catch (NumberFormatException e) {\r
+                    sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND,\r
+                            "Invalid feed ID in 'delete ingress' command.", eventlogger);\r
+                    return;\r
+                }\r
+            } else if (parts.length == 2) {\r
+                // /internal/route/ingress/<seq>\r
+                try {\r
+                    int seq = Integer.parseInt(parts[1]);\r
+                    Set<IngressRoute> set = IngressRoute.getIngressRoutesForSeq(seq);\r
+                    deleteables = set.toArray(new Deleteable[0]);\r
+                } catch (NumberFormatException e) {\r
+                    sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND,\r
+                            "Invalid sequence number in 'delete ingress' command.", eventlogger);\r
+                    return;\r
+                }\r
+            } else {\r
+                sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND,\r
+                        "Invalid number of arguments in 'delete ingress' command.", eventlogger);\r
+                return;\r
+            }\r
+        } else if ("egress".equals(parts[0])) {\r
+            if (parts.length == 2) {\r
+                // /internal/route/egress/<sub>\r
+                try {\r
+                    int subid = Integer.parseInt(parts[1]);\r
+                    EgressRoute er = EgressRoute.getEgressRoute(subid);\r
+                    if (er == null) {\r
+                        sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND,\r
+                                "The specified egress route does not exist.", eventlogger);\r
+                        return;\r
+                    }\r
+                    deleteables = new Deleteable[] { er };\r
+                } catch (NumberFormatException e) {\r
+                    sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND,\r
+                            "Invalid sub ID in 'delete egress' command.", eventlogger);\r
+                    return;\r
+                }\r
+            } else {\r
+                sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND,\r
+                        "Invalid number of arguments in 'delete egress' command.", eventlogger);\r
+                return;\r
+            }\r
+        } else if ("network".equals(parts[0])) {\r
+            if (parts.length == 3) {\r
+                // /internal/route/network/<from>/<to>\r
+                try {\r
+                    NetworkRoute nr = new NetworkRoute(\r
+                        NodeClass.normalizeNodename(parts[1]),\r
+                        NodeClass.normalizeNodename(parts[2])\r
+                    );\r
+                    deleteables = new Deleteable[] { nr };\r
+                } catch (IllegalArgumentException e) {\r
+                    String message = "The specified network route does not exist.";\r
+                    eventlogger.error(message, e);\r
+                    sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND, message, eventlogger);\r
+                    return;\r
+                }\r
+            } else {\r
+                sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND,\r
+                        "Invalid number of arguments in 'delete network' command.", eventlogger);\r
+                return;\r
+            }\r
+        }\r
+        if (deleteables == null) {\r
+            sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND, BAD_URL, eventlogger);\r
+            return;\r
+        }\r
+        boolean rv = true;\r
+        for (Deleteable dd : deleteables) {\r
+            rv &= doDelete(dd);\r
+        }\r
+        if (rv) {\r
+            elr.setResult(HttpServletResponse.SC_OK);\r
+            eventlogger.info(elr.toString());\r
+            resp.setStatus(HttpServletResponse.SC_OK);\r
+            provisioningDataChanged();\r
+            provisioningParametersChanged();\r
+        } else {\r
+            // Something went wrong with the DELETE\r
+            elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);\r
+            eventlogger.error(elr.toString());\r
+            sendResponseError(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG, eventlogger);\r
+        }\r
+    }\r
+\r
+    /**\r
+     * GET route table entries from the route table tree specified by the URL path.\r
+     */\r
+    @Override\r
+    public void doGet(HttpServletRequest req, HttpServletResponse resp) {\r
+        EventLogRecord elr = new EventLogRecord(req);\r
+        if (!isAuthorizedForInternal(req)) {\r
+            elr.setMessage(UNAUTHORIZED);\r
+            elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
+            eventlogger.error(elr.toString());\r
+            sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, UNAUTHORIZED, eventlogger);\r
+            return;\r
+        }\r
+        if (isProxyOK(req) && isProxyServer()) {\r
+            super.doGet(req, resp);\r
+            return;\r
+        }\r
+\r
+        String path = req.getPathInfo();\r
+        if (!path.endsWith("/")) {\r
+            path += "/";\r
+        }\r
+        if (!"/".equals(path) && !INGRESS.equals(path) && !EGRESS.equals(path) && !NETWORK.equals(path)) {\r
+            sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND, BAD_URL, eventlogger);\r
+            return;\r
+        }\r
+\r
+        StringBuilder sb = new StringBuilder("{\n");\r
+        String px2 = "";\r
+        if ("/".equals(path) || INGRESS.equals(path)) {\r
+            String pfx = "\n";\r
+            sb.append("\"ingress\": [");\r
+            for (IngressRoute in : IngressRoute.getAllIngressRoutes()) {\r
+                sb.append(pfx);\r
+                sb.append(in.asJSONObject().toString());\r
+                pfx = ",\n";\r
+            }\r
+            sb.append("\n]");\r
+            px2 = ",\n";\r
+        }\r
 \r
-               String path = req.getPathInfo();\r
-               if (!path.endsWith("/"))\r
-                       path += "/";\r
-               if (!path.equals("/") && !path.equals("/ingress/") && !path.equals("/egress/") && !path.equals("/network/")) {\r
-                       resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Bad URL.");\r
-                       return;\r
-               }\r
+        if ("/".equals(path) || EGRESS.equals(path)) {\r
+            String pfx = "\n";\r
+            sb.append(px2);\r
+            sb.append("\"egress\": {");\r
+            for (EgressRoute eg : EgressRoute.getAllEgressRoutes()) {\r
+                JSONObject jx = eg.asJSONObject();\r
+                for (String key : jx.keySet()) {\r
+                    sb.append(pfx);\r
+                    sb.append("  \"").append(key).append("\": ");\r
+                    try {\r
+                        sb.append("\"").append(jx.getString(key)).append("\"");\r
+                    } catch (JSONException je) {\r
+                        eventlogger.error("PROV0161 RouteServlet.doGet: " + je.getMessage(), je);\r
+                    }\r
+                    pfx = ",\n";\r
+                }\r
+            }\r
+            sb.append("\n}");\r
+            px2 = ",\n";\r
+        }\r
 \r
-               StringBuilder sb = new StringBuilder("{\n");\r
-               String px2 = "";\r
-               if (path.equals("/") || path.equals("/ingress/")) {\r
-                       String pfx = "\n";\r
-                       sb.append("\"ingress\": [");\r
-                       for (IngressRoute in : IngressRoute.getAllIngressRoutes()) {\r
-                               sb.append(pfx);\r
-                               sb.append(in.asJSONObject().toString());\r
-                               pfx = ",\n";\r
-                       }\r
-                       sb.append("\n]");\r
-                       px2 = ",\n";\r
-               }\r
+        if ("/".equals(path) || NETWORK.equals(path)) {\r
+            String pfx = "\n";\r
+            sb.append(px2);\r
+            sb.append("\"routing\": [");\r
+            for (NetworkRoute ne : NetworkRoute.getAllNetworkRoutes()) {\r
+                sb.append(pfx);\r
+                sb.append(ne.asJSONObject().toString());\r
+                pfx = ",\n";\r
+            }\r
+            sb.append("\n]");\r
+        }\r
+        sb.append("}\n");\r
+        resp.setStatus(HttpServletResponse.SC_OK);\r
+        resp.setContentType("application/json");\r
+        try {\r
+            resp.getOutputStream().print(sb.toString());\r
+        } catch (IOException ioe) {\r
+            eventlogger.error("PROV0162 RouteServlet.doGet: " + ioe.getMessage(), ioe);\r
+        }\r
+    }\r
 \r
-               if (path.equals("/") || path.equals("/egress/")) {\r
-                       String pfx = "\n";\r
-                       sb.append(px2);\r
-                       sb.append("\"egress\": {");\r
-                       for (EgressRoute eg : EgressRoute.getAllEgressRoutes()) {\r
-                               JSONObject jx = eg.asJSONObject();\r
-                               for (String key : jx.keySet()) {\r
-                                       sb.append(pfx);\r
-                                       sb.append("  \"").append(key).append("\": ");\r
-                                       sb.append("\"").append(jx.getString(key)).append("\"");\r
-                                       pfx = ",\n";\r
-                               }\r
-                       }\r
-                       sb.append("\n}");\r
-                       px2 = ",\n";\r
-               }\r
+    /**\r
+     * PUT on &lt;/internal/route/*&gt; -- not supported.\r
+     */\r
+    @Override\r
+    public void doPut(HttpServletRequest req, HttpServletResponse resp) {\r
+        EventLogRecord elr = new EventLogRecord(req);\r
+        if (!isAuthorizedForInternal(req)) {\r
+            elr.setMessage(UNAUTHORIZED);\r
+            elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
+            eventlogger.error(elr.toString());\r
+            sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, UNAUTHORIZED, eventlogger);\r
+            return;\r
+        }\r
+        sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND, BAD_URL, eventlogger);\r
+    }\r
 \r
-               if (path.equals("/") || path.equals("/network/")) {\r
-                       String pfx = "\n";\r
-                       sb.append(px2);\r
-                       sb.append("\"routing\": [");\r
-                       for (NetworkRoute ne : NetworkRoute.getAllNetworkRoutes()) {\r
-                               sb.append(pfx);\r
-                               sb.append(ne.asJSONObject().toString());\r
-                               pfx = ",\n";\r
-                       }\r
-                       sb.append("\n]");\r
-               }\r
-               sb.append("}\n");\r
-               resp.setStatus(HttpServletResponse.SC_OK);\r
-               resp.setContentType("application/json");\r
-               resp.getOutputStream().print(sb.toString());\r
-       }\r
-       /**\r
-        * PUT on &lt;/internal/route/*&gt; -- not supported.\r
-        */\r
-       @Override\r
-       public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {\r
-               EventLogRecord elr = new EventLogRecord(req);\r
-               if (!isAuthorizedForInternal(req)) {\r
-                       elr.setMessage("Unauthorized.");\r
-                       elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
-                       eventlogger.info(elr);\r
-                       resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized.");\r
-                       return;\r
-               }\r
-               resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Bad URL.");\r
-       }\r
-       /**\r
-        * POST - modify existing route table entries in the route table tree specified by the URL path.\r
-        */\r
-       @Override\r
-       public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {\r
-               EventLogRecord elr = new EventLogRecord(req);\r
-               if (!isAuthorizedForInternal(req)) {\r
-                       elr.setMessage("Unauthorized.");\r
-                       elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
-                       eventlogger.info(elr);\r
-                       resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized.");\r
-                       return;\r
-               }\r
-               if (isProxyOK(req) && isProxyServer()) {\r
-                       super.doPost(req, resp);\r
-                       return;\r
-               }\r
-               String path = req.getPathInfo();\r
-               Insertable[] ins = null;\r
-               if (path.startsWith("/ingress/")) {\r
-                       // /internal/route/ingress/?feed=%s&amp;user=%s&amp;subnet=%s&amp;nodepatt=%s\r
-                       try {\r
-                               // Although it probably doesn't make sense, you can install two identical routes in the IRT\r
-                               int feedid = Integer.parseInt(req.getParameter("feed"));\r
-                               String user = req.getParameter("user");\r
-                               if (user == null)\r
-                                       user = "-";\r
-                               String subnet = req.getParameter("subnet");\r
-                               if (subnet == null)\r
-                                       subnet = "-";\r
-                               String nodepatt = req.getParameter("nodepatt");\r
-                               String t = req.getParameter("seq");\r
-                               int seq = (t != null) ? Integer.parseInt(t) : (IngressRoute.getMaxSequence() + 100);\r
-                               ins = new Insertable[] { new IngressRoute(seq, feedid, user, subnet, NodeClass.lookupNodeNames(nodepatt)) };\r
-                       } catch (Exception e) {\r
-                               intlogger.info(e);\r
-                               resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid arguments in 'add ingress' command.");\r
-                               return;\r
-                       }\r
-               } else if (path.startsWith("/egress/")) {\r
-                       // /internal/route/egress/?sub=%s&amp;node=%s\r
-                       try {\r
-                               int subid = Integer.parseInt(req.getParameter("sub"));\r
-                               EgressRoute er = EgressRoute.getEgressRoute(subid);\r
-                               if (er != null) {\r
-                                       resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "An egress route already exists for that subscriber.");\r
-                                       return;\r
-                               }\r
-                               String node = NodeClass.normalizeNodename(req.getParameter("node"));\r
-                               ins = new Insertable[] { new EgressRoute(subid, node) };\r
-                       } catch (Exception e) {\r
-                               intlogger.info(e);\r
-                               resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid arguments in 'add egress' command.");\r
-                               return;\r
-                       }\r
-               } else if (path.startsWith("/network/")) {\r
-                       // /internal/route/network/?from=%s&amp;to=%s&amp;via=%s\r
-                       try {\r
-                               String nfrom = req.getParameter("from");\r
-                               String nto   = req.getParameter("to");\r
-                               String nvia  = req.getParameter("via");\r
-                               if (nfrom == null || nto == null || nvia == null) {\r
-                                       resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Missing arguments in 'add network' command.");\r
-                                       return;\r
-                               }\r
-                               nfrom = NodeClass.normalizeNodename(nfrom);\r
-                               nto   = NodeClass.normalizeNodename(nto);\r
-                               nvia  = NodeClass.normalizeNodename(nvia);\r
-                               NetworkRoute nr = new NetworkRoute(nfrom, nto, nvia);\r
-                               for (NetworkRoute route : NetworkRoute.getAllNetworkRoutes()) {\r
-                                       if (route.getFromnode() == nr.getFromnode() && route.getTonode() == nr.getTonode()) {\r
-                                               resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Network route table already contains a route for "+nfrom+" and "+nto);\r
-                                               return;\r
-                                       }\r
-                               }\r
-                               ins = new Insertable[] { nr };\r
-                       } catch (IllegalArgumentException e) {\r
-                               intlogger.info(e);\r
-                               resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid arguments in 'add network' command.");\r
-                               return;\r
-                       }\r
-               }\r
-               if (ins == null) {\r
-                       resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Bad URL.");\r
-                       return;\r
-               }\r
-               boolean rv = true;\r
-               for (Insertable dd : ins) {\r
-                       rv &= doInsert(dd);\r
-               }\r
-               if (rv) {\r
-                       elr.setResult(HttpServletResponse.SC_OK);\r
-                       eventlogger.info(elr);\r
-                       resp.setStatus(HttpServletResponse.SC_OK);\r
-                       provisioningDataChanged();\r
-                       provisioningParametersChanged();\r
-               } else {\r
-                       // Something went wrong with the INSERT\r
-                       elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);\r
-                       eventlogger.info(elr);\r
-                       resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);\r
-               }\r
-       }\r
+    /**\r
+     * POST - modify existing route table entries in the route table tree specified by the URL path.\r
+     */\r
+    @Override\r
+    public void doPost(HttpServletRequest req, HttpServletResponse resp) {\r
+        EventLogRecord elr = new EventLogRecord(req);\r
+        if (!isAuthorizedForInternal(req)) {\r
+            elr.setMessage(UNAUTHORIZED);\r
+            elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
+            eventlogger.error(elr.toString());\r
+            sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, UNAUTHORIZED, eventlogger);\r
+            return;\r
+        }\r
+        if (isProxyOK(req) && isProxyServer()) {\r
+            super.doPost(req, resp);\r
+            return;\r
+        }\r
+        String path = req.getPathInfo();\r
+        Insertable[] ins = null;\r
+        if (path.startsWith(INGRESS)) {\r
+            // /internal/route/ingress/?feed=%s&amp;user=%s&amp;subnet=%s&amp;nodepatt=%s\r
+            try {\r
+                // Although it probably doesn't make sense, you can install two identical routes in the IRT\r
+                int feedid = Integer.parseInt(req.getParameter("feed"));\r
+                String user = req.getParameter("user");\r
+                if (user == null) {\r
+                    user = "-";\r
+                }\r
+                String subnet = req.getParameter("subnet");\r
+                if (subnet == null) {\r
+                    subnet = "-";\r
+                }\r
+                String nodepatt = req.getParameter("nodepatt");\r
+                String str = req.getParameter("seq");\r
+                int seq = (str != null) ? Integer.parseInt(str) : (IngressRoute.getMaxSequence() + 100);\r
+                ins = new Insertable[] { new IngressRoute(seq, feedid,\r
+                        user, subnet, NodeClass.lookupNodeNames(nodepatt)) };\r
+            } catch (Exception e) {\r
+                intlogger.info(e.toString(), e);\r
+                sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST,\r
+                        "Invalid arguments in 'add ingress' command.", intlogger);\r
+                return;\r
+            }\r
+        } else if (path.startsWith(EGRESS)) {\r
+            // /internal/route/egress/?sub=%s&amp;node=%s\r
+            try {\r
+                int subid = Integer.parseInt(req.getParameter("sub"));\r
+                EgressRoute er = EgressRoute.getEgressRoute(subid);\r
+                if (er != null) {\r
+                    sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST,\r
+                            "An egress route already exists for that subscriber.", intlogger);\r
+                    return;\r
+                }\r
+                String node = NodeClass.normalizeNodename(req.getParameter("node"));\r
+                ins = new Insertable[] { new EgressRoute(subid, node) };\r
+            } catch (Exception e) {\r
+                intlogger.info(e.toString(), e);\r
+                sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST,\r
+                        "Invalid arguments in 'add egress' command.", intlogger);\r
+                return;\r
+            }\r
+        } else if (path.startsWith(NETWORK)) {\r
+            // /internal/route/network/?from=%s&amp;to=%s&amp;via=%s\r
+            try {\r
+                String nfrom = req.getParameter("from");\r
+                String nto   = req.getParameter("to");\r
+                String nvia  = req.getParameter("via");\r
+                if (nfrom == null || nto == null || nvia == null) {\r
+                    sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST,\r
+                            "Missing arguments in 'add network' command.", intlogger);\r
+                    return;\r
+                }\r
+                nfrom = NodeClass.normalizeNodename(nfrom);\r
+                nto   = NodeClass.normalizeNodename(nto);\r
+                nvia  = NodeClass.normalizeNodename(nvia);\r
+                NetworkRoute nr = new NetworkRoute(nfrom, nto, nvia);\r
+                for (NetworkRoute route : NetworkRoute.getAllNetworkRoutes()) {\r
+                    if (route.getFromnode() == nr.getFromnode() && route.getTonode() == nr.getTonode()) {\r
+                        sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST,\r
+                                "Network route table already contains a route for " + nfrom\r
+                                        + " and " + nto, intlogger);\r
+                        return;\r
+                    }\r
+                }\r
+                ins = new Insertable[] { nr };\r
+            } catch (IllegalArgumentException e) {\r
+                intlogger.info(e.toString(), e);\r
+                sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST,\r
+                        "Invalid arguments in 'add network' command.", intlogger);\r
+                return;\r
+            }\r
+        }\r
+        if (ins == null) {\r
+            sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND, BAD_URL, intlogger);\r
+            return;\r
+        }\r
+        boolean rv = true;\r
+        for (Insertable dd : ins) {\r
+            rv &= doInsert(dd);\r
+        }\r
+        if (rv) {\r
+            elr.setResult(HttpServletResponse.SC_OK);\r
+            eventlogger.info(elr.toString());\r
+            resp.setStatus(HttpServletResponse.SC_OK);\r
+            provisioningDataChanged();\r
+            provisioningParametersChanged();\r
+        } else {\r
+            // Something went wrong with the INSERT\r
+            elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);\r
+            eventlogger.error(elr.toString());\r
+            sendResponseError(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG, intlogger);\r
+        }\r
+    }\r
 }\r