Starting implementation of UI topo  modeling. WIP.
If reviewing this, please refer to http://tinyurl.com/onos-ui-topo-model

Change-Id: Iab75f213ca0a7d36619f9c498387b402ac9477af
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/ModelCache.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/ModelCache.java
index 6a76eb5..6d5de44 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/ModelCache.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/ModelCache.java
@@ -24,6 +24,7 @@
 import org.onosproject.net.Host;
 import org.onosproject.net.Link;
 import org.onosproject.net.region.Region;
+import org.onosproject.ui.model.topo.UiClusterMember;
 import org.onosproject.ui.model.topo.UiDevice;
 import org.onosproject.ui.model.topo.UiTopology;
 
@@ -42,6 +43,11 @@
         this.dispatcher = eventDispatcher;
     }
 
+    @Override
+    public String toString() {
+        return "ModelCache{" + uiTopology + "}";
+    }
+
     /**
      * Clear our model.
      */
@@ -61,6 +67,44 @@
     }
 
 
+    /**
+     * Updates the model (adds a new instance if necessary) with the given
+     * controller node information.
+     *
+     * @param cnode controller node to be added/updated
+     */
+    void addOrUpdateClusterMember(ControllerNode cnode) {
+        UiClusterMember member = uiTopology.findClusterMember(cnode.id());
+        if (member != null) {
+            member.update(cnode);
+        } else {
+            member = new UiClusterMember(cnode);
+            uiTopology.add(member);
+        }
+
+        // TODO: post event
+    }
+
+    void removeClusterMember(ControllerNode cnode) {
+        // TODO: find cluster member assoc. with parameter; remove from model
+        // TODO: post event
+    }
+
+    void updateMasterships(DeviceId deviceId, RoleInfo roleInfo) {
+        // TODO: store the updated mastership information
+        // TODO: post event
+    }
+
+    void addOrUpdateRegion(Region region) {
+        // TODO: find or create region assoc. with parameter
+        // TODO: post event
+    }
+
+    void removeRegion(Region region) {
+        // TODO: find region assoc. with parameter; remove from model
+        // TODO: post event
+    }
+
     void addOrUpdateDevice(Device device) {
         // TODO: find or create device assoc. with parameter
         // FIXME
@@ -80,32 +124,6 @@
 
     }
 
-    void addOrUpdateClusterMember(ControllerNode cnode) {
-        // TODO: find or create cluster member assoc. with parameter
-        // TODO: post event
-    }
-
-    void removeClusterMember(ControllerNode cnode) {
-        // TODO: find cluster member assoc. with parameter; remove from model
-        // TODO: post event
-    }
-
-
-    void updateMasterships(DeviceId deviceId, RoleInfo roleInfo) {
-        // TODO: store the updated mastership information
-        // TODO: post event
-    }
-
-    void addOrUpdateRegion(Region region) {
-        // TODO: find or create region assoc. with parameter
-        // TODO: post event
-    }
-
-    void removeRegion(Region region) {
-        // TODO: find region assoc. with parameter; remove from model
-        // TODO: post event
-    }
-
     void addOrUpdateLink(Link link) {
         // TODO: find ui-link assoc. with parameter; create or update.
         // TODO: post event
@@ -129,4 +147,22 @@
     void removeHost(Host host) {
         // TODO: find host assoc. with parameter; remove from model
     }
+
+    /**
+     * Returns the number of members in the cluster.
+     *
+     * @return number of cluster members
+     */
+    public int clusterMemberCount() {
+        return uiTopology.clusterMemberCount();
+    }
+
+    /**
+     * Returns the number of regions configured in the topology.
+     *
+     * @return number of regions
+     */
+    public int regionCount() {
+        return uiTopology.regionCount();
+    }
 }