Keep track of pan and zoom of layouts in metaUI data (no longer in user preferences).

Change-Id: I4a2c6941d5dd4586b732278c583974e85d9a9321
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 a50401b..e133775 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
@@ -55,7 +55,6 @@
 import org.onosproject.ui.model.topo.UiRegion;
 import org.onosproject.ui.model.topo.UiSynthLink;
 import org.onosproject.ui.model.topo.UiTopoLayout;
-import org.onosproject.ui.model.topo.UiTopoLayoutId;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -87,6 +86,7 @@
 
     private static final String CONTEXT_KEY_DELIM = "_";
     private static final String NO_CONTEXT = "";
+    private static final String ZOOM_KEY = "layoutZoom";
 
     private static final String REGION = "region";
     private static final String DEVICE = "device";
@@ -98,12 +98,6 @@
 
     private static final String GEO = "geo";
     private static final String GRID = "grid";
-    private static final String PKEY_TOPO_ZOOM = "topo2_zoom";
-    private static final String ZOOM_SCALE = "zoomScale";
-    private static final String ZOOM_PAN_X = "zoomPanX";
-    private static final String ZOOM_PAN_Y = "zoomPanY";
-    private static final String DEFAULT_SCALE = "1.0";
-    private static final String DEFAULT_PAN = "0.0";
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
@@ -216,20 +210,21 @@
      *
      * @param layout the layout to transform
      * @param crumbs list of layouts in bread-crumb order
+     * @param rid    current region id
      * @return a JSON representation of the data
      */
-    ObjectNode layout(UiTopoLayout layout, List<UiTopoLayout> crumbs) {
+    ObjectNode layout(UiTopoLayout layout, List<UiTopoLayout> crumbs, String rid) {
         ObjectNode result = objectNode()
                 .put("id", layout.id().toString())
                 .put("parent", nullIsEmpty(layout.parent()))
                 .put("region", nullIsEmpty(layout.regionId()))
                 .put("regionName", UiRegion.safeName(layout.region()));
         addCrumbs(result, crumbs);
-        addBgRef(result, layout);
+        addBgRef(result, layout, rid);
         return result;
     }
 
-    private void addBgRef(ObjectNode result, UiTopoLayout layout) {
+    private void addBgRef(ObjectNode result, UiTopoLayout layout, String rid) {
         String mapId = layout.geomap();
         String sprId = layout.sprites();
 
@@ -239,51 +234,31 @@
         } else if (sprId != null) {
             result.put("bgType", GRID).put("bgId", sprId);
         }
-        addZoomPan(result, layout.id());
+
+        attachZoomData(result, layout, rid);
     }
 
-    private ObjectNode initialZoomForLayout(ObjectNode zoomPrefs, String id) {
-        ObjectNode zoomForLayout = defaultZoomForLayout();
-        zoomPrefs.set(id, zoomForLayout);
-        prefService.setPreference(userName, PKEY_TOPO_ZOOM, zoomPrefs);
-        return zoomPrefs;
-    }
+    private void attachZoomData(ObjectNode result, UiTopoLayout layout, String rid) {
 
-    private ObjectNode defaultZoomForLayout() {
-        return objectNode()
-            .put(ZOOM_SCALE, DEFAULT_SCALE)
-            .put(ZOOM_PAN_X, DEFAULT_PAN)
-            .put(ZOOM_PAN_Y, DEFAULT_PAN);
-    }
+        ObjectNode zoomData = objectNode();
 
-    private void addZoomPan(ObjectNode result, UiTopoLayoutId layoutId) {
-        // need to look up topo_zoom settings from preferences service.
+        // first, set configured scale and offset
+        addCfgZoomData(zoomData, layout);
 
-        // NOTE:
-        // UiPreferencesService API only allows us to retrieve ALL prefs for
-        // the given user. It would be better if we could call something like:
-        //
-        //   ObjectNode value = prefService.getPreference(userName, prefKey);
-        //
-        // to get back a single value.
-
-        Map<String, ObjectNode> userPrefs = prefService.getPreferences(userName);
-        ObjectNode zoomPrefs = userPrefs.get(PKEY_TOPO_ZOOM);
-
-        if (zoomPrefs == null) {
-            zoomPrefs = initialZoomForLayout(objectNode(), layoutId.id());
+        // next, retrieve user-set zoom data, if we have it
+        ObjectNode userZoom = metaUi.get(contextKey(rid, ZOOM_KEY));
+        if (userZoom != null) {
+            zoomData.set("usr", userZoom);
         }
+        result.set("bgZoom", zoomData);
+    }
 
-        ObjectNode zoomData = (ObjectNode) zoomPrefs.get(layoutId.id());
-
-        if (zoomData == null) {
-            zoomPrefs = initialZoomForLayout(zoomPrefs, layoutId.id());
-            zoomData = (ObjectNode) zoomPrefs.get(layoutId.id());
-        }
-
-        result.put("bgZoomScale", zoomData.get(ZOOM_SCALE).asText());
-        result.put("bgZoomPanX", zoomData.get(ZOOM_PAN_X).asText());
-        result.put("bgZoomPanY", zoomData.get(ZOOM_PAN_Y).asText());
+    private void addCfgZoomData(ObjectNode data, UiTopoLayout layout) {
+        ObjectNode zoom = objectNode();
+        zoom.put("scale", layout.scale());
+        zoom.put("offsetX", layout.offsetX());
+        zoom.put("offsetY", layout.offsetY());
+        data.set("cfg", zoom);
     }
 
     private void addMapParameters(ObjectNode result, String mapId) {
@@ -623,7 +598,7 @@
      * being displayed in.
      *
      * @param ridStr region-id string
-     * @param nodes the nodes
+     * @param nodes  the nodes
      * @return a JSON representation of the nodes
      */
     public ArrayNode closedNodes(String ridStr, Set<UiNode> nodes) {
@@ -640,51 +615,6 @@
         return array;
     }
 
-    // TODO: These methods do not seem to be used; consider removing them.
-    /*
-     * Returns a JSON array representation of a list of regions. Note that the
-     * information about each region is limited to what needs to be used to
-     * show the regions as nodes on the view.
-     *
-     * @param regions the regions
-     * @return a JSON representation of the minimal region information
-     */
-//    public ArrayNode closedRegions(Set<UiRegion> regions) {
-//        ArrayNode array = arrayNode();
-//        for (UiRegion r : regions) {
-//            array.add(jsonClosedRegion(r));
-//        }
-//        return array;
-//    }
-
-    /*
-     * Returns a JSON array representation of a list of devices.
-     *
-     * @param devices the devices
-     * @return a JSON representation of the devices
-     */
-//    public ArrayNode devices(Set<UiDevice> devices) {
-//        ArrayNode array = arrayNode();
-//        for (UiDevice device : devices) {
-//            array.add(json(device));
-//        }
-//        return array;
-//    }
-
-    /*
-     * Returns a JSON array representation of a list of hosts.
-     *
-     * @param hosts the hosts
-     * @return a JSON representation of the hosts
-     */
-//    public ArrayNode hosts(Set<UiHost> hosts) {
-//        ArrayNode array = arrayNode();
-//        for (UiHost host : hosts) {
-//            array.add(json(host));
-//        }
-//        return array;
-//    }
-
     // package-private for unit testing
     List<Set<UiNode>> splitByLayer(List<String> layerTags,
                                    Set<? extends UiNode> nodes) {