ONOS-6372: Topo2 - Refactor "location" data to be consistent

- consistently labeled fields "locType", "latOrY", "longOrX"
- simplified code in topo2NodePosition.js

Change-Id: I73e8daadcc3e6ca3ff45f7f60e7b372ccfd8b045
This commit is contained in:
Simon Hunt 2017-05-04 17:36:26 -07:00 committed by Andrea Campanella
parent 5f97a30982
commit f27a929fbb
6 changed files with 66 additions and 81 deletions

View File

@ -44,7 +44,12 @@ public final class LayoutLocation {
* Designates the type of location; either geographic or logical grid.
*/
public enum Type {
GEO, GRID
GEO, GRID;
@Override
public String toString() {
return name().toLowerCase();
}
}
private final String id;

View File

@ -38,8 +38,8 @@ public class LayoutLocationTest extends AbstractUiTest {
private static final double PI = 3.142;
private static final double ZERO = 0.0;
private static final String COMPACT_LL_1 = "foo,GEO,3.142,1.414";
private static final String COMPACT_LL_2 = "bar,GRID,1.414,3.142";
private static final String COMPACT_LL_1 = "foo,geo,3.142,1.414";
private static final String COMPACT_LL_2 = "bar,grid,1.414,3.142";
private static final String COMPACT_LIST = COMPACT_LL_1 + "~" + COMPACT_LL_2;

View File

@ -93,8 +93,8 @@ public class TopologyResource extends BaseResource {
// TODO: add handling of gridY/gridX if locType is "grid" (not "geo")
try {
annot.put("latitude", memento.get("lat").asDouble())
.put("longitude", memento.get("lng").asDouble());
annot.put("latitude", memento.get("latOrY").asDouble())
.put("longitude", memento.get("longOrX").asDouble());
array.add(node);
} catch (Exception e) {
log.debug("Skipping geo entry");

View File

@ -319,21 +319,21 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler {
return;
}
String slng = annotations.value(AnnotationKeys.LONGITUDE);
String slat = annotations.value(AnnotationKeys.LATITUDE);
boolean validLng = slng != null && !slng.equals(NO_GEO_VALUE);
String slng = annotations.value(AnnotationKeys.LONGITUDE);
boolean validLat = slat != null && !slat.equals(NO_GEO_VALUE);
boolean validLng = slng != null && !slng.equals(NO_GEO_VALUE);
if (validLat && validLng) {
try {
double lng = Double.parseDouble(slng);
double lat = Double.parseDouble(slat);
double lng = Double.parseDouble(slng);
ObjectNode loc = objectNode()
.put("type", "geo")
.put("lng", lng)
.put("lat", lat);
.put("locType", "geo")
.put("latOrY", lat)
.put("longOrX", lng);
payload.set("location", loc);
} catch (NumberFormatException e) {
log.warn("Invalid geo data: longitude={}, latitude={}", slng, slat);
log.warn("Invalid geo data: latitude={}, longitude={}", slat, slng);
}
}
}

View File

@ -102,6 +102,10 @@ public class Topo2Jsonifier {
private static final String GEO = "geo";
private static final String GRID = "grid";
private static final String PEER_LOCATIONS = "peerLocations";
private static final String LOCATION = "location";
private static final String LOC_TYPE = "locType";
private static final String LAT_OR_Y = "latOrY";
private static final String LONG_OR_X = "longOrX";
private final Logger log = LoggerFactory.getLogger(getClass());
@ -478,29 +482,29 @@ public class Topo2Jsonifier {
}
private void addGeoGridLocation(ObjectNode node, Annotated a) {
List<String> lngLat = getAnnotValues(a, LONGITUDE, LATITUDE);
List<String> gridYX = getAnnotValues(a, GRID_Y, GRID_X);
List<String> latLongData = getAnnotValues(a, LATITUDE, LONGITUDE);
List<String> gridYXdata = getAnnotValues(a, GRID_Y, GRID_X);
if (lngLat != null) {
attachLocation(node, "geo", "lng", "lat", lngLat);
} else if (gridYX != null) {
attachLocation(node, "grid", "gridY", "gridX", gridYX);
if (latLongData != null) {
attachLocation(node, GEO, latLongData);
} else if (gridYXdata != null) {
attachLocation(node, GRID, gridYXdata);
}
}
private void attachLocation(ObjectNode node, String locType,
String keyA, String keyB, List<String> values) {
List<String> values) {
try {
double valA = Double.parseDouble(values.get(0));
double valB = Double.parseDouble(values.get(1));
double latOrY = Double.parseDouble(values.get(0));
double longOrX = Double.parseDouble(values.get(1));
ObjectNode loc = objectNode()
.put("type", locType)
.put(keyA, valA)
.put(keyB, valB);
node.set("location", loc);
.put(LOC_TYPE, locType)
.put(LAT_OR_Y, latOrY)
.put(LONG_OR_X, longOrX);
node.set(LOCATION, loc);
} catch (NumberFormatException e) {
log.warn("Invalid {} data: long/Y={}, lat/X={}",
log.warn("Invalid {} data: lat/Y={}, long/X={}",
locType, values.get(0), values.get(1));
}
}
@ -513,9 +517,9 @@ public class Topo2Jsonifier {
ObjectNode o = objectNode();
for (LayoutLocation ll : locs) {
ObjectNode lnode = objectNode()
.put("locType", ll.locType().toString())
.put("latOrY", ll.latOrY())
.put("longOrX", ll.longOrX());
.put(LOC_TYPE, ll.locType().toString())
.put(LAT_OR_Y, ll.latOrY())
.put(LONG_OR_X, ll.longOrX());
o.set(ll.id(), lnode);
}

View File

@ -28,6 +28,13 @@
// Internal state;
var nearDist = 15;
function setElCoord(el, coord) {
el.fix(true);
el.x = el.px = coord[0];
el.y = el.py = coord[1];
return true;
}
function positionNode(node, forUpdate) {
var meta = node.get('metaUi'),
@ -40,7 +47,7 @@
// If the node has metaUI data attached, it indicates that the user
// has dragged the node to a new position on the view; so we should
// respect that above any script-configured position...
// (NOTE: This is a slightly different to the original topology code)
// (NOTE: This is slightly different to the "classic" topology code)
if (hasMeta) {
node.fix(true);
@ -53,33 +60,18 @@
// LONG/LAT (or GRID) locations for regions/devices/hosts
if (node.nodeType === 'peer-region') {
var coord = [0, 0],
loc = {};
if (t2bgs.getBackgroundType() === 'geo') {
var loc = node.get('location'),
type = loc.locType || loc.type;
node.set({ location: {
type: type.toLowerCase(),
lat: loc.latOrY || loc.lat,
lng: loc.longOrX || loc.lng
}});
setLongLat(node);
return true;
} else {
loc.gridX = -20;
loc.gridY = 10 * node.index();
coord = coordFromXY(loc);
}
node.px = node.x = coord[0];
node.py = node.y = coord[1];
// assumed to be grid
var loc = {
longOrX: -20,
latOrY: 10 * node.index()
};
node.fix(true);
setElCoord(node, coordFromXY(loc));
return;
}
@ -130,45 +122,29 @@
}
function setLongLat(el) {
var loc = el.get('location'),
coord;
var loc = el.get('location');
if (loc && loc.type === 'geo') {
if (loc.lat === 0 && loc.lng === 0) {
return false;
}
coord = coordFromLngLat(loc);
el.fix(true);
el.x = el.px = coord[0];
el.y = el.py = coord[1];
return true;
// bail if no location set
if (!loc || (loc.latOrY === 0 && loc.longOrX === 0)) {
return false;
}
if (loc && loc.type === 'grid') {
if (loc.gridX === 0 && loc.gridY === 0) {
return false;
}
coord = coordFromXY(loc);
el.fix(true);
el.x = el.px = coord[0];
el.y = el.py = coord[1];
return true;
if (loc.locType === 'geo') {
return setElCoord(el, coordFromLngLat(loc));
}
if (loc.locType === 'grid') {
return setElCoord(el, coordFromXY(loc));
}
return false;
}
function coordFromLngLat(loc) {
var p = t2mcs.projection();
return p ? p([loc.lng, loc.lat]) : [0, 0];
return p ? p([loc.longOrX, loc.latOrY]) : [0, 0];
}
function coordFromXY(loc) {
var bgWidth = t2sls.getWidth() || 100,
bgHeight = t2sls.getHeight() || 100;
@ -176,8 +152,8 @@
yOffset = (1000 - (bgHeight * scale)) / 2;
// 1000 is a hardcoded HTML value of the SVG element (topo2.html)
var x = scale * loc.gridX,
y = (scale * loc.gridY) + yOffset;
var x = scale * loc.longOrX,
y = (scale * loc.latOrY) + yOffset;
return [x, y];
}