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/impl/DefaultExternalPeerRouter.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DefaultExternalPeerRouter.java
index 57b997c..0f44cb8 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DefaultExternalPeerRouter.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DefaultExternalPeerRouter.java
@@ -23,34 +23,41 @@
 
 import java.util.Objects;
 
+import static com.google.common.base.Preconditions.checkArgument;
+
 /**
  * Implementation of external peer router.
  */
 public final class DefaultExternalPeerRouter implements ExternalPeerRouter {
 
-    private final IpAddress externalPeerRouterIp;
-    private final MacAddress externalPeerRouterMac;
-    private final VlanId externalPeerRouterVlanId;
+    private final IpAddress ipAddress;
+    private final MacAddress macAddress;
+    private final VlanId vlanId;
 
-    public DefaultExternalPeerRouter(IpAddress externalPeerRouterIp,
-                                     MacAddress externalPeerRouterMac,
-                                     VlanId externalPeerRouterVlanId) {
-        this.externalPeerRouterIp = externalPeerRouterIp;
-        this.externalPeerRouterMac = externalPeerRouterMac;
-        this.externalPeerRouterVlanId = externalPeerRouterVlanId;
+    private static final String NOT_NULL_MSG = "External Peer Router % cannot be null";
+
+    // private constructor not intended for invoked from external
+    private DefaultExternalPeerRouter(IpAddress ipAddress,
+                                     MacAddress macAddress,
+                                     VlanId vlanId) {
+        this.ipAddress = ipAddress;
+        this.macAddress = macAddress;
+        this.vlanId = vlanId;
     }
 
     @Override
-    public IpAddress externalPeerRouterIp() {
-        return this.externalPeerRouterIp;
+    public IpAddress ipAddress() {
+        return this.ipAddress;
     }
+
     @Override
-    public MacAddress externalPeerRouterMac() {
-        return this.externalPeerRouterMac;
+    public MacAddress macAddress() {
+        return this.macAddress;
     }
+
     @Override
-    public VlanId externalPeerRouterVlanId() {
-        return this.externalPeerRouterVlanId;
+    public VlanId vlanId() {
+        return this.vlanId;
     }
 
     @Override
@@ -61,26 +68,75 @@
 
         if (obj instanceof DefaultExternalPeerRouter) {
             DefaultExternalPeerRouter that = (DefaultExternalPeerRouter) obj;
-            return Objects.equals(externalPeerRouterIp, that.externalPeerRouterIp) &&
-                    Objects.equals(externalPeerRouterMac, that.externalPeerRouterMac) &&
-                    Objects.equals(externalPeerRouterVlanId, that.externalPeerRouterVlanId);
+            return Objects.equals(ipAddress, that.ipAddress) &&
+                    Objects.equals(macAddress, that.macAddress) &&
+                    Objects.equals(vlanId, that.vlanId);
         }
         return false;
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(externalPeerRouterIp,
-                externalPeerRouterMac,
-                externalPeerRouterVlanId);
+        return Objects.hash(ipAddress, macAddress, vlanId);
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(getClass())
-                .add("externalPeerRouterIp", externalPeerRouterIp)
-                .add("externalPeerRouterMac", externalPeerRouterMac)
-                .add("externalPeerRouterVlanId", externalPeerRouterVlanId)
+                .add("ipAddress", ipAddress)
+                .add("macAddress", macAddress)
+                .add("vlanId", vlanId)
                 .toString();
     }
+
+    /**
+     * Obtains an external peer router builder.
+     *
+     * @return external peer router builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * A builder class for external peer router.
+     */
+    public static final class Builder implements ExternalPeerRouter.Builder {
+
+        private IpAddress ipAddress;
+        private MacAddress macAddress;
+        private VlanId vlanId;
+
+        // private constructor not intended to use from external
+        private Builder() {
+        }
+
+        @Override
+        public ExternalPeerRouter build() {
+
+            checkArgument(ipAddress != null, NOT_NULL_MSG, "IP address");
+            checkArgument(macAddress != null, NOT_NULL_MSG, "MAC address");
+            checkArgument(vlanId != null, NOT_NULL_MSG, "VLAN ID");
+
+            return new DefaultExternalPeerRouter(ipAddress, macAddress, vlanId);
+        }
+
+        @Override
+        public Builder ipAddress(IpAddress ipAddress) {
+            this.ipAddress = ipAddress;
+            return this;
+        }
+
+        @Override
+        public Builder macAddress(MacAddress macAddress) {
+            this.macAddress = macAddress;
+            return this;
+        }
+
+        @Override
+        public Builder vlanId(VlanId vlanId) {
+            this.vlanId = vlanId;
+            return this;
+        }
+    }
 }