Add JSON output for routes CLI command

Change-Id: If4901d58da3130bf30439205e4e87cb1b1e157ad
diff --git a/cli/src/main/java/org/onosproject/cli/net/RoutesListCommand.java b/cli/src/main/java/org/onosproject/cli/net/RoutesListCommand.java
index 1b4658e..b4bbf94 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RoutesListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RoutesListCommand.java
@@ -15,6 +15,10 @@
  */
 package org.onosproject.cli.net;
 
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.routing.Route;
@@ -45,14 +49,54 @@
 
         Map<RouteTableId, Collection<Route>> allRoutes = service.getAllRoutes();
 
-        allRoutes.forEach((id, routes) -> {
-            print(FORMAT_TABLE, id);
-            print(FORMAT_HEADER);
-            routes.forEach(r -> print(FORMAT_ROUTE, r.prefix(), r.nextHop()));
-            print(FORMAT_TOTAL, routes.size());
-            print("");
-        });
+        if (outputJson()) {
+            ObjectMapper mapper = new ObjectMapper();
+            ObjectNode result = mapper.createObjectNode();
+            result.set("routes4", json(allRoutes.get(new RouteTableId("ipv4"))));
+            result.set("routes6", json(allRoutes.get(new RouteTableId("ipv6"))));
+            print("%s", result);
+        } else {
+            allRoutes.forEach((id, routes) -> {
+                print(FORMAT_TABLE, id);
+                print(FORMAT_HEADER);
+                routes.forEach(r -> print(FORMAT_ROUTE, r.prefix(), r.nextHop()));
+                print(FORMAT_TOTAL, routes.size());
+                print("");
+            });
+        }
 
     }
 
+    /**
+     * Produces a JSON array of routes.
+     *
+     * @param routes the routes with the data
+     * @return JSON array with the routes
+     */
+    private JsonNode json(Collection<Route> routes) {
+        ObjectMapper mapper = new ObjectMapper();
+        ArrayNode result = mapper.createArrayNode();
+
+        for (Route route : routes) {
+            result.add(json(mapper, route));
+        }
+        return result;
+    }
+
+    /**
+     * Produces JSON object for a route.
+     *
+     * @param mapper the JSON object mapper to use
+     * @param route the route with the data
+     * @return JSON object for the route
+     */
+    private ObjectNode json(ObjectMapper mapper, Route route) {
+        ObjectNode result = mapper.createObjectNode();
+
+        result.put("prefix", route.prefix().toString());
+        result.put("nextHop", route.nextHop().toString());
+
+        return result;
+    }
+
 }