Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js?rev=1741993&r1=1741992&r2=1741993&view=diff ============================================================================== --- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js (original) +++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js Mon May 2 15:57:52 2016 @@ -29,592 +29,594 @@ define(["dojo/_base/lang", "qpid/common/metadata", "qpid/common/timezone", "qpid/management/UserPreferences"], - function (lang, array, xhr, ioQuery, json, Promise, Deferred, sasl, Metadata, Timezone, UserPreferences) - { + function (lang, array, xhr, ioQuery, json, Promise, Deferred, sasl, Metadata, Timezone, UserPreferences) + { - function shallowCopy(source, target, excludes) - { - if (source) - { - for (var fieldName in source) - { - if (source.hasOwnProperty(fieldName)) - { - if (excludes && array.indexOf(excludes, fieldName) != -1) - { - continue; - } - - target[fieldName] = source[fieldName]; - } - } - } - return target; - } - - function merge(data1, data2) - { - var result = {}; - shallowCopy(data1, result); - shallowCopy(data2, result); - return result; - } - - // summary: - // This is a facade for sending management requests to broker at given brokerURL specifying schema, host and port. - // Optional errorHandler method can be set and invoked on error responses. - function Management(brokerURL, errorHandler) - { - this.brokerURL = brokerURL; - this.errorHandler = errorHandler || function (error) - { - console.error(error); - }; - } - - // summary: - // Submits HTTP request to broker using dojo.request.xhr - // request: Object? - // request object can have the same fields as dojo.request.xhr options and additional 'url' field: - // data: String|Object|FormData? - // Data to transfer. This is ignored for GET and DELETE requests. - // headers: Object? - // Headers to use for the request. - // user: String? - // Username to use during the request. - // password: String? - // Password to use during the request. - // withCredentials: Boolean? - // For cross-site requests, whether to send credentials or not. - // query: Object? - // the query parameters to add to the request url - // handleAs: String - // Indicates how the response will be handled. - // url: String? - // relative URL to broker REST API - // - // returns: promise of type dojo.promise.Promise - // Promise returned by dojo.request.xhr with modified then method allowing to use default error handler if none is specified. - Management.prototype.submit = function (request) - { - var requestOptions = { - sync: false, - handleAs: "json", - withCredentials: true, - headers: {"Content-Type": "application/json"} - }; - - if (request) - { - shallowCopy(request, requestOptions, ["url"]); - if (requestOptions.data && requestOptions.headers && requestOptions.headers["Content-Type"] - && requestOptions.headers["Content-Type"] == "application/json" && typeof requestOptions.data - != "string") - { - requestOptions.data = json.stringify(request.data); - } - } - - if (!requestOptions.method) - { - requestOptions.method = "GET"; - } - - var url = this.getFullUrl(request.url); - var promise = xhr(url, requestOptions); - var errorHandler = this.errorHandler; - - // decorate promise in order to use a default error handler when 'then' method is invoked without providing error handler - return lang.mixin(new Promise(), { - then: function (callback, errback, progback) - { - return promise.then(callback, errback || errorHandler, progback); - }, - cancel: function (reason, strict) - { - return promise.cancel(reason, strict); - }, - isResolved: function () - { - return promise.isResolved(); - }, - isRejected: function () - { - return promise.isRejected(); - }, - isFulfilled: function () - { - return promise.isFulfilled(); - }, - isCanceled: function () - { - return promise.isCanceled(); - }, - always: function (callbackOrErrback) - { - return promise.always(callbackOrErrback); - }, - otherwise: function (errback) - { - return promise.otherwise(errback); - }, - trace: function () - { - return promise.trace(); - }, - traceRejected: function () - { - return promise.traceRejected(); - }, - toString: function () - { - return promise.toString(); - }, - response: promise.response - }); - }; - - Management.prototype.get = function (request) - { - var requestOptions = merge(request, {method: "GET"}); - return this.submit(requestOptions); - }; - - Management.prototype.post = function (request, data) - { - var requestOptions = merge(request, - { - method: "POST", - data: data - }); - return this.submit(requestOptions); - }; - - Management.prototype.del = function (request) - { - var requestOptions = merge(request, {method: "DELETE"}); - return this.submit(requestOptions); - }; - - // summary: - // Loads object data specified as modelObj argument - // modelObj: Object? - // is a JSON object specifying the hierarchy - // It can have the following fields: - // name: String? - // name of the object - // type: String? - // category of the object - // parent: Object? - // parent of the object in the same format, having fields name, type, parent - // - // parameters: Object? - // is optional JSON to pass additional request parameters which will be added into query of REST url - // - // returns: promise of type dojo.promise.Promise - // Promise returned by dojo.request.xhr with modified then method allowing to use default error handler if none is specified. - Management.prototype.load = function (modelObj, parameters, requestOptions) - { - var url = this.objectToURL(modelObj); - var request = {url: url}; - - if (requestOptions) - { - lang.mixin(request, requestOptions); - } - - if (parameters) - { - request.query = parameters; - } - return this.get(request); - }; - - // summary: - // Creates object as specified in data parameter with given category and with given parent parentModelObject - // category: String? - // Object category - // - // parentModelObject: Object? - // Parent object hierarchy - // It can have the following fields: - // name: String? - // name of the object - // type: String? - // category of the object - // parent: Object? - // parent of the object in the same format, having fields name, type, parent - // data; Object? - // Object structure - // - // returns: promise of type dojo.promise.Promise - // Promise returned by dojo.request.xhr with modified then method allowing to use default error handler if none is specified. - Management.prototype.create = function (category, parentModelObject, data) - { - var newObjectModel = { - type: category.toLowerCase(), - parent: parentModelObject - }; - var url = this.objectToURL(newObjectModel); - var request = {url: url}; - return this.post(request, data); - }; - - // summary: - // Updates object (which can be located using modelObj parameter) attributes to the values set in data parameter - // - // modelObj: Object? - // Object specifying hierarchy - // It can have the following fields: - // name: String? - // name of the object - // type: String? - // category of the object - // parent: Object? - // parent of the object in the same format, having fields name, type, parent - // data; Object? - // New attributes - // - // returns: promise of type dojo.promise.Promise - // Promise returned by dojo.request.xhr with modified then method allowing to use default error handler if none is specified. - Management.prototype.update = function (modelObj, data) - { - var url = this.objectToURL(modelObj); - var request = {url: url}; - return this.post(request, data); - }; - - // summary: - // Removes object specified as modelObj argument - // modelObj: Object? - // hierarchy object - // It can have the following fields: - // name: String? - // name of the object - // type: String? - // category of the object - // parent: Object? - // parent of the object in the same format, having fields name, type, parent - // parameters: Object? - // is optional JSON object to pass additional request parameters which will be added into query of REST url - // - // returns: promise of type dojo.promise.Promise - // Promise returned by dojo.request.xhr with modified then method allowing to use default error handler if none is specified. - Management.prototype.remove = function (modelObj, parameters) - { - var url = this.objectToURL(modelObj); - var request = {url: url}; - if (parameters) - { - request.query = parameters; - } - return this.del(request); - }; - - // summary: - // Downloads current JSON for object specified as modelObj argument - // - // modelObj: Object? - // hierarchy object - // It can have the following fields: - // name: String? - // name of the object - // type: String? - // category of the object - // parent: Object? - // parent of the object in the same format, having fields name, type, parent - // parameters: Object? - // is optional JSON object to pass additional request parameters which will be added into query of REST url - // - Management.prototype.download = function (modelObj, parameters) - { - var url = this.buildObjectURL(modelObj, parameters); - setTimeout(function () - { - window.location = url; - }, 100); - } - - // summary: - // Downloads current JSON for object specified as modelObj argument into iframe - Management.prototype.downloadIntoFrame = function (modelObj, parameters) - { - var url = this.buildObjectURL(modelObj, parameters); - var iframe = document.createElement('iframe'); - iframe.id = "downloader_" + modelObj.name; - document.body.appendChild(iframe); - iframe.src = url; - // It seems there is no way to remove this iframe in a manner that is cross browser compatible. - } - - // summary: - // Builds relative REST url (excluding schema, host and port) for the object representing CO hierarchy - // modelObj: Object? - // hierarchy object - // It can have the following fields: - // name: String? - // name of the object - // type: String? - // category of the object - // parent: Object? - // parent of the object in the same format, having fields name, type, parent - // parameters: Object? - // is optional JSON object to pass additional request parameters which will be added into query of REST url - // - // returns: relative REST url for the hierarchy object - // - Management.prototype.objectToURL = function (modelObj) - { - var url = null; - if (modelObj.type == "broker") - { - url = "broker" - } - else - { - url = encodeURIComponent(modelObj.type); - var parentPath = this.objectToPath(modelObj); - if (parentPath) - { - url = url + "/" + parentPath; - } - - if (modelObj.name) - { - if (url.substring(url.length - 1) != "/") - { - url = url + "/"; - } - // Double encode the object name in case it contains slashes - url = url + encodeURIComponent(encodeURIComponent(modelObj.name)) - } - } - return "api/latest/" + url; - }; - - // summary: - // Builds a servlet path of REST url for the object representing CO hierarchy - // modelObj: Object? - // hierarchy object - // It can have the following fields: - // name: String? - // name of the object - // type: String? - // category of the object - // parent: Object? - // parent of the object in the same format, having fields name, type, parent - // parameters: Object? - // is optional JSON object to pass additional request parameters which will be added into query of REST url - // - // returns: relative REST servlet path for the hierarchy object - // - Management.prototype.objectToPath = function (modelObj) - { - var path = ""; - var parent = modelObj.parent; - while (parent && parent.type != "broker") - { - if (path) - { - path = encodeURIComponent(encodeURIComponent(parent.name)) + "/" + path; - } - else - { - path = encodeURIComponent(encodeURIComponent(parent.name)); - } - parent = parent.parent; - } - return path; - }; - - // summary: - // Builds full REST url for the object representing CO hierarchy - // modelObj: Object? - // hierarchy object - // It can have the following fields: - // name: String? - // name of the object - // type: String? - // category of the object - // parent: Object? - // parent of the object in the same format, having fields name, type, parent - // parameters: Object? - // is optional JSON object to pass additional request parameters which will be added into query of REST url - // - // returns: full REST url for the hierarchy object - // - Management.prototype.buildObjectURL = function (modelObj, parameters) - { - var url = this.objectToURL(modelObj); - if (parameters) - { - url = url + "?" + ioQuery.objectToQuery(parameters); - } - return this.getFullUrl(url); - } - - // summary: - // Returns full REST url for the relative REST url - // - // returns: full urk for the given relative URL - // - Management.prototype.getFullUrl = function (url) - { - var baseUrl = this.brokerURL || ""; - if (baseUrl != "") - { - baseUrl = baseUrl + "/"; - } - return baseUrl + url; - } - - // summary: - // Loads meta data, time zones, user preferences and invokes callback functions after loading user preferences - // - Management.prototype.init = function (callback) - { - var that = this; - this.loadMetadata(function () - { - that.loadTimezones(function () - { - that.loadUserPreferences(callback) - }); - }); - }; - - // summary: - // Loads meta data and store it under 'metadata' field as object of type qpid.common.metadata object. - // When meta data are loaded successfully a callback function is executed, otherwise default error handler is invoked - // - Management.prototype.loadMetadata = function (callback) - { - var that = this; - this.get({url: "service/metadata"}).then(function (data) - { - that.metadata = new Metadata(data); - if (callback) - { - callback(); - } - }); - }; - - // summary: - // Loads timezones and store them under 'timezone' field as object of type qpid.common.timezone object - // When timezones are loaded successfully a callback function is executed, otherwise default error handler is invoked - // - Management.prototype.loadTimezones = function (callback) - { - var that = this; - that.get({url: "service/timezones"}).then(function (timezones) - { - that.timezone = new Timezone(timezones); - if (callback) - { - callback(); - } - }); - }; - - // summary: - // Loads user preferences and store them under 'userPreferences' field as object of type qpid.management.UserPreferences - // Callback is invoked on both successful and unsuccessful preferences request - // - Management.prototype.loadUserPreferences = function (callback) - { - this.userPreferences = new UserPreferences(this); - this.userPreferences.load(callback, callback); - }; - - var saslServiceUrl = "service/sasl"; - - Management.prototype.getSaslStatus = function () - { - return this.get({url: saslServiceUrl}); - } - - Management.prototype.sendSaslResponse = function (response) - { - return this.submit({ - url: saslServiceUrl, - data: response, - headers: {}, - method: "POST" - }); - }; - - Management.prototype.authenticate = function (forceAuthentication) - { - var that = this; - var deferred = new Deferred(); - var successCallback = function (data) - { - that.getSaslStatus().then(function (saslData) - { - if (saslData.user) - { - deferred.resolve(saslData); - } - else - { - deferred.reject({ - message: "User identifier is not found!" - + " Authentication failed!" - }); - } - }, failureCallback); - }; - var failureCallback = function (data) - { - deferred.reject(data); - }; - this.getSaslStatus().then(function (data) - { - if (data.user && !forceAuthentication) - { - deferred.resolve(data); - } - else - { - sasl.authenticate(data.mechanisms, that) - .then(successCallback, failureCallback); - } - }, failureCallback); - return deferred.promise; - }; - - // summary: - // Sends query request - // query: query Object? - // is a JSON object specifying the hierarchy - // It can have the following fields: - // where: String? - // sql like expression containing 'where' conditions - // select: String? - // coma separated list of fields to select - // category: String? - // category of the object - // parent: Object? - // hierarchy object defining query scope, - // if not set queries will be executed against broker. - // Virtual host query scope can be defined by setting parent - // into corresponding object representing a virtual host hierarchy - // - // returns: promise of type dojo.promise.Promise - // Promise returned by dojo.request.xhr with modified then method allowing to use default error handler if none is specified. - Management.prototype.query = function (query) - { - var url = "api/latest/" + (query.parent && query.parent.type === "virtualhost" ? "queryvhost/" - + this.objectToPath({parent: query.parent}) : "querybroker") + (query.category ? "/" - + query.category : ""); - var request = { - url: this.getFullUrl(url), - query: {} - }; - shallowCopy(query, request.query, ["parent", "category"]); - return this.get(request); - }; + function shallowCopy(source, target, excludes) + { + if (source) + { + for (var fieldName in source) + { + if (source.hasOwnProperty(fieldName)) + { + if (excludes && array.indexOf(excludes, fieldName) != -1) + { + continue; + } + + target[fieldName] = source[fieldName]; + } + } + } + return target; + } + + function merge(data1, data2) + { + var result = {}; + shallowCopy(data1, result); + shallowCopy(data2, result); + return result; + } + + // summary: + // This is a facade for sending management requests to broker at given brokerURL specifying schema, host and port. + // Optional errorHandler method can be set and invoked on error responses. + function Management(brokerURL, errorHandler) + { + this.brokerURL = brokerURL; + this.errorHandler = errorHandler || function (error) + { + console.error(error); + }; + } + + // summary: + // Submits HTTP request to broker using dojo.request.xhr + // request: Object? + // request object can have the same fields as dojo.request.xhr options and additional 'url' field: + // data: String|Object|FormData? + // Data to transfer. This is ignored for GET and DELETE requests. + // headers: Object? + // Headers to use for the request. + // user: String? + // Username to use during the request. + // password: String? + // Password to use during the request. + // withCredentials: Boolean? + // For cross-site requests, whether to send credentials or not. + // query: Object? + // the query parameters to add to the request url + // handleAs: String + // Indicates how the response will be handled. + // url: String? + // relative URL to broker REST API + // + // returns: promise of type dojo.promise.Promise + // Promise returned by dojo.request.xhr with modified then method allowing to use default error handler if none is specified. + Management.prototype.submit = function (request) + { + var requestOptions = { + sync: false, + handleAs: "json", + withCredentials: true, + headers: {"Content-Type": "application/json"} + }; + + if (request) + { + shallowCopy(request, requestOptions, ["url"]); + if (requestOptions.data && requestOptions.headers && requestOptions.headers["Content-Type"] + && requestOptions.headers["Content-Type"] == "application/json" && typeof requestOptions.data + != "string") + { + requestOptions.data = json.stringify(request.data); + } + } + + if (!requestOptions.method) + { + requestOptions.method = "GET"; + } + + var url = this.getFullUrl(request.url); + var promise = xhr(url, requestOptions); + var errorHandler = this.errorHandler; + + // decorate promise in order to use a default error handler when 'then' method is invoked without providing error handler + return lang.mixin(new Promise(), { + then: function (callback, errback, progback) + { + return promise.then(callback, errback || errorHandler, progback); + }, + cancel: function (reason, strict) + { + return promise.cancel(reason, strict); + }, + isResolved: function () + { + return promise.isResolved(); + }, + isRejected: function () + { + return promise.isRejected(); + }, + isFulfilled: function () + { + return promise.isFulfilled(); + }, + isCanceled: function () + { + return promise.isCanceled(); + }, + always: function (callbackOrErrback) + { + return promise.always(callbackOrErrback); + }, + otherwise: function (errback) + { + return promise.otherwise(errback); + }, + trace: function () + { + return promise.trace(); + }, + traceRejected: function () + { + return promise.traceRejected(); + }, + toString: function () + { + return promise.toString(); + }, + response: promise.response + }); + }; + + Management.prototype.get = function (request) + { + var requestOptions = merge(request, {method: "GET"}); + return this.submit(requestOptions); + }; + + Management.prototype.post = function (request, data) + { + var requestOptions = merge(request, { + method: "POST", + data: data + }); + return this.submit(requestOptions); + }; + + Management.prototype.del = function (request) + { + var requestOptions = merge(request, {method: "DELETE"}); + return this.submit(requestOptions); + }; + + // summary: + // Loads object data specified as modelObj argument + // modelObj: Object? + // is a JSON object specifying the hierarchy + // It can have the following fields: + // name: String? + // name of the object + // type: String? + // category of the object + // parent: Object? + // parent of the object in the same format, having fields name, type, parent + // + // parameters: Object? + // is optional JSON to pass additional request parameters which will be added into query of REST url + // + // returns: promise of type dojo.promise.Promise + // Promise returned by dojo.request.xhr with modified then method allowing to use default error handler if none is specified. + Management.prototype.load = function (modelObj, parameters, requestOptions) + { + var url = this.objectToURL(modelObj); + var request = {url: url}; + + if (requestOptions) + { + lang.mixin(request, requestOptions); + } + + if (parameters) + { + request.query = parameters; + } + return this.get(request); + }; + + // summary: + // Creates object as specified in data parameter with given category and with given parent parentModelObject + // category: String? + // Object category + // + // parentModelObject: Object? + // Parent object hierarchy + // It can have the following fields: + // name: String? + // name of the object + // type: String? + // category of the object + // parent: Object? + // parent of the object in the same format, having fields name, type, parent + // data; Object? + // Object structure + // + // returns: promise of type dojo.promise.Promise + // Promise returned by dojo.request.xhr with modified then method allowing to use default error handler if none is specified. + Management.prototype.create = function (category, parentModelObject, data) + { + var newObjectModel = { + type: category.toLowerCase(), + parent: parentModelObject + }; + var url = this.objectToURL(newObjectModel); + var request = {url: url}; + return this.post(request, data); + }; + + // summary: + // Updates object (which can be located using modelObj parameter) attributes to the values set in data parameter + // + // modelObj: Object? + // Object specifying hierarchy + // It can have the following fields: + // name: String? + // name of the object + // type: String? + // category of the object + // parent: Object? + // parent of the object in the same format, having fields name, type, parent + // data; Object? + // New attributes + // + // returns: promise of type dojo.promise.Promise + // Promise returned by dojo.request.xhr with modified then method allowing to use default error handler if none is specified. + Management.prototype.update = function (modelObj, data) + { + var url = this.objectToURL(modelObj); + var request = {url: url}; + return this.post(request, data); + }; + + // summary: + // Removes object specified as modelObj argument + // modelObj: Object? + // hierarchy object + // It can have the following fields: + // name: String? + // name of the object + // type: String? + // category of the object + // parent: Object? + // parent of the object in the same format, having fields name, type, parent + // parameters: Object? + // is optional JSON object to pass additional request parameters which will be added into query of REST url + // + // returns: promise of type dojo.promise.Promise + // Promise returned by dojo.request.xhr with modified then method allowing to use default error handler if none is specified. + Management.prototype.remove = function (modelObj, parameters) + { + var url = this.objectToURL(modelObj); + var request = {url: url}; + if (parameters) + { + request.query = parameters; + } + return this.del(request); + }; + + // summary: + // Downloads current JSON for object specified as modelObj argument + // + // modelObj: Object? + // hierarchy object + // It can have the following fields: + // name: String? + // name of the object + // type: String? + // category of the object + // parent: Object? + // parent of the object in the same format, having fields name, type, parent + // parameters: Object? + // is optional JSON object to pass additional request parameters which will be added into query of REST url + // + Management.prototype.download = function (modelObj, parameters) + { + var url = this.buildObjectURL(modelObj, parameters); + setTimeout(function () + { + window.location = url; + }, 100); + } + + // summary: + // Downloads current JSON for object specified as modelObj argument into iframe + Management.prototype.downloadIntoFrame = function (modelObj, parameters) + { + var url = this.buildObjectURL(modelObj, parameters); + var iframe = document.createElement('iframe'); + iframe.id = "downloader_" + modelObj.name; + document.body.appendChild(iframe); + iframe.src = url; + // It seems there is no way to remove this iframe in a manner that is cross browser compatible. + } + + // summary: + // Builds relative REST url (excluding schema, host and port) for the object representing CO hierarchy + // modelObj: Object? + // hierarchy object + // It can have the following fields: + // name: String? + // name of the object + // type: String? + // category of the object + // parent: Object? + // parent of the object in the same format, having fields name, type, parent + // parameters: Object? + // is optional JSON object to pass additional request parameters which will be added into query of REST url + // + // returns: relative REST url for the hierarchy object + // + Management.prototype.objectToURL = function (modelObj) + { + var url = null; + if (modelObj.type == "broker") + { + url = "broker" + } + else + { + url = encodeURIComponent(modelObj.type); + var parentPath = this.objectToPath(modelObj); + if (parentPath) + { + url = url + "/" + parentPath; + } + + if (modelObj.name) + { + if (url.substring(url.length - 1) != "/") + { + url = url + "/"; + } + // Double encode the object name in case it contains slashes + url = url + encodeURIComponent(encodeURIComponent(modelObj.name)) + } + } + return "api/latest/" + url; + }; + + // summary: + // Builds a servlet path of REST url for the object representing CO hierarchy + // modelObj: Object? + // hierarchy object + // It can have the following fields: + // name: String? + // name of the object + // type: String? + // category of the object + // parent: Object? + // parent of the object in the same format, having fields name, type, parent + // parameters: Object? + // is optional JSON object to pass additional request parameters which will be added into query of REST url + // + // returns: relative REST servlet path for the hierarchy object + // + Management.prototype.objectToPath = function (modelObj) + { + var path = ""; + var parent = modelObj.parent; + while (parent && parent.type != "broker") + { + if (path) + { + path = encodeURIComponent(encodeURIComponent(parent.name)) + "/" + path; + } + else + { + path = encodeURIComponent(encodeURIComponent(parent.name)); + } + parent = parent.parent; + } + return path; + }; + + // summary: + // Builds full REST url for the object representing CO hierarchy + // modelObj: Object? + // hierarchy object + // It can have the following fields: + // name: String? + // name of the object + // type: String? + // category of the object + // parent: Object? + // parent of the object in the same format, having fields name, type, parent + // parameters: Object? + // is optional JSON object to pass additional request parameters which will be added into query of REST url + // + // returns: full REST url for the hierarchy object + // + Management.prototype.buildObjectURL = function (modelObj, parameters) + { + var url = this.objectToURL(modelObj); + if (parameters) + { + url = url + "?" + ioQuery.objectToQuery(parameters); + } + return this.getFullUrl(url); + } + + // summary: + // Returns full REST url for the relative REST url + // + // returns: full urk for the given relative URL + // + Management.prototype.getFullUrl = function (url) + { + var baseUrl = this.brokerURL || ""; + if (baseUrl != "") + { + baseUrl = baseUrl + "/"; + } + return baseUrl + url; + } + + // summary: + // Loads meta data, time zones, user preferences and invokes callback functions after loading user preferences + // + Management.prototype.init = function (callback) + { + var that = this; + this.loadMetadata(function () + { + that.loadTimezones(function () + { + that.loadUserPreferences(callback) + }); + }); + }; + + // summary: + // Loads meta data and store it under 'metadata' field as object of type qpid.common.metadata object. + // When meta data are loaded successfully a callback function is executed, otherwise default error handler is invoked + // + Management.prototype.loadMetadata = function (callback) + { + var that = this; + this.get({url: "service/metadata"}) + .then(function (data) + { + that.metadata = new Metadata(data); + if (callback) + { + callback(); + } + }); + }; + + // summary: + // Loads timezones and store them under 'timezone' field as object of type qpid.common.timezone object + // When timezones are loaded successfully a callback function is executed, otherwise default error handler is invoked + // + Management.prototype.loadTimezones = function (callback) + { + var that = this; + that.get({url: "service/timezones"}) + .then(function (timezones) + { + that.timezone = new Timezone(timezones); + if (callback) + { + callback(); + } + }); + }; + + // summary: + // Loads user preferences and store them under 'userPreferences' field as object of type qpid.management.UserPreferences + // Callback is invoked on both successful and unsuccessful preferences request + // + Management.prototype.loadUserPreferences = function (callback) + { + this.userPreferences = new UserPreferences(this); + this.userPreferences.load(callback, callback); + }; + + var saslServiceUrl = "service/sasl"; + + Management.prototype.getSaslStatus = function () + { + return this.get({url: saslServiceUrl}); + } + + Management.prototype.sendSaslResponse = function (response) + { + return this.submit({ + url: saslServiceUrl, + data: response, + headers: {}, + method: "POST" + }); + }; + + Management.prototype.authenticate = function (forceAuthentication) + { + var that = this; + var deferred = new Deferred(); + var successCallback = function (data) + { + that.getSaslStatus() + .then(function (saslData) + { + if (saslData.user) + { + deferred.resolve(saslData); + } + else + { + deferred.reject({ + message: "User identifier is not found!" + " Authentication failed!" + }); + } + }, failureCallback); + }; + var failureCallback = function (data) + { + deferred.reject(data); + }; + this.getSaslStatus() + .then(function (data) + { + if (data.user && !forceAuthentication) + { + deferred.resolve(data); + } + else + { + sasl.authenticate(data.mechanisms, that) + .then(successCallback, failureCallback); + } + }, failureCallback); + return deferred.promise; + }; + + // summary: + // Sends query request + // query: query Object? + // is a JSON object specifying the hierarchy + // It can have the following fields: + // where: String? + // sql like expression containing 'where' conditions + // select: String? + // coma separated list of fields to select + // category: String? + // category of the object + // parent: Object? + // hierarchy object defining query scope, + // if not set queries will be executed against broker. + // Virtual host query scope can be defined by setting parent + // into corresponding object representing a virtual host hierarchy + // + // returns: promise of type dojo.promise.Promise + // Promise returned by dojo.request.xhr with modified then method allowing to use default error handler if none is specified. + Management.prototype.query = function (query) + { + var url = "api/latest/" + (query.parent && query.parent.type === "virtualhost" ? "queryvhost/" + + this.objectToPath({parent: query.parent}) : "querybroker") + (query.category ? "/" + + query.category : ""); + var request = { + url: this.getFullUrl(url), + query: {} + }; + shallowCopy(query, request.query, ["parent", "category"]); + return this.get(request); + }; - return Management; - }); + return Management; + });
Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Plugin.js URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Plugin.js?rev=1741993&r1=1741992&r2=1741993&view=diff ============================================================================== --- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Plugin.js (original) +++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Plugin.js Mon May 2 15:57:52 2016 @@ -29,77 +29,77 @@ define(["dojo/parser", "dojox/html/entities", "dojo/text!showPlugin.html", "dojo/domReady!"], - function (parser, query, connect, properties, updater, util, registry, event, entities, template) - { + function (parser, query, connect, properties, updater, util, registry, event, entities, template) + { - function Plugin(name, parent, controller) - { - this.name = name; - this.controller = controller; - this.management = controller.management; - this.modelObj = { - type: "plugin", - name: name, - parent: parent - }; - } - - Plugin.prototype.getTitle = function () - { - return "Plugin: " + this.name; - }; - - Plugin.prototype.open = function (contentPane) - { - var that = this; - this.contentPane = contentPane; - contentPane.containerNode.innerHTML = template; - parser.parse(contentPane.containerNode).then(function (instances) - { - that.pluginUpdater = - new PluginUpdater(contentPane, that.modelObj, that.controller); - }); - }; - - Plugin.prototype.close = function () - { - updater.remove(this.pluginUpdater); - }; - - function PluginUpdater(contentPane, pluginObject, controller) - { - this.controller = controller; - this.modelObj = pluginObject; - this.management = controller.management; - var node = contentPane.containerNode; - this.name = query(".name", node)[0]; - this.type = query(".type", node)[0]; - - var that = this; - - this.management.load(that.modelObj) - .then(function (data) - { - that.pluginData = data[0]; - - that.updateHeader(); - - require(["qpid/management/plugin/" + that.pluginData.type.toLowerCase().replace('-', '')], - function (SpecificPlugin) - { - that.details = new SpecificPlugin(query(".pluginDetails", - node)[0], pluginObject, controller, contentPane); - }); - - }, util.xhrErrorHandler); - - } - - PluginUpdater.prototype.updateHeader = function () - { - this.name.innerHTML = entities.encode(String(this.pluginData["name"])); - this.type.innerHTML = entities.encode(String(this.pluginData["type"])); - }; + function Plugin(name, parent, controller) + { + this.name = name; + this.controller = controller; + this.management = controller.management; + this.modelObj = { + type: "plugin", + name: name, + parent: parent + }; + } + + Plugin.prototype.getTitle = function () + { + return "Plugin: " + this.name; + }; + + Plugin.prototype.open = function (contentPane) + { + var that = this; + this.contentPane = contentPane; + contentPane.containerNode.innerHTML = template; + parser.parse(contentPane.containerNode) + .then(function (instances) + { + that.pluginUpdater = new PluginUpdater(contentPane, that.modelObj, that.controller); + }); + }; + + Plugin.prototype.close = function () + { + updater.remove(this.pluginUpdater); + }; + + function PluginUpdater(contentPane, pluginObject, controller) + { + this.controller = controller; + this.modelObj = pluginObject; + this.management = controller.management; + var node = contentPane.containerNode; + this.name = query(".name", node)[0]; + this.type = query(".type", node)[0]; + + var that = this; + + this.management.load(that.modelObj) + .then(function (data) + { + that.pluginData = data[0]; + + that.updateHeader(); + + require(["qpid/management/plugin/" + that.pluginData.type.toLowerCase() + .replace('-', '')], function (SpecificPlugin) + { + that.details = + new SpecificPlugin(query(".pluginDetails", node)[0], pluginObject, controller, contentPane); + }); + + }, util.xhrErrorHandler); + + } + + PluginUpdater.prototype.updateHeader = function () + { + this.name.innerHTML = entities.encode(String(this.pluginData["name"])); + this.type.innerHTML = entities.encode(String(this.pluginData["type"])); + }; - return Plugin; - }); + return Plugin; + }); Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Port.js URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Port.js?rev=1741993&r1=1741992&r2=1741993&view=diff ============================================================================== --- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Port.js (original) +++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Port.js Mon May 2 15:57:52 2016 @@ -31,273 +31,270 @@ define(["dojo/dom", "qpid/management/addPort", "dojo/text!showPort.html", "dojo/domReady!"], - function (dom, parser, query, connect, registry, entities, properties, updater, util, formatter, addPort, template) - { + function (dom, parser, query, connect, registry, entities, properties, updater, util, formatter, addPort, template) + { - function Port(name, parent, controller) - { - this.name = name; - this.controller = controller; - this.management = controller.management; - this.modelObj = { - type: "port", - name: name, - parent: parent - }; - } - - Port.prototype.getTitle = function () - { - return "Port: " + this.name; - }; - - Port.prototype.open = function (contentPane) - { - var that = this; - this.contentPane = contentPane; - - contentPane.containerNode.innerHTML = template; - parser.parse(contentPane.containerNode).then(function (instances) - { - that.portUpdater = new PortUpdater(that); - - var deletePortButton = query(".deletePortButton", - contentPane.containerNode)[0]; - var node = registry.byNode(deletePortButton); - connect.connect(node, "onClick", function (evt) - { - that.deletePort(); - }); - - var editPortButton = query(".editPortButton", - contentPane.containerNode)[0]; - var node = registry.byNode(editPortButton); - connect.connect(node, "onClick", function (evt) - { - that.showEditDialog(); - }); - - that.portUpdater.update(function () - { - updater.add(that.portUpdater); - }); - }); - }; - - Port.prototype.close = function () - { - updater.remove(this.portUpdater); - }; - - Port.prototype.deletePort = function () - { - if (confirm("Are you sure you want to delete port '" + entities.encode(this.name) + "'?")) - { - var that = this; - this.management.remove(this.modelObj).then(function (data) - { - that.contentPane.onClose() - that.controller.tabContainer.removeChild(that.contentPane); - that.contentPane.destroyRecursive(); - that.close(); - }, util.xhrErrorHandler); - } - } - - Port.prototype.showEditDialog = function () - { - var that = this; - this.management.load(that.modelObj.parent) - .then(function (data) - { - var brokerData = data[0]; - addPort.show(that.management, - that.modelObj, - that.portUpdater.portData.type, - brokerData.authenticationproviders, - brokerData.keystores, - brokerData.truststores); - }, util.xhrErrorHandler); - } - - function PortUpdater(portTab) - { - var that = this; - this.tabObject = portTab; - this.management = portTab.controller.management; - this.modelObj = portTab.modelObj; - var containerNode = portTab.contentPane.containerNode; - - function findNode(name) - { - return query("." + name, containerNode)[0]; - } - - function storeNodes(names) - { - for (var i = 0; i < names.length; i++) - { - that[names[i]] = findNode(names[i]); - } - } - - storeNodes(["nameValue", - "stateValue", - "typeValue", - "portValue", - "authenticationProviderValue", - "protocolsValue", - "transportsValue", - "bindingAddressValue", - "keyStoreValue", - "needClientAuthValue", - "wantClientAuthValue", - "trustStoresValue", - "connectionCountValue", - "maxOpenConnectionsValue", - "authenticationProvider", - "bindingAddress", - "keyStore", - "needClientAuth", - "wantClientAuth", - "clientCertRecorderValue", - "trustStores", - "maxOpenConnections", - "threadPoolMinimum", - "threadPoolMaximum", - "threadPoolSize", - "threadPoolMinimumValue", - "threadPoolMaximumValue", - "threadPoolSizeValue", - "portTypeSpecificDetails", - "portAttributes"]); - } - - PortUpdater.prototype.updateHeader = function () - { - function printArray(fieldName, object) - { - var array = object[fieldName]; - var data = "<div>"; - if (array) - { - for (var i = 0; i < array.length; i++) - { - data += "<div>" + entities.encode(array[i]) + "</div>"; - } - } - return data + "</div>"; - } - - this.nameValue.innerHTML = entities.encode(String(this.portData["name"])); - this.stateValue.innerHTML = entities.encode(String(this.portData["state"])); - this.typeValue.innerHTML = entities.encode(String(this.portData["type"])); - this.portValue.innerHTML = entities.encode(String(this.portData["port"])); - this.authenticationProviderValue.innerHTML = this.portData["authenticationProvider"] - ? entities.encode(String(this.portData["authenticationProvider"])) - : ""; - this.protocolsValue.innerHTML = printArray("protocols", this.portData); - this.transportsValue.innerHTML = printArray("transports", this.portData); - this.bindingAddressValue.innerHTML = - this.portData["bindingAddress"] ? entities.encode(String(this.portData["bindingAddress"])) : ""; - this.connectionCountValue.innerHTML = - this.portData["connectionCount"] ? entities.encode(String(this.portData["connectionCount"])) : "0"; - this.maxOpenConnectionsValue.innerHTML = - (this.portData["maxOpenConnections"] && this.portData["maxOpenConnections"] >= 0) ? entities.encode( - String(this.portData["maxOpenConnections"])) : "(no limit)"; - this.threadPoolMinimumValue.innerHTML = - entities.encode(String(this.portData["threadPoolMinimum"] || "")); - this.threadPoolMaximumValue.innerHTML = - entities.encode(String(this.portData["threadPoolMaximum"] || "")); - this.threadPoolSizeValue.innerHTML = entities.encode(String(this.portData["threadPoolSize"] || "")); - - this.keyStoreValue.innerHTML = - this.portData["keyStore"] ? entities.encode(String(this.portData["keyStore"])) : ""; - this.needClientAuthValue.innerHTML = - "<input type='checkbox' disabled='disabled' " + (this.portData["needClientAuth"] - ? "checked='checked'" - : "") + " />"; - this.wantClientAuthValue.innerHTML = - "<input type='checkbox' disabled='disabled' " + (this.portData["wantClientAuth"] - ? "checked='checked'" - : "") + " />"; - this.trustStoresValue.innerHTML = printArray("trustStores", this.portData); - this.clientCertRecorderValue.innerHTML = this.portData["clientCertRecorder"] - ? entities.encode(String(this.portData["clientCertRecorder"])) - : ""; - - var typeMetaData = this.management.metadata.getMetaData("Port", this.portData["type"]); - - this.authenticationProvider.style.display = - "authenticationProvider" in typeMetaData.attributes ? "block" : "none"; - this.bindingAddress.style.display = "bindingAddress" in typeMetaData.attributes ? "block" : "none"; - this.keyStore.style.display = "keyStore" in typeMetaData.attributes ? "block" : "none"; - this.needClientAuth.style.display = "needClientAuth" in typeMetaData.attributes ? "block" : "none"; - this.wantClientAuth.style.display = "wantClientAuth" in typeMetaData.attributes ? "block" : "none"; - this.trustStores.style.display = "trustStores" in typeMetaData.attributes ? "block" : "none"; - - var hasThreadPoolMinMaxSettings = "threadPoolMaximum" in typeMetaData.attributes; - this.threadPoolMinimum.style.display = hasThreadPoolMinMaxSettings ? "block" : "none"; - this.threadPoolMaximum.style.display = hasThreadPoolMinMaxSettings ? "block" : "none"; - - var hasThreadPoolSizeSettings = "threadPoolSize" in typeMetaData.attributes; - this.threadPoolSize.style.display = hasThreadPoolSizeSettings ? "block" : "none"; - - this.maxOpenConnections.style.display = - "maxOpenConnections" in typeMetaData.attributes ? "block" : "none"; - - }; - - PortUpdater.prototype.update = function (callback) - { - - var thisObj = this; - - this.management.load(this.modelObj).then(function (data) - { - thisObj.portData = data[0] || {}; - thisObj.updateUI(thisObj.portData); - util.flattenStatistics(thisObj.portData); - if (callback) - { - callback(); - } - thisObj.updateHeader(); - }, function (error) - { - util.tabErrorHandler(error, { - updater: thisObj, - contentPane: thisObj.tabObject.contentPane, - tabContainer: thisObj.tabObject.controller.tabContainer, - name: thisObj.modelObj.name, - category: "Port" - }); - }); - }; - - PortUpdater.prototype.updateUI = function (data) - { - if (!this.details) - { - var that = this; - require(["qpid/management/port/" + data.type.toLowerCase() + "/show"], function (Details) - { - that.details = new Details({ - containerNode: that.portAttributes, - typeSpecificDetailsNode: that.portTypeSpecificDetails, - metadata: that.tabObject.management.metadata, - data: data, - management: that.tabObject.management, - modelObj: that.tabObject.modelObj, - portUpdater: that.portUpdater - }); - }); - } - else - { - this.details.update(data); - } - } + function Port(name, parent, controller) + { + this.name = name; + this.controller = controller; + this.management = controller.management; + this.modelObj = { + type: "port", + name: name, + parent: parent + }; + } + + Port.prototype.getTitle = function () + { + return "Port: " + this.name; + }; + + Port.prototype.open = function (contentPane) + { + var that = this; + this.contentPane = contentPane; + + contentPane.containerNode.innerHTML = template; + parser.parse(contentPane.containerNode) + .then(function (instances) + { + that.portUpdater = new PortUpdater(that); + + var deletePortButton = query(".deletePortButton", contentPane.containerNode)[0]; + var node = registry.byNode(deletePortButton); + connect.connect(node, "onClick", function (evt) + { + that.deletePort(); + }); + + var editPortButton = query(".editPortButton", contentPane.containerNode)[0]; + var node = registry.byNode(editPortButton); + connect.connect(node, "onClick", function (evt) + { + that.showEditDialog(); + }); + + that.portUpdater.update(function () + { + updater.add(that.portUpdater); + }); + }); + }; + + Port.prototype.close = function () + { + updater.remove(this.portUpdater); + }; + + Port.prototype.deletePort = function () + { + if (confirm("Are you sure you want to delete port '" + entities.encode(this.name) + "'?")) + { + var that = this; + this.management.remove(this.modelObj) + .then(function (data) + { + that.contentPane.onClose() + that.controller.tabContainer.removeChild(that.contentPane); + that.contentPane.destroyRecursive(); + that.close(); + }, util.xhrErrorHandler); + } + } + + Port.prototype.showEditDialog = function () + { + var that = this; + this.management.load(that.modelObj.parent) + .then(function (data) + { + var brokerData = data[0]; + addPort.show(that.management, + that.modelObj, + that.portUpdater.portData.type, + brokerData.authenticationproviders, + brokerData.keystores, + brokerData.truststores); + }, util.xhrErrorHandler); + } + + function PortUpdater(portTab) + { + var that = this; + this.tabObject = portTab; + this.management = portTab.controller.management; + this.modelObj = portTab.modelObj; + var containerNode = portTab.contentPane.containerNode; + + function findNode(name) + { + return query("." + name, containerNode)[0]; + } + + function storeNodes(names) + { + for (var i = 0; i < names.length; i++) + { + that[names[i]] = findNode(names[i]); + } + } + + storeNodes(["nameValue", + "stateValue", + "typeValue", + "portValue", + "authenticationProviderValue", + "protocolsValue", + "transportsValue", + "bindingAddressValue", + "keyStoreValue", + "needClientAuthValue", + "wantClientAuthValue", + "trustStoresValue", + "connectionCountValue", + "maxOpenConnectionsValue", + "authenticationProvider", + "bindingAddress", + "keyStore", + "needClientAuth", + "wantClientAuth", + "clientCertRecorderValue", + "trustStores", + "maxOpenConnections", + "threadPoolMinimum", + "threadPoolMaximum", + "threadPoolSize", + "threadPoolMinimumValue", + "threadPoolMaximumValue", + "threadPoolSizeValue", + "portTypeSpecificDetails", + "portAttributes"]); + } + + PortUpdater.prototype.updateHeader = function () + { + function printArray(fieldName, object) + { + var array = object[fieldName]; + var data = "<div>"; + if (array) + { + for (var i = 0; i < array.length; i++) + { + data += "<div>" + entities.encode(array[i]) + "</div>"; + } + } + return data + "</div>"; + } + + this.nameValue.innerHTML = entities.encode(String(this.portData["name"])); + this.stateValue.innerHTML = entities.encode(String(this.portData["state"])); + this.typeValue.innerHTML = entities.encode(String(this.portData["type"])); + this.portValue.innerHTML = entities.encode(String(this.portData["port"])); + this.authenticationProviderValue.innerHTML = this.portData["authenticationProvider"] + ? entities.encode(String(this.portData["authenticationProvider"])) + : ""; + this.protocolsValue.innerHTML = printArray("protocols", this.portData); + this.transportsValue.innerHTML = printArray("transports", this.portData); + this.bindingAddressValue.innerHTML = + this.portData["bindingAddress"] ? entities.encode(String(this.portData["bindingAddress"])) : ""; + this.connectionCountValue.innerHTML = + this.portData["connectionCount"] ? entities.encode(String(this.portData["connectionCount"])) : "0"; + this.maxOpenConnectionsValue.innerHTML = + (this.portData["maxOpenConnections"] && this.portData["maxOpenConnections"] >= 0) ? entities.encode( + String(this.portData["maxOpenConnections"])) : "(no limit)"; + this.threadPoolMinimumValue.innerHTML = entities.encode(String(this.portData["threadPoolMinimum"] || "")); + this.threadPoolMaximumValue.innerHTML = entities.encode(String(this.portData["threadPoolMaximum"] || "")); + this.threadPoolSizeValue.innerHTML = entities.encode(String(this.portData["threadPoolSize"] || "")); + + this.keyStoreValue.innerHTML = + this.portData["keyStore"] ? entities.encode(String(this.portData["keyStore"])) : ""; + this.needClientAuthValue.innerHTML = + "<input type='checkbox' disabled='disabled' " + (this.portData["needClientAuth"] + ? "checked='checked'" + : "") + " />"; + this.wantClientAuthValue.innerHTML = + "<input type='checkbox' disabled='disabled' " + (this.portData["wantClientAuth"] + ? "checked='checked'" + : "") + " />"; + this.trustStoresValue.innerHTML = printArray("trustStores", this.portData); + this.clientCertRecorderValue.innerHTML = + this.portData["clientCertRecorder"] ? entities.encode(String(this.portData["clientCertRecorder"])) : ""; + + var typeMetaData = this.management.metadata.getMetaData("Port", this.portData["type"]); + + this.authenticationProvider.style.display = + "authenticationProvider" in typeMetaData.attributes ? "block" : "none"; + this.bindingAddress.style.display = "bindingAddress" in typeMetaData.attributes ? "block" : "none"; + this.keyStore.style.display = "keyStore" in typeMetaData.attributes ? "block" : "none"; + this.needClientAuth.style.display = "needClientAuth" in typeMetaData.attributes ? "block" : "none"; + this.wantClientAuth.style.display = "wantClientAuth" in typeMetaData.attributes ? "block" : "none"; + this.trustStores.style.display = "trustStores" in typeMetaData.attributes ? "block" : "none"; + + var hasThreadPoolMinMaxSettings = "threadPoolMaximum" in typeMetaData.attributes; + this.threadPoolMinimum.style.display = hasThreadPoolMinMaxSettings ? "block" : "none"; + this.threadPoolMaximum.style.display = hasThreadPoolMinMaxSettings ? "block" : "none"; + + var hasThreadPoolSizeSettings = "threadPoolSize" in typeMetaData.attributes; + this.threadPoolSize.style.display = hasThreadPoolSizeSettings ? "block" : "none"; + + this.maxOpenConnections.style.display = "maxOpenConnections" in typeMetaData.attributes ? "block" : "none"; + + }; + + PortUpdater.prototype.update = function (callback) + { + + var thisObj = this; + + this.management.load(this.modelObj) + .then(function (data) + { + thisObj.portData = data[0] || {}; + thisObj.updateUI(thisObj.portData); + util.flattenStatistics(thisObj.portData); + if (callback) + { + callback(); + } + thisObj.updateHeader(); + }, function (error) + { + util.tabErrorHandler(error, { + updater: thisObj, + contentPane: thisObj.tabObject.contentPane, + tabContainer: thisObj.tabObject.controller.tabContainer, + name: thisObj.modelObj.name, + category: "Port" + }); + }); + }; + + PortUpdater.prototype.updateUI = function (data) + { + if (!this.details) + { + var that = this; + require(["qpid/management/port/" + data.type.toLowerCase() + "/show"], function (Details) + { + that.details = new Details({ + containerNode: that.portAttributes, + typeSpecificDetailsNode: that.portTypeSpecificDetails, + metadata: that.tabObject.management.metadata, + data: data, + management: that.tabObject.management, + modelObj: that.tabObject.modelObj, + portUpdater: that.portUpdater + }); + }); + } + else + { + this.details.update(data); + } + } - return Port; - }); + return Port; + }); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
