You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by lq...@apache.org on 2016/05/06 15:21:33 UTC

svn commit: r1742554 - in /qpid/java/trunk/broker-plugins/management-http/src/main/java/resources: ./ css/ js/qpid/common/ js/qpid/management/ js/qpid/management/query/

Author: lquack
Date: Fri May  6 15:21:32 2016
New Revision: 1742554

URL: http://svn.apache.org/viewvc?rev=1742554&view=rev
Log:
QPID-7215: [Java Broker, WMC] Use query to retrieve connection information

Added:
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryGrid.js
Modified:
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/css/common.css
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/index.html
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/QueryTab.js
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryBuilder.js
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryStore.js

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/css/common.css
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/css/common.css?rev=1742554&r1=1742553&r2=1742554&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/css/common.css (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/css/common.css Fri May  6 15:21:32 2016
@@ -467,4 +467,15 @@ div .messages {
     background-image:  none !important;
     background-color: inherit !important;
     background-repeat: inherit !important;
-}
\ No newline at end of file
+}
+
+.claro.qpid .dgrid-header .dgrid-cell { font-weight: normal; }
+.virtualHostConnections .field-name { width: 20%; }
+.virtualHostConnections .field-principal { width: 10% }
+.virtualHostConnections .field-port { width: 10% }
+.virtualHostConnections .field-transport { width: 10% }
+.virtualHostConnections .field-sessionCount { width: 10% }
+.virtualHostConnections .field-msgInRate { width: 10% }
+.virtualHostConnections .field-bytesInRate { width: 10% }
+.virtualHostConnections .field-msgOutRate { width: 10% }
+.virtualHostConnections .field-bytesOutRate { width: 10% }

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/index.html
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/index.html?rev=1742554&r1=1742553&r2=1742554&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/index.html (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/index.html Fri May  6 15:21:32 2016
@@ -148,7 +148,7 @@
     </script>
 
 </head>
-<body class="claro">
+<body class="claro qpid">
 
 <div id="pageLayout" data-dojo-type="dijit.layout.BorderContainer" data-dojo-props="design: 'headline', gutters: false">
     <div data-dojo-type="dijit.layout.ContentPane" data-dojo-props="region:'top'">

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js?rev=1742554&r1=1742553&r2=1742554&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js Fri May  6 15:21:32 2016
@@ -729,6 +729,23 @@ define(["dojo/_base/xhr",
                 });
         };
 
+        util.queryResultToObjects = function (queryResult)
+        {
+            var objects = [];
+            var headers = queryResult.headers;
+            var results = queryResult.results;
+            for (var i = 0, l1 = results.length; i < l1; ++i)
+            {
+                var result = {};
+                for (var j = 0, l2 = headers.length; j < l2; ++j)
+                {
+                    result[headers[j]] = results[i][j];
+                }
+                objects.push(result);
+            }
+            return objects;
+        };
+
         util.setMultiSelectOptions = function (multiSelectWidget, options)
         {
             util.addMultiSelectOptions(multiSelectWidget, options, true);

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js?rev=1742554&r1=1742553&r2=1742554&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js Fri May  6 15:21:32 2016
@@ -895,19 +895,11 @@ define(["dojo/parser",
                 .then(function (data)
                 {
                     that.brokerData = data.broker[0];
-                    var virtualHostData = [];
-                    var headers =  data.virtualHosts.headers;
-                    var results =  data.virtualHosts.results;
+                    var virtualHostData = util.queryResultToObjects(data.virtualHosts);
                     var queryVirtualHostNodes = {};
-                    for (var i = 0; i < results.length; i++)
+                    for (var i = 0; i < virtualHostData.length; ++i)
                     {
-                        var result = {};
-                        for (var j = 0; j < headers.length; j++)
-                        {
-                            result[headers[j]] = results[i][j];
-                        }
-                        virtualHostData.push(result);
-                        queryVirtualHostNodes[result.id] = null;
+                        queryVirtualHostNodes[virtualHostData[i].id] = null;
                     }
                     for (var i = 0; i < that.brokerData.virtualhostnodes.length; i++)
                     {

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/QueryTab.js
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/QueryTab.js?rev=1742554&r1=1742553&r2=1742554&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/QueryTab.js (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/QueryTab.js Fri May  6 15:21:32 2016
@@ -65,7 +65,7 @@ define(["dojo/parser",
             this.queryEditorNode = query(".queryEditorNode", containerNode)[0];
             this.queryBuilder = new QueryBuilder({
                 management: this.management,
-                parentModelObj: this.parent,
+                parentObject: this.parent,
                 controller: this.controller
             }, this.queryEditorNode);
         };

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js?rev=1742554&r1=1742553&r2=1742554&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js Fri May  6 15:21:32 2016
@@ -21,6 +21,7 @@
 define(["dojo/parser",
         "dojo/query",
         "dojo/_base/connect",
+        "dojo/_base/lang",
         "dijit/registry",
         "dojox/html/entities",
         "qpid/common/properties",
@@ -31,6 +32,7 @@ define(["dojo/parser",
         "qpid/management/addQueue",
         "qpid/management/addExchange",
         "qpid/management/addLogger",
+        "qpid/management/query/QueryGrid",
         "dojox/grid/EnhancedGrid",
         "qpid/management/editVirtualHost",
         "dojo/text!showVirtualHost.html",
@@ -38,6 +40,7 @@ define(["dojo/parser",
     function (parser,
               query,
               connect,
+              lang,
               registry,
               entities,
               properties,
@@ -48,6 +51,7 @@ define(["dojo/parser",
               addQueue,
               addExchange,
               addLogger,
+              QueryGrid,
               EnhancedGrid,
               editVirtualHost,
               template)
@@ -265,8 +269,6 @@ define(["dojo/parser",
                         "virtualHostConnections",
                         "virtualHostChildren"]);
 
-            var that = this;
-
             that.vhostData = {};
 
             var gridProperties = {
@@ -349,58 +351,45 @@ define(["dojo/parser",
                 });
             }, gridProperties, EnhancedGrid);
 
-            that.connectionsGrid = new UpdatableStore([], findNode("connections"), [{
-                name: "Name",
-                field: "name",
-                width: "20%"
-            }, {
-                name: "User",
-                field: "principal",
-                width: "10%"
-            }, {
-                name: "Port",
-                field: "port",
-                width: "10%"
-            }, {
-                name: "Transport",
-                field: "transport",
-                width: "10%"
-            }, {
-                name: "Sessions",
-                field: "sessionCount",
-                width: "10%"
-            }, {
-                name: "Msgs In",
-                field: "msgInRate",
-                width: "10%"
-            }, {
-                name: "Bytes In",
-                field: "bytesInRate",
-                width: "10%"
-            }, {
-                name: "Msgs Out",
-                field: "msgOutRate",
-                width: "10%"
-            }, {
-                name: "Bytes Out",
-                field: "bytesOutRate",
-                width: "10%"
-            }], function (obj)
-            {
-                connect.connect(obj.grid, "onRowDblClick", obj.grid, function (evt)
-                {
-                    var idx = evt.rowIndex, theItem = this.getItem(idx);
-                    var connectionName = obj.dataStore.getValue(theItem, "name");
-                    // mock the connection's parent port because we don't have access to it from here
-                    var port = {
-                        name: obj.dataStore.getValue(theItem, "port"),
-                        type: "port",
-                        parent: vhost.parent.parent
-                    };
-
-                    controller.show("connection", connectionName, port, theItem.id);
-                });
-            });
+            this.connectionsGrid = new QueryGrid({
+                transformer: lang.hitch(this, this._transformConnectionData),
+                management: this.management,
+                controller: controller,
+                parentObject: this.modelObj,
+                category: "Connection",
+                selectClause: "id, name, principal, port.name AS port, transport, sessionCount, messagesIn, bytesIn, messagesOut, bytesOut",
+                orderBy: "name",
+                columns: [{
+                    label: "Name",
+                    field: "name"
+                }, {
+                    label: "User",
+                    field: "principal"
+                }, {
+                    label: "Port",
+                    field: "port"
+                }, {
+                    label: "Transport",
+                    field: "transport"
+                }, {
+                    label: "Sessions",
+                    field: "sessionCount"
+                }, {
+                    label: "Msgs In",
+                    field: "msgInRate"
+                }, {
+                    label: "Bytes In",
+                    field: "bytesInRate"
+                }, {
+                    label: "Msgs Out",
+                    field: "msgOutRate"
+                }, {
+                    label: "Bytes Out",
+                    field: "bytesOutRate"
+                }
+                ]
+            }, findNode("connections"));
+            that.connectionsGrid.startup();
 
             that.virtualHostLoggersGrid = new UpdatableStore([], findNode("loggers"), [{
                 name: "Name",
@@ -458,6 +447,9 @@ define(["dojo/parser",
         {
             var thisObj = this;
 
+            thisObj.connectionsGrid.refresh();
+            thisObj.connectionsGrid.resize();
+
             this.management.load(this.modelObj,
                 {
                     excludeInheritedContext: true,
@@ -474,40 +466,23 @@ define(["dojo/parser",
                                 bytesOut: 0
                             }
                         };
-                    thisObj.management.get({
-                            url: thisObj.management.objectToURL(thisObj.modelObj) + "/getConnections"
-                        })
-                        .then(function (data)
-                        {
-                            thisObj.vhostData["connections"] = data;
 
-                            if (callback)
-                            {
-                                callback();
-                            }
-
-                            try
-                            {
-                                thisObj._update();
-                            }
-                            catch (e)
-                            {
-                                if (console && console.error)
-                                {
-                                    console.error(e);
-                                }
-                            }
+                    if (callback)
+                    {
+                        callback();
+                    }
 
-                        }, function (error)
+                    try
+                    {
+                        thisObj._update();
+                    }
+                    catch (e)
+                    {
+                        if (console && console.error)
                         {
-                            util.tabErrorHandler(error, {
-                                updater: thisObj,
-                                contentPane: thisObj.tabObject.contentPane,
-                                tabContainer: thisObj.tabObject.controller.tabContainer,
-                                name: thisObj.modelObj.name,
-                                category: "Virtual Host"
-                            });
-                        });
+                            console.error(e);
+                        }
+                    }
                 }, function (error)
                 {
                     util.tabErrorHandler(error, {
@@ -530,7 +505,6 @@ define(["dojo/parser",
             this.tabObject.deleteButton.set("disabled", !this.vhostData.state);
 
             util.flattenStatistics(thisObj.vhostData);
-            var connections = thisObj.vhostData["connections"];
             var queues = thisObj.vhostData["queues"];
             var exchanges = thisObj.vhostData["exchanges"];
 
@@ -562,37 +536,6 @@ define(["dojo/parser",
                 var bytesOutFormat = formatter.formatBytes(bytesOutRate);
                 thisObj.bytesOutRate.innerHTML = "(" + bytesOutFormat.value;
                 thisObj.bytesOutRateUnits.innerHTML = bytesOutFormat.units + "/s)";
-
-                if (connections && thisObj.connections)
-                {
-                    for (var i = 0; i < connections.length; i++)
-                    {
-                        var connection = connections[i];
-                        for (var j = 0; j < thisObj.connections.length; j++)
-                        {
-                            var oldConnection = thisObj.connections[j];
-                            if (oldConnection.id == connection.id)
-                            {
-                                msgOutRate =
-                                    (1000 * (connection.messagesOut - oldConnection.messagesOut)) / samplePeriod;
-                                connection.msgOutRate = msgOutRate.toFixed(0) + "msg/s";
-
-                                bytesOutRate = (1000 * (connection.bytesOut - oldConnection.bytesOut)) / samplePeriod;
-                                var bytesOutRateFormat = formatter.formatBytes(bytesOutRate);
-                                connection.bytesOutRate = bytesOutRateFormat.value + bytesOutRateFormat.units + "/s";
-
-                                msgInRate = (1000 * (connection.messagesIn - oldConnection.messagesIn)) / samplePeriod;
-                                connection.msgInRate = msgInRate.toFixed(0) + "msg/s";
-
-                                bytesInRate = (1000 * (connection.bytesIn - oldConnection.bytesIn)) / samplePeriod;
-                                var bytesInRateFormat = formatter.formatBytes(bytesInRate);
-                                connection.bytesInRate = bytesInRateFormat.value + bytesInRateFormat.units + "/s";
-                            }
-
-                        }
-
-                    }
-                }
             }
 
             thisObj.sampleTime = sampleTime;
@@ -600,7 +543,6 @@ define(["dojo/parser",
             thisObj.bytesIn = bytesIn;
             thisObj.messageOut = messageOut;
             thisObj.bytesOut = bytesOut;
-            thisObj.connections = connections;
 
             this._updateGrids(thisObj.vhostData)
 
@@ -623,6 +565,45 @@ define(["dojo/parser",
 
         };
 
+        Updater.prototype._transformConnectionData = function (data)
+        {
+
+            var sampleTime = new Date();
+            var connections = util.queryResultToObjects(data);
+            if (this._previousConnectionSampleTime)
+            {
+                var samplePeriod = sampleTime.getTime() - this._previousConnectionSampleTime.getTime();
+                for (var i = 0; i < connections.length; i++)
+                {
+                    var connection = connections[i];
+                    for (var j = 0; j < this._previousConnections.length; j++)
+                    {
+                        var oldConnection = this._previousConnections[j];
+                        if (oldConnection.id == connection.id)
+                        {
+                            var msgOutRate = (1000 * (connection.messagesOut - oldConnection.messagesOut))
+                                             / samplePeriod;
+                            connection.msgOutRate = msgOutRate.toFixed(0) + "msg/s";
+
+                            var bytesOutRate = (1000 * (connection.bytesOut - oldConnection.bytesOut)) / samplePeriod;
+                            var bytesOutRateFormat = formatter.formatBytes(bytesOutRate);
+                            connection.bytesOutRate = bytesOutRateFormat.value + bytesOutRateFormat.units + "/s";
+
+                            var msgInRate = (1000 * (connection.messagesIn - oldConnection.messagesIn)) / samplePeriod;
+                            connection.msgInRate = msgInRate.toFixed(0) + "msg/s";
+
+                            var bytesInRate = (1000 * (connection.bytesIn - oldConnection.bytesIn)) / samplePeriod;
+                            var bytesInRateFormat = formatter.formatBytes(bytesInRate);
+                            connection.bytesInRate = bytesInRateFormat.value + bytesInRateFormat.units + "/s";
+                        }
+                    }
+                }
+            }
+            this._previousConnectionSampleTime = sampleTime;
+            this._previousConnections = connections;
+            return connections;
+        };
+
         Updater.prototype._updateGrids = function (data)
         {
             this.virtualHostChildren.style.display = data.state == "ACTIVE" ? "block" : "none";
@@ -639,8 +620,6 @@ define(["dojo/parser",
                     var isStandard = item && item.name && util.isReservedExchangeName(item.name);
                     exchangesGrid.rowSelectCell.setDisabled(i, isStandard);
                 }
-                this.virtualHostConnections.style.display = data.connections ? "block" : "none";
-                util.updateUpdatableStore(this.connectionsGrid, data.connections);
             }
         };
 

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryBuilder.js
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryBuilder.js?rev=1742554&r1=1742553&r2=1742554&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryBuilder.js (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryBuilder.js Fri May  6 15:21:32 2016
@@ -33,7 +33,7 @@ define(["dojo/_base/declare",
         "dgrid/extensions/ColumnResizer",
         "dstore/Memory",
         'dstore/legacy/DstoreAdapter',
-        "qpid/management/query/QueryStore",
+        "qpid/management/query/QueryGrid",
         "qpid/management/query/DropDownSelect",
         "qpid/management/query/WhereExpression",
         "dojo/Evented",
@@ -72,7 +72,7 @@ define(["dojo/_base/declare",
               ColumnResizer,
               Memory,
               DstoreAdapter,
-              QueryStore)
+              QueryGrid)
     {
         var predefinedCategories = [{
             id: "queue",
@@ -108,7 +108,9 @@ define(["dojo/_base/declare",
                 /**
                  * constructor parameter
                  */
-                _management: null,
+                management: null,
+                controller: null,
+                parentObject: null,
 
                 /**
                  * Inner fields
@@ -118,14 +120,8 @@ define(["dojo/_base/declare",
                 _categorySelector: null,
                 _searchScopeSelector: null,
                 _lastStandardModeSelect: [],
-                _sort: [],
                 _lastHeaders: [],
 
-                constructor: function (args)
-                {
-                    this._management = args.management;
-                    this.inherited(arguments);
-                },
                 postCreate: function ()
                 {
                     this.inherited(arguments);
@@ -154,7 +150,7 @@ define(["dojo/_base/declare",
                     this.standardSelectChooser.startup();
                     this.standardWhereChooser.startup();
                     this.standardWhereExpressionBuilder.set("whereFieldsSelector", this.standardWhereChooser);
-                    this.standardWhereExpressionBuilder.set("userPreferences", this._management.userPreferences);
+                    this.standardWhereExpressionBuilder.set("userPreferences", this.management.userPreferences);
                     this.standardWhereExpressionBuilder.startup();
                     this.standardWhereExpressionBuilder.on("change", lang.hitch(this, this._standardModeWhereChanged));
 
@@ -163,24 +159,18 @@ define(["dojo/_base/declare",
                     this.modeButton.on("click", lang.hitch(this, this._showModeSwitchWarningIfRequired));
 
                     this._buildGrid();
-                    this._categoryChanged();
+                    this._categoryChanged(this._categorySelector.value);
                     this._toggleSearchButton();
                 },
                 search: function ()
                 {
-                    var category = this._categorySelector.value.toLowerCase();
                     var scope = this._searchScopeSelector.value;
-                    var modelObj = this._scopeModelObjects[scope];
-                    this._store.selectClause = this._store.selectClause;
-                    this._store.where = this._store.where;
-                    this._store.category = category;
-                    this._store.parent = modelObj;
-                    this._store.orderBy = this._store.orderBy;
+                    this._resultsGrid.setParentObject(this._scopeModelObjects[scope]);
                     this._resultsGrid.refresh();
                 },
                 _showModeSwitchWarningIfRequired: function ()
                 {
-                    var userPreferences = this._management.userPreferences;
+                    var userPreferences = this.management.userPreferences;
                     var displayWarning = (!userPreferences || !userPreferences.query
                                           || (userPreferences.query.displaySwitchModeWarning == undefined
                                           || userPreferences.query.displaySwitchModeWarning));
@@ -223,18 +213,22 @@ define(["dojo/_base/declare",
                         this._modeChanged();
                     }
                 },
+                _setSelectClause: function (select)
+                {
+                    this._resultsGrid.setSelect(select ? select + ",id" : "");
+                },
                 _advancedModeSelectChanged: function ()
                 {
-                    this._store.selectClause = this.advancedSelect.value;
+                    this._setSelectClause(this.advancedSelect.value);
                 },
                 _advancedModeWhereChanged: function ()
                 {
-                    this._store.where = this.advancedWhere.value;
+                    this._resultsGrid.setWhere(this.advancedWhere.value);
                 },
                 _advancedModeOrderByChanged: function ()
                 {
-                    this._store.orderBy = this.advancedOrderBy.value;
-                    this._sort = [];
+                    this._resultsGrid.setOrderBy(this.advancedOrderBy.value);
+                    this._resultsGrid.setSort([]);
                 },
                 _toggleSearchButton: function (select)
                 {
@@ -243,21 +237,6 @@ define(["dojo/_base/declare",
                     this.searchButton.set("title",
                         criteriaNotSet ? "Please, choose fields to display in order to enable search" : "Search");
                 },
-                _buildOrderByExpression: function ()
-                {
-                    var orderByExpression = "";
-                    if (this._sort && this._sort.length)
-                    {
-                        var orders = []
-                        for (var i = 0; i < this._sort.length; ++i)
-                        {
-                            orders.push(parseInt(this._sort[i].property) + (this._sort[i].descending ? " desc" : ""));
-                        }
-                        orderByExpression = orders.join(",");
-                    }
-                    this.advancedOrderBy.set("value", orderByExpression);
-                    return orderByExpression;
-                },
                 _buildSelectExpression: function (value)
                 {
                     var expression = "";
@@ -276,10 +255,11 @@ define(["dojo/_base/declare",
                 _normalizeSorting: function (selectedColumns)
                 {
                     var newSort = [];
-                    for (var i = 0; i < this._sort.length; ++i)
+                    var sort = this._resultsGrid.getSort();
+                    for (var i = 0; i < sort.length; ++i)
                     {
-                        var sortColumnIndex = parseInt(this._sort[i].property) - 1;
-                        var sortDescending = this._sort[i].descending;
+                        var sortColumnIndex = parseInt(sort[i].property) - 1;
+                        var sortDescending = sort[i].descending;
                         if (sortColumnIndex < this._lastStandardModeSelect.length)
                         {
                             var oldSortedColumnName = this._lastStandardModeSelect[sortColumnIndex].attributeName;
@@ -296,125 +276,96 @@ define(["dojo/_base/declare",
                             }
                         }
                     }
-                    this._sort = newSort;
+                    this._resultsGrid.setSort(newSort);
                 },
                 _standardModeSelectChanged: function (selectedColumns)
                 {
                     this._normalizeSorting(selectedColumns);
-                    this._store.orderBy = this._buildOrderByExpression();
-                    this._store.selectClause = this._buildSelectExpression(selectedColumns);
+                    var selectClause = this._buildSelectExpression(selectedColumns);
+                    this._setSelectClause(selectClause);
                     this._lastStandardModeSelect = lang.clone(selectedColumns);
-                    this._toggleSearchButton(this._store.selectClause);
+                    this._toggleSearchButton(selectClause);
                     this.search();
                 },
                 _standardModeWhereChanged: function (result)
                 {
-                    this._store.where = result;
+                    this._resultsGrid.setWhere(result);
                     this.search();
                 },
                 _buildGrid: function ()
                 {
-                    this._store = new QueryStore({
+                    var grid = new QueryGrid({
+                        controller: this.controller,
                         management: this.management,
                         category: this._categorySelector.value.toLowerCase(),
-                        parent: this._scopeModelObjects[this._searchScopeSelector.value],
-                        zeroBased: false
-                    });
+                        parentObject: this._scopeModelObjects[this._searchScopeSelector.value],
+                        zeroBased: false,
+                        transformer: function (data)
+                        {
+                            var dataResults = data.results;
 
-                    var CustomGrid = declare([Grid, Keyboard, Selection, Pagination, ColumnResizer]);
+                            var results = [];
+                            for (var i = 0, l = dataResults.length; i < l; ++i)
+                            {
+                                var result = dataResults[i];
+                                var item = {id: result[result.length - 1]};
 
-                    var grid = new CustomGrid({
-                        collection: this._store,
-                        rowsPerPage: 100,
-                        selectionMode: 'single',
-                        cellNavigation: false,
-                        className: 'dgrid-autoheight',
-                        pageSizeOptions: [10, 20, 30, 40, 50, 100, 1000, 10000, 100000],
-                        adjustLastColumn: true
+                                // excluding id, as we already added id field
+                                for (var j = 0, rl = result.length - 1; j < rl; ++j)
+                                {
+                                    // sql uses 1-based index in ORDER BY
+                                    var field = j + 1;
+                                    item[new String(field)] = result[j];
+                                }
+                                results.push(item);
+                            }
+                            return results;
+                        }
                     }, this.queryResultGrid);
-                    this._store.on("changeHeaders", lang.hitch(this, function (event)
+                    grid.on('dgrid-refresh-complete', lang.hitch(this, function ()
                     {
-                        this._store.useCachedResults = true;
-                        grid.set("columns", this._getColumns(event.headers));
-                        this._resultsGrid.resize();
+                        this._resultsGrid.setUseCachedResults(false);
+                    }));
+                    grid.on('queryCompleted', lang.hitch(this, this._buildColumnsIfHeadersChanged));
+                    grid.on('orderByChanged', lang.hitch(this, function (event)
+                    {
+                        this.advancedOrderBy.set("value", event.orderBy);
                     }));
                     this._resultsGrid = grid;
                     this._resultsGrid.startup();
-                    this._resultsGrid.on('.dgrid-row:dblclick', lang.hitch(this, this._onRowClick));
-                    this._resultsGrid.on("dgrid-sort", lang.hitch(this, function (event)
+                },
+                _buildColumnsIfHeadersChanged: function (event)
+                {
+                    var headers = lang.clone(event.headers);
+                    if (headers.length > 0)
                     {
-                        for (var i = 0; i < this._sort.length; ++i)
-                        {
-                            if (this._sort[i].property == event.sort[0].property)
-                            {
-                                this._sort.splice(i, 1);
-                                break;
-                            }
-                        }
-                        this._sort.splice(0, 0, event.sort[0]);
-                        this._store.orderBy = this._buildOrderByExpression();
-                        event.preventDefault();
-                        event.stopPropagation();
-                        this.search();
-                    }));
-                    this._resultsGrid.on("dgrid-refresh-complete", lang.hitch(this, function ()
+                        headers.pop();
+                    }
+                    if (!this._equalStringArrays(headers, this._lastHeaders))
                     {
-                        this._store.useCachedResults = false;
-                        this._resultsGrid.updateSortArrow(this._sort, true);
-                    }));
+                        this._lastHeaders = headers;
+                        this._resultsGrid.setUseCachedResults(true);
+                        this._resultsGrid.set("columns", this._getColumns(headers));
+                        this._resultsGrid.resize();
+                    }
                 },
-                _onRowClick: function (event)
+                _equalStringArrays: function (a, b)
                 {
-                    var row = this._resultsGrid.row(event);
-                    var promise = this._management.get({url: "service/structure"});
-                    var that = this;
-                    promise.then(function (data)
+                    if (a.length != b.length)
                     {
-                        var findObject = function findObject(structure, parent, type)
-                        {
-                            var item = {
-                                id: structure.id,
-                                name: structure.name,
-                                type: type,
-                                parent: parent
-                            };
-                            if (item.id == row.id)
-                            {
-                                return item;
-                            }
-                            else
-                            {
-                                for (var fieldName in structure)
-                                {
-                                    var fieldValue = structure[fieldName];
-                                    if (lang.isArray(fieldValue))
-                                    {
-                                        var fieldType = fieldName.substring(0, fieldName.length - 1);
-                                        for (var i = 0; i < fieldValue.length; i++)
-                                        {
-                                            var object = fieldValue[i];
-                                            var result = findObject(object, item, fieldType);
-                                            if (result != null)
-                                            {
-                                                return result;
-                                            }
-                                        }
-                                    }
-                                }
-                                return null;
-                            }
-                        };
-
-                        var item = findObject(data, null, "broker");
-                        if (item != null)
+                        return false;
+                    }
+                    for (var i = 0; i < a.length; ++i)
+                    {
+                        if (a[i] != b[i])
                         {
-                            that.controller.show(item.type, item.name, item.parent, item.id);
+                            return false;
                         }
-                    });
+                    }
+                    return true;
                 },
                 _getColumns: function (headers)
                 {
-                    this._lastHeaders = headers;
                     var columns = [];
                     if (headers)
                     {
@@ -441,7 +392,7 @@ define(["dojo/_base/declare",
                                                     value,
                                                     10)))
                                             {
-                                                return that._management.userPreferences.formatDateTime(value, {
+                                                return that.management.userPreferences.formatDateTime(value, {
                                                     addOffset: true,
                                                     appendTimeZone: true
                                                 });
@@ -495,7 +446,7 @@ define(["dojo/_base/declare",
                 _createScopeList: function ()
                 {
                     var that = this;
-                    var result = this._management.query({
+                    var result = this.management.query({
                         select: "id, $parent.name as parentName, name",
                         category: "virtualhost"
                     });
@@ -543,9 +494,9 @@ define(["dojo/_base/declare",
                                 parent: {type: "broker"}
                             }
                         };
-                        if (this.parentModelObj && this.parentModelObj.type == "virtualhost" && this.parentModelObj.name
-                                                                                                == name
-                            && this.parentModelObj.parent && this.parentModelObj.parent.name == parentName)
+                        if (this.parentObject && this.parentObject.type == "virtualhost" && this.parentObject.name
+                                                                                            == name
+                            && this.parentObject.parent && this.parentObject.parent.name == parentName)
                         {
                             defaultValue = data[i][0];
                         }
@@ -582,18 +533,19 @@ define(["dojo/_base/declare",
                     categoryList.on("change", lang.hitch(this, this._categoryChanged));
                     this._categorySelector = categoryList;
                 },
-                _categoryChanged: function ()
+                _categoryChanged: function (value)
                 {
                     this._resetSearch();
-                    var metadata = this._getCategoryMetadata(this._categorySelector.value);
+                    var metadata = this._getCategoryMetadata(value);
                     var disableMetadataDependant = !metadata;
                     this.standardWhereChooser.set("disabled", disableMetadataDependant);
                     this.standardSelectChooser.set("disabled", disableMetadataDependant);
-                    this.searchButton.set("disabled", disableMetadataDependant || !this._store.selectClause);
+                    this.searchButton.set("disabled", true);
                     this.modeButton.set("disabled", disableMetadataDependant);
                     this.advancedSelect.set("disabled", disableMetadataDependant);
                     this.advancedWhere.set("disabled", disableMetadataDependant);
                     this.advancedOrderBy.set("disabled", disableMetadataDependant);
+                    this._resultsGrid.setCategory(value);
 
                     if (disableMetadataDependant)
                     {
@@ -627,10 +579,10 @@ define(["dojo/_base/declare",
                     {
                         evt.preventDefault();
                         evt.stopPropagation();
-                        this._store.selectClause = this.advancedSelect.value;
-                        this._store.where = this.advancedWhere.value;
-                        this._store.orderBy = this.advancedOrderBy.value;
-                        this._sort = [];
+                        this._setSelectClause(this.advancedSelect.value);
+                        this._resultsGrid.setWhere(this.advancedWhere.value);
+                        this._resultsGrid.setOrderBy(this.advancedOrderBy.value);
+                        this._resultsGrid.setSort([]);
                         this.search();
                     }
                 },
@@ -646,9 +598,10 @@ define(["dojo/_base/declare",
                         this.standardSearch.style.display = "none";
                         this.standardWhereExpressionBuilder.domNode.style.display = "none";
                         this.advancedSearch.style.display = "";
-                        this.advancedSelect.set("value", this._store.selectClause);
-                        this.advancedWhere.set("value", this._store.where);
-                        this.advancedOrderBy.set("value", this._store.orderBy);
+                        this.advancedSelect.set("value",
+                            this._buildSelectExpression(this.standardSelectChooser.get("selectedItems")));
+                        this.advancedWhere.set("value", this._resultsGrid.getWhere());
+                        this.advancedOrderBy.set("value", this._resultsGrid.getOrderBy());
                     }
                     else
                     {
@@ -664,15 +617,12 @@ define(["dojo/_base/declare",
                 },
                 _resetSearch: function ()
                 {
-                    this._store.where = "";
-                    this._store.selectClause = "";
-                    this._store.orderBy = "";
+                    this._resultsGrid.resetQuery();
                     this.standardSelectChooser.set("data", {selected: []});
                     this.standardWhereExpressionBuilder.clearWhereCriteria();
-                    this._sort = [];
-                    this.advancedSelect.set("value", this._store.selectClause);
-                    this.advancedWhere.set("value", this._store.where);
-                    this.advancedOrderBy.set("value", this._store.orderBy);
+                    this.advancedSelect.set("value", "");
+                    this.advancedWhere.set("value", "");
+                    this.advancedOrderBy.set("value", "");
                     this.search();
                 },
                 _getCategoryMetadata: function (value)
@@ -681,7 +631,7 @@ define(["dojo/_base/declare",
                     {
                         var category = value.charAt(0)
                                            .toUpperCase() + value.substring(1);
-                        return this._management.metadata.metadata[category];
+                        return this.management.metadata.metadata[category];
                     }
                     else
                     {

Added: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryGrid.js
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryGrid.js?rev=1742554&view=auto
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryGrid.js (added)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryGrid.js Fri May  6 15:21:32 2016
@@ -0,0 +1,220 @@
+/*
+ *
+ * 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/_base/declare",
+        "dojo/_base/lang",
+        "dojo/dom-construct",
+        "dojo/json",
+        "dojo/on",
+        "dojo/parser",
+        "dojox/html/entities",
+        "dgrid/Grid",
+        "dgrid/Keyboard",
+        "dgrid/Selection",
+        "dgrid/extensions/Pagination",
+        "dgrid/extensions/ColumnResizer",
+        "qpid/management/query/QueryStore",
+        "qpid/management/query/MessageDialog"],
+    function (declare,
+              lang,
+              domConstruct,
+              json,
+              on,
+              parser,
+              entities,
+              Grid,
+              Keyboard,
+              Selection,
+              Pagination,
+              ColumnResizer,
+              QueryStore)
+    {
+        var QueryGrid = declare("qpid.management.query.QueryGrid",
+            [Grid, Keyboard, Selection, Pagination, ColumnResizer],
+            {
+                management: null,
+                controller: null,
+                _store: null,
+                _sort: [],
+                _lastHeaders: [],
+
+                postscript: function (args)
+                {
+                    this._store = new QueryStore(args);
+
+                    var settings = lang.mixin({
+                        collection: this._store,
+                        rowsPerPage: 100,
+                        selectionMode: 'single',
+                        cellNavigation: false,
+                        className: 'dgrid-autoheight',
+                        pageSizeOptions: [10, 20, 30, 40, 50, 100, 1000],
+                        adjustLastColumn: true
+                    }, args);
+                    /* initialise grid */
+                    this.inherited(arguments, [settings, arguments[1]]);
+                },
+                postCreate: function ()
+                {
+                    this.inherited(arguments);
+                    this.on('.dgrid-row:dblclick', lang.hitch(this, this._onRowClick));
+                    this.on('dgrid-sort', lang.hitch(this, function (event)
+                    {
+                        for (var i = 0; i < this._sort.length; ++i)
+                        {
+                            if (this._sort[i].property == event.sort[0].property)
+                            {
+                                this._sort.splice(i, 1);
+                                break;
+                            }
+                        }
+                        this._sort.splice(0, 0, event.sort[0]);
+                        this._updateOrderByExpression();
+                        event.preventDefault();
+                        event.stopPropagation();
+                        this.refresh();
+                    }));
+                    this.on('dgrid-refresh-complete', lang.hitch(this, function ()
+                    {
+                        this.updateSortArrow(this._sort, true);
+                    }));
+                    this._store.on('queryCompleted', lang.hitch(this, function (event)
+                    {
+                        on.emit(this.domNode, 'queryCompleted', event);
+                    }));
+                },
+                setCategory: function (category)
+                {
+                    this._store.category = category;
+                },
+                setParentObject: function (parentObject)
+                {
+                    this._store.parentObject = parentObject;
+                },
+                getSelect: function ()
+                {
+                    return this._store.selectClause;
+                },
+                setSelect: function (selectClause)
+                {
+                    this._store.selectClause = selectClause;
+                },
+                getWhere: function ()
+                {
+                    return this._store.where;
+                },
+                setWhere: function (whereClause)
+                {
+                    this._store.where = whereClause;
+                },
+                getOrderBy: function ()
+                {
+                    return this._store.orderBy;
+                },
+                setOrderBy: function (orderBy)
+                {
+                    this._store.orderBy = orderBy;
+                },
+                setUseCachedResults: function (value)
+                {
+                    this._store.useCachedResults = value;
+                },
+                setSort: function (value)
+                {
+                    this._sort = lang.clone(value);
+                },
+                getSort: function ()
+                {
+                    return lang.clone(this._sort);
+                },
+                _updateOrderByExpression: function ()
+                {
+                    var orderByExpression = "";
+                    if (this._sort && this._sort.length)
+                    {
+                        var orders = [];
+                        for (var i = 0; i < this._sort.length; ++i)
+                        {
+                            orders.push(parseInt(this._sort[i].property) + (this._sort[i].descending ? " desc" : ""));
+                        }
+                        orderByExpression = orders.join(",");
+                    }
+                    this._store.orderBy = orderByExpression;
+                    on.emit(this.domNode, "orderByChanged", {orderBy: orderByExpression});
+                },
+                _onRowClick: function (event)
+                {
+                    var row = this.row(event);
+                    var promise = this.management.get({url: "service/structure"});
+                    promise.then(lang.hitch(this, function (data)
+                    {
+                        var findObject = function findObject(structure, parent, type)
+                        {
+                            var item = {
+                                id: structure.id,
+                                name: structure.name,
+                                type: type,
+                                parent: parent
+                            };
+                            if (item.id == row.id)
+                            {
+                                return item;
+                            }
+                            else
+                            {
+                                for (var fieldName in structure)
+                                {
+                                    var fieldValue = structure[fieldName];
+                                    if (lang.isArray(fieldValue))
+                                    {
+                                        var fieldType = fieldName.substring(0, fieldName.length - 1);
+                                        for (var i = 0; i < fieldValue.length; i++)
+                                        {
+                                            var object = fieldValue[i];
+                                            var result = findObject(object, item, fieldType);
+                                            if (result != null)
+                                            {
+                                                return result;
+                                            }
+                                        }
+                                    }
+                                }
+                                return null;
+                            }
+                        };
+
+                        var item = findObject(data, null, "broker");
+                        if (item != null)
+                        {
+                            this.controller.show(item.type, item.name, item.parent, item.id);
+                        }
+                    }));
+                },
+                resetQuery: function ()
+                {
+                    this._store.where = "";
+                    this._store.selectClause = "";
+                    this._store.orderBy = "";
+                    this._sort = [];
+                }
+            });
+
+        return QueryGrid;
+    });

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryStore.js
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryStore.js?rev=1742554&r1=1742553&r2=1742554&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryStore.js (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryStore.js Fri May  6 15:21:32 2016
@@ -30,14 +30,13 @@ define(['dojo/_base/lang',
 
     return declare("qpid.management.query.QueryStore", [Store, Evented], {
 
+        transformer: null,
         management: null,
         selectClause: null,
         where: null,
         category: null,
-        parent: null,
+        parentObject: null,
         useCachedResults: false,
-        zeroBased: true,
-        _lastHeaders: [],
         _lastResponsePromise: null,
 
         fetch: function (kwArgs)
@@ -52,135 +51,105 @@ define(['dojo/_base/lang',
 
         _request: function (kwArgs)
         {
-
-            if (!this.selectClause)
+            if (this.useCachedResults && this._lastResponsePromise)
             {
-                this._emitChangeHeadersIfNecessary([]);
-                var deferred = new Deferred();
-                deferred.resolve([]);
-                return new QueryResults(deferred.promise);
+                return this._createQueryResults(this._lastResponsePromise);
             }
 
-            var queryRequest = {
-                category: this.category,
-                select: this.selectClause ? this.selectClause + ",id" : "id"
-            };
-
-            if (this.parent)
+            if (!this.selectClause)
             {
-                queryRequest.parent = this.parent;
-            }
+                var responseDeferred = new Deferred();
+                responseDeferred.resolve({
+                    headers: [],
+                    results: [],
+                    total: 0
+                });
+                this._lastResponsePromise = responseDeferred.promise;
+            }
+            else
+            {
+                var queryRequest = {
+                    category: this.category,
+                    select: this.selectClause
+                };
 
-            if (this.where)
-            {
-                queryRequest.where = this.where;
-            }
+                if (this.parentObject)
+                {
+                    queryRequest.parent = this.parentObject;
+                }
 
-            if ("start" in kwArgs)
-            {
-                queryRequest.offset = kwArgs.start;
-            }
+                if (this.where)
+                {
+                    queryRequest.where = this.where;
+                }
 
-            if ("end" in kwArgs)
-            {
-                queryRequest.limit = kwArgs.end - (queryRequest.offset ? queryRequest.offset : 0);
-            }
+                if ("start" in kwArgs)
+                {
+                    queryRequest.offset = kwArgs.start;
+                }
 
-            if (this.orderBy)
-            {
-                queryRequest.orderBy = this.orderBy;
-            }
+                if ("end" in kwArgs)
+                {
+                    queryRequest.limit = kwArgs.end - (queryRequest.offset ? queryRequest.offset : 0);
+                }
 
-            if (this.useCachedResults)
-            {
-                return this._createQueryResults(this._lastResponsePromise);
-            }
+                if (this.orderBy)
+                {
+                    queryRequest.orderBy = this.orderBy;
+                }
 
-            var responsePromise = this.management.query(queryRequest);
-            responsePromise.then(lang.hitch(this, function (data)
+                this._lastResponsePromise = this.management.query(queryRequest);
+            }
+            this._lastResponsePromise.then(lang.hitch(this, function (data)
             {
-                var headers = lang.clone(data.headers);
-                headers.pop();
-                this._emitChangeHeadersIfNecessary(headers);
+                this.emit("queryCompleted", data);
             }), lang.hitch(this, function (error)
             {
-                this._emitChangeHeadersIfNecessary([]);
+                this.emit("queryCompleted",
+                    {
+                        headers: [],
+                        results: [],
+                        total: 0
+                    });
             }));
-
-            this._lastResponsePromise = responsePromise;
             return this._createQueryResults(this._lastResponsePromise);
         },
 
         _createQueryResults: function (responsePromise)
         {
             var that = this;
-            var queryResultData = {
-                data: responsePromise.then(function (data)
+            return new QueryResults(responsePromise.then(function (data)
+            {
+                if (that.transformer)
                 {
-                    var dataResults = data.results;
-                    var results = [];
-                    for (var i = 0, l = dataResults.length; i < l; ++i)
-                    {
-                        var result = dataResults[i];
-                        var item = {id: result[result.length - 1]};
-
-                        // excluding id, as we already added id field
-                        for (var j = 0, rl = result.length - 1; j < rl; ++j)
-                        {
-                            // sql uses 1-based index in ORDER BY
-                            var field = this.zeroBased ? j : j + 1;
-                            item[new String(field)] = result[j];
-                        }
-                        results.push(item);
-                    }
-                    return results;
-                }, function (error)
+                    return that.transformer(data);
+                }
+                else
+                {
+                    return data.results;
+                }
+            }, function (error)
+            {
+                if (error.status)
                 {
                     this.management.errorHandler(error);
-                    return [];
-                }),
-                total: responsePromise.then(function (data)
+                }
+                return [];
+            }), {
+                totalLength: responsePromise.then(function (data)
                 {
                     return data.total;
                 }, function (error)
                 {
                     return 0;
                 })
-            };
-            return new QueryResults(queryResultData.data, {
-                totalLength: queryResultData.total
             });
         },
 
-        _emitChangeHeadersIfNecessary: function (headers)
-        {
-            if (!this._equalStringArrays(headers, this._lastHeaders))
-            {
-                this._lastHeaders = headers;
-                this.emit("changeHeaders", {headers: headers});
-            }
-        },
-
         // override from dstore.Store to not copy collection
         _createSubCollection: function ()
         {
             return this;
-        },
-
-        _equalStringArrays: function (a, b)
-        {
-            if (a.length != b.length)
-            {
-                return false;
-            }
-            for (var i = 0; i < a.length; ++i)
-            {
-                if (a[i] != b[i])
-                {
-                    return false;
-                }
-            }
-            return true;
         }
     });
 });



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org