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/core/api/src/main/java/org/onosproject/ui/model/topo/UiCluster.java b/core/api/src/main/java/org/onosproject/ui/model/topo/UiCluster.java
index f7879ef..a5de405 100644
--- a/core/api/src/main/java/org/onosproject/ui/model/topo/UiCluster.java
+++ b/core/api/src/main/java/org/onosproject/ui/model/topo/UiCluster.java
@@ -16,8 +16,12 @@
 
 package org.onosproject.ui.model.topo;
 
+import org.onosproject.cluster.NodeId;
+
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Encapsulates the notion of the ONOS cluster.
@@ -25,6 +29,12 @@
 class UiCluster extends UiElement {
 
     private final List<UiClusterMember> members = new ArrayList<>();
+    private final Map<NodeId, UiClusterMember> lookup = new HashMap<>();
+
+    @Override
+    public String toString() {
+        return String.valueOf(members.size()) + "-member cluster";
+    }
 
     /**
      * Removes all cluster members.
@@ -32,4 +42,34 @@
     void clear() {
         members.clear();
     }
+
+    /**
+     * Returns the cluster member with the given identifier, or null if no
+     * such member exists.
+     *
+     * @param id identifier of member to find
+     * @return corresponding member
+     */
+    public UiClusterMember find(NodeId id) {
+        return lookup.get(id);
+    }
+
+    /**
+     * Adds the given member to the cluster.
+     *
+     * @param member member to add
+     */
+    public void add(UiClusterMember member) {
+        members.add(member);
+        lookup.put(member.id(), member);
+    }
+
+    /**
+     * Returns the number of members in the cluster.
+     *
+     * @return number of members
+     */
+    public int size() {
+        return members.size();
+    }
 }
diff --git a/core/api/src/main/java/org/onosproject/ui/model/topo/UiClusterMember.java b/core/api/src/main/java/org/onosproject/ui/model/topo/UiClusterMember.java
index 71bba93..f89a9ae 100644
--- a/core/api/src/main/java/org/onosproject/ui/model/topo/UiClusterMember.java
+++ b/core/api/src/main/java/org/onosproject/ui/model/topo/UiClusterMember.java
@@ -16,8 +16,41 @@
 
 package org.onosproject.ui.model.topo;
 
+import org.onosproject.cluster.ControllerNode;
+import org.onosproject.cluster.NodeId;
+
 /**
  * Represents an individual member of the cluster (ONOS instance).
  */
 public class UiClusterMember extends UiElement {
+
+    private final ControllerNode cnode;
+
+    /**
+     * Constructs a cluster member, with a reference to the specified
+     * controller node instance.
+     *
+     * @param cnode underlying controller node.
+     */
+    public UiClusterMember(ControllerNode cnode) {
+        this.cnode = cnode;
+    }
+
+    /**
+     * Updates the information about this cluster member.
+     *
+     * @param cnode underlying controller node
+     */
+    public void update(ControllerNode cnode) {
+        // TODO: update our information cache appropriately
+    }
+
+    /**
+     * Returns the identity of the cluster member.
+     *
+     * @return member identifier
+     */
+    public NodeId id() {
+        return cnode.id();
+    }
 }
diff --git a/core/api/src/main/java/org/onosproject/ui/model/topo/UiTopology.java b/core/api/src/main/java/org/onosproject/ui/model/topo/UiTopology.java
index 62293e0..898c8eb 100644
--- a/core/api/src/main/java/org/onosproject/ui/model/topo/UiTopology.java
+++ b/core/api/src/main/java/org/onosproject/ui/model/topo/UiTopology.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.ui.model.topo;
 
+import org.onosproject.cluster.NodeId;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -32,6 +33,11 @@
     private final UiCluster uiCluster = new UiCluster();
     private final Set<UiRegion> uiRegions = new TreeSet<>();
 
+    @Override
+    public String toString() {
+        return "Topology: " + uiCluster + ", " + uiRegions.size() + " regions";
+    }
+
     /**
      * Clears the topology state; that is, drops all regions, devices, hosts,
      * links, and cluster members.
@@ -41,4 +47,42 @@
         uiRegions.clear();
         uiCluster.clear();
     }
+
+    /**
+     * Returns the cluster member with the given identifier, or null if no
+     * such member.
+     *
+     * @param id cluster node identifier
+     * @return the cluster member with that identifier
+     */
+    public UiClusterMember findClusterMember(NodeId id) {
+        return uiCluster.find(id);
+    }
+
+    /**
+     * Adds the given cluster member to the topology model.
+     *
+     * @param member cluster member to add
+     */
+    public void add(UiClusterMember member) {
+        uiCluster.add(member);
+    }
+
+    /**
+     * Returns the number of members in the cluster.
+     *
+     * @return number of cluster members
+     */
+    public int clusterMemberCount() {
+        return uiCluster.size();
+    }
+
+    /**
+     * Returns the number of regions configured in the topology.
+     *
+     * @return number of regions
+     */
+    public int regionCount() {
+        return uiRegions.size();
+    }
 }