GUI -- MapService: changed to cache promises with attached meta data.
- unit tests for cached promises still WIP.

Change-Id: Ibe52cf3e83ed5753ccc12581b52fa1f640354e60
diff --git a/web/gui/src/main/webapp/app/fw/svg/map.js b/web/gui/src/main/webapp/app/fw/svg/map.js
index c736149..a14a038 100644
--- a/web/gui/src/main/webapp/app/fw/svg/map.js
+++ b/web/gui/src/main/webapp/app/fw/svg/map.js
@@ -42,12 +42,12 @@
     'use strict';
 
     // injected references
-    var $log, fs;
+    var $log, $http, $q, fs;
 
     // internal state
     var maps = d3.map(),
         msgMs = 'MapService.',
-        bundledUrlPrefix = 'data/map/';
+        bundledUrlPrefix = '../data/map/';
 
     function getUrl(id) {
         if (id[0] === '*') {
@@ -57,38 +57,61 @@
     }
 
     angular.module('onosSvg')
-        .factory('MapService', ['$log', 'FnService',
+        .factory('MapService', ['$log', '$http', '$q', 'FnService',
 
-        function (_$log_, _fs_) {
+        function (_$log_, _$http_, _$q_, _fs_) {
             $log = _$log_;
+            $http = _$http_;
+            $q = _$q_;
             fs = _fs_;
 
             function clearCache() {
                 maps = d3.map();
             }
 
+            // NOTE: It is expected that mapLayer is a D3 selection of the
+            //       <g> element (a child of zoomLayer) into which the map
+            //       path data will be rendered.
+            function renderMap(mapLayer) {
+                // TODO ---
+                $log.log('Hey, let\'s render the map...');
+            }
+
             function fetchGeoMap(id) {
                 if (!fs.isS(id)) {
                     return null;
                 }
+                var url = getUrl(id);
 
-                var geomap = maps.get(id);
+                var promise = maps.get(id);
 
-                if (!geomap) {
+                if (!promise) {
                     // need to fetch the data and build the object...
-                    geomap = {
-                        id: id,
-                        url: getUrl(id),
-                        wasCached: false
-                    };
-                    // TODO: use $http service to load map data asynchronously
+                    var deferred = $q.defer();
+                    promise = deferred.promise;
 
-                    maps.set(id, geomap);
+                    $http.get(url)
+                        .success(function (data) {
+                            deferred.resolve(data);
+                        })
+                        .error(function (msg, code) {
+                            deferred.reject(msg);
+                            $log.warn(msg, code);
+                        });
+
+                    promise.meta = {
+                        id: id,
+                        url: url,
+                        wasCached: false,
+                        render: renderMap
+                    };
+
+                    maps.set(id, promise);
                 } else {
-                    geomap.wasCached = true;
+                    promise.meta.wasCached = true;
                 }
 
-                return geomap;
+                return promise;
             }
 
             return {