#*
* Copyright 2014 LinkedIn Corp.
*
* Licensed 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.
*#
<script type="text/javascript">
$.namespace('azkaban');
azkaban.HdfsSchemaModel = Backbone.Model.extend({
initialize: function() {
this.set('schema', '');
},
fetchSchema: function(path, viewerId) {
var requestURL = '/hdfs';
var requestData = {
'ajax': 'fetchschema',
'path': path,
'viewerId': viewerId
};
var model = this;
var successHandler = function(data) {
if (data.error != null) {
model.set('error', data.error);
}
if (data.schema != null) {
model.set('schema', data.schema);
}
};
$.get(requestURL, requestData, successHandler, 'json');
}
});
azkaban.HdfsSchemaView = Backbone.View.extend({
events: {
},
initialize: function(settings) {
this.listenTo(this.model, 'change:schema', this.render);
this.rendered = false;
},
show: function() {
if (this.rendered == true) {
return;
}
this.model.fetchSchema(path, viewerId);
},
render: function(self) {
if (this.rendered == true) {
return;
}
var schema = this.model.get('schema');
if (schema == null) {
return;
}
$('#file-schema-loading').hide();
$('#file-schema').show().text(schema);
this.rendered = true;
}
});
azkaban.HdfsFileModel = Backbone.Model.extend({
initialize: function() {
this.set('contents', '');
},
fetchFile: function(path, viewerId) {
var requestURL = '/hdfs';
var requestData = {
'ajax': 'fetchfile',
'path': path,
'viewerId': viewerId,
};
var model = this;
var successHandler = function(data) {
if (data.error != null) {
model.set('error', data.error);
}
if (data === '') {
data = 'Oops this is an empty file !!';
}
model.set('contents', data);
};
$.get(requestURL, requestData, successHandler, 'text');
}
});
azkaban.HdfsFileView = Backbone.View.extend({
events: {
},
initialize: function(settings) {
this.listenTo(this.model, 'change:contents', this.render);
this.rendered = false;
},
show: function() {
if (this.rendered == true) {
return;
}
this.model.fetchFile(path, viewerId);
},
render: function(self) {
if (this.rendered == true) {
return;
}
var file = this.model.get('contents');
if (file == null) {
return;
}
$('#file-contents-loading').hide();
if (contentType == "HTML") {
var iframe = document.getElementById('file-contents-iframe');
// show iframe (initially it's hidden)
iframe.style.display = "inline";
// Write content to iframe. We can't just set the html source content as
// inner html of the iframe. The iframe hosts a completely separate dom
// structure than the current html, thus setting the inner HTML will not
// work. The only way to store html inside iframe is by either writing
// the content directly into it or set the content in srcdoc attribute.
// Since either way is fine, will go with write method since it looks
// nicer when you inspect the html structure.
var doc = iframe.contentWindow.document;
doc.open();
doc.write(file);
doc.close();
// adjust iframe size
iframe.width = iframe.contentWindow.document.body.scrollWidth;
iframe.height = iframe.contentWindow.document.body.scrollHeight;
} else {
$('#file-contents').show().text(file);
}
this.rendered = true;
}
});
var schemaModel;
var schemaView;
var fileModel;
var fileView;
$(function () {
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
var current = e.target;
var previous = e.relatedTarget;
var hash = $(current).attr('href');
if (hash == '#schema' && schemaModel != null) {
schemaView.show();
}
else if (hash == '#contents') {
fileView.show();
}
});
if (hasSchema) {
schemaModel = new azkaban.HdfsSchemaModel();
schemaView = new azkaban.HdfsSchemaView({
el: $("#schema"),
model: schemaModel
});
}
fileModel = new azkaban.HdfsFileModel();
fileView = new azkaban.HdfsFileView({
el: $("#contents"),
model: fileModel
});
fileView.show();
});
</script>