Browse Source

[assist] Make sure the last opened HDFS folder exists before trying to open it

If a folder in the last opened path is missing it will go as far as it can.
Johan Ahlen 10 years ago
parent
commit
921b657

+ 36 - 1
desktop/core/src/desktop/static/desktop/js/assist/assistHdfsEntry.js

@@ -48,6 +48,7 @@
 
     self.entries = ko.observableArray([]);
 
+    self.loaded = false;
     self.loading = ko.observable(false);
     self.open = ko.observable(false);
 
@@ -67,7 +68,7 @@
     huePubSub.publish('assist.dblClickHdfsItem', self);
   };
 
-  AssistHdfsEntry.prototype.loadEntries = function() {
+  AssistHdfsEntry.prototype.loadEntries = function(callback) {
     var self = this;
     if (self.loading()) {
       return;
@@ -85,16 +86,50 @@
           assistHelper: self.assistHelper
         })
       }));
+      self.loaded = true;
       self.loading(false);
+      if (callback) {
+        callback();
+      }
     };
 
     var errorCallback = function () {
       self.loading(false);
+      if (callback) {
+        callback();
+      }
     };
 
     self.assistHelper.fetchHdfsPath(self.getHierarchy(), successCallback, errorCallback)
   };
 
+  AssistHdfsEntry.prototype.loadDeep = function(folders, callback) {
+    var self = this;
+
+    if (folders.length === 0) {
+      callback(self);
+      return;
+    }
+
+    var findNextAndLoadDeep = function () {
+      var nextName = folders.shift();
+      var foundEntry = $.grep(self.entries(), function (entry) {
+        return entry.definition.name === nextName && entry.definition.type === 'dir';
+      });
+      if (foundEntry.length === 1) {
+        foundEntry[0].loadDeep(folders, callback);
+      } else {
+        callback(self);
+      }
+    };
+
+    if (! self.loaded) {
+      self.loadEntries(findNextAndLoadDeep);
+    } else {
+      findNextAndLoadDeep();
+    }
+  };
+
   AssistHdfsEntry.prototype.getHierarchy = function () {
     var self = this;
     var parts = [];

+ 14 - 13
desktop/core/src/desktop/templates/assist.mako

@@ -669,20 +669,21 @@ from desktop.views import _ko
 
         var lastKnownPath = self.assistHelper.getFromTotalStorage('assist', 'currentHdfsPath', '/');
         var parts = lastKnownPath.split('/');
-        parts[0] = '/';
-
-        var currentEntry = null;
-        $.each(parts, function (idx, part) {
-          currentEntry = new AssistHdfsEntry({
-            definition: {
-              name: part,
-              type: 'dir'
-            },
-            parent: currentEntry,
-            assistHelper: self.assistHelper
-          });
-          currentEntry.loadEntries();
+        parts.shift();
+
+        var currentEntry = new AssistHdfsEntry({
+          definition: {
+            name: '/',
+            type: 'dir'
+          },
+          parent: null,
+          assistHelper: self.assistHelper
+        });
+
+        currentEntry.loadDeep(parts, function (entry) {
+          currentEntry = entry;
         });
+
         currentEntry.open(true);
         self.selectedHdfsEntry = ko.observable(currentEntry);