ONOS-4972: Augmented UiModelEvents to hold context and memo about the event subject.

Change-Id: Id0e28d8d5d3eb80fba36e0392cc80167effd39bc
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2Jsonifier.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2Jsonifier.java
index ebc20fe..6234391 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2Jsonifier.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2Jsonifier.java
@@ -44,6 +44,7 @@
 import org.onosproject.ui.impl.topo.model.UiModelEvent;
 import org.onosproject.ui.model.topo.UiClusterMember;
 import org.onosproject.ui.model.topo.UiDevice;
+import org.onosproject.ui.model.topo.UiElement;
 import org.onosproject.ui.model.topo.UiHost;
 import org.onosproject.ui.model.topo.UiLink;
 import org.onosproject.ui.model.topo.UiNode;
@@ -82,6 +83,8 @@
     private static final String HOST = "host";
     private static final String TYPE = "type";
     private static final String SUBJECT = "subject";
+    private static final String DATA = "data";
+    private static final String MEMO = "memo";
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
@@ -267,6 +270,28 @@
     }
 
     /**
+     * Creates a JSON representation of a UI element.
+     *
+     * @param element the source element
+     * @return a JSON representation of that element
+     */
+    public ObjectNode jsonUiElement(UiElement element) {
+        if (element instanceof UiNode) {
+            return json((UiNode) element);
+        }
+        if (element instanceof UiLink) {
+            return json((UiLink) element);
+        }
+
+        // TODO: UiClusterMember
+
+        // Unrecognized UiElement class
+        return objectNode()
+                .put("warning", "unknown UiElement... cannot encode")
+                .put("javaclass", element.getClass().toString());
+    }
+
+    /**
      * Creates a JSON representation of a UI model event.
      *
      * @param modelEvent the source model event
@@ -276,6 +301,8 @@
         ObjectNode payload = objectNode();
         payload.put(TYPE, enumToString(modelEvent.type()));
         payload.put(SUBJECT, modelEvent.subject().idAsString());
+        payload.set(DATA, modelEvent.data());
+        payload.put(MEMO, modelEvent.memo());
         return payload;
     }
 
@@ -408,14 +435,17 @@
     }
 
     private ObjectNode json(UiSynthLink sLink) {
-        UiLink uLink = sLink.link();
+        return json(sLink.link());
+    }
+
+    private ObjectNode json(UiLink link) {
         ObjectNode data = objectNode()
-                .put("id", uLink.idAsString())
-                .put("epA", uLink.endPointA())
-                .put("epB", uLink.endPointB())
-                .put("type", uLink.type());
-        String pA = uLink.endPortA();
-        String pB = uLink.endPortB();
+                .put("id", link.idAsString())
+                .put("epA", link.endPointA())
+                .put("epB", link.endPointB())
+                .put("type", link.type());
+        String pA = link.endPortA();
+        String pB = link.endPortB();
         if (pA != null) {
             data.put("portA", pA);
         }