Merge "added optical-2.py added oe-nonlinear-topo10"
diff --git a/apps/demo/src/main/java/org/onlab/onos/demo/DemoInstaller.java b/apps/demo/src/main/java/org/onlab/onos/demo/DemoInstaller.java
index ca2d6db..758f628 100644
--- a/apps/demo/src/main/java/org/onlab/onos/demo/DemoInstaller.java
+++ b/apps/demo/src/main/java/org/onlab/onos/demo/DemoInstaller.java
@@ -31,6 +31,7 @@
 import org.onlab.onos.net.flow.TrafficSelector;
 import org.onlab.onos.net.flow.TrafficTreatment;
 import org.onlab.onos.net.host.HostService;
+import org.onlab.onos.net.intent.Constraint;
 import org.onlab.onos.net.intent.HostToHostIntent;
 import org.onlab.onos.net.intent.Intent;
 import org.onlab.onos.net.intent.IntentService;
@@ -113,14 +114,14 @@
         public void run() {
             TrafficSelector selector = DefaultTrafficSelector.builder().build();
             TrafficTreatment treatment = DefaultTrafficTreatment.builder().build();
-
+            List<Constraint> constraint = Lists.newArrayList();
             List<Host> hosts = Lists.newArrayList(hostService.getHosts());
             while (!hosts.isEmpty()) {
                 Host src = hosts.remove(0);
                 for (Host dst : hosts) {
                     HostToHostIntent intent = new HostToHostIntent(appId, src.id(), dst.id(),
                                                                    selector, treatment,
-                                                                   null);
+                                                                   constraint);
                     existingIntents.add(intent);
                     intentService.submit(intent);
                 }
diff --git a/core/net/src/test/java/org/onlab/onos/net/flow/FlowIdTest.java b/core/api/src/test/java/org/onlab/onos/net/flow/FlowIdTest.java
similarity index 100%
rename from core/net/src/test/java/org/onlab/onos/net/flow/FlowIdTest.java
rename to core/api/src/test/java/org/onlab/onos/net/flow/FlowIdTest.java
diff --git a/web/gui/src/main/webapp/topo2.js b/web/gui/src/main/webapp/topo2.js
index 8a3bc5d..4c09b4d 100644
--- a/web/gui/src/main/webapp/topo2.js
+++ b/web/gui/src/main/webapp/topo2.js
@@ -1348,8 +1348,6 @@
     function preload(view, ctx, flags) {
         var w = view.width(),
             h = view.height(),
-            idBg = view.uid('bg'),
-            showBg = config.options.showBackground ? 'visible' : 'hidden',
             fcfg = config.force,
             fpad = fcfg.pad,
             forceDim = [w - 2*fpad, h - 2*fpad];
@@ -1364,20 +1362,9 @@
         // add blue glow filter to svg layer
         d3u.appendGlow(svg);
 
-        // load the background image
-        bgImg = svg.append('svg:image')
-            .attr({
-                id: idBg,
-                width: w,
-                height: h,
-                'xlink:href': config.backgroundUrl
-            })
-            .style({
-                visibility: showBg
-            });
-
         // group for the topology
         topoG = svg.append('g')
+            .attr('id', 'topo-G')
             .attr('transform', fcfg.translate());
 
         // subgroups for links and nodes
@@ -1460,14 +1447,78 @@
         view.setRadio(btnSet);
         view.setKeys(keyDispatch);
 
-        if (config.useLiveData) {
-            webSock.connect();
+        // Load map data asynchronously; complete startup after that..
+        loadGeoJsonData();
+    }
+
+    // TODO: move these to config/state portion of script
+    var geoJsonUrl = 'geoUsa.json',     // TODO: Paul
+        geoJson;
+
+    function loadGeoJsonData() {
+        d3.json(geoJsonUrl, function (err, data) {
+            if (err) {
+                // fall back to USA map background
+                loadStaticMap();
+            } else {
+                geoJson = data;
+                loadGeoMap();
+            }
+
+            // finally, connect to the server...
+            if (config.useLiveData) {
+                webSock.connect();
+            }
+        });
+    }
+
+    function showBg() {
+        return config.options.showBackground ? 'visible' : 'hidden';
+    }
+
+    function loadStaticMap() {
+        fnTrace('loadStaticMap', config.backgroundUrl);
+        var w = network.view.width(),
+            h = network.view.height();
+
+        // load the background image
+        bgImg = svg.insert('svg:image', '#topo-G')
+            .attr({
+                id: 'topo-bg',
+                width: w,
+                height: h,
+                'xlink:href': config.backgroundUrl
+            })
+            .style({
+                visibility: showBg()
+            });
+    }
+
+    function loadGeoMap() {
+        fnTrace('loadGeoMap', geoJsonUrl);
+        var w = network.view.width(),
+            h = network.view.height();
+
+        // TODO: load map layer from GeoJSON stored in 'geoJson' var...
+        // bgImg = svg.insert('<svg-element-type>', '#topo-G') ...
+
+        // TODO: Paul
+    }
+
+    function resizeBg(view) {
+        if (geoJson) {
+            // TODO : resize GeoJSON map
+
+            // TODO: Paul
+
+        } else if (bgImg) {
+            setSize(bgImg, view);
         }
     }
 
     function resize(view, ctx, flags) {
         setSize(svg, view);
-        setSize(bgImg, view);
+        resizeBg(view);
 
         // TODO: hook to recompute layout, perhaps? work with zoom/pan code
         // adjust force layout size