From 4b4d4ce4f3f1c401903411d43b91a700c6a8fb8b Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Thu, 11 Sep 2014 17:37:32 +0000 Subject: QPID-6093: Add UI to set context variables git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1624345 13f79535-47bb-0310-9956-ffa450edef68 --- .../js/qpid/management/store/pool/bonecp/add.js | 33 +- .../js/qpid/management/store/pool/bonecp/edit.js | 27 +- .../js/qpid/management/store/pool/bonecp/show.js | 3 +- .../virtualhost/store/pool/bonecp/add.html | 55 --- .../virtualhostnode/store/pool/bonecp/add.html | 55 --- .../js/qpid/management/store/pool/none/add.js | 21 +- .../js/qpid/management/virtualhost/jdbc/add.js | 2 +- .../js/qpid/management/virtualhost/jdbc/edit.js | 2 +- .../js/qpid/management/virtualhost/jdbc/show.js | 2 +- .../js/qpid/management/virtualhostnode/jdbc/add.js | 2 +- .../qpid/management/virtualhostnode/jdbc/edit.js | 2 +- .../qpid/management/virtualhostnode/jdbc/show.js | 2 +- .../rest/ConfiguredObjectToMapConverter.java | 42 +- .../plugin/servlet/rest/RestServlet.java | 10 +- .../addVirtualHostNodeAndVirtualHost.html | 11 + .../resources/common/ContextVariablesEditor.html | 35 ++ .../src/main/java/resources/css/common.css | 23 + .../src/main/java/resources/editBroker.html | 118 +++++ .../src/main/java/resources/editVirtualHost.html | 5 + .../main/java/resources/editVirtualHostNode.html | 4 + .../js/qpid/common/ContextVariablesEditor.js | 526 +++++++++++++++++++++ .../java/resources/js/qpid/management/Broker.js | 110 +---- .../js/qpid/management/VirtualHostNode.js | 3 +- .../management/addVirtualHostNodeAndVirtualHost.js | 80 +++- .../resources/js/qpid/management/editBroker.js | 196 ++++++++ .../js/qpid/management/editVirtualHost.js | 30 +- .../js/qpid/management/editVirtualHostNode.js | 33 +- .../rest/ConfiguredObjectToMapConverterTest.java | 1 + 28 files changed, 1113 insertions(+), 320 deletions(-) delete mode 100644 qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/resources/virtualhost/store/pool/bonecp/add.html delete mode 100644 qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/resources/virtualhostnode/store/pool/bonecp/add.html create mode 100644 qpid/java/broker-plugins/management-http/src/main/java/resources/common/ContextVariablesEditor.html create mode 100644 qpid/java/broker-plugins/management-http/src/main/java/resources/editBroker.html create mode 100644 qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ContextVariablesEditor.js create mode 100644 qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editBroker.js (limited to 'qpid/java') diff --git a/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/resources/js/qpid/management/store/pool/bonecp/add.js b/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/resources/js/qpid/management/store/pool/bonecp/add.js index db3bf8f57b..0ec991ea16 100644 --- a/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/resources/js/qpid/management/store/pool/bonecp/add.js +++ b/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/resources/js/qpid/management/store/pool/bonecp/add.js @@ -32,34 +32,13 @@ define(["dojo/_base/xhr", "dijit/form/FilteringSelect", "dojo/domReady!"], function (xhr, dom, construct, win, registry, parser, array, event, json, string, Memory, FilteringSelect) { - var fieldNames = ["maxConnectionsPerPartition", "minConnectionsPerPartition", "partitionCount"]; return { - show: function(poolSpecificDivId, formFieldPrefix, htmlUrl) { - var node = dom.byId(poolSpecificDivId); - var that = this; - - array.forEach(registry.toArray(), - function(item) { - if(item.id.substr(0,formFieldPrefix.length) == formFieldPrefix) { - item.destroyRecursive(); - } - }); - - xhr.get({url: htmlUrl, - sync: true, - load: function(data) { - - node.innerHTML = data; - parser.parse(node); - - for ( var i = 0 ; i < fieldNames.length; i++ ) - { - var widgetName = fieldNames[i]; - var widget = registry.byId(formFieldPrefix + widgetName); - widget.set("regExpGen", util.numericOrContextVarRegexp); - } - - }}); + show: function(data) { + data.context.addInheritedContext({ + "qpid.jdbcstore.bonecp.partitionCount": "4", + "qpid.jdbcstore.bonecp.minConnectionsPerPartition": "5", + "qpid.jdbcstore.bonecp.maxConnectionsPerPartition": "10" + }); } }; }); diff --git a/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/resources/js/qpid/management/store/pool/bonecp/edit.js b/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/resources/js/qpid/management/store/pool/bonecp/edit.js index 0179f38d07..6876e3850b 100644 --- a/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/resources/js/qpid/management/store/pool/bonecp/edit.js +++ b/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/resources/js/qpid/management/store/pool/bonecp/edit.js @@ -27,32 +27,7 @@ define(["dojo/_base/xhr", "qpid/common/util", "dojo/domReady!"], function (xhr, dom, construct, win, registry, parser, util) { - var fieldNames = ["maxConnectionsPerPartition", "minConnectionsPerPartition", "partitionCount"]; return { - show: function(data) { - var that = this; - xhr.get({url: "virtualhost/store/pool/bonecp/add.html", - sync: true, - load: function(template) { - for ( var i = 0 ; i < fieldNames.length; i++ ) - { - var widgetName = fieldNames[i]; - var widget = registry.byId("formAddVirtualHost.qpid.jdbcstore.bonecp." + widgetName); - if (widget) - { - widget.destroyRecursive(); - } - } - data.containerNode.innerHTML = template; - parser.parse(data.containerNode); - for ( var i = 0 ; i < fieldNames.length; i++ ) - { - var widgetName = fieldNames[i]; - var widget = registry.byId("formAddVirtualHost.qpid.jdbcstore.bonecp." + widgetName); - widget.set("value", data.data.context["qpid.jdbcstore.bonecp." + widgetName]); - widget.set("regExpGen", util.numericOrContextVarRegexp); - } - }}); - } + show: function(data) { } }; }); diff --git a/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/resources/js/qpid/management/store/pool/bonecp/show.js b/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/resources/js/qpid/management/store/pool/bonecp/show.js index c0556c28fd..31e5db5035 100644 --- a/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/resources/js/qpid/management/store/pool/bonecp/show.js +++ b/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/resources/js/qpid/management/store/pool/bonecp/show.js @@ -51,10 +51,11 @@ define(["dojo/_base/xhr", BoneCP.prototype.update=function(data) { + for(var i=0; i -
-
-BoneCP Settings - - - - - - - - - - - - - - - -
Partition Count: - -
Minimum connections per Partition: - -
Maximum connections per Partition: - -
-
-
diff --git a/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/resources/virtualhostnode/store/pool/bonecp/add.html b/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/resources/virtualhostnode/store/pool/bonecp/add.html deleted file mode 100644 index 810a232091..0000000000 --- a/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/resources/virtualhostnode/store/pool/bonecp/add.html +++ /dev/null @@ -1,55 +0,0 @@ - -
-
-BoneCP Settings - - - - - - - - - - - - - - - -
Partition Count: - -
Minimum connections per Partition: - -
Maximum connections per Partition: - -
-
-
diff --git a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/store/pool/none/add.js b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/store/pool/none/add.js index ccdcf643fb..44405c610b 100644 --- a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/store/pool/none/add.js +++ b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/store/pool/none/add.js @@ -33,24 +33,9 @@ define(["dojo/_base/xhr", "dojo/domReady!"], function (xhr, dom, construct, win, registry, parser, array, event, json, string, Memory, FilteringSelect) { return { - show: function(poolSpecificDivId, formFieldPrefix, htmlUrl) { - var node = dom.byId(poolSpecificDivId); - var that = this; - - array.forEach(registry.toArray(), - function(item) { - if(item.id.substr(0,formFieldPrefix.length) == formFieldPrefix) { - item.destroyRecursive(); - } - }); - - xhr.get({url: htmlUrl, - sync: true, - load: function(data) { - node.innerHTML = data; - parser.parse(node); - - }}); + show: function(data) + { + data.context.removeDynamicallyAddedInheritedContext(); } }; }); diff --git a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/add.js b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/add.js index 88b338750d..beb298e988 100644 --- a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/add.js +++ b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/add.js @@ -65,7 +65,7 @@ define(["dojo/_base/xhr", require(["qpid/management/store/pool/"+type.toLowerCase()+"/add"], function(poolType) { - poolType.show("addVirtualHost.poolSpecificDiv", "formAddVirtualHost.qpid.jdbcstore.bonecp", "virtualhost/store/pool/"+type.toLowerCase()+"/add.html"); + poolType.show({containerNode:poolTypeFieldsDiv, context: data.parent.virtualHostContext}); }); } } diff --git a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/edit.js b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/edit.js index 665f560290..90fc246276 100644 --- a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/edit.js +++ b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/edit.js @@ -68,7 +68,7 @@ define(["qpid/common/util", require(["qpid/management/store/pool/"+type.toLowerCase()+"/edit"], function(poolType) { - poolType.show({containerNode:poolTypeFieldsDiv, data: data.data}) + poolType.show({containerNode:poolTypeFieldsDiv, data: data.data, context: data.parent.context}) }); } } diff --git a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/show.js b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/show.js index edca323926..d3fdf50769 100644 --- a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/show.js +++ b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/show.js @@ -35,7 +35,7 @@ define(["qpid/common/util", "dojo/query", "dojo/_base/array", "dojo/dom-construc var previousConnectionPoolType = this.connectionPoolType ? this.connectionPoolType.innerHTML : null; util.updateUI(data, fieldNames, this); this.usernameAttributeContainer.style.display = data.username ? "block" : "none"; - if (!this.poolDetails || previousConnectionPoolType != data.connectionPoolType) + if (data.connectionPoolType && (!this.poolDetails || previousConnectionPoolType != data.connectionPoolType)) { var that = this; require(["qpid/management/store/pool/" + data.connectionPoolType.toLowerCase() + "/show"], diff --git a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/add.js b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/add.js index a285733f0e..d5a7b43aae 100644 --- a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/add.js +++ b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/add.js @@ -67,7 +67,7 @@ define(["dojo/_base/xhr", require(["qpid/management/store/pool/"+type.toLowerCase()+"/add"], function(poolType) { - poolType.show("addVirtualHostNode.poolSpecificDiv", "formAddVirtualHostNode.qpid.jdbcstore.bonecp", "virtualhostnode/store/pool/" + type.toLowerCase() + "/add.html"); + poolType.show({containerNode:poolTypeFieldsDiv, context: data.parent.virtualHostNodeContext}); }); } } diff --git a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/edit.js b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/edit.js index 69fa01871b..828369cae0 100644 --- a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/edit.js +++ b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/edit.js @@ -67,7 +67,7 @@ define(["qpid/common/util", require(["qpid/management/store/pool/"+type.toLowerCase()+"/edit"], function(poolType) { - poolType.show({containerNode:poolTypeFieldsDiv, data: data.data}) + poolType.show({containerNode:poolTypeFieldsDiv, data: data.data, context: data.parent.context}) if (!(data.data.state == "STOPPED" || data.data.state == "ERRORED")) { diff --git a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/show.js b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/show.js index b41fe32010..15c237d0a2 100644 --- a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/show.js +++ b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/show.js @@ -40,7 +40,7 @@ define(["qpid/common/util", "dojo/query", "dojo/_base/array", "dojo/dom-construc util.updateUI(data, fieldNames, this); this.usernameAttributeContainer.style.display = data.username ? "block" : "none"; - if (!this.poolDetails || previousConnectionPoolType != data.connectionPoolType) + if (data.connectionPoolType && (!this.poolDetails || previousConnectionPoolType != data.connectionPoolType)) { var that = this; require(["qpid/management/store/pool/" + data.connectionPoolType.toLowerCase() + "/show"], diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java index 7769263e5a..7bde933bb9 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java @@ -35,6 +35,7 @@ import java.util.TreeMap; import org.apache.qpid.server.model.ConfiguredObject; import org.apache.qpid.server.model.ConfiguredObjectAttribute; +import org.apache.qpid.server.model.Model; public class ConfiguredObjectToMapConverter { @@ -55,10 +56,21 @@ public class ConfiguredObjectToMapConverter final boolean useActualValues, final boolean includeSystemContext, final boolean extractAsConfig) + { + return convertObjectToMap(confObject, clazz, depth, useActualValues, false, includeSystemContext, extractAsConfig); + } + + public Map convertObjectToMap(final ConfiguredObject confObject, + Class clazz, + int depth, + final boolean useActualValues, + final boolean inheritedActuals, + final boolean includeSystemContext, + final boolean extractAsConfig) { Map object = new LinkedHashMap<>(); - incorporateAttributesIntoMap(confObject, object, useActualValues, includeSystemContext, extractAsConfig); + incorporateAttributesIntoMap(confObject, object, useActualValues, inheritedActuals, includeSystemContext, extractAsConfig); if(!extractAsConfig) { incorporateStatisticsIntoMap(confObject, object); @@ -66,7 +78,7 @@ public class ConfiguredObjectToMapConverter if(depth > 0) { - incorporateChildrenIntoMap(confObject, clazz, depth, object, useActualValues, includeSystemContext, extractAsConfig); + incorporateChildrenIntoMap(confObject, clazz, depth, object, useActualValues, inheritedActuals, includeSystemContext, extractAsConfig); } return object; } @@ -76,6 +88,7 @@ public class ConfiguredObjectToMapConverter final ConfiguredObject confObject, Map object, final boolean useActualValues, + final boolean inheritedActuals, final boolean includeSystemContext, final boolean extractAsConfig) { @@ -115,7 +128,7 @@ public class ConfiguredObjectToMapConverter Map contextValues = new HashMap<>(); if (useActualValues) { - contextValues.putAll(confObject.getContext()); + collectContext(contextValues, confObject.getModel(), confObject, inheritedActuals); } else { @@ -165,6 +178,27 @@ public class ConfiguredObjectToMapConverter } } + private void collectContext(Map contextValues, Model model, ConfiguredObject confObject, boolean inheritedContext) + { + Object value = confObject.getActualAttributes().get(ConfiguredObject.CONTEXT); + if (inheritedContext) + { + Collection> parents = model.getParentTypes(confObject.getCategoryClass()); + if(parents != null && !parents.isEmpty()) + { + ConfiguredObject parent = confObject.getParent(parents.iterator().next()); + if(parent != null) + { + collectContext(contextValues, model, parent, inheritedContext); + } + } + } + if (value instanceof Map) + { + contextValues.putAll((Map)value); + } + } + private void incorporateStatisticsIntoMap( final ConfiguredObject confObject, Map object) { @@ -184,6 +218,7 @@ public class ConfiguredObjectToMapConverter int depth, Map object, final boolean useActualValues, + final boolean inheritedActuals, final boolean includeSystemContext, final boolean extractAsConfig) { @@ -225,6 +260,7 @@ public class ConfiguredObjectToMapConverter childClass, depth - 1, useActualValues, + inheritedActuals, includeSystemContext, extractAsConfig)); } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java index efe644ca43..0bc0a4514f 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java @@ -59,6 +59,7 @@ public class RestServlet extends AbstractServlet public static final String ACTUALS_PARAM = "actuals"; public static final String SORT_PARAM = "sort"; public static final String INCLUDE_SYS_CONTEXT_PARAM = "includeSysContext"; + public static final String INHERITED_ACTUALS_PARAM = "inheritedActuals"; public static final String EXTRACT_INITIAL_CONFIG_PARAM = "extractInitialConfig"; public static final Set RESERVED_PARAMS = @@ -66,7 +67,8 @@ public class RestServlet extends AbstractServlet SORT_PARAM, ACTUALS_PARAM, INCLUDE_SYS_CONTEXT_PARAM, - EXTRACT_INITIAL_CONFIG_PARAM)); + EXTRACT_INITIAL_CONFIG_PARAM, + INHERITED_ACTUALS_PARAM)); private Class[] _hierarchy; @@ -326,25 +328,27 @@ public class RestServlet extends AbstractServlet int depth; boolean actuals; boolean includeSystemContext; - + boolean inheritedActuals; if(extractInitialConfig) { depth = Integer.MAX_VALUE; actuals = true; includeSystemContext = false; + inheritedActuals = false; } else { depth = getDepthParameterFromRequest(request); actuals = getBooleanParameterFromRequest(request, ACTUALS_PARAM); includeSystemContext = getBooleanParameterFromRequest(request, INCLUDE_SYS_CONTEXT_PARAM); + inheritedActuals = getBooleanParameterFromRequest(request, INHERITED_ACTUALS_PARAM); } List> output = new ArrayList>(); for(ConfiguredObject configuredObject : allObjects) { output.add(_objectConverter.convertObjectToMap(configuredObject, getConfiguredClass(), - depth, actuals, includeSystemContext, extractInitialConfig)); + depth, actuals, inheritedActuals, includeSystemContext, extractInitialConfig)); } Writer writer = getOutputWriter(request, response); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/addVirtualHostNodeAndVirtualHost.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/addVirtualHostNodeAndVirtualHost.html index 738af25332..685b3bced4 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/addVirtualHostNodeAndVirtualHost.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/addVirtualHostNodeAndVirtualHost.html @@ -58,6 +58,12 @@
+ +
+
+
+ + @@ -85,6 +91,11 @@
+ +
+
+
+ diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/common/ContextVariablesEditor.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/common/ContextVariablesEditor.html new file mode 100644 index 0000000000..60fc0843eb --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/common/ContextVariablesEditor.html @@ -0,0 +1,35 @@ + +
+
+
+
+
+ + + + + + +
+
\ No newline at end of file diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/css/common.css b/qpid/java/broker-plugins/management-http/src/main/java/resources/css/common.css index 7076f08b0b..7c8ca2e644 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/css/common.css +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/css/common.css @@ -283,3 +283,26 @@ div .messages { .dijitMultiSelect { width : 14.75em; } + +.highlightedText +{ + font-weight: bold; +} + +.normalText +{ + font-weight: normal; +} + +.contextEditor +{ + margin-left:5px; + margin-right:5px; +} + +.contextGrid +{ + width:100%; + max-height: 140px; + overflow: auto; +} \ No newline at end of file diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/editBroker.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/editBroker.html new file mode 100644 index 0000000000..2516396d4d --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/editBroker.html @@ -0,0 +1,118 @@ + +
+
+
+
+
+
Name*:
+
+ +
+
+
+
Default Virtual Host*:
+
+ +
+
+
+
Statistics reporting period (ms):
+
+ +
+
+
+
Statistics reporting period enabled:
+
+ +
+
+ +
+
+ Global Connection Defaults +
+
Maximum number of sessions:
+
+ +
+
+
+
Heart beat delay (ms)::
+
+ +
+
+
+
+ +
+
+
+ +
+ +
+ + +
+
+
+
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/editVirtualHost.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/editVirtualHost.html index 9b981b055e..29229137bb 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/editVirtualHost.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/editVirtualHost.html @@ -119,8 +119,13 @@ +
+
+
+
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/editVirtualHostNode.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/editVirtualHostNode.html index 4caf718f20..8c2c82fdbd 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/editVirtualHostNode.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/editVirtualHostNode.html @@ -39,6 +39,10 @@
+
+
+
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ContextVariablesEditor.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ContextVariablesEditor.js new file mode 100644 index 0000000000..4f384315ac --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ContextVariablesEditor.js @@ -0,0 +1,526 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +define([ + "qpid/common/util", + "dojo/_base/xhr", + "dojo/_base/declare", + "dojo/_base/array", + "dojo/_base/connect", + "dojo/_base/lang", + "dojo/dom-construct", + "dojo/parser", + "dojo/query", + "dojo/store/Memory", + "dojo/data/ObjectStore", + "dijit/_WidgetBase", + "dijit/registry", + "dojo/text!common/ContextVariablesEditor.html", + "dijit/form/Button", + "dojox/grid/EnhancedGrid", + "dojox/grid/enhanced/_Plugin", + "dijit/form/Select", + "dojox/validate/us", + "dojox/validate/web", + "dojo/domReady!"], +function (util, xhr, declare, array, connect, lang, domConstruct, parser, query, Memory, ObjectStore, _WidgetBase, registry, template) + { + + return declare("qpid.common.ContextVariablesEditor", [_WidgetBase], { + + value: null, + effectiveValues: null, + inheritedActualValues: null, + domNode: null, + _grid: null, + _addButton: null, + _deleteButton: null, + _filterBox: null, + _nextGridItemId: 0, + _dynamicInheritedContext: {}, + + constructor: function(args) + { + this._args = args; + }, + + buildRendering: function() + { + this.domNode = domConstruct.create("div", {innerHTML: template}); + parser.parse(this.domNode); + }, + + postCreate: function() + { + this.inherited(arguments); + var that = this; + var gridNode = query(".grid", this.domNode)[0]; + var addButtonNode = query(".addButton", this.domNode)[0]; + var deleteButtonNode = query(".deleteButton", this.domNode)[0]; + var addButton = registry.byNode(addButtonNode); + var deleteButton = registry.byNode(deleteButtonNode); + var layout = [[ + { name: "Name", field: "name", width: "40%", editable: true }, + { name: 'Actual Value', field: 'actualValue', width: '30%', editable: true}, + { name: 'Effective Value', field: 'effectiveValue', width: '30%', editable: false} + ]]; + var data = []; + var objectStore = new dojo.data.ObjectStore({objectStore: new Memory({data:data, idProperty: "id"})}); + var grid = new dojox.grid.EnhancedGrid({ + selectionMode: "multiple", + store: objectStore, + singleClickEdit: true, + structure: layout, + autoHeight: true, + sortFields: [{attribute: 'name', descending: false}], + plugins: {indirectSelection: true} + }, gridNode); + grid.canEdit = function(inCell, inRowIndex) + { + var item = grid.getItem(inRowIndex); + return inCell.field == "actualValue" || (inCell.field=="name" && item && item["inherited"] == false); + }; + + this._grid = grid; + this._deleteButton = deleteButton; + this._addButtonNode = addButtonNode; + + var toggleGridButtons = function(index) + { + var data = grid.selection.getSelected(); + deleteButton.set("disabled", !data || data.length==0); + }; + + connect.connect(grid.selection, 'onSelected', toggleGridButtons); + connect.connect(grid.selection, 'onDeselected', toggleGridButtons); + connect.connect(grid, 'onStyleRow' , this, function(row) { that._onStyleRow(row); }); + + deleteButton.set("disabled", true); + addButton.on("click", function(event) { that._newItem(); }); + deleteButton.on("click", function(event) { that._deleteSelected(); }); + grid.on("applyEdit", function(inRowIndex) { that._onEdit(inRowIndex); }); + grid.startup(); + this._filterBox = registry.byNode(query(".filter", this.domNode)[0]); + this._filterBox.on("change", function(value) { if (value) { that._filter(value); } }); + }, + resize: function() + { + this._grid.render(); + }, + load: function(restUrl, data) + { + data = data || {}; + var actualValues = data.actualValues; + var allEffectiveValues = data.effectiveValues; + var inheritedActualValues = data.inheritedActualValues; + if (!actualValues) + { + xhr.get( + { + url: restUrl, + sync: true, + content: { actuals: true }, + handleAs: "json", + load: function(data) + { + actualValues = data[0].context; + } + } + ); + } + if (!allEffectiveValues) + { + xhr.get( + { + url: restUrl, + sync: true, + content: { actuals: false }, + handleAs: "json", + load: function(data) + { + allEffectiveValues = data[0].context; + } + } + ); + } + if (!inheritedActualValues) + { + xhr.get( + { + url: restUrl, + sync: true, + content: { actuals: true, inheritedActuals: true}, + handleAs: "json", + load: function(data) + { + inheritedActualValues = data[0].context; + } + } + ); + } + this.setData(actualValues, allEffectiveValues, inheritedActualValues); + }, + setData: function(actualValues, allEffectiveValues, inheritedActualValues) + { + this.value = actualValues; + this.effectiveValues = allEffectiveValues; + this.inheritedActualValues = inheritedActualValues; + + var values = this._mergeValues(actualValues, allEffectiveValues, inheritedActualValues); + this._originalValues = values; + + var grid = this._grid; + if (grid) + { + // delete previous store data + grid.store.fetch({ + onComplete:function(items,request) + { + if(items.length) + { + array.forEach(items, function(item) + { + grid.store.deleteItem(item); + }); + } + } + }); + + // add new data into grid store + this._nextGridItemId = 0; + for(var i=0; i 0) + { + array.forEach(data, function(selectedItem) { + if (selectedItem !== null && !selectedItem["inherited"]) + { + grid.store.deleteItem(selectedItem); + that._deleteOriginalItem(selectedItem.name); + } + }); + grid.store.save(); + grid.selection.deselectAll(); + this._valueChanged(); + } + }, + _deleteOriginalItem: function(key) + { + for(var i=0;i< this._originalValues.length;i++) + { + if (this._originalValues[i].name == key) + { + this._originalValues = this._originalValues.splice(i, 1); + break; + } + } + }, + _onEdit:function(inRowIndex) + { + var grid = this._grid; + var item = grid.getItem(inRowIndex); + var previousItems = this._originalValues; + var previousItemActualValue = null; + for(var i=0;i 0) + { + array.forEach(items, function(item) + { + if (item !== null && item.name && ((item["inherited"] && item.changed) || !item["inherited"])) + { + value[item.name]=item.actualValue; + } + }); + } + } + }); + if (!util.equals(this.value, value)) + { + this.value = value; + this._handleOnChange(value); + } + } + }, + _setValueAttr: function(actualValues) + { + this.value = actualValues; + if (this.inheritedActualValues!=null && this.effectiveValues != null) + { + this.setData(this.value, this.effectiveValues, this.inheritedActualValues); + } + }, + _setEffectiveValuesAttr: function(effectiveValues) + { + this.effectiveValues = effectiveValues; + if (this.value != null && this.inheritedActualValues !=null) + { + this.setData(this.value, this.effectiveValues, this.inheritedActualValues); + } + }, + _setInheritedActualValues: function(inheritedActualValues) + { + this.inheritedActualValues = inheritedActualValues; + if (this.value!= null && this.effectiveValues != null) + { + this.setData(this.value, this.effectiveValues, this.inheritedActualValues); + } + }, + _mergeValues: function(actualValues, allEffectiveValues, inheritedActualValues) + { + var fields = []; + + if (allEffectiveValues) + { + for(var key in allEffectiveValues) + { + if (!actualValues || !(key in actualValues)) + { + var actualValue = inheritedActualValues && key in inheritedActualValues ? inheritedActualValues[key] : allEffectiveValues[key]; + fields.push({name: key, actualValue: actualValue, effectiveValue: allEffectiveValues[key], "inherited": true}); + } + } + } + + if (actualValues) + { + for(var key in actualValues) + { + var effectiveValue = allEffectiveValues && key in allEffectiveValues ? allEffectiveValues[key]: actualValues[key]; + fields.push({name: key, actualValue: actualValues[key], effectiveValue: effectiveValue, "inherited": false}); + } + } + return fields; + }, + _handleOnChange: function(newValue) + { + if (!util.equals(this._lastValueReported, newValue)) + { + this._lastValueReported = newValue; + if(this._onChangeHandle) + { + this._onChangeHandle.remove(); + } + this._onChangeHandle = this.defer(function() + { + this._onChangeHandle = null; + this.onChange(newValue); + }); + } + } + + }); +}); \ No newline at end of file diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js index 81a21cf736..fb91a95de9 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js @@ -36,6 +36,7 @@ define(["dojo/_base/xhr", "qpid/management/addKeystore", "qpid/management/addGroupProvider", "qpid/management/addAccessControlProvider", + "qpid/management/editBroker", "dojox/grid/enhanced/plugins/Pagination", "dojox/grid/enhanced/plugins/IndirectSelection", "dijit/layout/AccordionContainer", @@ -49,7 +50,8 @@ define(["dojo/_base/xhr", "dijit/Menu", "dijit/MenuItem", "dojo/domReady!"], - function (xhr, parser, query, json, connect, properties, updater, util, UpdatableStore, EnhancedGrid, registry, entities, addAuthenticationProvider, addVirtualHostNodeAndVirtualHost, addPort, addKeystore, addGroupProvider, addAccessControlProvider) { + function (xhr, parser, query, json, connect, properties, updater, util, UpdatableStore, EnhancedGrid, registry, entities, + addAuthenticationProvider, addVirtualHostNodeAndVirtualHost, addPort, addKeystore, addGroupProvider, addAccessControlProvider, editBroker) { function Broker(name, parent, controller) { this.name = name; @@ -60,95 +62,6 @@ define(["dojo/_base/xhr", this.modelObj.parent = {}; this.modelObj.parent[ parent.type] = parent; } - this.attributeWidgetFactories = [{ - name: "name", - createWidget: function(brokerData) { - return new dijit.form.ValidationTextBox({ - required: true, - trim: true, - regExpGen: util.nameOrContextVarRegexp, - value: brokerData.name, - label: "Name*:", - name: "name", - promptMessage: "Identifies the broker instance."}) - } - }, { - name: "defaultVirtualHost", - createWidget: function(brokerData) { - var nodes = brokerData.virtualhostnodes; - var data = []; - if (nodes) { - for (var i=0; i< nodes.length; i++) { - if (nodes[i].virtualhosts) - { - data.push({id: nodes[i].virtualhosts[0].name, name: nodes[i].virtualhosts[0].name}); - } - } - } - var hostsStore = new dojo.store.Memory({ data: data }); - return new dijit.form.FilteringSelect({ - required: true, store: hostsStore, - value: brokerData.defaultVirtualHost, - label: "Default Virtual Host*:", - name: "defaultVirtualHost", - promptMessage: "Default virtual host used for clients that don't specify one when connecting."}) - } - }, { - name: "statisticsReportingPeriod", - createWidget: function(brokerData) { - return new dijit.form.ValidationTextBox({ - trim: "true", - regExpGen: util.numericOrContextVarRegexp, - required: false, - value: brokerData.statisticsReportingPeriod, - placeholder: "Time in ms", - label: "Statistics reporting period (ms):", - name: "statisticsReportingPeriod", - promptMessage: "Frequency with which statistics are reported to broker log." - }); - } - }, { - name: "statisticsReportingResetEnabled", - createWidget: function(brokerData) - { - return new dijit.form.CheckBox({ - required: false, checked: brokerData.statisticsReportingResetEnabled, value: "true", - label: "Statistics reporting period enabled:", - name: "statisticsReportingResetEnabled" - }); - } - }, { - name: "connection.sessionCountLimit", - groupName: "Global Connection Defaults", - createWidget: function(brokerData) - { - return new dijit.form.ValidationTextBox({ - trim: "true", - regExpGen: util.numericOrContextVarRegexp, - required: false, - value: brokerData["connection.sessionCountLimit"], - placeholder: "Number of sessions", - label: "Maximum number of sessions:", - name: "connection.sessionCountLimit", - promptMessage: "Maximum number of sessions per connection" - }); - } - }, { - name: "connection.heartBeatDelay", - createWidget: function(brokerData) { - return new dijit.form.ValidationTextBox({ - trim: "true", - regExpGen: util.numericOrContextVarRegexp, - invalidMessage: "Invalid value", - required: false, - value: brokerData["connection.heartBeatDelay"], - placeholder: "Time in ms", - label: "Heart beat delay (ms):", - name: "connection.heartBeatDelay", - promptMessage: "Interval between heart beat messages exchanged between broker and clients" - }); - } - } ]; } Broker.prototype.getTitle = function() @@ -227,20 +140,9 @@ define(["dojo/_base/xhr", var editButton = query(".editBroker", contentPane.containerNode)[0]; connect.connect(registry.byNode(editButton), "onClick", - function(evt){ - var query = "api/latest/broker"; - - xhr.get({url: query, sync: properties.useSyncGet, handleAs: "json", content: { actuals: true, depth: 2 }}) - .then(function(data) - { - var brokerData = data[0]; - - util.showSetAttributesDialog( - that.attributeWidgetFactories, - brokerData, - query, - "Set broker attributes", "Broker", "broker"); - }); + function(evt) + { + editBroker.show(that.brokerUpdater.brokerData); } ); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHostNode.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHostNode.js index 455cfbb410..76eaadad18 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHostNode.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHostNode.js @@ -107,7 +107,7 @@ define(["dojo/_base/xhr", this.editNodeButton.on("click", function(event) { - editVirtualHostNode.show(that.name); + editVirtualHostNode.show(that.vhostNodeUpdater.nodeData); } ); @@ -179,6 +179,7 @@ define(["dojo/_base/xhr", xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"}).then( function(data) { + that.nodeData = data[0]; that.updateUI(data[0]); } ); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addVirtualHostNodeAndVirtualHost.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addVirtualHostNodeAndVirtualHost.js index 02eb8cd2b6..96da8dc5fa 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addVirtualHostNodeAndVirtualHost.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addVirtualHostNodeAndVirtualHost.js @@ -36,6 +36,9 @@ define(["dojo/_base/xhr", "qpid/common/util", "qpid/common/metadata", "dojo/text!addVirtualHostNodeAndVirtualHost.html", + "qpid/common/ContextVariablesEditor", + "dijit/TitlePane", + "dijit/layout/ContentPane", "dijit/form/Form", "dijit/form/CheckBox", "dijit/form/RadioButton", @@ -100,7 +103,65 @@ define(["dojo/_base/xhr", this.virtualHostForm.reset(); this.virtualHostType.set("value", null); + if (!this.virtualHostNodeContext) + { + this.virtualHostNodeContext = new qpid.common.ContextVariablesEditor({name: 'context', title: 'Context variables'}); + this.virtualHostNodeContext.placeAt(dom.byId("addVirtualHostNode.context")); + var that = this; + this.virtualHostNodeContext.on("change", function(value){ + var inherited = that.virtualHostContext.inheritedActualValues; + var effective = that.virtualHostContext.effectiveValues; + var actuals = that.virtualHostContext.value; + for(var key in value) + { + var val = value[key]; + if (!(key in actuals)) + { + inherited[key] = val; + if (!(key in effective)) + { + effective[key] = val.indexOf("${") == -1 ? val : ""; + } + } + } + that.virtualHostContext.setData(that.virtualHostContext.value,effective,inherited); + }); + } + if (!this.virtualHostContext) + { + this.virtualHostContext = new qpid.common.ContextVariablesEditor({name: 'context', title: 'Context variables'}); + this.virtualHostContext.placeAt(dom.byId("addVirtualHost.context")); + + } + var inheritedActualValues = null; + xhr.get( + { + url: "api/latest/broker", + sync: true, + content: { actuals: true, inheritedActuals: true}, + handleAs: "json", + load: function(data) + { + inheritedActualValues = data[0].context; + } + } + ); + var effectiveValues = null; + xhr.get( + { + url: "api/latest/broker", + sync: true, + handleAs: "json", + load: function(data) + { + effectiveValues = data[0].context; + } + } + ); + + this.virtualHostNodeContext.setData({},effectiveValues,inheritedActualValues); + this.virtualHostContext.setData({},effectiveValues,inheritedActualValues); this.dialog.show(); }, destroy: function() @@ -133,7 +194,14 @@ define(["dojo/_base/xhr", var widgets = registry.findWidgets(typeFieldsContainer); array.forEach(widgets, function(item) { item.destroyRecursive();}); domConstruct.empty(typeFieldsContainer); - + if (category) + { + var context = this["v" + category.substring(1) + "Context"]; + if (context) + { + context.removeDynamicallyAddedInheritedContext(); + } + } if (type) { var that = this; @@ -214,7 +282,17 @@ define(["dojo/_base/xhr", var success = false,failureReason=null; var virtualHostNodeData = this._getValues(this.virtualHostNodeForm); + var virtualHostNodeContext = this.virtualHostNodeContext.get("value"); + if (virtualHostNodeContext) + { + virtualHostNodeData["context"] = virtualHostNodeContext; + } var virtualHostData = this._getValues(this.virtualHostForm); + var virtualHostContext = this.virtualHostContext.get("value"); + if (virtualHostContext) + { + virtualHostData["context"] = virtualHostContext; + } //Default the VH name to be the same as the VHN name. virtualHostData["name"] = virtualHostNodeData["name"]; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editBroker.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editBroker.js new file mode 100644 index 0000000000..d83db74b65 --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editBroker.js @@ -0,0 +1,196 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +define(["dojo/_base/xhr", + "dojox/html/entities", + "dojo/_base/array", + "dojo/_base/event", + "dojo/_base/lang", + "dojo/_base/window", + "dojo/dom", + "dojo/dom-construct", + "dijit/registry", + "dojo/parser", + 'dojo/json', + "dojo/query", + "dojo/store/Memory", + "dojo/data/ObjectStore", + "qpid/common/util", + "dojo/text!editBroker.html", + "qpid/common/ContextVariablesEditor", + "dijit/Dialog", + "dijit/form/CheckBox", + "dijit/form/FilteringSelect", + "dijit/form/ValidationTextBox", + "dijit/form/Button", + "dijit/form/Form", + "dojox/validate/us", + "dojox/validate/web", + "dojo/domReady!"], + function (xhr, entities, array, event, lang, win, dom, domConstruct, registry, parser, json, query, Memory, ObjectStore, util, template) + { + var fields = [ "name", "defaultVirtualHost", "statisticsReportingPeriod", "statisticsReportingResetEnabled", "connection.sessionCountLimit", "connection.heartBeatDelay"]; + var numericFieldNames = ["statisticsReportingPeriod", "connection.sessionCountLimit", "connection.heartBeatDelay"]; + + var brokerEditor = + { + init: function() + { + var that=this; + this.containerNode = domConstruct.create("div", {innerHTML: template}); + parser.parse(this.containerNode); + + this.dialog = registry.byId("editBrokerDialog"); + this.saveButton = registry.byId("editBroker.saveButton"); + this.cancelButton = registry.byId("editBroker.cancelButton"); + this.cancelButton.on("click", function(e){that._cancel(e);}); + this.saveButton.on("click", function(e){that._save(e);}); + for(var i = 0; i < fields.length; i++) + { + var fieldName = fields[i]; + this[fieldName] = registry.byId("editBroker." + fieldName); + } + this.form = registry.byId("editBrokerForm"); + this.context = registry.byId("editBroker.context"); + util.applyMetadataToWidgets(this.containerNode, "Broker", "broker"); + + for(var i = 0; i < numericFieldNames.length; i++) + { + this[numericFieldNames[i]].set("regExpGen", util.numericOrContextVarRegexp); + } + }, + show: function(brokerData) + { + var that=this; + this.query = "api/latest/broker"; + this.dialog.set("title", "Edit Broker - " + entities.encode(String(brokerData.name))); + xhr.get( + { + url: this.query, + sync: true, + content: { actuals: true }, + handleAs: "json", + load: function(data) + { + that._show(data[0], brokerData); + } + } + ); + }, + destroy: function() + { + if (this.dialog) + { + this.dialog.destroyRecursive(); + this.dialog = null; + } + + if (this.containerNode) + { + domConstruct.destroy(this.containerNode); + this.containerNode = null; + } + }, + _cancel: function(e) + { + this.dialog.hide(); + }, + _save: function(e) + { + event.stop(e); + if(this.form.validate()) + { + var data = util.getFormWidgetValues(this.form, this.initialData); + var context = this.context.get("value"); + if (context && !util.equals(context, this.initialData.context)) + { + data["context"] = context; + } + + var success = false,failureReason=null; + xhr.put({ + url: this.query, + sync: true, + handleAs: "json", + headers: { "Content-Type": "application/json"}, + putData: json.stringify(data), + load: function(x) {success = true; }, + error: function(error) {success = false; failureReason = error;} + }); + + if(success === true) + { + this.dialog.hide(); + } + else + { + util.xhrErrorHandler(failureReason); + } + } + else + { + alert('Form contains invalid data. Please correct first'); + } + }, + _show:function(actualData, effectiveData) + { + this.initialData = actualData; + var nodes = effectiveData.virtualhostnodes + var data = []; + if (nodes) + { + for (var i=0; i< nodes.length; i++) + { + if (nodes[i].virtualhosts) + { + data.push({id: nodes[i].virtualhosts[0].name, name: nodes[i].virtualhosts[0].name}); + } + } + } + var hostsStore = new dojo.store.Memory({ data: data }); + this["defaultVirtualHost"].set("store", hostsStore); + + + for(var i = 0; i < fields.length; i++) + { + var fieldName = fields[i]; + var widget = this[fieldName]; + widget.reset(); + + if (widget instanceof dijit.form.CheckBox) + { + widget.set("checked", actualData[fieldName]); + } + else + { + widget.set("value", actualData[fieldName]); + } + } + this.context.load(this.query, {actualValues: actualData.context, effectiveValues: effectiveData.context}); + this.dialog.startup(); + this.dialog.show(); + } + }; + + brokerEditor.init(); + + return brokerEditor; + } +); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHost.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHost.js index f25be2d57e..7ba86e5d03 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHost.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHost.js @@ -34,6 +34,7 @@ define(["dojo/_base/xhr", "dojo/data/ObjectStore", "qpid/common/util", "dojo/text!editVirtualHost.html", + "qpid/common/ContextVariablesEditor", "dijit/Dialog", "dijit/form/CheckBox", "dijit/form/FilteringSelect", @@ -73,6 +74,11 @@ define(["dojo/_base/xhr", show: function(hostData) { var that=this; + if (!this.context) + { + this.context = new qpid.common.ContextVariablesEditor({name: 'context', title: 'Context variables'}); + this.context.placeAt(dom.byId("editVirtualHost.context")); + } this.query = "api/latest/virtualhost/" + encodeURIComponent(hostData.nodeName) + "/" + encodeURIComponent(hostData.hostName); this.dialog.set("title", "Edit Virtual Host - " + entities.encode(String(hostData.hostName))); xhr.get( @@ -83,7 +89,7 @@ define(["dojo/_base/xhr", handleAs: "json", load: function(data) { - that._show(data[0]); + that._show(data[0], hostData); } } ); @@ -112,7 +118,11 @@ define(["dojo/_base/xhr", if(this.form.validate()) { var data = util.getFormWidgetValues(this.form, this.initialData); - + var context = this.context.get("value"); + if (context && !util.equals(context, this.initialData.context)) + { + data["context"] = context; + } var success = false,failureReason=null; xhr.put({ url: this.query, @@ -138,10 +148,10 @@ define(["dojo/_base/xhr", alert('Form contains invalid data. Please correct first'); } }, - _show:function(virtualHostData) + _show:function(actualData, effectiveData) { - this.initialData = virtualHostData; + this.initialData = actualData; for(var i = 0; i < fields.length; i++) { var fieldName = fields[i]; @@ -150,14 +160,16 @@ define(["dojo/_base/xhr", if (widget instanceof dijit.form.CheckBox) { - widget.set("checked", virtualHostData[fieldName]); + widget.set("checked", actualData[fieldName]); } else { - widget.set("value", virtualHostData[fieldName]); + widget.set("value", actualData[fieldName]); } } + this.context.load(this.query, {actualValues:actualData.context, effectiveValues:effectiveData.context}); + // Add regexp to the numeric fields for(var i = 0; i < numericFieldNames.length; i++) { @@ -170,15 +182,15 @@ define(["dojo/_base/xhr", array.forEach(widgets, function(item) { item.destroyRecursive();}); domConstruct.empty(this.typeFieldsContainer); - require(["qpid/management/virtualhost/" + virtualHostData.type.toLowerCase() + "/edit"], + require(["qpid/management/virtualhost/" + actualData.type.toLowerCase() + "/edit"], function(TypeUI) { try { - TypeUI.show({containerNode:that.typeFieldsContainer, parent: that, data: virtualHostData}); + TypeUI.show({containerNode:that.typeFieldsContainer, parent: that, data: actualData}); that.form.connectChildren(); - util.applyMetadataToWidgets(that.allFieldsContainer, "VirtualHost", virtualHostData.type); + util.applyMetadataToWidgets(that.allFieldsContainer, "VirtualHost", actualData.type); } catch(e) { diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHostNode.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHostNode.js index 545be75fff..ca619f10f5 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHostNode.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHostNode.js @@ -34,6 +34,7 @@ define(["dojo/_base/xhr", "dojo/data/ObjectStore", "qpid/common/util", "dojo/text!editVirtualHostNode.html", + "qpid/common/ContextVariablesEditor", "dijit/Dialog", "dijit/form/CheckBox", "dijit/form/FilteringSelect", @@ -61,11 +62,16 @@ define(["dojo/_base/xhr", this.name = registry.byId("editVirtualHostNode.name"); this.form = registry.byId("editVirtualHostNodeForm"); }, - show: function(nodeName) + show: function(effectiveData) { var that=this; - this.query = "api/latest/virtualhostnode/" + encodeURIComponent(nodeName); - this.dialog.set("title", "Edit Virtual Host Node - " + entities.encode(String(nodeName))); + if (!this.context) + { + this.context = new qpid.common.ContextVariablesEditor({name: 'context', title: 'Context variables'}); + this.context.placeAt(dom.byId("editVirtualHostNode.context")); + } + this.query = "api/latest/virtualhostnode/" + encodeURIComponent(effectiveData.name); + this.dialog.set("title", "Edit Virtual Host Node - " + entities.encode(String(effectiveData.name))); xhr.get( { url: this.query, @@ -74,7 +80,7 @@ define(["dojo/_base/xhr", handleAs: "json", load: function(data) { - that._show(data[0]); + that._show(data[0], effectiveData); } } ); @@ -103,7 +109,11 @@ define(["dojo/_base/xhr", if(this.form.validate()) { var data = util.getFormWidgetValues(this.form, this.initialData); - + var context = this.context.get("value"); + if (context && !util.equals(context, this.initialData.context)) + { + data["context"] = context; + } var success = false,failureReason=null; xhr.put({ url: this.query, @@ -129,10 +139,11 @@ define(["dojo/_base/xhr", alert('Form contains invalid data. Please correct first'); } }, - _show:function(nodeData) + _show:function(actualData, effectiveData) { - this.initialData = nodeData; - this.name.set("value", nodeData.name); + this.initialData = actualData; + this.name.set("value", actualData.name); + this.context.load( this.query, {actualValues: actualData.context, effectiveValues: effectiveData.context}); var that = this; @@ -140,15 +151,15 @@ define(["dojo/_base/xhr", array.forEach(widgets, function(item) { item.destroyRecursive();}); domConstruct.empty(this.typeFieldsContainer); - require(["qpid/management/virtualhostnode/" + nodeData.type.toLowerCase() + "/edit"], + require(["qpid/management/virtualhostnode/" + actualData.type.toLowerCase() + "/edit"], function(TypeUI) { try { - TypeUI.show({containerNode:that.typeFieldsContainer, parent: that, data: nodeData}); + TypeUI.show({containerNode:that.typeFieldsContainer, parent: that, data: actualData}); that.form.connectChildren(); - util.applyMetadataToWidgets(that.allFieldsContainer, "VirtualHostNode", nodeData.type); + util.applyMetadataToWidgets(that.allFieldsContainer, "VirtualHostNode", actualData.type); } catch(e) { diff --git a/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverterTest.java b/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverterTest.java index 15102c8ce4..ac595154bb 100644 --- a/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverterTest.java +++ b/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverterTest.java @@ -139,6 +139,7 @@ public class ConfiguredObjectToMapConverterTest extends TestCase when(_configuredObject.getContextValue(eq(String.class),eq("inheritedkey"))).thenReturn("foo"); when(_configuredObject.getContextKeys(anyBoolean())).thenReturn(inheritedKeys); when(_configuredObject.getContext()).thenReturn(actualContext); + when(_configuredObject.getActualAttributes()).thenReturn(Collections.singletonMap(ConfiguredObject.CONTEXT, actualContext)); when(mockChild.getAttributeNames()).thenReturn(Arrays.asList(childAttributeName, ConfiguredObject.CONTEXT)); when(mockChild.getAttribute(childAttributeName)).thenReturn(childAttributeValue); when(mockChild.getActualAttributes()).thenReturn(Collections.singletonMap(childAttributeName, childActualAttributeValue)); -- cgit v1.2.1