Simon Hunt
Committed by Gerrit Code Review

ONOS-2470: Implement "Reset Node Locations" function in topology view.

- also cleaned up some Long/Lat code.
- Note also that metadata from client is structured so 'lng/lat' properties
    (from repositioned node) are wrapped in 'equivLoc' object.

Change-Id: I5afc53d26ef56fc0932f8650e8f7df79b36c3947
...@@ -357,18 +357,24 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { ...@@ -357,18 +357,24 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler {
357 return; 357 return;
358 } 358 }
359 359
360 - String slat = annotations.value(AnnotationKeys.LATITUDE);
361 String slng = annotations.value(AnnotationKeys.LONGITUDE); 360 String slng = annotations.value(AnnotationKeys.LONGITUDE);
361 + String slat = annotations.value(AnnotationKeys.LATITUDE);
362 + boolean haveLng = slng != null && !slng.isEmpty();
363 + boolean haveLat = slat != null && !slat.isEmpty();
362 try { 364 try {
363 - if (slat != null && slng != null && !slat.isEmpty() && !slng.isEmpty()) { 365 + if (haveLng && haveLat) {
364 - double lat = Double.parseDouble(slat);
365 double lng = Double.parseDouble(slng); 366 double lng = Double.parseDouble(slng);
367 + double lat = Double.parseDouble(slat);
366 ObjectNode loc = objectNode() 368 ObjectNode loc = objectNode()
367 - .put("type", "latlng").put("lat", lat).put("lng", lng); 369 + .put("type", "lnglat")
370 + .put("lng", lng)
371 + .put("lat", lat);
368 payload.set("location", loc); 372 payload.set("location", loc);
373 + } else {
374 + log.trace("missing Lng/Lat: lng={}, lat={}", slng, slat);
369 } 375 }
370 } catch (NumberFormatException e) { 376 } catch (NumberFormatException e) {
371 - log.warn("Invalid geo data latitude={}; longiture={}", slat, slng); 377 + log.warn("Invalid geo data: longitude={}, latitude={}", slng, slat);
372 } 378 }
373 } 379 }
374 380
......
...@@ -55,7 +55,7 @@ ...@@ -55,7 +55,7 @@
55 B: [toggleMap, 'Toggle background map'], 55 B: [toggleMap, 'Toggle background map'],
56 S: [toggleSprites, 'Toggle sprite layer'], 56 S: [toggleSprites, 'Toggle sprite layer'],
57 57
58 - //X: [toggleNodeLock, 'Lock / unlock node positions'], 58 + X: [tfs.resetAllLocations, 'Reset node locations'],
59 Z: [tos.toggleOblique, 'Toggle oblique view (Experimental)'], 59 Z: [tos.toggleOblique, 'Toggle oblique view (Experimental)'],
60 N: [fltr.clickAction, 'Cycle node layers'], 60 N: [fltr.clickAction, 'Cycle node layers'],
61 L: [tfs.cycleDeviceLabels, 'Cycle device labels'], 61 L: [tfs.cycleDeviceLabels, 'Cycle device labels'],
......
...@@ -455,10 +455,17 @@ ...@@ -455,10 +455,17 @@
455 ll; 455 ll;
456 456
457 // if we are not clearing the position data (unpinning), 457 // if we are not clearing the position data (unpinning),
458 - // attach the x, y, longitude, latitude... 458 + // attach the x, y, (and equivalent longitude, latitude)...
459 if (!clearPos) { 459 if (!clearPos) {
460 ll = tms.lngLatFromCoord([d.x, d.y]); 460 ll = tms.lngLatFromCoord([d.x, d.y]);
461 - metaUi = {x: d.x, y: d.y, lng: ll[0], lat: ll[1]}; 461 + metaUi = {
462 + x: d.x,
463 + y: d.y,
464 + equivLoc: {
465 + lng: ll[0],
466 + lat: ll[1]
467 + }
468 + };
462 } 469 }
463 d.metaUi = metaUi; 470 d.metaUi = metaUi;
464 wss.sendEvent('updateMeta', { 471 wss.sendEvent('updateMeta', {
...@@ -580,6 +587,13 @@ ...@@ -580,6 +587,13 @@
580 $timeout(updateLinks, 2000); 587 $timeout(updateLinks, 2000);
581 } 588 }
582 589
590 + function resetAllLocations() {
591 + tms.resetAllLocations();
592 + updateNodes();
593 + tick(); // force nodes to be redrawn in their new locations
594 + flash.flash('Reset Node Locations');
595 + }
596 +
583 // ========================================== 597 // ==========================================
584 598
585 function updateNodes() { 599 function updateNodes() {
...@@ -1169,6 +1183,7 @@ ...@@ -1169,6 +1183,7 @@
1169 showMastership: showMastership, 1183 showMastership: showMastership,
1170 showBadLinks: showBadLinks, 1184 showBadLinks: showBadLinks,
1171 1185
1186 + resetAllLocations: resetAllLocations,
1172 addDevice: addDevice, 1187 addDevice: addDevice,
1173 updateDevice: updateDevice, 1188 updateDevice: updateDevice,
1174 removeDevice: removeDevice, 1189 removeDevice: removeDevice,
......
...@@ -62,7 +62,13 @@ ...@@ -62,7 +62,13 @@
62 y = meta && meta.y, 62 y = meta && meta.y,
63 xy; 63 xy;
64 64
65 - // If we have [x,y] already, use that... 65 + // if the device contains explicit LONG/LAT data, use that to position
66 + if (setLongLat(node)) {
67 + // indicate we want to update cached meta data...
68 + return true;
69 + }
70 +
71 + // else if we have [x,y] cached in meta data, use that...
66 if (x && y) { 72 if (x && y) {
67 node.fixed = true; 73 node.fixed = true;
68 node.px = node.x = x; 74 node.px = node.x = x;
...@@ -70,17 +76,6 @@ ...@@ -70,17 +76,6 @@
70 return; 76 return;
71 } 77 }
72 78
73 - var location = node.location,
74 - coord;
75 -
76 - if (location && location.type === 'latlng') {
77 - coord = coordFromLngLat(location);
78 - node.fixed = true;
79 - node.px = node.x = coord[0];
80 - node.py = node.y = coord[1];
81 - return true;
82 - }
83 -
84 // if this is a node update (not a node add).. skip randomizer 79 // if this is a node update (not a node add).. skip randomizer
85 if (forUpdate) { 80 if (forUpdate) {
86 return; 81 return;
...@@ -116,6 +111,25 @@ ...@@ -116,6 +111,25 @@
116 angular.extend(node, xy); 111 angular.extend(node, xy);
117 } 112 }
118 113
114 + function setLongLat(node) {
115 + var loc = node.location,
116 + coord;
117 +
118 + if (loc && loc.type === 'lnglat') {
119 + coord = coordFromLngLat(loc);
120 + node.fixed = true;
121 + node.px = node.x = coord[0];
122 + node.py = node.y = coord[1];
123 + return true;
124 + }
125 + }
126 +
127 + function resetAllLocations() {
128 + nodes.forEach(function (d) {
129 + setLongLat(d);
130 + });
131 + }
132 +
119 function mkSvgCls(dh, t, on) { 133 function mkSvgCls(dh, t, on) {
120 var ndh = 'node ' + dh, 134 var ndh = 'node ' + dh,
121 ndht = t ? ndh + ' ' + t : ndh; 135 ndht = t ? ndh + ' ' + t : ndh;
...@@ -428,6 +442,7 @@ ...@@ -428,6 +442,7 @@
428 destroyModel: destroyModel, 442 destroyModel: destroyModel,
429 443
430 positionNode: positionNode, 444 positionNode: positionNode,
445 + resetAllLocations: resetAllLocations,
431 createDeviceNode: createDeviceNode, 446 createDeviceNode: createDeviceNode,
432 createHostNode: createHostNode, 447 createHostNode: createHostNode,
433 createHostLink: createHostLink, 448 createHostLink: createHostLink,
......
...@@ -51,6 +51,7 @@ ...@@ -51,6 +51,7 @@
51 B: { id: 'bkgrnd-tog', gid: 'map', isel: false }, 51 B: { id: 'bkgrnd-tog', gid: 'map', isel: false },
52 S: { id: 'sprite-tog', gid: 'cloud', isel: false }, 52 S: { id: 'sprite-tog', gid: 'cloud', isel: false },
53 53
54 + // TODO: add reset-node-locations button to toolbar
54 //X: { id: 'nodelock-tog', gid: 'lock', isel: false }, 55 //X: { id: 'nodelock-tog', gid: 'lock', isel: false },
55 Z: { id: 'oblique-tog', gid: 'oblique', isel: false }, 56 Z: { id: 'oblique-tog', gid: 'oblique', isel: false },
56 N: { id: 'filters-btn', gid: 'filters' }, 57 N: { id: 'filters-btn', gid: 'filters' },
......
...@@ -232,7 +232,7 @@ describe('factory: view/topo/topoModel.js', function() { ...@@ -232,7 +232,7 @@ describe('factory: view/topo/topoModel.js', function() {
232 it('should position a node by translating lng/lat', function () { 232 it('should position a node by translating lng/lat', function () {
233 var node = { 233 var node = {
234 location: { 234 location: {
235 - type: 'latlng', 235 + type: 'lnglat',
236 lng: 2008, 236 lng: 2008,
237 lat: 3009 237 lat: 3009
238 } 238 }
...@@ -319,7 +319,7 @@ describe('factory: view/topo/topoModel.js', function() { ...@@ -319,7 +319,7 @@ describe('factory: view/topo/topoModel.js', function() {
319 type: 'yowser', 319 type: 'yowser',
320 online: true, 320 online: true,
321 location: { 321 location: {
322 - type: 'latlng', 322 + type: 'lnglat',
323 lng: 2048, 323 lng: 2048,
324 lat: 3096 324 lat: 3096
325 } 325 }
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
5 "type": "switch", 5 "type": "switch",
6 "online": false, 6 "online": false,
7 "location": { 7 "location": {
8 - "type": "latlng", 8 + "type": "lnglat",
9 "lat": 40.7127, 9 "lat": 40.7127,
10 "lng": -74.0059 10 "lng": -74.0059
11 }, 11 },
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
6 "online": false, 6 "online": false,
7 "master": "myInstA", 7 "master": "myInstA",
8 "location": { 8 "location": {
9 - "type": "latlng", 9 + "type": "lnglat",
10 "lat": 37.7833, 10 "lat": 37.7833,
11 "lng": -122.4167 11 "lng": -122.4167
12 }, 12 },
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
6 "online": false, 6 "online": false,
7 "master": "myInstA", 7 "master": "myInstA",
8 "location": { 8 "location": {
9 - "type": "latlng", 9 + "type": "lnglat",
10 "lat": 37.7833, 10 "lat": 37.7833,
11 "lng": -122.4167 11 "lng": -122.4167
12 }, 12 },
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
6 "online": false, 6 "online": false,
7 "master": "myInstB", 7 "master": "myInstB",
8 "location": { 8 "location": {
9 - "type": "latlng", 9 + "type": "lnglat",
10 "lat": 40.7127, 10 "lat": 40.7127,
11 "lng": -74.0059 11 "lng": -74.0059
12 }, 12 },
......