This is an automated email from the ASF dual-hosted git repository.

clebertsuconic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git


The following commit(s) were added to refs/heads/master by this push:
     new ea7f001  ARTEMIS-3043 - improvements on new console
     new 1d7d7f9  This closes #3389
ea7f001 is described below

commit ea7f00177622d53cc0abe50537acec11b2129dd2
Author: Andy Taylor <[email protected]>
AuthorDate: Fri Dec 18 12:49:21 2020 +0000

    ARTEMIS-3043 - improvements on new console
    
    https://issues.apache.org/jira/browse/ARTEMIS-3043
---
 .../apache/activemq/artemis/logs/AuditLogger.java  |  24 ++++
 .../artemis/api/core/management/QueueControl.java  |  20 +++
 .../src/main/webapp/plugin/js/artemisPlugin.js     |   1 +
 .../main/webapp/plugin/js/components/addresses.js  |  41 +++++-
 .../src/main/webapp/plugin/js/components/browse.js | 111 +++++++++++++---
 .../webapp/plugin/js/components/connections.js     |  62 +++++++--
 .../main/webapp/plugin/js/components/consumers.js  |  50 ++++++-
 .../main/webapp/plugin/js/components/diagram.js    |  44 +++++-
 .../main/webapp/plugin/js/components/producers.js  |  35 +++++
 .../src/main/webapp/plugin/js/components/queues.js | 147 ++++++++++++++++-----
 .../main/webapp/plugin/js/components/sessions.js   |  50 +++++--
 .../src/main/webapp/plugin/js/services/toolbar.js  |  35 +++++
 .../core/management/impl/QueueControlImpl.java     |  49 +++++++
 .../core/management/impl/view/QueueView.java       |  19 ++-
 .../management/QueueControlUsingCoreTest.java      |  15 +++
 15 files changed, 623 insertions(+), 80 deletions(-)

diff --git 
a/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
 
b/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
index ff5302f..0fadf25 100644
--- 
a/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
+++ 
b/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
@@ -2793,4 +2793,28 @@ public interface AuditLogger extends BasicLogger {
    @LogMessage(level = Logger.Level.INFO)
    @Message(id = 601742, value = "User {0} is getting the queue count on 
target resource: {1} {2}", format = Message.Format.MESSAGE_FORMAT)
    void getQueueCount(String user, Object source, Object... args);
+
+   static void lastValueKey(Object source) {
+      LOGGER.lastValueKey(getCaller(), source);
+   }
+
+   @LogMessage(level = Logger.Level.INFO)
+   @Message(id = 601743, value = "User {0} is getting last-value-key property 
on target resource: {1} {2}", format = Message.Format.MESSAGE_FORMAT)
+   void lastValueKey(String user, Object source, Object... args);
+
+   static void consumersBeforeDispatch(Object source) {
+      LOGGER.consumersBeforeDispatch(getCaller(), source);
+   }
+
+   @LogMessage(level = Logger.Level.INFO)
+   @Message(id = 601744, value = "User {0} is getting 
consumers-before-dispatch property on target resource: {1} {2}", format = 
Message.Format.MESSAGE_FORMAT)
+   void consumersBeforeDispatch(String user, Object source, Object... args);
+
+   static void delayBeforeDispatch(Object source) {
+      LOGGER.delayBeforeDispatch(getCaller(), source);
+   }
+
+   @LogMessage(level = Logger.Level.INFO)
+   @Message(id = 601745, value = "User {0} is getting delay-before-dispatch 
property on target resource: {1} {2}", format = Message.Format.MESSAGE_FORMAT)
+   void delayBeforeDispatch(String user, Object source, Object... args);
 }
diff --git 
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/QueueControl.java
 
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/QueueControl.java
index b6ba1e1..414a9da 100644
--- 
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/QueueControl.java
+++ 
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/QueueControl.java
@@ -290,6 +290,26 @@ public interface QueueControl {
    @Attribute(desc = "is this queue a last value queue")
    boolean isLastValue();
 
+   /**
+    *The key used for the last value queues
+    */
+   @Attribute(desc = "last value key")
+   String getLastValueKey();
+
+   /**
+    *Return the Consumers Before Dispatch
+    * @return
+    */
+   @Attribute(desc = "Return the Consumers Before Dispatch")
+   int getConsumersBeforeDispatch();
+
+   /**
+    *Return the Consumers Before Dispatch
+    * @return
+    */
+   @Attribute(desc = "Return the Consumers Before Dispatch")
+   long getDelayBeforeDispatch();
+
    // Operations ----------------------------------------------------
 
    /**
diff --git 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/artemisPlugin.js 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/artemisPlugin.js
index 1cec98f..9e7d499 100644
--- a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/artemisPlugin.js
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/artemisPlugin.js
@@ -46,6 +46,7 @@ var Artemis = (function (Artemis) {
                   <artemis-tree></artemis-tree>
                 </div>
                 <div class="tree-nav-main">
+                  <jmx-header></jmx-header>
                   <artemis-navigation></artemis-navigation>
                   <div class="contents" ng-view></div>
                 </div>
diff --git 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/addresses.js
 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/addresses.js
index 6aa87c8..d15a3a2 100644
--- 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/addresses.js
+++ 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/addresses.js
@@ -28,6 +28,7 @@ var Artemis;
             </h1>
              <div ng-include="'plugin/artemistoolbar.html'"></div>
              <pf-table-view config="$ctrl.tableConfig"
+                            dt-options="$ctrl.dtOptions"
                             columns="$ctrl.tableColumns"
                             action-buttons="$ctrl.tableActionButtons"
                             items="$ctrl.addresses">
@@ -59,17 +60,48 @@ var Artemis;
     function AddressesController($scope, workspace, jolokia, localStorage, 
artemisMessage, $location, $timeout, $filter, $sanitize, pagination, 
artemisAddress) {
         var ctrl = this;
         ctrl.pagination = pagination;
+        ctrl.pagination.reset();
         var mbean = Artemis.getBrokerMBean(workspace, jolokia);
         ctrl.allAddresses = [];
         ctrl.addresses = [];
         ctrl.workspace = workspace;
         ctrl.refreshed = false;
+        ctrl.dtOptions = {
+           // turn of ordering as we do it ourselves
+           ordering: false,
+           columns: [
+                {name: "ID", visible: true},
+                {name: "Name", visible: true},
+                {name: "Routing Types", visible: true},
+                {name: "Queue Count", visible: true}
+           ]
+        };
+
+        Artemis.log.debug('sessionStorage: addressColumnDefs =', 
localStorage.getItem('addressColumnDefs'));
+        if (localStorage.getItem('addressColumnDefs')) {
+            loadedDefs = JSON.parse(localStorage.getItem('addressColumnDefs'));
+            //sanity check to make sure columns havent been added
+            if(loadedDefs.length === ctrl.dtOptions.columns.length) {
+                ctrl.dtOptions.columns = loadedDefs;
+            }
+
+        }
+
+        ctrl.updateColumns = function () {
+            var attributes = [];
+            ctrl.dtOptions.columns.forEach(function (column) {
+                attributes.push({name: column.name, visible: column.visible});
+            });
+            Artemis.log.debug("saving columns " + JSON.stringify(attributes));
+            localStorage.setItem('addressColumnDefs', 
JSON.stringify(attributes));
+        }
+
         ctrl.filter = {
             fieldOptions: [
-                {id: 'ID', name: 'ID'},
-                {id: 'NAME', name: 'Name'},
-                {id: 'ROUTING_TYPES', name: 'Queue Count'},
-                {id: 'QUEUE_COUNT', name: 'User'}
+                {id: 'id', name: 'ID'},
+                {id: 'name', name: 'Name'},
+                {id: 'routingTypes', name: 'Routing Types'},
+                {id: 'queueCount', name: 'Queue Count'}
             ],
             operationOptions: [
                 {id: 'EQUALS', name: 'Equals'},
@@ -139,6 +171,7 @@ var Artemis;
             ctrl.filter.values.field = ctrl.filter.fieldOptions[1].id;
             ctrl.filter.values.operation = ctrl.filter.operationOptions[0].id;
             ctrl.filter.values.value = artemisAddress.address.address;
+            artemisAddress.address = null;
         }
 
         selectQueues = function (idx) {
diff --git 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/browse.js 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/browse.js
index 27e3ed4..4780a2a 100644
--- 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/browse.js
+++ 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/browse.js
@@ -65,6 +65,11 @@ var Artemis;
                                         ng-disabled="$ctrl.retryDisabled"
                                         
ng-click="$ctrl.openRetryDialog()">Retry Messages
                                     </button>
+                                    <button class="btn btn-default 
primary-action ng-binding ng-scope"
+                                        type="button"
+                                        title=""
+                                        ng-click="$ctrl.showColumns = 
true">Columns
+                                    </button>
                             </div>
                         </form>
                     </div>
@@ -72,7 +77,7 @@ var Artemis;
                 <pf-table-view config="$ctrl.tableConfig"
                     columns="$ctrl.tableColumns"
                     items="$ctrl.messages"
-                    dt-options="$ctrl.tableDtOptions"
+                    dt-options="$ctrl.dtOptions"
                     action-buttons="$ctrl.tableMenuActions">
                 </pf-table-view>
                 <div ng-include="'plugin/artemispagination.html'"></div>
@@ -147,6 +152,33 @@ var Artemis;
                     <p>{{$ctrl.actionText}}</p>
                 </div>
             </div>
+            <div class="form-group" ng-show="$ctrl.showColumns">
+                <button class="btn btn-default" data-toggle="modal" 
data-target="#myModal">Columns</button>
+                <div class="modal ng-scope">
+                  <div class="modal-dialog ">
+                    <div class="modal-content">
+                      <div class="modal-header">
+                        <h4 class="modal-title ng-binding">Column Selector</h4>
+                      </div>
+                      <div class="modal-body">
+                        <table class="table-view-container table table-striped 
table-bordered table-hover dataTable ng-scope ng-isolate-scope no-footer">
+                            <tbody>
+                                <tr ng-repeat="col in $ctrl.dtOptions.columns">
+                                    <td>{{ col.name }}</td>
+                                    <td><input type="checkbox" 
ng-model="col.visible" placeholder="Name" autocomplete="off" id="name"></td>
+                                </tr>
+                            </tbody>
+                        </table>
+                      </div>
+                      <div class="modal-footer">
+                        <button type="button" class="btn btn-default 
ng-binding" ng-click="$ctrl.showColumns = false;$ctrl.updateColumns()">
+                          Close
+                        </button>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+            </div>
             <script type="text/ng-template" id="browse-instructions.html">
               <div>
                 <p>
@@ -174,6 +206,7 @@ var Artemis;
         ctrl.moveDisabled = true;
         ctrl.retryDisabled = true;
         ctrl.pagination = pagination;
+        ctrl.pagination.reset();
         ctrl.filter = '';
         ctrl.actionText = '';
 
@@ -200,6 +233,44 @@ var Artemis;
             }
         }
 
+        ctrl.dtOptions = {
+           // turn of ordering as we do it ourselves
+           ordering: false,
+           columns: [
+                {name: "Select", visible: true},
+                {name: "Message ID", visible: true},
+                {name: "Type", visible: true},
+                {name: "Durable", visible: true},
+                {name: "Priority", visible: true},
+                {name: "Timestamp", visible: true},
+                {name: "Expires", visible: true},
+                {name: "Redelivered", visible: true},
+                {name: "Large", visible: true},
+                {name: "Persistent Size", visible: true},
+                {name: "User ID", visible: true},
+                {name: "Validated User", visible: true},
+                {name: "Original Queue (Expiry/DLQ's only)", visible: true}
+           ]
+        };
+
+        Artemis.log.debug('sessionStorage: browseColumnDefs =', 
localStorage.getItem('browseColumnDefs'));
+        if (localStorage.getItem('browseColumnDefs')) {
+            loadedDefs = JSON.parse(localStorage.getItem('browseColumnDefs'));
+            //sanity check to make sure columns havent been added
+            if(loadedDefs.length === ctrl.dtOptions.columns.length) {
+                ctrl.dtOptions.columns = loadedDefs;
+            }
+        }
+
+        ctrl.updateColumns = function () {
+            var attributes = [];
+            ctrl.dtOptions.columns.forEach(function (column) {
+                attributes.push({name: column.name, visible: column.visible});
+            });
+            Artemis.log.debug("saving columns " + JSON.stringify(attributes));
+            localStorage.setItem('browseColumnDefs', 
JSON.stringify(attributes));
+        }
+
         ctrl.tableConfig = {
             onCheckBoxChange: handleCheckBoxChange,
             selectionMatchProp: 'messageID',
@@ -208,7 +279,7 @@ var Artemis;
         ctrl.tableColumns = [
             {
                 itemField: 'messageID',
-                header: 'messageID'
+                header: 'Message ID'
             },
             {
                 itemField: 'type',
@@ -312,9 +383,6 @@ var Artemis;
 
         ctrl.tableMenuActions = [ showConfig, resendConfig ];
 
-        ctrl.tableDtOptions = {
-          order: [[0, "asc"]]
-        };
         ctrl.sysprops = [];
 
         Artemis.log.debug("loaded browse 5" + Artemis.browseQueueModule);
@@ -354,33 +422,34 @@ var Artemis;
         }
 
         function formatExpires(timestamp) {
-            if (isNaN(timestamp)) {
+             if (isNaN(timestamp)) {
                 return timestamp;
-            }
-            var expiresIn = timestamp - Date.now();
-            if (Math.abs(expiresIn) < MS_PER_DAY) {
+             }
+             var expiresIn = timestamp - Date.now();
+             if (Math.abs(expiresIn) < MS_PER_DAY) {
                 var duration = expiresIn < 0 ? -expiresIn : expiresIn;
                 var hours = pad2(Math.floor((duration / MS_PER_HOUR) % 24));
                 var mins  = pad2(Math.floor((duration / MS_PER_MIN) % 60));
                 var secs  = pad2(Math.floor((duration / MS_PER_SEC) % 60));
                 if (expiresIn < 0) {
-                // "HH:mm:ss ago"
-                    return hours + ":" + mins + ":" + secs + " ago";
+                   // "HH:mm:ss ago"
+                   return hours + ":" + mins + ":" + secs + " ago";
                 }
                 // "in HH:mm:ss ago"
                 return "in " + hours + ":" + mins + ":" + secs;
-            }
-            return formatTimestamp(timestamp);
-        }
+             }
+             return formatTimestamp(timestamp);
+          }
 
-        function formatTimestamp(timestamp) {
-            if (isNaN(timestamp)) {
+          function formatTimestamp(timestamp) {
+             if (isNaN(timestamp)) {
                 return timestamp;
-            }
-            var d = new Date(timestamp);
-            // "yyyy-MM-dd HH:mm:ss"
-            return d.getFullYear() + "-" + pad2(d.getMonth()) + "-" + 
pad2(d.getDay()) + " " + pad2(d.getHours()) + ":" + pad2(d.getMinutes()) + ":" 
+ pad2(d.getSeconds());
-        }
+             }
+             var d = new Date(timestamp);
+             // "yyyy-MM-dd HH:mm:ss"
+             //add 1 to month as getmonth returns the position not the actual 
month
+             return d.getFullYear() + "-" + pad2(d.getMonth() + 1) + "-" + 
pad2(d.getDate()) + " " + pad2(d.getHours()) + ":" + pad2(d.getMinutes()) + ":" 
+ pad2(d.getSeconds());
+          }
 
         var typeLabels = ["default", "1", "object", "text", "bytes", "map", 
"stream", "embedded"];
         function formatType(type) {
diff --git 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/connections.js
 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/connections.js
index ddf48c5..3aa3099 100644
--- 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/connections.js
+++ 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/connections.js
@@ -29,6 +29,7 @@ var Artemis;
             </h1>
             <div ng-include="'plugin/artemistoolbar.html'"></div>
             <pf-table-view config="$ctrl.tableConfig"
+                            dt-options="$ctrl.dtOptions"
                             columns="$ctrl.tableColumns"
                             action-buttons="$ctrl.tableActionButtons"
                             items="$ctrl.connections">
@@ -71,6 +72,7 @@ var Artemis;
     function ConnectionsController($scope, workspace, jolokia, localStorage, 
artemisMessage, $location, $timeout, $filter, $sanitize, pagination, 
artemisConnection, artemisSession) {
         var ctrl = this;
         ctrl.pagination = pagination;
+        ctrl.pagination.reset();
         var mbean = Artemis.getBrokerMBean(workspace, jolokia);
         ctrl.allConnections = [];
         ctrl.connections = [];
@@ -79,16 +81,51 @@ var Artemis;
         ctrl.refreshed = false;
         ctrl.connectionToDelete = '';
         ctrl.closeDialog = false;
+        ctrl.dtOptions = {
+           // turn of ordering as we do it ourselves
+           ordering: false,
+           columns: [
+                {name: "ID", visible: true},
+                {name: "Client ID", visible: true},
+                {name: "Users", visible: true},
+                {name: "Protocol", visible: true},
+                {name: "Session Count", visible: true},
+                {name: "Remote Address", visible: true},
+                {name: "Local Address", visible: true},
+                {name: "Session ID", visible: true},
+                {name: "Creation Time", visible: true}
+           ]
+        };
+
+        Artemis.log.debug('localStorage: connectionsColumnDefs =', 
localStorage.getItem('connectionsColumnDefs'));
+        if (localStorage.getItem('connectionsColumnDefs')) {
+            loadedDefs = 
JSON.parse(localStorage.getItem('connectionsColumnDefs'));
+            //sanity check to make sure columns havent been added
+            if(loadedDefs.length === ctrl.dtOptions.columns.length) {
+                ctrl.dtOptions.columns = loadedDefs;
+            }
+            Artemis.log.debug('loaded' + ctrl.dtOptions.columns);
+        }
+
+        ctrl.updateColumns = function () {
+            var attributes = [];
+            ctrl.dtOptions.columns.forEach(function (column) {
+                attributes.push({name: column.name, visible: column.visible});
+            });
+            Artemis.log.debug("saving columns " + JSON.stringify(attributes));
+            localStorage.setItem('connectionsColumnDefs', 
JSON.stringify(attributes));
+        }
+
         ctrl.filter = {
             fieldOptions: [
-                {id: 'CONNECTION_ID', name: 'ID'},
-                {id: 'CLIENT_ID', name: 'Client ID'},
-                {id: 'USERS', name: 'Users'},
-                {id: 'PROTOCOL', name: 'Protocol'},
-                {id: 'SESSION_COUNT', name: 'Session Count'},
-                {id: 'REMOTE_ADDRESS', name: 'Remote Address'},
-                {id: 'LOCAL_ADDRESS', name: 'Local Address'},
-                {id: 'SESSION_ID', name: 'Session ID'}
+                {id: 'connection_id', name: 'ID'},
+                {id: 'client_id', name: 'Client ID'},
+                {id: 'users', name: 'Users'},
+                {id: 'protocol', name: 'Protocol'},
+                {id: 'session_count', name: 'Session Count'},
+                {id: 'remote_address', name: 'Remote Address'},
+                {id: 'local_address', name: 'Local Address'},
+                {id: 'session_id', name: 'Session ID'}
             ],
             operationOptions: [
                 {id: 'EQUALS', name: 'Equals'},
@@ -106,6 +143,12 @@ var Artemis;
                 value: "",
                 sortOrder: "asc",
                 sortColumn: "connectionID"
+            },
+            text: {
+                fieldText: "Filter Field..",
+                operationText: "Operation..",
+                sortOrderText: "ascending",
+                sortByText: "ID"
             }
         };
 
@@ -144,6 +187,7 @@ var Artemis;
             ctrl.filter.values.field = ctrl.filter.fieldOptions[0].id;
             ctrl.filter.values.operation = ctrl.filter.operationOptions[0].id;
             ctrl.filter.values.value = artemisSession.session.connectionID;
+            artemisSession.session = null;
         }
 
         ctrl.refresh = function () {
@@ -180,7 +224,7 @@ var Artemis;
                     ctrl.pagination.reset();
                     ctrl.refreshed = false;
                 }
-                Artemis.log.debug(JSON.stringify(connectionsFilter));
+                Artemis.log.info(JSON.stringify(connectionsFilter));
                 jolokia.request({ type: 'exec', mbean: mbean, operation: 
method, arguments: [JSON.stringify(connectionsFilter), 
ctrl.pagination.pageNumber, ctrl.pagination.pageSize] }, 
Core.onSuccess(populateTable, { error: onError }));
             }
         };
diff --git 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/consumers.js
 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/consumers.js
index 71b0ff2..da55649 100644
--- 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/consumers.js
+++ 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/consumers.js
@@ -27,6 +27,7 @@ var Artemis;
             </h1>
              <div ng-include="'plugin/artemistoolbar.html'"></div>
              <pf-table-view config="$ctrl.tableConfig"
+                            dt-options="$ctrl.dtOptions"
                             columns="$ctrl.tableColumns"
                             action-buttons="$ctrl.tableActionButtons"
                             items="$ctrl.consumers">
@@ -69,6 +70,7 @@ var Artemis;
     function ConsumersController($scope, workspace, jolokia, localStorage, 
artemisMessage, $location, $timeout, $filter, $sanitize, pagination, 
artemisConsumer, artemisQueue, artemisAddress, artemisSession) {
         var ctrl = this;
         ctrl.pagination = pagination;
+        ctrl.pagination.reset();
         var mbean = Artemis.getBrokerMBean(workspace, jolokia);
         ctrl.allConsumers = [];
         ctrl.consumers = [];
@@ -78,6 +80,41 @@ var Artemis;
         ctrl.consumerToDeletesSession = '';
         ctrl.consumerToDelete = '';
         ctrl.closeDialog = false;
+        ctrl.dtOptions = {
+           // turn of ordering as we do it ourselves
+           ordering: false,
+           columns: [
+              {name: "ID", visible: true},
+              {name: "Session", visible: true},
+              {name: "Client ID", visible: true},
+              {name: "Protocol", visible: true},
+              {name: "Queue", visible: true},
+              {name: "Queue Type", visible: true},
+              {name: "Filter", visible: true},
+              {name: "Address", visible: true},
+              {name: "Remote Address", visible: true},
+              {name: "Local Address", visible: true},
+              {name: "Creation Time", visible: true}
+         ]
+        };
+
+        Artemis.log.debug('localStorage: consumersColumnDefs =', 
localStorage.getItem('consumersColumnDefs'));
+        if (localStorage.getItem('consumersColumnDefs')) {
+          loadedDefs = JSON.parse(localStorage.getItem('consumersColumnDefs'));
+          //sanity check to make sure columns havent been added
+          if(loadedDefs.length === ctrl.dtOptions.columns.length) {
+              ctrl.dtOptions.columns = loadedDefs;
+          }
+        }
+
+        ctrl.updateColumns = function () {
+          var attributes = [];
+          ctrl.dtOptions.columns.forEach(function (column) {
+              attributes.push({name: column.name, visible: column.visible});
+          });
+          Artemis.log.debug("saving columns " + JSON.stringify(attributes));
+          localStorage.setItem('consumersColumnDefs', 
JSON.stringify(attributes));
+        }
         ctrl.filter = {
             fieldOptions: [
                 {id: 'ID', name: 'ID'},
@@ -132,7 +169,7 @@ var Artemis;
             { header: 'Client ID', itemField: 'clientID' },
             { header: 'Protocol', itemField: 'protocol' },
             { header: 'Queue', itemField: 'queue', templateFn: function(value, 
item) { return '<a href="#" onclick="selectQueue(' + item.idx + ')">' + 
$sanitize(value) + '</a>' }},
-            { header: 'queueType', itemField: 'queueType' },
+            { header: 'Queue Type', itemField: 'queueType' },
             { header: 'Filter', itemField: 'filter' },
             { header: 'Address', itemField: 'address' , templateFn: 
function(value, item) { return '<a href="#" onclick="selectAddress(' + item.idx 
+ ')">' + $sanitize(value) + '</a>' }},
             { header: 'Remote Address', itemField: 'remoteAddress' },
@@ -164,6 +201,15 @@ var Artemis;
             ctrl.filter.values.field = ctrl.filter.fieldOptions[1].id;
             ctrl.filter.values.operation = ctrl.filter.operationOptions[0].id;
             ctrl.filter.values.value = artemisConsumer.consumer.sessionID;
+            artemisConsumer.consumer = null;
+        }
+
+        if (artemisQueue.queue) {
+            Artemis.log.info("navigating to consumer = " + 
artemisQueue.queue.queue);
+            ctrl.filter.values.field = ctrl.filter.fieldOptions[5].id;
+            ctrl.filter.values.operation = ctrl.filter.operationOptions[0].id;
+            ctrl.filter.values.value = artemisQueue.queue.queue;
+            artemisQueue.queue = null;
         }
 
         selectQueue = function (idx) {
@@ -220,6 +266,8 @@ var Artemis;
                     ctrl.pagination.reset();
                     ctrl.refreshed = false;
                 }
+
+                Artemis.log.info(JSON.stringify(sessionsFilter));
                 jolokia.request({ type: 'exec', mbean: mbean, operation: 
method, arguments: [JSON.stringify(sessionsFilter), ctrl.pagination.pageNumber, 
ctrl.pagination.pageSize] }, Core.onSuccess(populateTable, { error: onError }));
             }
         };
diff --git 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/diagram.js 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/diagram.js
index 0284f88..e01ce7f 100644
--- 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/diagram.js
+++ 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/diagram.js
@@ -44,6 +44,16 @@ var Artemis;
                 <label>Show internal queues:
                     <input type="checkbox" ng-model="$ctrl.showInternalQueues">
                 </label>
+
+                <label>Show Live Brokers:
+                    <input type="checkbox" ng-model="$ctrl.showLiveBrokers">
+                </label>
+                <label>Show Backup Brokers:
+                    <input type="checkbox" ng-model="$ctrl.showBackupBrokers">
+                </label>
+                <label>Show Connectors:
+                    <input type="checkbox" ng-model="$ctrl.showConnectors">
+                </label>
                 <button type="submit" class="btn btn-primary"
                     ng-click="$ctrl.refresh()">Refresh
                 </button>
@@ -81,6 +91,10 @@ var Artemis;
         ctrl.showQueues = true;
         ctrl.showInternalAddresses = false;
         ctrl.showInternalQueues = false;
+        ctrl.showLiveBrokers = true;
+        ctrl.showBackupBrokers = true;
+        ctrl.showConnectors = true;
+        ctrl.hiddenRelations = [];
         $scope.$watch('$ctrl.showAddresses', function () {
             if(ctrl.kinds.Address && !ctrl.showAddresses) {
                delete ctrl.kinds.Address;
@@ -109,6 +123,34 @@ var Artemis;
                 ctrl.kinds.InternalQueue = true;
             }
         });
+        $scope.$watch('$ctrl.showLiveBrokers', function () {
+            if(ctrl.kinds.ThisBroker && !ctrl.showLiveBrokers) {
+               delete ctrl.kinds.ThisBroker;
+            } else if (!ctrl.kinds.ThisBroker && ctrl.showLiveBrokers) {
+                ctrl.kinds.ThisBroker = true;
+            }
+            if(ctrl.kinds.MasterBroker && !ctrl.showLiveBrokers) {
+               delete ctrl.kinds.MasterBroker;
+            } else if (!ctrl.kinds.MasterBroker && ctrl.showLiveBrokers) {
+                ctrl.kinds.MasterBroker = true;
+            }
+        });
+
+        $scope.$watch('$ctrl.showBackupBrokers', function () {
+            if(ctrl.kinds.SlaveBroker && !ctrl.showBackupBrokers) {
+               delete ctrl.kinds.SlaveBroker;
+            } else if (!ctrl.kinds.SlaveBroker && ctrl.showBackupBrokers) {
+                ctrl.kinds.SlaveBroker = true;
+            }
+        });
+
+        $scope.$watch('$ctrl.showConnectors', function () {
+            if(!ctrl.showConnectors) {
+                ctrl.data.relations = [];
+            } else {
+                ctrl.data.relations = ctrl.hiddenRelations;
+            }
+        });
         ctrl.datasets = [];
         //icons can be found at 
https://www.patternfly.org/v3/styles/icons/index.html
         ctrl.serverIcon = "\ue90d";
@@ -157,7 +199,7 @@ var Artemis;
         };
 
         load();
-
+        ctrl.hiddenRelations = ctrl.relations;
         function load() {
             ctrl.items = {};
 
diff --git 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/producers.js
 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/producers.js
index a35344a..9d87c01 100644
--- 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/producers.js
+++ 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/producers.js
@@ -28,6 +28,7 @@ var Artemis;
             </h1>
              <div ng-include="'plugin/artemistoolbar.html'"></div>
              <pf-table-view config="$ctrl.tableConfig"
+                            dt-options="$ctrl.dtOptions"
                             columns="$ctrl.tableColumns"
                             items="$ctrl.producers">
              </pf-table-view>
@@ -56,12 +57,45 @@ var Artemis;
     function ProducersController($scope, workspace, jolokia, localStorage, 
artemisMessage, $location, $timeout, $filter, $sanitize, pagination, 
artemisProducer, artemisAddress, artemisSession) {
         var ctrl = this;
         ctrl.pagination = pagination;
+        ctrl.pagination.reset();
         var mbean = Artemis.getBrokerMBean(workspace, jolokia);
         ctrl.allProducers = [];
         ctrl.producers = [];
         ctrl.pageNumber = 1;
         ctrl.workspace = workspace;
         ctrl.refreshed = false;
+        ctrl.dtOptions = {
+           // turn of ordering as we do it ourselves
+           ordering: false,
+           columns: [
+                {name: "ID", visible: true},
+                {name: "Session", visible: true},
+                {name: "Client ID", visible: true},
+                {name: "Protocol", visible: true},
+                {name: "User", visible: true},
+                {name: "Address", visible: true},
+                {name: "Remote Address", visible: true},
+                {name: "Local Address", visible: true}
+           ]
+          };
+
+        Artemis.log.debug('localStorage: producersColumnDefs =', 
localStorage.getItem('producersColumnDefs'));
+        if (localStorage.getItem('producersColumnDefs')) {
+            loadedDefs = 
JSON.parse(localStorage.getItem('producersColumnDefs'));
+            //sanity check to make sure columns havent been added
+            if(loadedDefs.length === ctrl.dtOptions.columns.length) {
+                ctrl.dtOptions.columns = loadedDefs;
+            }
+        }
+
+        ctrl.updateColumns = function () {
+            var attributes = [];
+            ctrl.dtOptions.columns.forEach(function (column) {
+                attributes.push({name: column.name, visible: column.visible});
+            });
+            Artemis.log.debug("saving columns " + JSON.stringify(attributes));
+            localStorage.setItem('producersColumnDefs', 
JSON.stringify(attributes));
+        }
         ctrl.filter = {
             fieldOptions: [
                 {id: 'ID', name: 'ID'},
@@ -148,6 +182,7 @@ var Artemis;
             ctrl.filter.values.field = ctrl.filter.fieldOptions[1].id;
             ctrl.filter.values.operation = ctrl.filter.operationOptions[0].id;
             ctrl.filter.values.value = artemisProducer.producer.sessionID;
+            artemisProducer.producer = null;
         }
 
         ctrl.loadOperation = function () {
diff --git 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/queues.js 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/queues.js
index 3389aa9..6c80f21 100644
--- 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/queues.js
+++ 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/queues.js
@@ -28,6 +28,7 @@ var Artemis;
             </h1>
              <div ng-include="'plugin/artemistoolbar.html'"></div>
              <pf-table-view config="$ctrl.tableConfig"
+                            dt-options="$ctrl.dtOptions"
                             columns="$ctrl.tableColumns"
                             action-buttons="$ctrl.tableActionButtons"
                             items="$ctrl.queues">
@@ -59,28 +60,86 @@ var Artemis;
     function QueuesController($scope, workspace, jolokia, localStorage, 
artemisMessage, $location, $timeout, $filter, $sanitize, pagination, 
artemisQueue, artemisAddress) {
         var ctrl = this;
         ctrl.pagination = pagination;
+        ctrl.pagination.reset();
         var mbean = Artemis.getBrokerMBean(workspace, jolokia);
         ctrl.allAddresses = [];
         ctrl.queues = [];
         ctrl.workspace = workspace;
         ctrl.refreshed = false;
+        ctrl.dtOptions = {
+           // turn of ordering as we do it ourselves
+           ordering: false,
+           columns: [
+                  {name: "ID", visible: true},
+                  {name: "name", visible: true},
+                  {name: "Address", visible: true},
+                  {name: "Routing Type", visible: true},
+                  {name: "Filter", visible: true},
+                  {name: "Durable", visible: true},
+                  {name: "Max Consumers", visible: true},
+                  {name: "Purge On No Consumers", visible: true},
+                  {name: "Consumer Count", visible: true},
+                  {name: "Rate", visible: true},
+                  {name: "Message Count", visible: true},
+                  {name: "Paused", visible: false},
+                  {name: "Temporary", visible: false},
+                  {name: "Auto Created", visible: false},
+                  {name: "User", visible: false},
+                  {name: "Total Messages Added", visible: false},
+                  {name: "Total Messages Acked", visible: false},
+                  {name: "Delivering Count", visible: false},
+                  {name: "Messages Killed", visible: false},
+                  {name: "Direct Deliver", visible: false},
+                  {name: "Exclusive", visible: false},
+                  {name: "Last Value", visible: false},
+                  {name: "Last Value Key", visible: false},
+                  {name: "Scheduled Count", visible: false},
+                  {name: "Group Rebalance", visible: false},
+                  {name: "Group Rebalance Pause Dispatch", visible: false},
+                  {name: "Group Buckets", visible: false},
+                  {name: "Group First Key", visible: false},
+                  {name: "Queue Enabled", visible: false},
+                  {name: "Ring Size", visible: false},
+                  {name: "Consumers Before Dispatch", visible: false},
+                  {name: "Delay Before Dispatch", visible: false}
+             ]
+        };
+
+        Artemis.log.debug('localStorage: queuesColumnDefs =', 
localStorage.getItem('queuesColumnDefs'));
+        if (localStorage.getItem('queuesColumnDefs')) {
+        Artemis.log.info("loading columns " + 
localStorage.getItem('queuesColumnDefs'))
+              loadedDefs = 
JSON.parse(localStorage.getItem('queuesColumnDefs'));
+              //sanity check to make sure columns havent been added
+              if(loadedDefs.length === ctrl.dtOptions.columns.length) {
+                  ctrl.dtOptions.columns = loadedDefs;
+              }
+        }
+
+        ctrl.updateColumns = function () {
+              var attributes = [];
+              ctrl.dtOptions.columns.forEach(function (column) {
+                  attributes.push({name: column.name, visible: 
column.visible});
+              });
+              Artemis.log.debug("saving columns " + 
JSON.stringify(attributes));
+              localStorage.setItem('queuesColumnDefs', 
JSON.stringify(attributes));
+        }
         ctrl.filter = {
             fieldOptions: [
-                {id: 'ID', name: 'ID'},
-                {id: 'NAME', name: 'Name'},
-                {id: 'CONSUMER_ID', name: 'Consumer ID'},
-                {id: 'ADDRESS', name: 'Address'},
-                {id: 'FILTER', name: 'Filter'},
-                {id: 'MAX_CONSUMERS', name: 'maxConsumers'},
-                {id: 'ROUTING_TYPE', name: 'Routing Type'},
-                {id: 'PURGE_ON_NO_CONSUMERS', name: 'Purge On No Consumers'},
-                {id: 'USER', name: 'User'},
-                {id: 'MESSAGE_COUNT', name: 'Message Count'},
-                {id: 'DELIVERING_COUNT', name: 'Delivering Count'},
-                {id: 'PAUSED', name: 'Paused'},
-                {id: 'TEMPORARY', name: 'Temporary'},
-                {id: 'AUTO_CREATED', name: 'Auto Created'},
-                {id: 'RATE', name: 'Rate'}
+                {id: 'id', name: 'ID'},
+                {id: 'name', name: 'Name'},
+                {id: 'consumerId', name: 'Consumer ID'},
+                {id: 'address', name: 'Address'},
+                {id: 'filter', name: 'Filter'},
+                {id: 'maxConsumers', name: 'Max Consumers'},
+                {id: 'routingType', name: 'Routing Type'},
+                {id: 'purgeOnNoConsumers', name: 'Purge On No Consumers'},
+                {id: 'user', name: 'User'},
+                {id: 'messageCount', name: 'Message Count'},
+                {id: 'deliveringCount', name: 'Delivering Count'},
+                {id: 'paused', name: 'Paused'},
+                {id: 'temporary', name: 'Temporary'},
+                {id: 'autoCreated', name: 'Auto Created'},
+                {id: 'rate', name: 'Rate'}
             ],
             operationOptions: [
                 {id: 'EQUALS', name: 'Equals'},
@@ -128,16 +187,17 @@ var Artemis;
             { header: 'Name', itemField: 'name',
               templateFn: function(value, item) { return '<a href="#" 
onclick="selectQueue(' + item.idx + ')">' + $sanitize(value) + '</a>' }
             },
-            { header: 'Routing Types', itemField: 'routingTypes' },
             { header: 'Address', itemField: 'address',
               templateFn: function(value, item) { return '<a href="#" 
onclick="selectAddress(' + item.idx + ')">' + $sanitize(value) + '</a>' }
             },
-            { header: 'Routing Type', itemField: 'routingType' },
+            { header: 'Routing Type', itemField: 'routingType'},
             { header: 'Filter', itemField: 'filter' },
             { header: 'Durable', itemField: 'durable' },
             { header: 'Max Consumers', itemField: 'maxConsumers' },
             { header: 'Purge On No Consumers', itemField: 'purgeOnNoConsumers' 
},
-            { header: 'Consumer Count', itemField: 'consumerCount' },
+            { header: 'Consumer Count', itemField: 'consumerCount' ,
+              templateFn: function(value, item) { return '<a href="#" 
onclick="selectConsumers(' + item.idx + ')">' + $sanitize(value) + '</a>' }
+            },
             { header: 'Rate', itemField: 'rate' },
             { header: 'Message Count', itemField: 'messageCount',
               templateFn: function(value, item) { return '<a href="#" 
onclick="browseQueue(' + item.idx + ')" title="Browse Messages">' + value + 
'</a>' }
@@ -150,12 +210,24 @@ var Artemis;
             { header: 'Total Messages Acked', itemField: 'messagesAcked' },
             { header: 'Delivering Count', itemField: 'deliveringCount' },
             { header: 'Messages Killed', itemField: 'messagesKilled' },
-            { header: 'Direct Deliver', itemField: 'directDeliver' }
+            { header: 'Direct Deliver', itemField: 'directDeliver' },
+            { header: 'exclusive', itemField: 'exclusive' },
+            { header: 'Last Value', itemField: 'lastValue' },
+            { header: 'Last Value Key', itemField: 'lastValueKey' },
+            { header: 'Scheduled Count', itemField: 'scheduledCount' },
+            { header: 'Group Rebalance', itemField: 'groupRebalance' },
+            { header: 'Group Rebalance Pause Dispatch', itemField: 
'groupRebalancePauseDispatch' },
+            { header: 'Group Buckets', itemField: 'groupBuckets' },
+            { header: 'Group First Key', itemField: 'groupFirstKey' },
+            { header: 'Enabled', itemField: 'enabled'},
+            { header: 'Ring Size', itemField: 'ringSize'},
+            { header: 'Consumers Before Dispatch', itemField: 
'consumersBeforeDispatch'},
+            { header: 'Delay Before Dispatch', itemField: 
'delayBeforeDispatch'}
         ];
 
         ctrl.refresh = function () {
             ctrl.refreshed = true;
-            loadTable();
+            ctrl.pagination.load();
         };
         ctrl.reset = function () {
             ctrl.filter.values.field = "";
@@ -176,6 +248,7 @@ var Artemis;
             ctrl.filter.values.field = ctrl.filter.fieldOptions[1].id;
             ctrl.filter.values.operation = ctrl.filter.operationOptions[0].id;
             ctrl.filter.values.value = artemisQueue.queue.queue;
+            artemisQueue.queue = null;
         }
 
         if (artemisAddress.address) {
@@ -183,10 +256,13 @@ var Artemis;
             ctrl.filter.values.field = ctrl.filter.fieldOptions[3].id;
             ctrl.filter.values.operation = ctrl.filter.operationOptions[0].id;
             ctrl.filter.values.value = artemisAddress.address.address;
+            artemisAddress.address = null;
         }
 
         function navigateToQueuesAtts(action, item) {
-            $location.path("artemis/attributes").search({"tab": "artemis", 
"nid": getQueuesNid(item, $location)});
+            qnid = getQueuesNid(item, $location);
+            Artemis.log.info(qnid);
+            $location.path("artemis/attributes").search({"tab": "artemis", 
"nid": qnid });
         };
         function navigateToQueuesOps(action, item) {
             $location.path("artemis/operations").search({"tab": "artemis", 
"nid": getQueuesNid(item, $location)});
@@ -201,10 +277,15 @@ var Artemis;
             var item = ctrl.queues[idx];
             var nid = getQueuesNid(item, $location);
             Artemis.log.debug("navigating to queue:" + nid);
-            artemisAddress.address = { address: item.address };
-            artemisQueue.queue = item;
+            artemisQueue.queue = { queue: item.name };
             $location.path("artemis/artemisQueues").search({"tab": "artemis", 
"nid": nid});
         };
+        selectConsumers = function (idx) {
+            var item = ctrl.queues[idx];
+            var nid = getQueuesNid(item, $location);
+            artemisQueue.queue = { queue: item.name };
+            $location.path("artemis/artemisConsumers").search({"tab": 
"artemis", "nid": nid});;
+        };
         browseQueue = function (idx) {
             var item = ctrl.queues[idx];
             var nid = getQueuesNid(item, $location);
@@ -224,16 +305,14 @@ var Artemis;
             return targetNID;
         }
         function getRootNid($location) {
-            var currentNid = $location.search()['nid'];
-            Artemis.log.debug("current nid=" + currentNid);
-            var firstDash = currentNid.indexOf('-');
-            var secondDash = currentNid.indexOf('-', firstDash + 1);
-            var thirdDash = currentNid.indexOf('-', secondDash + 1);
-            if (thirdDash < 0) {
-                return currentNid + "-";
-            }
-            var rootNID = currentNid.substring(0, thirdDash + 1);
-            return rootNID;
+            var mBean = Artemis.getBrokerMBean(workspace, jolokia);
+            var details = Core.parseMBean(mBean);
+            var properties = details['attributes'];
+            var brokerAddress = properties["broker"] || "unknown";
+            var artemisJmxDomain = localStorage['artemisJmxDomain'] || 
"org.apache.activemq.artemis";
+            //we have to remove the surrounding quotes
+            return "root-" + artemisJmxDomain + "-" + 
brokerAddress.replace(/^"|"$/g, '') + "-";
+
         }
         ctrl.loadOperation = function () {
             if (mbean) {
@@ -257,7 +336,7 @@ var Artemis;
         ctrl.pagination.setOperation(ctrl.loadOperation);
 
         function onError(response) {
-            Core.notification("error", "could not invoke list sessions" + 
response.error);
+            Core.notification("error", "could not invoke list queues" + 
response.error);
             $scope.workspace.selectParentNode();
         };
 
diff --git 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/sessions.js
 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/sessions.js
index 1e033f4..47dd96f 100644
--- 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/sessions.js
+++ 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/sessions.js
@@ -28,6 +28,7 @@ var Artemis;
             </h1>
              <div ng-include="'plugin/artemistoolbar.html'"></div>
              <pf-table-view config="$ctrl.tableConfig"
+                            dt-options="$ctrl.dtOptions"
                             columns="$ctrl.tableColumns"
                             action-buttons="$ctrl.tableActionButtons"
                             items="$ctrl.sessions">
@@ -70,6 +71,7 @@ var Artemis;
     function SessionsController($scope, workspace, jolokia, localStorage, 
artemisMessage, $location, $timeout, $filter, $sanitize, pagination, 
artemisConnection, artemisSession, artemisConsumer, artemisProducer) {
         var ctrl = this;
         ctrl.pagination = pagination;
+        ctrl.pagination.reset();
         var mbean = Artemis.getBrokerMBean(workspace, jolokia);
         ctrl.allSessions = [];
         ctrl.sessions = [];
@@ -79,16 +81,46 @@ var Artemis;
         ctrl.sessionToDeletesConnection = '';
         ctrl.sessionToDelete = '';
         ctrl.closeDialog = false;
+        ctrl.dtOptions = {
+           // turn of ordering as we do it ourselves
+           ordering: false,
+           columns: [
+                {name: "ID", visible: true},
+                {name: "Connection", visible: true},
+                {name: "User", visible: true},
+                {name: "Consumer Count", visible: true},
+                {name: "Producer Count", visible: true},
+                {name: "Creation Time", visible: true}
+             ]
+        };
+
+        Artemis.log.debug('localStorage: sessionsColumnDefs =', 
localStorage.getItem('sessionsColumnDefs'));
+        if (localStorage.getItem('sessionsColumnDefs')) {
+            loadedDefs = 
JSON.parse(localStorage.getItem('sessionsColumnDefs'));
+            //sanity check to make sure columns havent been added
+            if(loadedDefs.length === ctrl.dtOptions.columns.length) {
+                ctrl.dtOptions.columns = loadedDefs;
+            }
+        }
+
+        ctrl.updateColumns = function () {
+                var attributes = [];
+                ctrl.dtOptions.columns.forEach(function (column) {
+                    attributes.push({name: column.name, visible: 
column.visible});
+                });
+                Artemis.log.debug("saving columns " + 
JSON.stringify(attributes));
+                localStorage.setItem('sessionsColumnDefs', 
JSON.stringify(attributes));
+        }
         ctrl.filter = {
             fieldOptions: [
-                {id: 'ID', name: 'ID'},
-                {id: 'CONNECTION_ID', name: 'Connection ID'},
-                {id: 'CONSUMER_COUNT', name: 'Consumer Count'},
-                {id: 'USER', name: 'User'},
-                {id: 'PROTOCOL', name: 'Protocol'},
-                {id: 'CLIENT_ID', name: 'Client ID'},
-                {id: 'LOCAL_ADDRESS', name: 'Local Address'},
-                {id: 'REMOTE_ADDRESS', name: 'Remote Address'}
+                {id: 'id', name: 'ID'},
+                {id: 'connection_id', name: 'Connection ID'},
+                {id: 'consumer_count', name: 'Consumer Count'},
+                {id: 'user', name: 'User'},
+                {id: 'protocol', name: 'Protocol'},
+                {id: 'client_id', name: 'Client ID'},
+                {id: 'local_address', name: 'Local Address'},
+                {id: 'remote_address', name: 'Remote Address'}
             ],
             operationOptions: [
                 {id: 'EQUALS', name: 'Equals'},
@@ -181,6 +213,7 @@ var Artemis;
             ctrl.filter.values.field = ctrl.filter.fieldOptions[1].id;
             ctrl.filter.values.operation = ctrl.filter.operationOptions[0].id;
             ctrl.filter.values.value = 
artemisConnection.connection.connectionID;
+            artemisConnection.connection = null;
         }
 
         if (artemisSession.session) {
@@ -188,6 +221,7 @@ var Artemis;
             ctrl.filter.values.field = ctrl.filter.fieldOptions[0].id;
             ctrl.filter.values.operation = ctrl.filter.operationOptions[0].id;
             ctrl.filter.values.value = artemisSession.session.session;
+            artemisSession.session = null;
         }
 
         function openCloseDialog(action, item) {
diff --git 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/services/toolbar.js 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/services/toolbar.js
index 5cef955..bd343a9 100644
--- 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/services/toolbar.js
+++ 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/services/toolbar.js
@@ -66,7 +66,42 @@ var Artemis;
                                         ng-click="$ctrl.reset()">Reset
                                     </button>
                                 </div>
+                                <div class="input-group-btn">
+                                    <button class="btn btn-default 
primary-action ng-binding ng-scope"
+                                        type="button"
+                                        title=""
+                                        ng-click="$ctrl.showColumns = 
true">Columns
+                                    </button>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="form-group" ng-show="$ctrl.showColumns">
+                            <button class="btn btn-default" 
data-toggle="modal" data-target="#myModal">Columns</button>
+                            <div class="modal ng-scope">
+                              <div class="modal-dialog ">
+                                <div class="modal-content">
+                                  <div class="modal-header">
+                                    <h4 class="modal-title ng-binding">Column 
Selector</h4>
+                                  </div>
+                                  <div class="modal-body">
+                                    <table class="table-view-container table 
table-striped table-bordered table-hover dataTable ng-scope ng-isolate-scope 
no-footer">
+                                        <tbody>
+                                            <tr ng-repeat="col in 
$ctrl.dtOptions.columns">
+                                                <td>{{ col.name }}</td>
+                                                <td><input type="checkbox" 
ng-model="col.visible" placeholder="Name" autocomplete="off" id="name"></td>
+                                            </tr>
+                                        </tbody>
+                                    </table>
+                                  </div>
+                                  <div class="modal-footer">
+                                    <button type="button" class="btn 
btn-default ng-binding" ng-click="$ctrl.showColumns = 
false;$ctrl.updateColumns()">
+                                      Close
+                                    </button>
+                                  </div>
+                                </div>
+                              </div>
                             </div>
+                        </div>
                     </form>
                  </div>
                `
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/QueueControlImpl.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/QueueControlImpl.java
index bfa9a7b..5fb5a7d 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/QueueControlImpl.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/QueueControlImpl.java
@@ -704,6 +704,55 @@ public class QueueControlImpl extends AbstractControl 
implements QueueControl {
    }
 
    @Override
+   public String getLastValueKey() {
+      if (AuditLogger.isEnabled()) {
+         AuditLogger.lastValueKey(queue);
+      }
+      checkStarted();
+
+      clearIO();
+      try {
+         if (queue.getLastValueKey() != null) {
+            return queue.getLastValueKey().toString();
+         } else {
+            return null;
+         }
+      } finally {
+         blockOnIO();
+      }
+   }
+
+   @Override
+   public int getConsumersBeforeDispatch() {
+      if (AuditLogger.isEnabled()) {
+         AuditLogger.consumersBeforeDispatch(queue);
+      }
+      checkStarted();
+
+      clearIO();
+      try {
+         return queue.getConsumersBeforeDispatch();
+      } finally {
+         blockOnIO();
+      }
+   }
+
+   @Override
+   public long getDelayBeforeDispatch() {
+      if (AuditLogger.isEnabled()) {
+         AuditLogger.delayBeforeDispatch(queue);
+      }
+      checkStarted();
+
+      clearIO();
+      try {
+         return queue.getDelayBeforeDispatch();
+      } finally {
+         blockOnIO();
+      }
+   }
+
+   @Override
    public Map<String, Object>[] listScheduledMessages() throws Exception {
       if (AuditLogger.isEnabled()) {
          AuditLogger.listScheduledMessages(queue);
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/QueueView.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/QueueView.java
index deaa0bf..66d16e1 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/QueueView.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/QueueView.java
@@ -60,14 +60,19 @@ public class QueueView extends 
ActiveMQAbstractView<QueueControl> {
          .add("messagesAcked", toString(queue.getMessagesAcknowledged()))
          .add("deliveringCount", toString(queue.getDeliveringCount()))
          .add("messagesKilled", toString(queue.getMessagesKilled()))
-         .add("deliverDeliver", toString(q.isDirectDeliver()))
+         .add("directDeliver", toString(q.isDirectDeliver()))
          .add("exclusive", toString(queue.isExclusive()))
          .add("lastValue", toString(queue.isLastValue()))
+         .add("lastValueKey", toString(queue.getLastValueKey()))
          .add("scheduledCount", toString(queue.getScheduledCount()))
          .add("groupRebalance", toString(queue.isGroupRebalance()))
          .add("groupRebalancePauseDispatch", 
toString(queue.isGroupRebalancePauseDispatch()))
          .add("groupBuckets", toString(queue.getGroupBuckets()))
-         .add("groupFirstKey", toString(queue.getGroupFirstKey()));
+         .add("groupFirstKey", toString(queue.getGroupFirstKey()))
+         .add("enabled", toString(queue.isEnabled()))
+         .add("ringSize", toString(queue.getRingSize()))
+         .add("consumersBeforeDispatch", 
toString(queue.getConsumersBeforeDispatch()))
+         .add("delayBeforeDispatch", toString(queue.getDelayBeforeDispatch()));
       return obj;
    }
 
@@ -119,6 +124,8 @@ public class QueueView extends 
ActiveMQAbstractView<QueueControl> {
             return q.isExclusive();
          case "lastValue":
             return q.isLastValue();
+         case "lastValueKey":
+            return q.getLastValueKey();
          case "scheduledCount":
             return q.getScheduledCount();
          case "groupRebalance":
@@ -129,6 +136,14 @@ public class QueueView extends 
ActiveMQAbstractView<QueueControl> {
             return queue.getGroupBuckets();
          case "groupFirstKey":
             return queue.getGroupFirstKey();
+         case "enabled":
+            return q.isEnabled();
+         case "ringSize":
+            return q.getRingSize();
+         case "consumersBeforeDispatch":
+            return q.getConsumersBeforeDispatch();
+         case "delayBeforeDispatch":
+            return q.getDelayBeforeDispatch();
          default:
             throw new IllegalArgumentException("Unsupported field, " + 
fieldName);
       }
diff --git 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/QueueControlUsingCoreTest.java
 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/QueueControlUsingCoreTest.java
index 8d8472a..44babe8 100644
--- 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/QueueControlUsingCoreTest.java
+++ 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/QueueControlUsingCoreTest.java
@@ -225,6 +225,21 @@ public class QueueControlUsingCoreTest extends 
QueueControlTest {
          }
 
          @Override
+         public String getLastValueKey() {
+            return (String) proxy.retrieveAttributeValue("lastValueKey");
+         }
+
+         @Override
+         public int getConsumersBeforeDispatch() {
+            return (Integer) 
proxy.retrieveAttributeValue("consumersBeforeDispatch");
+         }
+
+         @Override
+         public long getDelayBeforeDispatch() {
+            return (Long) proxy.retrieveAttributeValue("delayBeforeDispatch");
+         }
+
+         @Override
          public int getDeliveringCount() {
             return (Integer) proxy.retrieveAttributeValue("deliveringCount", 
Integer.class);
          }

Reply via email to