blob: 072eef9bcbfc6d1616ddb267e19e8fd7e9726148 [file] [log] [blame]
/*
* 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.
*/
define(["dojo/dom",
"dojo/dom-construct",
"dojo/dom-class",
"dojo/_base/window",
"dijit/registry",
"dojo/parser",
"dojo/_base/lang",
"dojo/_base/array",
"dojo/_base/event",
'dojo/json',
"dojo/query",
"dojo/_base/connect",
"qpid/common/properties",
"dojox/html/entities",
"qpid/common/util",
"qpid/common/HexDumpWidget",
"dojo/text!showMessage.html",
'dojo/_base/declare',
'dstore/Memory',
'dstore/Trackable',
"dgrid/OnDemandGrid",
"dgrid/extensions/DijitRegistry",
"dijit/form/SimpleTextarea",
"dojo/domReady!"],
function (dom,
construct,
domClass,
win,
registry,
parser,
lang,
array,
event,
json,
query,
connect,
properties,
entities,
util,
HexDumpWidget,
template,
declare,
Memory,
Trackable,
OnDemandGrid,
DijitRegistry)
{
function encode(val)
{
return typeof val === 'string' ? entities.encode(val) : val;
}
var populatedFields = [];
var showMessage = {includeHeaders: true};
showMessage.hide = function ()
{
registry.byId("showMessage")
.hide();
};
showMessage.loadViewMessage = function (data)
{
var node = construct.create("div", null, win.body(), "last");
node.innerHTML = data;
var that = this;
parser.parse(node)
.then(function (instances)
{
that.dialogNode = dom.byId("showMessage");
var closeButton = query(".closeViewMessage", that.dialogNode)[0];
registry.byNode(closeButton)
.on("click", function (evt)
{
event.stop(evt);
that.hide();
});
});
};
showMessage.createPreviewWidget = function(contentData, widgetDiv)
{
if (typeof contentData !== 'object')
{
return new dijit.form.SimpleTextarea({
value: contentData,
rows: 4,
readOnly: true
}, widgetDiv);
}
else
{
if (Array.isArray(contentData))
{
var isByteArray = true;
for (var i = 0; i < contentData.length; i++)
{
var element = contentData[i];
if (!util.isInteger(element) || element < -128 || element > 127)
{
isByteArray = false;
break;
}
}
if (isByteArray)
{
return new HexDumpWidget({data: contentData}, widgetDiv);
}
else
{
var columns = {
value: {
label: 'Item'
}
};
var items = [];
for (var i = 0; i < contentData.length; i++)
{
items.push({
id: i,
value: json.stringify(contentData[i])
});
}
var store = new (declare([Memory, Trackable]))({
data: items
});
return new (declare([OnDemandGrid, DijitRegistry]))({
collection: store,
columns: columns
}, widgetDiv);
}
}
else
{
var columns = {
id: {
label: 'Key'
},
value: {
label: 'Value'
}
};
var items = [];
for (var i in contentData)
{
items.push({
id: i,
value: json.stringify(contentData[i])
});
}
var store = new (declare([Memory, Trackable]))({
data: items
});
return new (declare([OnDemandGrid, DijitRegistry]))({
collection: store,
columns: columns
}, widgetDiv);
}
}
}
showMessage.populateShowMessage = function (management, modelObj, data, includesConfidential)
{
// clear fields set by previous invocation.
if (populatedFields)
{
for (var i = 0; i < populatedFields.length; i++)
{
populatedFields[i].innerHTML = "";
}
populatedFields = [];
}
for (var attrName in data)
{
if (data.hasOwnProperty(attrName))
{
var fields = query(".message-" + attrName, this.dialogNode);
if (fields && fields.length != 0)
{
var field = fields[0];
populatedFields.push(field);
var val = data[attrName];
if (val != null)
{
if (domClass.contains(field, "map"))
{
var tableStr = "<table style='border: 1pt'><tr><th style='width: 6em; font-weight: bold'>Header</th><th style='font-weight: bold'>Value</th></tr>";
for (var name in val)
{
if (val.hasOwnProperty(name))
{
tableStr += "<tr><td>" + encode(name) + "</td>";
tableStr += "<td>" + encode(val[name]) + "</td></tr>";
}
}
tableStr += "</table>";
field.innerHTML = tableStr;
}
else if (domClass.contains(field, "datetime"))
{
field.innerHTML = management.userPreferences.formatDateTime(val, {
addOffset: true,
appendTimeZone: true
});
}
else
{
field.innerHTML = encode(val);
}
}
}
}
}
var contentAndPreview = query('#contentAndPreview', this.dialogNode)[0];
var confidentialInformationWarning = query('#confidentialInformationWarning', this.dialogNode)[0];
confidentialInformationWarning.style.display = includesConfidential ? "none" : "block";
var confidentialCells = query('.confidential', this.dialogNode);
for(var i = 0; i < confidentialCells.length; i++)
{
confidentialCells[i].style.display = includesConfidential ? "block" : "none";
}
var confidentialPlaceholderCells = query('.confidentialPlaceholder', this.dialogNode);
for(var i = 0; i < confidentialPlaceholderCells.length; i++)
{
confidentialPlaceholderCells[i].style.display = includesConfidential ? "none" : "block";
}
if (includesConfidential)
{
var contentModelObj = {
name: "getMessageContent",
parent: modelObj,
type: modelObj.type
};
var parameters = {messageId: data.id};
var download = registry.byId('message-download', this.dialogNode);
download.on("click", function ()
{
management.download(contentModelObj, parameters);
});
var limit = 1024;
var previewParameters = lang.mixin({
limit: limit,
returnJson: true
}, parameters);
management.load(contentModelObj, previewParameters, {
handleAs: "json"
})
.then(function (content)
{
if (showMessage.previewWidget)
{
showMessage.previewWidget.destroyRecursive();
}
if (content == null || (Array.isArray(content) && content.length == 0))
{
contentAndPreview.style.display = "none";
}
else
{
contentAndPreview.style.display = "block";
var previewDetail = query('#preview-detail', contentAndPreview)[0];
previewDetail.innerHTML = (limit < data.size
? 'showing the first ' + limit + ' of ' + data.size + ' bytes'
: 'showing all ' + data.size + ' bytes');
var previewContent = query("#message-content-preview", contentAndPreview)[0];
var widgetDiv = construct.create("div", null, previewContent, "last");
var contentWidget = showMessage.createPreviewWidget(content, widgetDiv);
showMessage.previewWidget = contentWidget;
contentWidget.startup();
}
registry.byId("showMessage") .show();
});
}
else
{
registry.byId("showMessage").show()
}
};
var loadMessage = function (management, modelObj, id, includeHeaders, errorHandler)
{
var obj = {
name: "getMessageInfoById",
parent: modelObj,
type: modelObj.type
};
management.load(obj,
{
messageId: id,
includeHeaders: includeHeaders
})
.then(function (data)
{
showMessage.populateShowMessage(management, modelObj, data, includeHeaders);
},
errorHandler);
};
showMessage.show = function (management, modelObj, message)
{
loadMessage(management, modelObj, message.id, this.includeHeaders,
function (e)
{
if (showMessage.includeHeaders && e.response && e.response.status == 403)
{
showMessage.includeHeaders = false;
loadMessage(management, modelObj, message.id, false);
}
else
{
management.errorHandler(e);
}
});
};
showMessage.loadViewMessage(template);
return showMessage;
});