Load topology from saved files

refs: #2911

Change-Id: Ic5b0c0713333579fd6e92c738784b3de1dda6a1d
diff --git a/bin/minindnedit b/bin/minindnedit
index bb6e030..8e945a4 100755
--- a/bin/minindnedit
+++ b/bin/minindnedit
@@ -151,8 +151,8 @@
             self.fibFrame = Frame(n)
 
             # NDN
-            self.nfdFrame = NfdFrame(n)
-            self.nlsrFrame = NlsrFrame(n)
+            self.nfdFrame = NfdFrame(n, self.prefValues)
+            self.nlsrFrame = NlsrFrame(n,self.prefValues)
 
             n.add(self.propFrame, text='Properties')
             n.add(self.fibFrame, text='FIB Entries')
@@ -849,7 +849,7 @@
         loadedTopology = self.convertJsonUnicode(json.load(f))
 
         # Load hosts
-        hosts = loadedTopology['nodes']
+        hosts = loadedTopology['hosts']
         for host in hosts:
             nodeNum = host['number']
             hostname = 'h'+nodeNum
@@ -859,6 +859,7 @@
                 host['opts']['hostname'] = hostname
             if 'nodeNum' not in host['opts']:
                 host['opts']['nodeNum'] = int(nodeNum)
+
             x = host['x']
             y = host['y']
 
diff --git a/ndn/gui.py b/ndn/gui.py
index 653dbbc..a0b33ab 100644
--- a/ndn/gui.py
+++ b/ndn/gui.py
@@ -13,9 +13,12 @@
 ]
 
 class GuiFrame(Frame):
-    def __init__(self, notebook):
+    def __init__(self, notebook, prefValues, appId):
         Frame.__init__(self, notebook)
 
+        self.prefValues = prefValues
+        self.appId = appId
+
         self.row = 0
         self.column = 0
 
@@ -38,22 +41,30 @@
 
         self.row += 1
 
+    def getPreferredOrDefaultValue(self, key, defaultValue):
+        if self.appId in self.prefValues:
+            return self.prefValues[self.appId][key]
+        else:
+            return defaultValue
+
 class NfdFrame(GuiFrame):
-    def __init__(self, notebook):
-        GuiFrame.__init__(self, notebook)
+    def __init__(self, notebook, prefValues):
+        GuiFrame.__init__(self, notebook, prefValues, "nfd")
 
         self.frameLabel = "NFD"
 
         # log-level
         self.logLevel = StringVar(self)
-        self.addDropDown("Log level:", self.logLevel, LOG_LEVELS, LOG_LEVELS[3])
+        self.addDropDown("Log level:",
+                         self.logLevel,
+                         LOG_LEVELS,
+                         self.getPreferredOrDefaultValue("log-level", LOG_LEVELS[3]))
 
     def getValues(self):
         return {
             "log-level": self.logLevel.get()
         }
 
-
 class NlsrFrame(GuiFrame):
 
     HYPERBOLIC_STATES = [
@@ -62,44 +73,54 @@
         "dry-run"
     ]
 
-    def __init__(self, notebook):
-        GuiFrame.__init__(self, notebook)
+    def __init__(self, notebook, prefValues):
+        GuiFrame.__init__(self, notebook, prefValues, "nlsr")
 
         self.frameLabel = "NLSR"
 
         # general: network
         self.network = StringVar(self)
-        self.addEntryBox("Network:", self.network, "/ndn/")
+        self.addEntryBox("Network:",
+                         self.network,
+                         self.getPreferredOrDefaultValue("network", "/ndn"))
 
         # general: site
         self.site = StringVar(self)
-        self.addEntryBox("Site:", self.site, "/edu/site")
+        self.addEntryBox("Site:", self.site, self.getPreferredOrDefaultValue("site", "/edu/site"))
 
         # general: router
         self.router = StringVar(self)
-        self.addEntryBox("Router:", self.router, "/%C1.Router/cs/host")
+        self.addEntryBox("Router:",
+                         self.router,
+                         self.getPreferredOrDefaultValue("router", "/%C1.Router/cs/host"))
 
         # general: log-level
         self.logLevel = StringVar(self)
-        self.addDropDown("Log level:", self.logLevel, LOG_LEVELS, LOG_LEVELS[3])
+        self.addDropDown("Log level:",
+                         self.logLevel,
+                         LOG_LEVELS,
+                         self.getPreferredOrDefaultValue("log-level", LOG_LEVELS[3]))
 
         # hyperbolic: state
         self.hyperbolicState = StringVar(self)
-        self.addDropDown("Hyperbolic routing:", self.hyperbolicState,
-                         self.HYPERBOLIC_STATES, self.HYPERBOLIC_STATES[0])
+        self.addDropDown("Hyperbolic routing:",
+                         self.hyperbolicState,
+                         self.HYPERBOLIC_STATES,
+                         self.getPreferredOrDefaultValue("hyperbolic-state", self.HYPERBOLIC_STATES[0]))
 
         # hyperbolic: angle
         self.angle = StringVar(self)
-        self.addEntryBox("Angle:", self.angle, "0.0")
+        self.addEntryBox("Angle:", self.angle, self.getPreferredOrDefaultValue("angle", "0.0"))
 
         # hyperbolic: radius
         self.radius = StringVar(self)
-        self.addEntryBox("Radius:", self.radius, "0.0")
+        self.addEntryBox("Radius:", self.radius, self.getPreferredOrDefaultValue("radius", "0.0"))
 
         # fib: max-faces-per-prefix
         self.maxFaces = StringVar(self)
-        self.addEntryBox("Max faces per prefix:", self.maxFaces, "0")
-
+        self.addEntryBox("Max faces per prefix:",
+                         self.maxFaces,
+                         self.getPreferredOrDefaultValue("max-faces-per-prefix", "0"))
 
     def getValues(self):
         return {