Author: kwall
Date: Mon Jul 25 15:13:24 2016
New Revision: 1754027

URL: http://svn.apache.org/viewvc?rev=1754027&view=rev
Log:
QPID-7360 : [Java Broker] Replace usages of the old preference system with new 
one

Added:
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/userpreference/
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/userpreference/UserPreferenceForm.js
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/userpreference/
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/userpreference/UserPreferenceForm.html
Removed:
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Preferences.js
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/showPreferences.html
Modified:
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/common/TimeZoneSelector.html
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ConsoleHelper.js
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/TimeZoneSelector.js
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/metadata.js
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/updater.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/Management.js
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/QueryBrowserTab.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/Queue.js
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/UserPreferences.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/VirtualHostNode.js
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/controller.js
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/GroupManagingGroupProvider.js
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/LogViewer.js
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryCreateDialogForm.js
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryWidget.js
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/treeView.js

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/common/TimeZoneSelector.html
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/common/TimeZoneSelector.html?rev=1754027&r1=1754026&r2=1754027&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/common/TimeZoneSelector.html
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/common/TimeZoneSelector.html
 Mon Jul 25 15:13:24 2016
@@ -18,49 +18,34 @@
  - under the License.
  -
  -->
-<table cellpadding="0" cellspacing="2">
-    <tr>
-        <td class="labelClass"><strong>Use UTC time:</strong></td>
-        <td>
-            <input type="checkbox" class='utcSelector' name="utc" 
data-dojo-type="dijit/form/CheckBox" value="UTC"></input>
-        </td>
-    </tr>
-    <tr>
-        <td class="labelClass"><strong>Time Zone:</strong></td>
-        <td>
-          <table cellpadding="0" cellspacing="2">
-            <tr>
-              <td>Region</td>
-              <td><select class='timezoneRegion' name="region" 
data-dojo-type="dijit/form/FilteringSelect"
+<div>
+    <div class="clear">
+        <input id="${id}_utcSelector"
+               class="formLabel-controlCell tableContainer-valueCell"
+               type="checkbox"
+               data-dojo-type="dijit/form/CheckBox"
+               data-dojo-attach-point="utcSelector" value="UTC"/>
+        <label for="${id}_utcSelector">Use UTC time</label>
+    </div>
+    <div class="clear">
+        <select data-dojo-type="dijit/form/FilteringSelect"
                 data-dojo-props="
                     placeholder: 'Select region',
                     required: true,
                     missingMessage: 'A region must be supplied',
                     title: 'Select region',
-                    autoComplete: true,
-                    value:'undefined'">
-                  <option value="undefined">Undefined</option>
-                  <option value="Africa">Africa</option>
-                  <option value="America">America</option>
-                  <option value="Antarctica">Antarctica</option>
-                  <option value="Arctic">Arctic</option>
-                  <option value="Asia">Asia</option>
-                  <option value="Atlantic">Atlantic</option>
-                  <option value="Australia">Australia</option>
-                  <option value="Europe">Europe</option>
-                  <option value="Indian">Indian</option>
-                  <option value="Pacific">Pacific</option>
-              </select></td>
-              <td>City</td>
-              <td><select class='timezoneCity' name="city" 
data-dojo-type="dijit/form/FilteringSelect"
+                    autoComplete: true"
+                data-dojo-attach-point="regionSelector">
+        </select>
+    </div>
+    <div class="clear">
+        <select data-dojo-type="dijit/form/FilteringSelect"
                 data-dojo-props="
                     placeholder: 'Select city',
                     required: true,
                     missingMessage: 'A city must be supplied',
-                    title: 'Select city'">
-              </select></td>
-            </tr>
-        </table>
-    </td>
-    </tr>
-</table>
\ No newline at end of file
+                    title: 'Select city'"
+                data-dojo-attach-point="citySelector">
+        </select>
+    </div>
+</div>

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ConsoleHelper.js
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ConsoleHelper.js?rev=1754027&r1=1754026&r2=1754027&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ConsoleHelper.js
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ConsoleHelper.js
 Mon Jul 25 15:13:24 2016
@@ -29,7 +29,6 @@ define(["dojo/query",
         "dojo/domReady!"], function (query, registry, entities, Structure, 
updater, Management, util, Dialog)
 {
 
-    var preferencesDialog = null;
     var helpURL = null;
     var queryCreateDialog = null;
     var queryCreateDialogForm = null;
@@ -37,22 +36,7 @@ define(["dojo/query",
     return {
         showPreferencesDialog: function ()
         {
-            if (preferencesDialog == null)
-            {
-                var management = this.management;
-                require(["qpid/management/Preferences", "dojo/ready"], 
function (PreferencesDialog, ready)
-                {
-                    ready(function ()
-                    {
-                        preferencesDialog = new PreferencesDialog(management);
-                        preferencesDialog.showDialog();
-                    });
-                });
-            }
-            else
-            {
-                preferencesDialog.showDialog();
-            }
+            this.management.userPreferences.showEditor();
         },
         getHelpUrl: function (callback)
         {
@@ -123,7 +107,14 @@ define(["dojo/query",
                             queryCreateDialogForm.on("create", function (e)
                             {
                                 queryCreateDialog.hide();
-                                controller.show("query", e.preference, 
e.parentObject);
+                                var tabData = {
+                                    tabType: "query",
+                                    parent: e.parentObject,
+                                    configuredObjectId: e.parentObject.id,
+                                    data: e.preference,
+                                    preferenceId: e.preference.id
+                                };
+                                controller.showTab(tabData);
                             });
                             queryCreateDialogForm.on("cancel", function (e)
                             {
@@ -142,7 +133,9 @@ define(["dojo/query",
         },
         showQueryBrowser: function (e)
         {
-            this.controller.show("queryBrowser", "QueueBrowser");
+            this.controller.showTab({
+                tabType: "queryBrowser"
+            });
         },
         init: function (controller, TreeView)
         {

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/TimeZoneSelector.js
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/TimeZoneSelector.js?rev=1754027&r1=1754026&r2=1754027&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/TimeZoneSelector.js
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/TimeZoneSelector.js
 Mon Jul 25 15:13:24 2016
@@ -19,22 +19,19 @@
  *
  */
 define(["dojo/_base/declare",
-        "dojo/_base/array",
-        "dojo/dom-construct",
-        "dojo/parser",
-        "dojo/query",
-        "dojo/dom-style",
+        "dojo/_base/lang",
+        "dojo/Evented",
         "dojo/store/Memory",
-        "dijit/_WidgetBase",
-        "dijit/registry",
         "dojo/text!common/TimeZoneSelector.html",
-        "dijit/form/ComboBox",
+        "dijit/_WidgetBase",
+        "dijit/_TemplatedMixin",
+        "dijit/_WidgetsInTemplateMixin",
         "dijit/form/FilteringSelect",
         "dijit/form/CheckBox",
         "dojox/validate/us",
         "dojox/validate/web",
         "dojo/domReady!"],
-    function (declare, array, domConstruct, parser, query, domStyle, Memory, 
_WidgetBase, registry, template)
+    function (declare, lang, Evented, Memory, template)
     {
 
         var preferencesRegions = ["Africa",
@@ -50,10 +47,7 @@ define(["dojo/_base/declare",
 
         function initSupportedRegions()
         {
-            var supportedRegions = [{
-                "id": "undefined",
-                "name": "Undefined"
-            }];
+            var supportedRegions = [];
             for (var j = 0; j < preferencesRegions.length; j++)
             {
                 supportedRegions.push({
@@ -64,168 +58,118 @@ define(["dojo/_base/declare",
             return supportedRegions;
         }
 
-        return declare("qpid.common.TimeZoneSelector", [_WidgetBase], {
-
+        return declare("qpid.common.TimeZoneSelector", [dijit._WidgetBase,
+                                                        dijit._TemplatedMixin,
+                                                        
dijit._WidgetsInTemplateMixin,
+                                                        Evented], {
+            templateString: template.replace(/<!--[\s\S]*?-->/g, ""),
+
+            /**
+             * template fields
+             */
             value: null,
-            domNode: null,
-            _regionSelector: null,
-            _citySelector: null,
-            _utcSelector: null,
-
-            constructor: function (args)
-            {
-                this._args = args;
-                this.timezones = args.timezones;
-            },
-
-            buildRendering: function ()
-            {
-                this.domNode = domConstruct.create("div", {innerHTML: 
template});
-                parser.parse(this.domNode);
-            },
+            regionSelector: null,
+            citySelector: null,
+            utcSelector: null,
+
+            /**
+             * internal fields
+             */
+            _supportedRegions: null,
 
             postCreate: function ()
             {
                 this.inherited(arguments);
 
-                var self = this;
-                if (this._args.labelStyle)
-                {
-                    var nl = query(".labelClass", this.domNode);
-                    array.forEach(nl, function (entry, i)
-                    {
-                        domStyle.set(entry, self._args.labelStyle)
-                    });
-                }
-                var supportedTimeZones = this.timezones;
-
-                this._utcSelector = registry.byNode(query(".utcSelector", 
this.domNode)[0]);
-                this._citySelector = registry.byNode(query(".timezoneCity", 
this.domNode)[0]);
-                this._citySelector.set("searchAttr", "city");
-                this._citySelector.set("query", {region: /.*/});
-                this._citySelector.set("labelAttr", "city");
-                if (this.timezones)
-                {
-                    this._setTimezonesAttr(this.timezones);
-                }
-
-                this._regionSelector = 
registry.byNode(query(".timezoneRegion", this.domNode)[0]);
-                var supportedRegions = initSupportedRegions();
-                this._regionSelector.set("store", new Memory({data: 
supportedRegions}));
-
-                this._utcSelector.on("change", function (value)
-                {
-                    var checked = this.get("checked");
+                this.citySelector.set("searchAttr", "city");
+                this.citySelector.set("query", {region: /.*/});
+                this.citySelector.set("labelAttr", "city");
+                this._supportedRegions = initSupportedRegions();
+                this.regionSelector.set("store", new Memory({data: 
this._supportedRegions}));
+
+                this.utcSelector.on("change", lang.hitch(this, function (value)
+                {
+                    var checked = this.utcSelector.get("checked");
+                    this.citySelector.set("disabled", checked);
+                    this.regionSelector.set("disabled", checked);
                     if (checked)
                     {
-                        self.value = "UTC";
+                        this.value = "UTC";
+                        this.regionSelector.reset();
+                        this.citySelector.reset();
+                        this._handleOnChange(this.value);
                     }
                     else
                     {
-                        if (self._citySelector.value && 
self._regionSelector.value)
-                        {
-                            self.value = self._citySelector.value;
-                        }
-                        else
-                        {
-                            self.value = null;
-                        }
+                        this._defaultRegionAndCity();
                     }
-                    self._citySelector.set("disabled", checked);
-                    self._regionSelector.set("disabled", checked);
-                    self._handleOnChange(self.value);
-                });
-                this._regionSelector.on("change", function (value)
+
+                }));
+                this.regionSelector.on("change", lang.hitch(this, function 
(value)
                 {
-                    if (value == "undefined")
-                    {
-                        self._citySelector.set("disabled", true);
-                        self._citySelector.query.region = /.*/;
-                        self.value = null;
-                        self._citySelector.set("value", null);
-                        self._handleOnChange(self.value);
-                    }
-                    else
+                    if (value)
                     {
-                        self._citySelector.set("disabled", false);
-                        self._citySelector.query.region = value || /.*/;
-                        if (this.timeZone)
-                        {
-                            self._citySelector.set("value", this.timeZone);
-                            this.timeZone = null;
-                        }
-                        else
-                        {
-                            self._citySelector.set("value", null);
-                        }
+                        this.citySelector.set("disabled", false);
+                        this.citySelector.query.region = value;
+                        var store = this.citySelector.get("store");
+                        var cities = store.query({region: value});
+                        this.citySelector.set("value", cities[0].id, true);
                     }
-                });
+                }));
 
-                this._citySelector.on("change", function (value)
+                this.citySelector.on("change", lang.hitch(this, function 
(value)
                 {
-                    self.value = value;
-                    self._handleOnChange(value);
-                });
+                    if (value)
+                    {
+                        this.value = value;
+                        this._handleOnChange(value);
+                    }
+                }));
+            },
 
-                this._setValueAttr(this._args.value);
+            _defaultRegionAndCity: function ()
+            {
+                var firstRegion = this._supportedRegions[0];
+                this.regionSelector.set("value", firstRegion.id, false);
+                var store = this.citySelector.get("store");
+                var cities = store.query({region: firstRegion.id});
+                this.citySelector.set("value", cities[0].id, true);
             },
 
             _setTimezonesAttr: function (supportedTimeZones)
             {
-                this._citySelector.set("store", new Memory({data: 
supportedTimeZones}));
-                if (this._args.name)
-                {
-                    this._citySelector.set("name", this._args.name);
-                }
+                this.citySelector.set("store", new Memory({data: 
supportedTimeZones}));
             },
 
             _setValueAttr: function (value)
             {
+                this._lastValueReported = value;
                 if (value)
                 {
                     if (value == "UTC")
                     {
-                        this._utcSelector.set("checked", true);
+                        this.utcSelector.set("checked", true);
                     }
                     else
                     {
-                        this._utcSelector.set("checked", false);
+                        this.utcSelector.set("checked", false);
                         var elements = value.split("/");
                         if (elements.length > 1)
                         {
-                            this._regionSelector.timeZone = value;
-                            this._regionSelector.set("value", elements[0]);
-                            this._citySelector.set("value", value);
+                            this.regionSelector.timeZone = value;
+                            this.regionSelector.set("value", elements[0], 
false);
+                            this.citySelector.set("value", value, true);
                         }
                         else
                         {
-                            this._regionSelector.set("value", "undefined");
+                            this._defaultRegionAndCity();
                         }
                     }
                 }
                 else
                 {
-                    this._utcSelector.set("checked", false);
-                    this._regionSelector.set("value", "undefined");
-                }
-                this.value = value;
-                this._handleOnChange(value);
-            },
-
-            destroy: function ()
-            {
-                if (this.domNode)
-                {
-                    this.domNode.destroy();
-                    this.domNode = null;
+                    this._defaultRegionAndCity();
                 }
-                _regionSelector: null;
-                _citySelector: null;
-                _utcSelector: null;
-            },
-
-            onChange: function (newValue)
-            {
             },
 
             _handleOnChange: function (newValue)
@@ -233,15 +177,7 @@ define(["dojo/_base/declare",
                 if (this._lastValueReported != newValue)
                 {
                     this._lastValueReported = newValue;
-                    if (this._onChangeHandle)
-                    {
-                        this._onChangeHandle.remove();
-                    }
-                    this._onChangeHandle = this.defer(function ()
-                    {
-                        this._onChangeHandle = null;
-                        this.onChange(newValue);
-                    });
+                    this.emit("change", newValue);
                 }
             }
 

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/metadata.js
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/metadata.js?rev=1754027&r1=1754026&r2=1754027&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/metadata.js
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/metadata.js
 Mon Jul 25 15:13:24 2016
@@ -107,7 +107,21 @@ define(["dojo/_base/array", "dojox/lang/
     {
         var metaData = this.getMetaData(category, type);
         return metaData ? metaData.validChildTypes[childCategory] : [];
-    }
+    };
+
+    Metadata.prototype.isCategory = function (category)
+    {
+        var categoryLower = category ? category.toLowerCase() : null;
+        for (var fieldName in this.metadata)
+        {
+            if (new String(fieldName).toLowerCase() === categoryLower)
+            {
+                return true;
+            }
+        }
+        return false;
+    };
+
 
     return Metadata;
 });

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/updater.js
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/updater.js?rev=1754027&r1=1754026&r2=1754027&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/updater.js
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/updater.js
 Mon Jul 25 15:13:24 2016
@@ -36,11 +36,11 @@ define([], function ()
     var timer = setInterval(invokeUpdates, updatePeriod * 1000);
 
     var updateIntervalListener = {
-        onPreferencesChange: function (preferences)
+        onPreferenceChange: function (preference)
         {
-            if (preferences.updatePeriod && preferences.updatePeriod != 
updatePeriod)
+            if (preference.value && preference.value.updatePeriod && 
preference.value.updatePeriod != updatePeriod)
             {
-                updatePeriod = preferences.updatePeriod;
+                updatePeriod = preference.value.updatePeriod;
                 clearInterval(timer);
                 timer = setInterval(invokeUpdates, updatePeriod * 1000);
             }
@@ -50,7 +50,7 @@ define([], function ()
     return {
         registerUpdateIntervalListener: function (userPreferences)
         {
-            userPreferences.addListener(updateIntervalListener);
+            userPreferences.addListener(updateIntervalListener, 
userPreferences.updatePeriodPreferenceName);
         },
         add: function (obj)
         {

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=1754027&r1=1754026&r2=1754027&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
 Mon Jul 25 15:13:24 2016
@@ -406,7 +406,7 @@ define(["dojo/parser",
                         var idx = evt.rowIndex, theItem = this.getItem(idx);
                         if (theItem.vhId)
                         {
-                            that.showVirtualHost(theItem, that.brokerObj);
+                            that.showVirtualHost(theItem);
                         }
                     });
                 }, gridProperties, EnhancedGrid, true);
@@ -437,7 +437,7 @@ define(["dojo/parser",
                 var data = that.vhostsGrid.grid.selection.getSelected();
                 if (data.length == 1)
                 {
-                    that.showVirtualHost(data[0], that.brokerObj);
+                    that.showVirtualHost(data[0]);
                     that.vhostsGrid.grid.selection.clear();
                 }
             });
@@ -448,7 +448,7 @@ define(["dojo/parser",
                 if (data.length == 1)
                 {
                     var item = data[0];
-                    that.controller.show("virtualhostnode", item.name, 
that.brokerObj, item.id);
+                    that.controller.showById(item.id);
                     that.vhostsGrid.grid.selection.clear();
                 }
             });
@@ -588,9 +588,8 @@ define(["dojo/parser",
             {
                 connect.connect(obj.grid, "onRowDblClick", obj.grid, function 
(evt)
                 {
-                    var idx = evt.rowIndex, theItem = this.getItem(idx);
-                    var name = obj.dataStore.getValue(theItem, "name");
-                    that.controller.show("port", name, that.brokerObj, 
theItem.id);
+                    var theItem = this.getItem(evt.rowIndex);
+                    that.controller.showById(theItem.id);
                 });
             }, gridProperties, EnhancedGrid);
 
@@ -641,9 +640,8 @@ define(["dojo/parser",
                 {
                     connect.connect(obj.grid, "onRowDblClick", obj.grid, 
function (evt)
                     {
-                        var idx = evt.rowIndex, theItem = this.getItem(idx);
-                        var name = obj.dataStore.getValue(theItem, "name");
-                        that.controller.show("authenticationprovider", name, 
that.brokerObj, theItem.id);
+                        var theItem = this.getItem(evt.rowIndex);
+                        that.controller.showById(theItem.id);
                     });
                 }, gridProperties, EnhancedGrid);
 
@@ -668,9 +666,8 @@ define(["dojo/parser",
                 {
                     connect.connect(obj.grid, "onRowDblClick", obj.grid, 
function (evt)
                     {
-                        var idx = evt.rowIndex, theItem = this.getItem(idx);
-                        var name = obj.dataStore.getValue(theItem, "name");
-                        that.controller.show("keystore", name, that.brokerObj, 
theItem.id);
+                        var theItem = this.getItem(evt.rowIndex);
+                        that.controller.showById(theItem.id);
                     });
                 }, gridProperties, EnhancedGrid);
 
@@ -703,9 +700,8 @@ define(["dojo/parser",
                 {
                     connect.connect(obj.grid, "onRowDblClick", obj.grid, 
function (evt)
                     {
-                        var idx = evt.rowIndex, theItem = this.getItem(idx);
-                        var name = obj.dataStore.getValue(theItem, "name");
-                        that.controller.show("truststore", name, 
that.brokerObj, theItem.id);
+                        var theItem = this.getItem(evt.rowIndex);
+                        that.controller.showById(theItem.id);
                     });
                 }, gridProperties, EnhancedGrid);
             this.groupProvidersGrid =
@@ -725,9 +721,8 @@ define(["dojo/parser",
                 {
                     connect.connect(obj.grid, "onRowDblClick", obj.grid, 
function (evt)
                     {
-                        var idx = evt.rowIndex, theItem = this.getItem(idx);
-                        var name = obj.dataStore.getValue(theItem, "name");
-                        that.controller.show("groupprovider", name, 
that.brokerObj, theItem.id);
+                        var theItem = this.getItem(evt.rowIndex);
+                        that.controller.showById(theItem.id);
                     });
                 }, gridProperties, EnhancedGrid);
             this.accessControlProvidersGrid =
@@ -751,9 +746,8 @@ define(["dojo/parser",
                 {
                     connect.connect(obj.grid, "onRowDblClick", obj.grid, 
function (evt)
                     {
-                        var idx = evt.rowIndex, theItem = this.getItem(idx);
-                        var name = obj.dataStore.getValue(theItem, "name");
-                        that.controller.show("accesscontrolprovider", name, 
that.brokerObj, theItem.id);
+                        var theItem = this.getItem(evt.rowIndex);
+                        that.controller.showById(theItem.id);
                     });
                 }, gridProperties, EnhancedGrid);
 
@@ -789,9 +783,8 @@ define(["dojo/parser",
             {
                 connect.connect(obj.grid, "onRowDblClick", obj.grid, function 
(evt)
                 {
-                    var idx = evt.rowIndex, theItem = this.getItem(idx);
-                    var name = obj.dataStore.getValue(theItem, "name");
-                    that.controller.show("brokerlogger", name, that.brokerObj, 
theItem.id);
+                    var theItem = this.getItem(evt.rowIndex);
+                    that.controller.showById(theItem.id);
                 });
             }, gridProperties, EnhancedGrid);
             this.update(function ()
@@ -800,14 +793,9 @@ define(["dojo/parser",
             });
         }
 
-        BrokerUpdater.prototype.showVirtualHost = function (item, brokerObj)
+        BrokerUpdater.prototype.showVirtualHost = function (item)
         {
-            var nodeObject = {
-                type: "virtualhostnode",
-                name: item.name,
-                parent: brokerObj
-            };
-            this.controller.show("virtualhost", item.vhId ? item.vhName : 
item.name, nodeObject, item.vhId);
+            this.controller.showById(item.vhId);
         }
 
         BrokerUpdater.prototype.updateHeader = function ()

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js?rev=1754027&r1=1754026&r2=1754027&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js
 Mon Jul 25 15:13:24 2016
@@ -483,13 +483,14 @@ define(["dojo/_base/lang",
         Management.prototype.init = function (callback)
         {
             var that = this;
+            // todo : change invoked methods to return promise and execute 
requests in parallel using promise.all
             this.getAuthenticatedUserAndGroups(function()
             {
                 that.loadMetadata(function ()
                 {
                     that.loadTimezones(function ()
                     {
-                        that.loadUserPreferences(callback);
+                        that.loadUserPreferences().then(callback, callback);
                     });
                 });
             });
@@ -558,12 +559,12 @@ define(["dojo/_base/lang",
 
         // summary:
         //  Loads user preferences and store them under 'userPreferences' 
field as object of type qpid.management.UserPreferences
-        //  Callback is invoked on both successful and unsuccessful 
preferences request
+        //  Returns promise
         //
-        Management.prototype.loadUserPreferences = function (callback)
+        Management.prototype.loadUserPreferences = function ()
         {
             this.userPreferences = new UserPreferences(this);
-            this.userPreferences.load(callback, callback);
+            return this.userPreferences.load();
         };
 
         var saslServiceUrl = "service/sasl";
@@ -662,6 +663,11 @@ define(["dojo/_base/lang",
            return this.put({url: url}, preference);
         };
 
+        Management.prototype.savePreferences = function(parentObject, 
preferences)
+        {
+            var url =  this.buildPreferenceUrl(parentObject);
+            return this.post({url: url}, preferences);
+        };
 
         Management.prototype.getPreference = function(parentObject, type, name)
         {
@@ -669,6 +675,12 @@ define(["dojo/_base/lang",
            return this.get({url: url});
         };
 
+        Management.prototype.getPreferenceById = function(parentObject, 
preferenceId)
+        {
+            var url =  this.buildPreferenceUrl(parentObject, null, null, true, 
preferenceId);
+            return this.get({url: url});
+        };
+
         Management.prototype.getUserPreferences = function(parentObject, type)
         {
             var url =  this.buildPreferenceUrl(parentObject, type);
@@ -687,12 +699,23 @@ define(["dojo/_base/lang",
            return this.del({url: url});
         };
 
-        Management.prototype.buildPreferenceUrl = function (parentObject, 
type, name, visiblePreferences)
+        Management.prototype.buildPreferenceUrl = function (parentObject, 
type, name, visiblePreferences, id)
         {
-            return this.objectToURL(parentObject)
-                   + (visiblePreferences ? "/visiblepreferences/" : 
"/userpreferences/")
-                   + encodeURIComponent(encodeURIComponent(type))
-                   + (name ? "/" + 
encodeURIComponent(encodeURIComponent(name)) : "" );
+            var url = this.objectToURL(parentObject);
+            url = url + (visiblePreferences ? "/visiblepreferences" : 
"/userpreferences");
+            if (type)
+            {
+                url = url + "/" + encodeURIComponent(encodeURIComponent(type));
+                if (name)
+                {
+                    url = url + "/" + 
encodeURIComponent(encodeURIComponent(name));
+                }
+            }
+            else if (id)
+            {
+                url = url + "?id=" + 
encodeURIComponent(encodeURIComponent(id));
+            }
+            return url;
         };
 
         Management.prototype.getGroups = function ()

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/QueryBrowserTab.js
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/QueryBrowserTab.js?rev=1754027&r1=1754026&r2=1754027&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/QueryBrowserTab.js
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/QueryBrowserTab.js
 Mon Jul 25 15:13:24 2016
@@ -62,7 +62,15 @@ define(["dojo/parser",
             this.queryBrowserWidget.on("openQuery",
                 function (event)
                 {
-                    that.controller.show("query", event.preference, 
event.parentObject, event.preference.id);
+                    var tabData = {
+                        tabType: "query",
+                        data: event.preference,
+                        name: event.preference.name,
+                        parent: event.parentObject,
+                        configuredObjectId: event.parentObject.id,
+                        preferenceId: event.preference.id
+                    };
+                    that.controller.showTab(tabData);
                 });
             this.queryBrowserWidget.startup();
 

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=1754027&r1=1754026&r2=1754027&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
 Mon Jul 25 15:13:24 2016
@@ -19,13 +19,16 @@
  *
  */
 define(["dojo/parser",
+        "dojo/_base/lang",
+        "dojo/promise/all",
+        "dojo/Deferred",
         "dojo/query",
         "dojo/json",
         "qpid/common/util",
         "dojo/text!showQueryTab.html",
         "qpid/management/query/QueryWidget",
         "dojo/domReady!"],
-    function (parser, query, json, util, template, QueryWidget)
+    function (parser, lang, all, Deferred, query, json, util, template, 
QueryWidget)
     {
         function getPath(object)
         {
@@ -42,41 +45,80 @@ define(["dojo/parser",
             return "";
         }
 
-        function QueryTab(data, parent, controller)
+        function QueryTab(name, parent, controller)
         {
             this.controller = controller;
             this.management = controller.management;
             this.parent = parent;
-            this.preference = data;
         }
 
         QueryTab.prototype.getTitle = function (changed)
         {
+            if (this.tabData.preferenceId && !this.tabData.data)
+            {
+                return "Loading...";
+            }
             var category = "";
-            if (this.preference && this.preference.value && 
this.preference.value.category)
+            if (this.tabData.data && this.tabData.data.value && 
this.tabData.data.value.category)
             {
-                category = this.preference.value.category;
+                category = this.tabData.data.value.category;
                 category = category.charAt(0).toUpperCase() + 
category.substring(1);
             }
-            var name = this.preference.id ? this.preference.name : "New";
-            var prefix = this.preference.id && !changed ? "" : "*";
+            var name = this.tabData.data.name ? this.tabData.data.name : "New";
+            var prefix = this.tabData.data.name && !changed ? "" : "*";
             var path = getPath(this.parent);
             return prefix + category + " query:" + name + path;
         };
 
         QueryTab.prototype.open = function (contentPane)
         {
-            var that = this;
             this.contentPane = contentPane;
             contentPane.containerNode.innerHTML = template;
-            parser.parse(contentPane.containerNode)
-                .then(function (instances)
+            var parserPromise = parser.parse(contentPane.containerNode);
+            var preferencePromise = null;
+            if (this.tabData.preferenceId && !this.tabData.data)
+            {
+                preferencePromise = 
this.management.getPreferenceById(this.parent, this.tabData.preferenceId);
+            }
+            else
+            {
+                var deferred = new Deferred();
+                var obj = {};
+                obj[this.tabData.data.type] = [this.tabData.data];
+                deferred.resolve(obj);
+                preferencePromise = deferred.promise;
+            }
+            all({parser: parserPromise, preference: preferencePromise})
+                .then(lang.hitch(this, function (data)
                 {
-                    that.onOpen(contentPane.containerNode)
-                }, function (e)
+                    for (var type in data.preference)
+                    {
+                        var preferences = data.preference[type];
+                        if (preferences[0])
+                        {
+                            this.tabData.data = preferences[0];
+                        }
+                        if (preferences.length !== 1)
+                        {
+                            console.warn("Unexpected number of preferences 
returned for id "
+                                         + this.tabData.preferenceId);
+                        }
+                    }
+
+                    if (this.tabData.data)
+                    {
+                        this.onOpen(contentPane.containerNode)
+                    }
+                    else
+                    {
+                        
this.management.userPreferences.removeTab(this.tabData);
+                        this.destroy();
+                    }
+
+                }), lang.hitch(this, function (e)
                 {
-                    console.error("Unexpected error on parsing query tab 
template", e);
-                });
+                    this.management.errorHandler(e);
+                }));
         };
 
         QueryTab.prototype.onOpen = function (containerNode)
@@ -85,33 +127,35 @@ define(["dojo/parser",
             this.queryWidget = new QueryWidget({
                 management: this.management,
                 parentObject: this.parent,
-                preference: this.preference,
+                preference: this.tabData.data,
                 controller: this.controller
             }, this.queryWidgetNode);
-            var that = this;
-            this.queryWidget.on("save", function(e)
-            {
-                if (that.preference.name != e.preference.name)
-                {
-                    that.controller.update(that, e.preference.name, 
that.parent, e.preference.id);
-                }
-                that.preference = e.preference;
-                var title = that.getTitle();
-                that.contentPane.set("title", title);
-            });
-            this.queryWidget.on("change", function(e)
-            {
-                var title = that.getTitle(true);
-                that.contentPane.set("title", title);
-            });
-            this.queryWidget.on("delete", function(e)
-            {
-                that.destroy();
-            });
-            this.queryWidget.on("clone", function(e)
+            this.contentPane.set("title", this.getTitle());
+            this.queryWidget.on("save", lang.hitch(this, function(e)
             {
-                that.controller.show("query", e.preference, e.parentObject);
-            });
+                this.tabData.data = e.preference;
+                var title = this.getTitle();
+                this.contentPane.set("title", title);
+            }));
+            this.queryWidget.on("change", lang.hitch(this, function(e)
+            {
+                var title = this.getTitle(true);
+                this.contentPane.set("title", title);
+            }));
+            this.queryWidget.on("delete", lang.hitch(this, function(e)
+            {
+                this.management.userPreferences.removeTab(this.tabData);
+                this.destroy();
+            }));
+            this.queryWidget.on("clone", lang.hitch(this, function(e)
+            {
+                this.controller.showTab({
+                    tabType: "query",
+                    data: e.preference,
+                    parent: e.parentObject,
+                    configuredObjectId: e.parentObject.id
+                });
+            }));
             this.queryWidget.startup();
         };
 

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js?rev=1754027&r1=1754026&r2=1754027&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js
 Mon Jul 25 15:13:24 2016
@@ -214,7 +214,6 @@ define(["dojo/_base/declare",
                         event.stop(evt);
                         editQueue.show(that.management, that.modelObj);
                     });
-                    userPreferences.addListener(that);
                     that.queueUpdater.update(function ()
                     {
                         updater.add(that.queueUpdater);
@@ -321,12 +320,6 @@ define(["dojo/_base/declare",
         Queue.prototype.close = function ()
         {
             updater.remove(this.queueUpdater);
-            this.management.userPreferences.removeListener(this);
-        };
-
-        Queue.prototype.onPreferencesChange = function (data)
-        {
-            //this.grid._refresh();
         };
 
         var queueTypeKeys = {

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/UserPreferences.js
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/UserPreferences.js?rev=1754027&r1=1754026&r2=1754027&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/UserPreferences.js
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/UserPreferences.js
 Mon Jul 25 15:13:24 2016
@@ -18,92 +18,108 @@
  * under the License.
  *
  */
-define(["dojo/date", "dojo/date/locale", "dojo/number"], function (date, 
locale, number)
+define(["dojo/_base/lang",
+        "dojo/Deferred",
+        "dojo/date",
+        "dojo/date/locale",
+        "dojo/number"], function (lang, Deferred, date, locale, number)
 {
-
+    var timeZonePreferenceName = "Time Zone";
+    var updatePeriodPreferenceName = "Update Period";
+    var tabsPreferenceName = "Tabs";
+    var defaultPreferences = [
+        {name: timeZonePreferenceName, type: "X-TimeZone", value: {timeZone: 
"UTC"} },
+        {name: updatePeriodPreferenceName, type: "X-UpdatePeriod", value: 
{updatePeriod: 5} },
+        {name: tabsPreferenceName, type: "X-Tabs", value: {tabs: []} }
+    ];
     function UserPreferences(management)
     {
-        this.listeners = [];
-        /* set time zone to 'UTC' by default*/
-        this.timeZone = "UTC";
-        this.tabs = [];
-        this.management = management;
+        this.timeZonePreferenceName = timeZonePreferenceName;
+        this.updatePeriodPreferenceName = updatePeriodPreferenceName;
+        this.tabsPreferenceName = tabsPreferenceName;
         this.preferences = {};
+        for(var i = 0; i< defaultPreferences.length; i++)
+        {
+            var preference = defaultPreferences[i];
+            this.preferences[preference.name] = preference;
+        }
+        this.management = management;
+        this.listeners = {};
     }
 
-    UserPreferences.prototype.load = function (successCallback, 
failureCallback)
+    UserPreferences.prototype.load = function ()
     {
-        var that = this;
-        this.management.get({url: "service/preferences"})
-            .then(function (preferences)
-            {
-                that.preferences = preferences;
-                for (var name in preferences)
-                {
-                    that[name] = preferences[name];
-                }
-                if (successCallback)
-                {
-                    successCallback();
-                }
-            }, function (error)
-            {
-                that.preferencesError = error;
-                if (failureCallback)
-                {
-                    failureCallback();
-                }
-            });
-    }
+        var deferred = new Deferred();
+        management.getUserPreferences({type: "broker"}).then(lang.hitch(this, 
function (preferences)
+        {
+            this._init(preferences);
+            deferred.resolve(preferences);
+        }),lang.hitch(this, function (error)
+        {
+            this.lastError = error;
+            deferred.reject(error);
+        }));
+        return deferred.promise;
+    };
 
-    UserPreferences.prototype.save = function (preferences, successCallback, 
failureCallback)
+    UserPreferences.prototype.getLastError = function ()
     {
-        var that = this;
-        this.management.post({url: "service/preferences"}, preferences)
-            .then(function (x)
-            {
-                that.preferences = preferences;
-                for (var name in preferences)
-                {
-                    if (preferences.hasOwnProperty(name))
-                    {
-                        that[name] = preferences[name];
-                    }
-                }
-                that._notifyListeners(preferences);
-                if (successCallback)
-                {
-                    successCallback(preferences);
-                }
-            }, failureCallback);
+        return this.lastError;
     };
 
-    var fields = ["preferencesError", "management", "listeners"];
-    UserPreferences.prototype.resetPreferences = function ()
+    UserPreferences.prototype._init= function(preferences)
     {
-        var preferences = {};
-        for (var name in this)
+        var timezone = preferences["X-TimeZone"];
+        if (timezone && timezone[0])
         {
-            if (this.hasOwnProperty(name) && typeof this[name] != "function")
-            {
-                if (fields.indexOf(name) != -1)
-                {
-                    continue;
-                }
-                this[name] = null;
-                preferences[name] = undefined;
-                delete preferences[name];
-            }
+            this.preferences[timeZonePreferenceName] = timezone[0];
+        }
+        var tabs = preferences["X-Tabs"];
+        if (tabs && tabs[0])
+        {
+            this.preferences[tabsPreferenceName] = tabs[0];
         }
-        this.timeZone = "UTC";
-        this.preferences = preferences;
-        this._notifyListeners(preferences);
+        var updatePeriod = preferences["X-UpdatePeriod"];
+        if (updatePeriod && updatePeriod[0])
+        {
+            this.preferences[updatePeriodPreferenceName] = updatePeriod[0];
+        }
+    };
+
+    UserPreferences.prototype.save = function (preferences)
+    {
+        var deferred = new Deferred();
+        var result = this.management.savePreferences({type: "broker"}, 
preferences);
+        result.then(lang.hitch(this, function ()
+        {
+            deferred.resolve(preferences);
+            this._notifyListeners(preferences);
+        }), lang.hitch(this, function (error)
+        {
+            this.lastError = error;
+            deferred.reject(error);
+        }));
+        return deferred.promise;
     };
 
-    UserPreferences.prototype.addListener = function (obj)
+    UserPreferences.prototype.addListener = function (listener, preferenceName)
     {
-        this.listeners.push(obj);
-        this._notifyListener(obj, this.preferences);
+        var preference = this.preferences[preferenceName];
+        if (preference)
+        {
+            var preferenceListeners = this.listeners[preferenceName];
+            if (!preferenceListeners)
+            {
+                preferenceListeners = [];
+                this.listeners[preferenceName] = preferenceListeners;
+            }
+            preferenceListeners.push(listener);
+            this._notifyListener(listener, preference);
+        }
+        else
+        {
+            throw new Error("Unsupported preference '" + preferenceName + "'");
+        }
     };
 
     UserPreferences.prototype.removeListener = function (obj)
@@ -120,17 +136,30 @@ define(["dojo/date", "dojo/date/locale",
 
     UserPreferences.prototype._notifyListeners = function (preferences)
     {
-        for (var i = 0; i < this.listeners.length; i++)
+        for( var type in preferences)
         {
-            this._notifyListener(this.listeners[i], preferences);
+            var typeList = preferences[type];
+            for(var i = 0; i < typeList.length; i++)
+            {
+                var preference = typeList[i];
+                var name = preference.name;
+                var listenerList = this.listeners[name];
+                if (listenerList)
+                {
+                    for(var j=0; j < listenerList.length; j++)
+                    {
+                        this._notifyListener(listenerList[j], preference);
+                    }
+                }
+            }
         }
     };
 
-    UserPreferences.prototype._notifyListener = function (listener, 
preferences)
+    UserPreferences.prototype._notifyListener = function (listener, preference)
     {
         try
         {
-            listener.onPreferencesChange(preferences);
+            listener.onPreferenceChange(preference);
         }
         catch (e)
         {
@@ -141,11 +170,17 @@ define(["dojo/date", "dojo/date/locale",
         }
     };
 
+    UserPreferences.prototype.getPreferenceByName= function(preferenceName)
+    {
+        return this.preferences[preferenceName];
+    };
+
     UserPreferences.prototype.getTimeZoneInfo = function (timeZoneName)
     {
-        if (!timeZoneName && this.timeZone)
+        var timeZonePreference = 
this.getPreferenceByName(timeZonePreferenceName);
+        if (!timeZoneName && timeZonePreference.value && 
timeZonePreference.value.timeZone)
         {
-            timeZoneName = this.timeZone;
+            timeZoneName = timeZonePreference.value.timeZone;
         }
 
         if (!timeZoneName)
@@ -234,30 +269,49 @@ define(["dojo/date", "dojo/date/locale",
 
     UserPreferences.prototype.appendTab = function (tab)
     {
-        if (!this.tabs)
-        {
-            this.tabs = [];
-        }
         if (!this.isTabStored(tab))
         {
-            this.tabs.push(tab);
-            this.save({tabs: this.tabs});
+            var tabsPreference = 
this.getPreferenceByName(this.tabsPreferenceName);
+            var tabs;
+            if (tabsPreference.value && tabsPreference.value.tabs)
+            {
+                tabs = tabsPreference.value.tabs;
+            }
+            else
+            {
+                tabs = [];
+                tabsPreference.value = {"tabs": tabs};
+            }
+            tabs.push({tabType: tab.tabType, configuredObjectId: 
tab.configuredObjectId, preferenceId: tab.preferenceId});
+            this._savePreference(tabsPreference);
         }
     };
 
     UserPreferences.prototype.removeTab = function (tab)
     {
-        if (this.tabs)
+        if (this.isTabStored(tab))
         {
             var index = this._getTabIndex(tab);
             if (index != -1)
             {
-                this.tabs.splice(index, 1);
-                this.save({tabs: this.tabs});
+                var tabsPreference = 
this.getPreferenceByName(this.tabsPreferenceName);
+                tabsPreference.value.tabs.splice(index, 1);
+                this._savePreference(tabsPreference);
             }
         }
     };
 
+    UserPreferences.prototype._savePreference = function (preference)
+    {
+        var preferences = {};
+        preferences[preference.type] = [preference];
+        var result = this.save(preferences);
+        if (!preference.id)
+        {
+            result.then(lang.hitch(this, this.load));
+        }
+    };
+
     UserPreferences.prototype.isTabStored = function (tab)
     {
         return this._getTabIndex(tab) != -1;
@@ -266,12 +320,16 @@ define(["dojo/date", "dojo/date/locale",
     UserPreferences.prototype._getTabIndex = function (tab)
     {
         var index = -1;
-        if (this.tabs)
+        var tabsPreference = this.getPreferenceByName(this.tabsPreferenceName);
+        if (tabsPreference && tabsPreference.value && 
tabsPreference.value.tabs)
         {
-            for (var i = 0; i < this.tabs.length; i++)
+            var tabs = tabsPreference.value.tabs;
+            for (var i = 0; i < tabs.length; i++)
             {
-                var t = this.tabs[i];
-                if (t.objectId == tab.objectId && t.objectType == 
tab.objectType)
+                var t = tabs[i];
+                if (t.configuredObjectId === tab.configuredObjectId
+                    && t.tabType === tab.tabType
+                    && (!tab.preferenceId && !t.preferenceId || 
tab.preferenceId === t.preferenceId ))
                 {
                     index = i;
                     break;
@@ -279,7 +337,72 @@ define(["dojo/date", "dojo/date/locale",
             }
         }
         return index;
-    }
+    };
+
+    UserPreferences.prototype.getSavedTabs = function ()
+    {
+        var tabsPreference = this.getPreferenceByName(this.tabsPreferenceName);
+        if (tabsPreference && tabsPreference.value && 
tabsPreference.value.tabs)
+        {
+            return lang.clone(tabsPreference.value.tabs);
+        }
+        return [];
+    };
+
+    var preferencesDialog = null, userPreferenceForm = null;
+    UserPreferences.prototype.showEditor = function ()
+    {
+        this.load().then(lang.hitch(this, function ()
+            {
+                var tzp = this.getPreferenceByName(timeZonePreferenceName);
+                var upp = this.getPreferenceByName(updatePeriodPreferenceName);
+                if (preferencesDialog)
+                {
+                    userPreferenceForm.set("timezone", tzp.value ? 
tzp.value.timeZone : "UTC");
+                    userPreferenceForm.set("updatePeriod", upp.value ? 
upp.value.updatePeriod : 5, false);
+                    preferencesDialog.show();
+                }
+                else
+                {
+                    require(["dojo/_base/lang", 
"qpid/management/userpreference/UserPreferenceForm", "dijit/Dialog"],
+                        lang.hitch(this, function (lang, UserPreferenceForm, 
Dialog)
+                        {
+                            userPreferenceForm = new UserPreferenceForm({});
+                            preferencesDialog = new Dialog({title: "User 
preferences", content: userPreferenceForm});
+                            userPreferenceForm.set("timezones", 
this.management.timezone.getAllTimeZones());
+                            userPreferenceForm.set("timezone", tzp.value ? 
tzp.value.timeZone : "UTC");
+                            userPreferenceForm.set("updatePeriod", upp.value ? 
upp.value.updatePeriod : 5, false);
+                            userPreferenceForm.on("cancel", lang.hitch(this, 
function ()
+                            {
+                                preferencesDialog.hide();
+                            }));
+                            userPreferenceForm.on("save", lang.hitch(this, 
function (event)
+                            {
+                                var timeZonePreference = 
this.getPreferenceByName(timeZonePreferenceName);
+                                var updatePeriodPreference = 
this.getPreferenceByName(updatePeriodPreferenceName);
+                                var preferences = {};
+                                if (event.preferences.timeZone)
+                                {
+                                    timeZonePreference.value = {timeZone: 
event.preferences.timeZone};
+                                    preferences[timeZonePreference.type] = 
[timeZonePreference];
+                                }
+                                if (event.preferences.updatePeriod)
+                                {
+                                    updatePeriodPreference.value = 
{updatePeriod: event.preferences.updatePeriod};
+                                    preferences[updatePeriodPreference.type] = 
[updatePeriodPreference];
+                                }
+
+                                this.save(preferences)
+                                    .then(lang.hitch(this, function ()
+                                    {
+                                        preferencesDialog.hide();
+                                    }));
+                            }));
+                            preferencesDialog.show();
+                        }));
+                }
+            }));
+    };
 
     return UserPreferences;
-});
\ No newline at end of file
+});

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=1754027&r1=1754026&r2=1754027&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
 Mon Jul 25 15:13:24 2016
@@ -318,9 +318,8 @@ define(["dojo/parser",
             {
                 connect.connect(obj.grid, "onRowDblClick", obj.grid, function 
(evt)
                 {
-                    var idx = evt.rowIndex, theItem = this.getItem(idx);
-                    var queueName = obj.dataStore.getValue(theItem, "name");
-                    controller.show("queue", queueName, vhost, theItem.id);
+                    var theItem = this.getItem(evt.rowIndex);
+                    controller.showById(theItem.id);
                 });
             }, gridProperties, EnhancedGrid);
 
@@ -340,9 +339,8 @@ define(["dojo/parser",
             {
                 connect.connect(obj.grid, "onRowDblClick", obj.grid, function 
(evt)
                 {
-                    var idx = evt.rowIndex, theItem = this.getItem(idx);
-                    var exchangeName = obj.dataStore.getValue(theItem, "name");
-                    controller.show("exchange", exchangeName, vhost, 
theItem.id);
+                    var theItem = this.getItem(evt.rowIndex);
+                    controller.showById(theItem.id);
                 });
             }, gridProperties, EnhancedGrid);
 
@@ -421,9 +419,8 @@ define(["dojo/parser",
             {
                 connect.connect(obj.grid, "onRowDblClick", obj.grid, function 
(evt)
                 {
-                    var idx = evt.rowIndex, theItem = this.getItem(idx);
-                    var name = obj.dataStore.getValue(theItem, "name");
-                    controller.show("virtualhostlogger", name, vhost, 
theItem.id);
+                    var theItem = this.getItem(evt.rowIndex);
+                    controller.showById(theItem.id);
                 });
             }, gridProperties, EnhancedGrid);
 

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHostNode.js
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHostNode.js?rev=1754027&r1=1754026&r2=1754027&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHostNode.js
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHostNode.js
 Mon Jul 25 15:13:24 2016
@@ -158,12 +158,12 @@ define(["dojo/parser",
             {
                 updater.add(that.vhostNodeUpdater);
             });
-        }
+        };
 
         VirtualHostNode.prototype.showVirtualHost = function (item)
         {
-            this.controller.show("virtualhost", item.name, this.modelObj, 
item.id);
-        }
+            this.controller.showById(item.id);
+        };
 
         VirtualHostNode.prototype.close = function ()
         {
@@ -173,10 +173,10 @@ define(["dojo/parser",
         VirtualHostNode.prototype.destroy = function ()
         {
             this.close();
-            this.contentPane.onClose()
+            this.contentPane.onClose();
             this.controller.tabContainer.removeChild(this.contentPane);
             this.contentPane.destroyRecursive();
-        }
+        };
 
         function Updater(virtualHostNode)
         {

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/controller.js
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/controller.js?rev=1754027&r1=1754026&r2=1754027&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/controller.js
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/controller.js
 Mon Jul 25 15:13:24 2016
@@ -109,67 +109,78 @@ define(["dojo/dom",
 
         controller.viewedObjects = {};
 
-        var generateTabObjId = function(objType, name, parent)
+        var generateTabObjId = function(tabData)
         {
-            var parentPart = (parent ? util.generateName(parent) + "/" : "");
-            var namePart = null;
-            if (typeof name === 'string')
+            if (tabData.preferenceId)
             {
-                namePart = name;
+                return tabData.preferenceId;
             }
-            else if (name &&  typeof name === 'object' && 
name.hasOwnProperty("name"))
+            else if (tabData.configuredObjectId)
             {
-                namePart = name.name;
+                return tabData.configuredObjectId;
             }
             else
             {
-                namePart = "new-" + dojox.uuid.generateRandomUuid();
+                return tabData.tabType;
             }
-            return parentPart + objType + ":" + namePart;
         };
 
-        // TODO: find a better way how to pass business object into a tab 
instead of passing it as a name
-        controller.show = function (objType, nameOrObject, parent, objectId)
+        controller.showById = function(id)
         {
+            var item = this.structure.findById(id);
+            if (item != null)
+            {
+                this.showTab({
+                    tabType: item.type,
+                    name: item.name,
+                    parent: item.parent,
+                    configuredObjectId: item.id
+                });
+            }
+        };
+
+        controller.showTab = function (tabData)
+        {
+            var tabType = tabData.tabType;
+            var name = tabData.name;
+            var parent = tabData.parent;
+
             var that = this;
-            var objId = generateTabObjId(objType, nameOrObject, parent);
+            var tabObjectId = generateTabObjId(tabData);
 
-            var obj = this.viewedObjects[objId];
-            if (obj)
+            var tabObject = this.viewedObjects[tabObjectId];
+            if (tabObject)
             {
-                this.tabContainer.selectChild(obj.contentPane);
+                this.tabContainer.selectChild(tabObject.contentPane);
             }
             else
             {
-                var Constructor = constructors[objType];
+                var Constructor = constructors[tabType];
                 if (Constructor)
                 {
-                    obj = new Constructor(nameOrObject, parent, this);
-                    obj.tabId = objId;
-                    obj.tabData = {
-                        objectId: objectId,
-                        objectType: objType
-                    };
-                    this.viewedObjects[objId] = obj;
+                    tabObject = new Constructor(name, parent, this);
+                    tabObject.tabId = tabObjectId;
+                    tabObject.tabData = tabData;
+                    this.viewedObjects[tabObjectId] = tabObject;
 
                     var contentPane = new ContentPane({
                         region: "center",
-                        title: entities.encode(obj.getTitle()),
+                        title: entities.encode(tabObject.getTitle()),
                         closable: true,
                         onClose: function ()
                         {
-                            obj.close();
-                            delete that.viewedObjects[obj.tabId];
+                            tabObject.close();
+                            delete that.viewedObjects[tabObject.tabId];
                             return true;
                         }
                     });
                     this.tabContainer.addChild(contentPane);
                     var userPreferences = this.management.userPreferences;
-                    if (objType != "broker" && nameOrObject &&  typeof 
nameOrObject === 'string')
+                    if (tabType != "broker")
                     {
                         var preferencesCheckBox = new dijit.form.CheckBox({
-                            checked: userPreferences.isTabStored(obj.tabData),
-                            title: "If checked the tab is saved in user 
preferences and restored on next login"
+                            checked: 
userPreferences.isTabStored(tabObject.tabData),
+                            title: "If checked the tab will be restored on 
next login"
                         });
                         var tabs = this.tabContainer.tablist.getChildren();
                         preferencesCheckBox.placeAt(tabs[tabs.length - 
1].titleNode, "first");
@@ -177,19 +188,19 @@ define(["dojo/dom",
                         {
                             if (value)
                             {
-                                userPreferences.appendTab(obj.tabData);
+                                userPreferences.appendTab(tabObject.tabData);
                             }
                             else
                             {
-                                userPreferences.removeTab(obj.tabData);
+                                userPreferences.removeTab(tabObject.tabData);
                             }
                         });
                     }
-                    obj.open(contentPane);
+                    tabObject.open(contentPane);
                     contentPane.startup();
-                    if (obj.startup)
+                    if (tabObject.startup)
                     {
-                        obj.startup();
+                        tabObject.startup();
                     }
                     this.tabContainer.selectChild(contentPane);
                 }
@@ -198,6 +209,56 @@ define(["dojo/dom",
 
         };
 
+        var openTabs = function (controller, management, structure)
+        {
+            try
+            {
+                var brokers = structure.findByType("broker");
+                if (brokers[0])
+                {
+                    controller.showById(brokers[0].id);
+                }
+
+                var tabs = management.userPreferences.getSavedTabs();
+                if (tabs)
+                {
+                    for (var i in tabs)
+                    {
+                        var tab = tabs[i];
+                        if (tab.configuredObjectId)
+                        {
+                            var modelObject = 
structure.findById(tab.configuredObjectId);
+                            if (modelObject)
+                            {
+                                if 
(management.metadata.isCategory(tab.tabType))
+                                {
+                                    tab.name = modelObject.name;
+                                    tab.parent = modelObject.parent;
+                                }
+                                else
+                                {
+                                    tab.parent = modelObject;
+                                }
+                                controller.showTab(tab);
+                            }
+                            else
+                            {
+                                management.userPreferences.removeTab(tab);
+                            }
+                        }
+                        else
+                        {
+                            controller.showTab(tab);
+                        }
+                    }
+                }
+            }
+            catch (e)
+            {
+                console.error(e);
+            }
+        };
+
         controller.init = function (management, structure, treeView)
         {
             controller.management = management;
@@ -217,28 +278,20 @@ define(["dojo/dom",
             initialUpdate.then(lang.hitch(this, function ()
             {
                 updater.add({update : structureUpdate});
+
+                openTabs(controller, management, structure);
             }));
         };
 
-        controller.update = function(tabObject, name, parent, objectId)
+        controller.update = function(tabObject, tabData)
         {
-            var objType = tabObject.tabData.objectType;
             var tabId = tabObject.tabId;
             delete this.viewedObjects[tabId];
-            var newTabId = generateTabObjId(objType, name, parent);
+            var newTabId = generateTabObjId(tabData.tabType, tabData.name, 
tabData.parent);
             this.viewedObjects[newTabId] = tabObject;
-            tabObject.tabData.objectId = objectId;
+            tabObject.tabData.preferenceId = tabData.preferenceId;
             tabObject.tabId = newTabId;
         };
 
-        controller.showById = function(id)
-        {
-            var item = this.structure.findById(id);
-            if (item != null)
-            {
-                this.show(item.type, item.name, item.parent, item.id);
-            }
-        };
-
         return controller;
     });

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/GroupManagingGroupProvider.js
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/GroupManagingGroupProvider.js?rev=1754027&r1=1754026&r2=1754027&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/GroupManagingGroupProvider.js
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/GroupManagingGroupProvider.js
 Mon Jul 25 15:13:24 2016
@@ -103,9 +103,8 @@ define(["dojo/dom",
                     {
                         connect.connect(obj.grid, "onRowDblClick", obj.grid, 
function (evt)
                         {
-                            var idx = evt.rowIndex, theItem = 
this.getItem(idx);
-                            var name = obj.dataStore.getValue(theItem, "name");
-                            that.controller.show("group", name, 
groupProviderObj, theItem.id);
+                            var theItem = this.getItem(evt.rowIndex);
+                            that.controller.showById(theItem.id);
                         });
                     }, gridProperties, EnhancedGrid);
                     var addGroupButton = query(".addGroupButton", node)[0];

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/LogViewer.js
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/LogViewer.js?rev=1754027&r1=1754026&r2=1754027&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/LogViewer.js
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/LogViewer.js
 Mon Jul 25 15:13:24 2016
@@ -215,7 +215,7 @@ define(["dojo/_base/xhr",
             };
             this.grid.on("styleRow", onStyleRow);
             this.grid.startup();
-            userPreferences.addListener(this);
+            userPreferences.addListener(this, 
userPreferences.timeZonePreferenceName);
         }
         catch (err)
         {
@@ -226,7 +226,7 @@ define(["dojo/_base/xhr",
         }
     };
 
-    LogViewer.prototype.onPreferencesChange = function (data)
+    LogViewer.prototype.onPreferenceChange = function (data)
     {
         var userPreferences = this.management.userPreferences;
         currentTimeZone = userPreferences.getTimeZoneDescription();

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryCreateDialogForm.js
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryCreateDialogForm.js?rev=1754027&r1=1754026&r2=1754027&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryCreateDialogForm.js
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryCreateDialogForm.js
 Mon Jul 25 15:13:24 2016
@@ -24,6 +24,7 @@ define(["dojo/_base/declare",
         "dojo/text!query/QueryCreateDialogForm.html",
         "dojo/Evented",
         "dojo/store/Memory",
+        "dojox/uuid/generateRandomUuid",
         "dijit/form/Form",
         "dijit/form/Button",
         "dijit/form/FilteringSelect",
@@ -33,7 +34,7 @@ define(["dojo/_base/declare",
         "dijit/_WidgetsInTemplateMixin",
         "dojox/validate/us",
         "dojox/validate/web",
-        "dojo/domReady!"], function (declare, lang, template, Evented, Memory)
+        "dojo/domReady!"], function (declare, lang, template, Evented, Memory, 
generateRandomUuid)
 {
     var getCategoryMetadata = function (management, value)
     {
@@ -113,7 +114,7 @@ define(["dojo/_base/declare",
             },
             _postCreate: function ()
             {
-                this.initScope()
+                this.initScope();
                 this.cancelButton.on("click", lang.hitch(this, 
this._onCancel));
                 this.okButton.on("click", lang.hitch(this, 
this._onFormSubmit));
                 this.scope.on("change", lang.hitch(this, this._onChange));
@@ -137,7 +138,7 @@ define(["dojo/_base/declare",
                     if (getCategoryMetadata(this.management, category))
                     {
                         var data = {
-                            preference: {value: {category: category}},
+                            preference: {value: {category: category}, id : 
generateRandomUuid()},
                             parentObject: 
this._scopeModelObjects[this.scope.value]
                         };
                         this.emit("create", data);

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryWidget.js
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryWidget.js?rev=1754027&r1=1754026&r2=1754027&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryWidget.js
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/QueryWidget.js
 Mon Jul 25 15:13:24 2016
@@ -452,11 +452,7 @@ define(["dojo/_base/declare",
                 },
                 _showModeSwitchWarningIfRequired: function ()
                 {
-                    var userPreferences = this.management.userPreferences;
-                    var displayWarning = (!userPreferences || 
!userPreferences.query
-                                          || 
(userPreferences.query.displaySwitchModeWarning == undefined
-                                          || 
userPreferences.query.displaySwitchModeWarning));
-                    if (this._standardMode && displayWarning && 
QueryWidget.showWarningOnModeChange)
+                    if (this._standardMode && 
QueryWidget.showWarningOnModeChange)
                     {
                         if (!this._switchModeWarningDialog)
                         {
@@ -470,22 +466,7 @@ define(["dojo/_base/declare",
                             }, domConstruct.create("div"));
                             this._switchModeWarningDialog.on("execute", 
lang.hitch(this, function (stopDisplaying)
                             {
-                                if (stopDisplaying)
-                                {
-                                    if (!userPreferences.query)
-                                    {
-                                        userPreferences.query = {};
-                                    }
-                                    
userPreferences.query.displaySwitchModeWarning = false;
-                                    userPreferences.save({query: 
userPreferences.query}, null, function (error)
-                                    {
-                                        console.log("Saving user preferences 
failed: " + error);
-                                    });
-                                }
-                                else
-                                {
-                                    QueryWidget.showWarningOnModeChange = 
false;
-                                }
+                                QueryWidget.showWarningOnModeChange = 
!stopDisplaying;
                                 this._modeChanged();
                             }));
                         }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to