Support JSON output in external router CLI, make router obj immutable

Change-Id: I6c76d9aafd64c1af7c3e28b42beabc268f824b88
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/ExternalPeerRouterListCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/ExternalPeerRouterListCommand.java
index ebd949c..ae30021 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/ExternalPeerRouterListCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/ExternalPeerRouterListCommand.java
@@ -15,6 +15,9 @@
  */
 package org.onosproject.openstacknetworking.cli;
 
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.google.common.collect.Lists;
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cli.AbstractShellCommand;
@@ -23,6 +26,8 @@
 
 import java.util.List;
 
+import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
+
 /**
  * Lists external peer router lists.
  */
@@ -35,14 +40,25 @@
     @Override
     protected void execute() {
         OpenstackNetworkService service = AbstractShellCommand.get(OpenstackNetworkService.class);
-
-        print(FORMAT, "Router IP", "Mac Address", "VLAN ID");
         List<ExternalPeerRouter> routers = Lists.newArrayList(service.externalPeerRouters());
 
-        for (ExternalPeerRouter router: routers) {
-            print(FORMAT, router.externalPeerRouterIp(),
-                    router.externalPeerRouterMac().toString(),
-                    router.externalPeerRouterVlanId());
+        if (outputJson()) {
+            print("%s", json(this, routers));
+        } else {
+            print(FORMAT, "Router IP", "Mac Address", "VLAN ID");
+            for (ExternalPeerRouter router: routers) {
+                print(FORMAT, router.ipAddress(),
+                        router.macAddress().toString(),
+                        router.vlanId());
+            }
         }
     }
+
+    private JsonNode json(AbstractShellCommand context, List<ExternalPeerRouter> routers) {
+        ObjectMapper mapper = new ObjectMapper();
+        ArrayNode result = mapper.enable(INDENT_OUTPUT).createArrayNode();
+        routers.forEach(r -> result.add(context.jsonForEntity(r, ExternalPeerRouter.class)));
+
+        return result;
+    }
 }