| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| (function() { |
| "use strict"; |
| |
| // The chunk size of tailing the files, i.e., how many bytes will be shown |
| // in the preview. |
| var TAIL_CHUNK_SIZE = 32768; |
| var helpers = { |
| 'helper_to_permission': function(chunk, ctx, bodies, params) { |
| var p = ctx.current().permission; |
| var dir = ctx.current().type == 'DIRECTORY' ? 'd' : '-'; |
| var symbols = [ '---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx' ]; |
| var sticky = p > 1000; |
| |
| var res = ""; |
| for (var i = 0; i < 3; ++i) { |
| res = symbols[(p % 10)] + res; |
| p = Math.floor(p / 10); |
| } |
| |
| if (sticky) { |
| var otherExec = ((ctx.current().permission % 10) & 1) == 1; |
| res = res.substr(0, res.length - 1) + (otherExec ? 't' : 'T'); |
| } |
| |
| chunk.write(dir + res); |
| return chunk; |
| } |
| }; |
| |
| var base = dust.makeBase(helpers); |
| var current_directory = ""; |
| |
| function show_err_msg(msg) { |
| $('#alert-panel-body').html(msg); |
| $('#alert-panel').show(); |
| } |
| |
| $(window).bind('hashchange', function () { |
| $('#alert-panel').hide(); |
| |
| var dir = window.location.hash.slice(1); |
| if(dir == "") { |
| dir = "/"; |
| } |
| if(current_directory != dir) { |
| browse_directory(dir); |
| } |
| }); |
| |
| function network_error_handler(url) { |
| return function (jqxhr, text, err) { |
| switch(jqxhr.status) { |
| case 401: |
| var msg = '<p>Authentication failed when trying to open ' + url + ': Unauthrozied.</p>'; |
| break; |
| case 403: |
| if(jqxhr.responseJSON !== undefined && jqxhr.responseJSON.RemoteException !== undefined) { |
| var msg = '<p>' + jqxhr.responseJSON.RemoteException.message + "</p>"; |
| break; |
| } |
| var msg = '<p>Permission denied when trying to open ' + url + ': ' + err + '</p>'; |
| break; |
| case 404: |
| var msg = '<p>Path does not exist on HDFS or WebHDFS is disabled. Please check your path or enable WebHDFS</p>'; |
| break; |
| default: |
| var msg = '<p>Failed to retreive data from ' + url + ': ' + err + '</p>'; |
| } |
| show_err_msg(msg); |
| }; |
| } |
| |
| function append_path(prefix, s) { |
| var l = prefix.length; |
| var p = l > 0 && prefix[l - 1] == '/' ? prefix.substring(0, l - 1) : prefix; |
| return p + '/' + s; |
| } |
| |
| function get_response(data, type) { |
| return data[type] !== undefined ? data[type] : null; |
| } |
| |
| function get_response_err_msg(data) { |
| var msg = data.RemoteException !== undefined ? data.RemoteException.message : ""; |
| return msg; |
| } |
| |
| function view_file_details(path, abs_path) { |
| function show_block_info(blocks) { |
| var menus = $('#file-info-blockinfo-list'); |
| menus.empty(); |
| |
| menus.data("blocks", blocks); |
| menus.change(function() { |
| var d = $(this).data('blocks')[$(this).val()]; |
| if (d === undefined) { |
| return; |
| } |
| |
| dust.render('block-info', d, function(err, out) { |
| $('#file-info-blockinfo-body').html(out); |
| }); |
| |
| }); |
| for (var i = 0; i < blocks.length; ++i) { |
| var item = $('<option value="' + i + '">Block ' + i + '</option>'); |
| menus.append(item); |
| } |
| menus.change(); |
| } |
| |
| var url = '/webhdfs/v1' + abs_path + '?op=GET_BLOCK_LOCATIONS'; |
| $.ajax({"url": url, "crossDomain": true}).done(function(data) { |
| var d = get_response(data, "LocatedBlocks"); |
| if (d === null) { |
| show_err_msg(get_response_err_msg(data)); |
| return; |
| } |
| |
| $('#file-info-tail').hide(); |
| $('#file-info-title').text("File information - " + path); |
| |
| var download_url = '/webhdfs/v1' + abs_path + '?op=OPEN'; |
| |
| $('#file-info-download').attr('href', download_url); |
| $('#file-info-preview').click(function() { |
| var offset = d.fileLength - TAIL_CHUNK_SIZE; |
| var url = offset > 0 ? download_url + '&offset=' + offset : download_url; |
| $.get(url, function(t) { |
| $('#file-info-preview-body').val(t); |
| $('#file-info-tail').show(); |
| }, "text").error(network_error_handler(url)); |
| }); |
| |
| if (d.fileLength > 0) { |
| show_block_info(d.locatedBlocks); |
| $('#file-info-blockinfo-panel').show(); |
| } else { |
| $('#file-info-blockinfo-panel').hide(); |
| } |
| $('#file-info').modal(); |
| }).error(network_error_handler(url)); |
| } |
| |
| function browse_directory(dir) { |
| var url = '/webhdfs/v1' + dir + '?op=LISTSTATUS'; |
| $.get(url, function(data) { |
| var d = get_response(data, "FileStatuses"); |
| if (d === null) { |
| show_err_msg(get_response_err_msg(data)); |
| return; |
| } |
| |
| current_directory = dir; |
| $('#directory').val(dir); |
| window.location.hash = dir; |
| dust.render('explorer', base.push(d), function(err, out) { |
| $('#panel').html(out); |
| |
| $('.explorer-browse-links').click(function() { |
| var type = $(this).attr('inode-type'); |
| var path = $(this).attr('inode-path'); |
| var abs_path = append_path(current_directory, path); |
| if (type == 'DIRECTORY') { |
| browse_directory(abs_path); |
| } else { |
| view_file_details(path, abs_path); |
| } |
| }); |
| }); |
| }).error(network_error_handler(url)); |
| } |
| |
| |
| function init() { |
| dust.loadSource(dust.compile($('#tmpl-explorer').html(), 'explorer')); |
| dust.loadSource(dust.compile($('#tmpl-block-info').html(), 'block-info')); |
| |
| var b = function() { browse_directory($('#directory').val()); }; |
| $('#btn-nav-directory').click(b); |
| var dir = window.location.hash.slice(1); |
| if(dir == "") { |
| window.location.hash = "/"; |
| } else { |
| browse_directory(dir); |
| } |
| } |
| |
| init(); |
| })(); |