blob: 5eeefbfe0916d64b79863cc490797f65b9e940b2 [file]
/*******************************************************************************
* Copyright (c) 2008, 2011 VMware Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* VMware Inc. - initial contribution
*******************************************************************************/
/**
* Scripts to be loaded in to the head of the dumps view
*/
function pageinit(){
util.loadScript('bundlesGui', function(){});
util.loadScript('raphael', function(){});
dumpViewer = new DumpViewer().displayDumps();
$.ajax({
url: util.getHostAndAdminPath() + '/jolokia/read/org.eclipse.virgo.kernel:type=Medic,name=DumpInspector/ConfiguredDumpDirectory',
dataType: 'json',
contentType: 'application/json',
cache: false,
success: function (response) {
$('#dumpLocation').text("Location: " + response.value);
dumpViewer.setDumpLocation(response.value);
}
});
}
function DumpViewer(){
var self = this;
self.loadingDump = false;
self.selectedDump = null;
self.setDumpLocation = function(dumpLocation){
self.dumpLocation = dumpLocation;
};
self.displayDumps = function(){
$('#dumps').empty();
$.ajax({
url: util.getHostAndAdminPath() + '/jolokia/read/org.eclipse.virgo.kernel:type=Medic,name=DumpInspector/Dumps',
dataType: 'json',
contentType: 'application/json',
cache: false,
success: function (response){
self.displayDumpsResponse(response.value);
if(self.selectedDump){
// Look up the id of the selected dump again.
var dumpId = self.selectedDump.attr("id");
self.selectedDump = $('#' + dumpId);
if (self.selectedDump){
$(self.selectedDump).addClass('selected-item');
}
}
self.displaySelectedDump();
}
});
return self;
};
self.displayDumpsResponse = function(json){
if(json && json.length > 0){
$.each(json, function(index, item){
var dumpListItem = $('<li />', {'class' : 'dump'});
dumpListItem.attr("id", item);
dumpListItem.append($('<div />', {'class' : 'label'}).text(item).click(dumpListItem, self.displayDumpEntries));
dumpListItem.append($('<div />', {'class' : 'delete'}).text('Delete').click(dumpListItem, self.deleteDump));
$('#dumps').append(dumpListItem);
});
} else {
var dumpListItem = $('<li />');
dumpListItem.text('None');
$('#dumps').append(dumpListItem);
}
util.pageReady();
};
self.displayDumpEntries = function(event){
var dumpListItem = event.data;
var dumpParent = $('#dumps');
var dumps = dumpParent.children();
$.each(dumps, function(index, dump){
$(dump).removeClass('selected-item');
});
dumpListItem.addClass('selected-item');
self.selectedDump = dumpListItem;
self.displaySelectedDump();
};
self.displaySelectedDump = function(){
if(self.selectedDump){
var dumpId = self.selectedDump.attr("id");
$.ajax({
url: util.getHostAndAdminPath() + '/jolokia/exec/org.eclipse.virgo.kernel:type=Medic,name=DumpInspector/getDumpEntries/' + dumpId,
dataType: 'json',
contentType: 'application/json',
cache: false,
success: function (response){
self.displaySelectedDumpResponse(response.value, self.selectedDump);
}
});
}else{
$('#dump-items').empty();
$('#dump-item-content').empty();
}
};
self.displaySelectedDumpResponse = function(json, dumpListItem){
var dumpId = dumpListItem.attr("id");
$('#dump-items').empty();
$('#dump-item-content').empty();
if(json && json.length > 0){
$.each(json, function(index, item){
// Replace periods in ids to make them easy to use as JQuery selectors.
var dumpEntryId = (dumpId + item[0]).replace(new RegExp('\\.', 'g'), '_');
var dumpEntryListItem = $('<li />', {'class' : 'dump-item'});
dumpEntryListItem.attr('id', dumpEntryId);
var dumpEntryLabel = $('<div />', {'class' : 'label'}).text(item[0]);
var dumpEntryClickData = {'dumpEntryId': dumpEntryId, 'queryString': item[1], 'dumpId': dumpId};
dumpEntryLabel.click(dumpEntryClickData, self.displayDumpEntry);
dumpEntryListItem.append(dumpEntryLabel);
$('#dump-items').append(dumpEntryListItem);
if('summary.txt' == item[0]){
dumpEntryLabel.click();
}
});
}
};
self.displayDumpEntry = function(event){
$.each($('#dump-items').children(), function(index, dump){
$(dump).removeClass('selected-item');
});
$('#' + event.data.dumpEntryId).addClass('selected-item');
if(-1 < event.data.queryString.indexOf('StateDumpInspector')){
self.displayOSGiStateDumpEntry(event.data.dumpId);
} else {
$.ajax({
url: util.getHostAndAdminPath() + '/jolokia/exec/org.eclipse.virgo.kernel:type=Medic,name=' + event.data.queryString,
dataType: 'json',
success: function (response){
self.displayDumpEntryResponse(response.value);
}
});
}
};
self.displayDumpEntryResponse = function(json){
$('#dump-item-content').empty();
if(json && json.length > 0){
$.each(json, function(index, item){
var dumpListItem = $('<div />', {'class' : 'dump-file-line'});
dumpListItem.text(item);
$('#dump-item-content').append(dumpListItem);
});
}
};
self.displayOSGiStateDumpEntry = function(dumpId){
$('#dump-item-content').empty();
var controls = $('<div />', {id: 'gui-controls'});
var bundleCanvas = $('<div />', {id: 'bundle-canvas'});
$('#dump-item-content').append(controls);
$('#dump-item-content').append(bundleCanvas);
var dataSource = new QuasiDataSource(self.dumpLocation + '!/' + dumpId);
dataSource.updateData(function(){
dataSource.getUnresolvedBundleIds(function(bundles){
if($.browser.msie){
$('#bundle-canvas').css({'height': '574px', 'width': '1000px'});
}
layoutManager = new LayoutManager('bundle-canvas', 1000, 553, dataSource);
if(bundles.length < 1){
controls.append($('<div />').text('There were no unresolved bundles at the time of this state dump.'));
}else{
$.each(bundles, function(index, unresolvedBundle){
var bundleTitle = $('<div />').text('Bundle [' + unresolvedBundle.identifier + '] ' + unresolvedBundle.symbolicName + ': ' + unresolvedBundle.version + ' is unresolved.');
var cause = $('<div />', {'class': 'unresolved-bundle-cause'}).text(unresolvedBundle.description);
var unresolvedBundleElement = $('<div />', {'class': 'unresolved-bundle'}).append(bundleTitle).append(cause);
unresolvedBundleElement.click(unresolvedBundle.identifier, function(eventData){
layoutManager.displayBundle(eventData.data);
});
controls.append(unresolvedBundleElement);
});
layoutManager.displayBundle(bundles[0].identifier);
}
var tableHolder = $('<div />', {id: 'table-holder'});
controls.append(tableHolder);
new TopBar(tableHolder, layoutManager, dataSource).init();
$('#side-bar').height($('#dump-item-content').height() - 17);
});
}, function(){
controls.append($('<div />').text('Unable to retrieve Bundle data for the state dump, this requires the Virgo Kernel or above.'));
});
};
//CREATE AND DELETE DUMPS
self.createDump = function(){
if(!self.loadingDump){
self.loadingDump = true;
$('#create-dump-button').addClass('grey-out');
$('#dumps').append($('<div />', {'class' : 'spinner-small'}));
$.ajax({
url: util.getHostAndAdminPath() + '/jolokia/exec/org.eclipse.virgo.kernel:type=Medic,name=DumpInspector/createDump',
dataType: 'json',
cache: false,
success: function (response){
self.loadingDump = false;
$('#create-dump-button').removeClass('grey-out');
self.displayDumps();
}
});
}
};
self.deleteDump = function(event){
var dumpListItem = event.data;
var dumpId = dumpListItem.attr("id");
$.ajax({
url: util.getHostAndAdminPath() + '/jolokia/exec/org.eclipse.virgo.kernel:type=Medic,name=DumpInspector/deleteDump/' + dumpId,
dataType: 'json',
cache: false,
success: function (response){
if(dumpListItem == self.selectedDump){
self.selectedDump = null;
}
self.displayDumps();
}
});
};
};
/**
* As a datasource to the bundles gui layout manager this object must provide the following methods.
*
* UpdateData
* UpdateBundle
*
*/
var QuasiDataSource = function(dumpFolder){
var self = this;
self.dumpFolder = dumpFolder.replace('/', '!/');
self.bundles = {};
self.services = {};
self.getUnresolvedBundleIds = function(callback){
util.doQuery('exec/org.eclipse.virgo.kernel:type=Medic,name=StateDumpInspector/getUnresolvedBundleFailures/' + self.dumpFolder, function(response){
callback(response.value);
});
};
self.updateData = function(callback, failCallback){
util.doQuery('exec/org.eclipse.virgo.kernel:type=Medic,name=StateDumpInspector/listBundles/' + self.dumpFolder, function(response){
if(response.value){
self.bundles = {};
$.each(response.value, function(index, item){
self.bundles[item.identifier] = { 'SymbolicName': item.symbolicName,
'Version': item.version,
'Identifier': item.identifier,
'State': item.state,
'Region': item.region,
'Location': item.location,
'Fragment': item.fragment,
'ExportedPackages': item.exportedPackages,
'ImportedPackages': item.importedPackages};
});
callback();
}else{
failCallback();
}
});
};
self.updateBundle = function(bundleId, callback){
util.doQuery('exec/org.eclipse.virgo.kernel:type=Medic,name=StateDumpInspector/getBundle/' + self.dumpFolder + '/' + bundleId, function(response){
self.bundles[bundleId].ProvidedWires = self.processWires(response.value.providedWires);
self.bundles[bundleId].RequiredWires = self.processWires(response.value.requiredWires);
callback();
});
};
self.processWires = function(badlyFormattedWires){
var wellFormattedWires = new Array();
$.each(badlyFormattedWires, function(index, badlyFormattedWire){
wellFormattedWires.push({ProviderBundleId: badlyFormattedWire.providerBundleId,
RequirerBundleId: badlyFormattedWire.requirerBundleId,
BundleRequirement: {Namespace: badlyFormattedWire.namespace,
Attributes: self.processProperties(badlyFormattedWire.bundleRequirementAttributes),
Directives: self.processProperties(badlyFormattedWire.bundleRequirementDirectives)},
BundleCapability: {Namespace: badlyFormattedWire.namespace,
Attributes: self.processProperties(badlyFormattedWire.bundleCapabilityAttributes),
Directives: self.processProperties(badlyFormattedWire.bundleCapabilityDirectives)}});
});
return wellFormattedWires;
};
self.processProperties = function(wellFormattedProperties){
var specFormattedProperties = {};
$.each(wellFormattedProperties, function(key, value){
specFormattedProperties[key] = {'Key': key, 'Value': value};
});
return specFormattedProperties;
};
};
var TopBar = function(container, layoutManager, dataSource){
var self = this;
self.dataSource = dataSource;
self.layoutManager = layoutManager;
self.container = container;
self.focused = -1;
self.layoutManager.setFocusListener(function(bundleId){
if(bundleId != self.focused){
self.setFocused(bundleId);
}
});
self.setFocused = function(bundleId){
self.focused = bundleId;
var rowIds = $('tbody td:first-child', self.bundlesTable);
$.each(rowIds, function(index, rowId){
if($(rowId).text() == bundleId){
self.container.scrollTop(self.bundlesTable.getElementOffset($(rowId)));
$('.table-tr-selected', self.bundlesTable).removeClass('table-tr-selected');
$(rowId).parent().addClass('table-tr-selected');
}
});
};
self.init = function(){
var tRows = new Array();
$.each(dataSource.bundles, function(id, bundle){
tRows.push([id, self.getFormattedBundleName(bundle), bundle.Version]);
});
self.bundlesTable = util.makeTable({
id: 'bundle-table',
headers: [{title: 'Id', type: 'numeric'}, {title: 'SymbolicName', type: 'alpha'}, {title: 'Version', type: 'version'}],
rows: tRows,
sortable : true,
sortIndex: 0,
selectable : self.clickEvent
});
self.container.append(self.bundlesTable);
if(util.pageLocation && util.pageLocation.length > 0){
self.setFocused(util.pageLocation);
}
};
self.getFormattedBundleName = function(bundle){
var formatBundleList = function(bundleIdArray){
var result = bundleIdArray[0];
for(var i = 1; i < bundleIdArray.length; i++) {
result = result + ', ' + bundleIdArray[i];
}
return result;
};
if(bundle.Fragments && bundle.Fragments.length > 0){
return bundle.SymbolicName + ' - Fragments [' + formatBundleList(bundle.Fragments) + ']';
}
if(bundle.Hosts && bundle.Hosts.length > 0){
return bundle.SymbolicName + ' - Host [' + formatBundleList(bundle.Hosts) + ']';
}else if(bundle.Fragment == 'true'){
return bundle.SymbolicName + ' Is Fragments';
}
return bundle.SymbolicName;
};
self.clickEvent = function(row){
var bundleId = $('td:first-child', row).text();
self.focused = bundleId;
self.layoutManager.displayBundle(bundleId);
};
};