diff options
Diffstat (limited to 'qpid/java/broker-plugins/management-http')
15 files changed, 513 insertions, 445 deletions
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java index f55b373119..2339cfb000 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java @@ -210,7 +210,7 @@ public class HttpManagement extends AbstractPluginAdapter<HttpManagement> implem + transports); } lastPort = port.getPort(); - String bindingAddress = port.getBindingAddress(); + String bindingAddress = ((HttpPort)port).getBindingAddress(); if (bindingAddress != null && !bindingAddress.trim().equals("") && !bindingAddress.trim().equals("*")) { connector.setHost(bindingAddress.trim()); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/FileServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/FileServlet.java index 3eab80dbd8..1c741d97e8 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/FileServlet.java +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/FileServlet.java @@ -119,7 +119,7 @@ public class FileServlet extends HttpServlet } else { - response.sendError(HttpServletResponse.SC_NOT_FOUND, "unknown file: "+ filename); + response.sendError(HttpServletResponse.SC_NOT_FOUND, "unknown file"); } } 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 bc563c141e..7769263e5a 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 @@ -20,33 +20,53 @@ package org.apache.qpid.server.management.plugin.servlet.rest; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.TreeMap; import org.apache.qpid.server.model.ConfiguredObject; +import org.apache.qpid.server.model.ConfiguredObjectAttribute; public class ConfiguredObjectToMapConverter { /** Name of the key used for the statistics map */ public static final String STATISTICS_MAP_KEY = "statistics"; + private static Set<String> CONFIG_EXCLUDED_ATTRIBUTES = + new HashSet<>(Arrays.asList(ConfiguredObject.ID, + ConfiguredObject.DURABLE, + ConfiguredObject.CREATED_BY, + ConfiguredObject.CREATED_TIME, + ConfiguredObject.LAST_UPDATED_BY, + ConfiguredObject.LAST_UPDATED_TIME)); + public Map<String, Object> convertObjectToMap(final ConfiguredObject<?> confObject, Class<? extends ConfiguredObject> clazz, int depth, final boolean useActualValues, - final boolean includeSystemContext) + final boolean includeSystemContext, + final boolean extractAsConfig) { - Map<String, Object> object = new LinkedHashMap<String, Object>(); + Map<String, Object> object = new LinkedHashMap<>(); - incorporateAttributesIntoMap(confObject, object, useActualValues, includeSystemContext); - incorporateStatisticsIntoMap(confObject, object); + incorporateAttributesIntoMap(confObject, object, useActualValues, includeSystemContext, extractAsConfig); + if(!extractAsConfig) + { + incorporateStatisticsIntoMap(confObject, object); + } if(depth > 0) { - incorporateChildrenIntoMap(confObject, clazz, depth, object, useActualValues, includeSystemContext); + incorporateChildrenIntoMap(confObject, clazz, depth, object, useActualValues, includeSystemContext, extractAsConfig); } return object; } @@ -56,60 +76,100 @@ public class ConfiguredObjectToMapConverter final ConfiguredObject<?> confObject, Map<String, Object> object, final boolean useActualValues, - final boolean includeSystemContext) + final boolean includeSystemContext, + final boolean extractAsConfig) { - - for(String name : confObject.getAttributeNames()) + // if extracting as config add a fake attribute for each secondary parent + if(extractAsConfig && confObject.getModel().getParentTypes(confObject.getCategoryClass()).size()>1) { - Object value = useActualValues ? confObject.getActualAttributes().get(name) : confObject.getAttribute(name); - if(value instanceof ConfiguredObject) + Iterator<Class<? extends ConfiguredObject>> parentClasses = + confObject.getModel().getParentTypes(confObject.getCategoryClass()).iterator(); + + // ignore the first parent which is supplied by structure + parentClasses.next(); + + while(parentClasses.hasNext()) { - object.put(name, ((ConfiguredObject) value).getName()); + Class<? extends ConfiguredObject> parentClass = parentClasses.next(); + ConfiguredObject parent = confObject.getParent(parentClass); + if(parent != null) + { + String categoryName = parentClass.getSimpleName(); + object.put(categoryName.substring(0,1).toLowerCase()+categoryName.substring(1), parent.getName()); + } } - else if(ConfiguredObject.CONTEXT.equals(name)) + } + + for(String name : confObject.getAttributeNames()) + { + if (!(extractAsConfig && CONFIG_EXCLUDED_ATTRIBUTES.contains(name))) { - Map<String,Object> contextValues = new HashMap<>(); - if(useActualValues) + Object value = + useActualValues ? confObject.getActualAttributes().get(name) : confObject.getAttribute(name); + if (value instanceof ConfiguredObject) { - contextValues.putAll(confObject.getContext()); + object.put(name, ((ConfiguredObject) value).getName()); } - else + else if (ConfiguredObject.CONTEXT.equals(name)) { - for(String contextName : confObject.getContextKeys(!includeSystemContext)) + Map<String, Object> contextValues = new HashMap<>(); + if (useActualValues) + { + contextValues.putAll(confObject.getContext()); + } + else { - contextValues.put(contextName, confObject.getContextValue(String.class, contextName)); + for (String contextName : confObject.getContextKeys(!includeSystemContext)) + { + contextValues.put(contextName, confObject.getContextValue(String.class, contextName)); + } + } + if (!contextValues.isEmpty()) + { + object.put(ConfiguredObject.CONTEXT, contextValues); } } - object.put(ConfiguredObject.CONTEXT, contextValues); - } - else if(value instanceof Collection) - { - List<Object> converted = new ArrayList(); - for(Object member : (Collection)value) + else if (value instanceof Collection) { - if(member instanceof ConfiguredObject) + List<Object> converted = new ArrayList<>(); + for (Object member : (Collection) value) { - converted.add(((ConfiguredObject)member).getName()); + if (member instanceof ConfiguredObject) + { + converted.add(((ConfiguredObject) member).getName()); + } + else + { + converted.add(member); + } } - else + object.put(name, converted); + } + else if (value != null) + { + object.put(name, value); + } + else if (extractAsConfig) + { + ConfiguredObjectAttribute<?, ?> attribute = confObject.getModel() + .getTypeRegistry() + .getAttributeTypes(confObject.getClass()) + .get(name); + + if(attribute.isPersisted() && attribute.isDerived()) { - converted.add(member); + object.put(name, confObject.getAttribute(name)); } } - object.put(name, converted); - } - else if(value != null) - { - object.put(name, value); } } } private void incorporateStatisticsIntoMap( - final ConfiguredObject confObject, Map<String, Object> object) + final ConfiguredObject<?> confObject, Map<String, Object> object) { - Map<String, Object> statMap = confObject.getStatistics(); + Map<String, Object> statMap = new TreeMap<String,Object>(confObject.getStatistics()); if(!statMap.isEmpty()) { @@ -120,24 +180,60 @@ public class ConfiguredObjectToMapConverter private void incorporateChildrenIntoMap( final ConfiguredObject confObject, - Class<? extends ConfiguredObject> clazz, int depth, - Map<String, Object> object, final boolean useActualValues, final boolean includeSystemContext) + Class<? extends ConfiguredObject> clazz, + int depth, + Map<String, Object> object, + final boolean useActualValues, + final boolean includeSystemContext, + final boolean extractAsConfig) { - for(Class<? extends ConfiguredObject> childClass : confObject.getModel().getChildTypes(clazz)) + List<Class<? extends ConfiguredObject>> childTypes = new ArrayList<>(confObject.getModel().getChildTypes(clazz)); + + Collections.sort(childTypes, new Comparator<Class<? extends ConfiguredObject>>() { - Collection<? extends ConfiguredObject> children = confObject.getChildren(childClass); - if(children != null) + @Override + public int compare(final Class<? extends ConfiguredObject> o1, final Class<? extends ConfiguredObject> o2) + { + return o1.getSimpleName().compareTo(o2.getSimpleName()); + } + }); + for(Class<? extends ConfiguredObject> childClass : childTypes) + { + if(!(extractAsConfig && confObject.getModel().getParentTypes(childClass).iterator().next() != confObject.getCategoryClass())) { - List<Map<String, Object>> childObjects = new ArrayList<Map<String, Object>>(); - for(ConfiguredObject child : children) + Collection children = confObject.getChildren(childClass); + if(children != null) { - childObjects.add(convertObjectToMap(child, childClass, depth-1, useActualValues, includeSystemContext)); - } + List<? extends ConfiguredObject> sortedChildren = new ArrayList<ConfiguredObject>(children); + Collections.sort(sortedChildren, new Comparator<ConfiguredObject>() + { + @Override + public int compare(final ConfiguredObject o1, final ConfiguredObject o2) + { + return o1.getName().compareTo(o2.getName()); + } + }); - if(!childObjects.isEmpty()) - { - object.put(childClass.getSimpleName().toLowerCase()+"s",childObjects); + List<Map<String, Object>> childObjects = new ArrayList<>(); + + for (ConfiguredObject child : sortedChildren) + { + if (!(extractAsConfig && !child.isDurable())) + { + childObjects.add(convertObjectToMap(child, + childClass, + depth - 1, + useActualValues, + includeSystemContext, + extractAsConfig)); + } + } + + if (!childObjects.isEmpty()) + { + object.put(childClass.getSimpleName().toLowerCase() + "s", childObjects); + } } } } 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 dc1f5bba46..efe644ca43 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,8 +59,14 @@ 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 EXTRACT_INITIAL_CONFIG_PARAM = "extractInitialConfig"; - public static final Set<String> RESERVED_PARAMS = new HashSet<String>(Arrays.asList(DEPTH_PARAM, SORT_PARAM, ACTUALS_PARAM, INCLUDE_SYS_CONTEXT_PARAM)); + public static final Set<String> RESERVED_PARAMS = + new HashSet<>(Arrays.asList(DEPTH_PARAM, + SORT_PARAM, + ACTUALS_PARAM, + INCLUDE_SYS_CONTEXT_PARAM, + EXTRACT_INITIAL_CONFIG_PARAM)); private Class<? extends ConfiguredObject>[] _hierarchy; @@ -316,21 +322,35 @@ public class RestServlet extends AbstractServlet Collection<ConfiguredObject<?>> allObjects = getObjects(request); // TODO - sort special params, everything else should act as a filter - int depth = getDepthParameterFromRequest(request); - boolean actuals = getBooleanParameterFromRequest(request, ACTUALS_PARAM); - boolean includeSystemContext = getBooleanParameterFromRequest(request, INCLUDE_SYS_CONTEXT_PARAM); + boolean extractInitialConfig = getBooleanParameterFromRequest(request, EXTRACT_INITIAL_CONFIG_PARAM); + int depth; + boolean actuals; + boolean includeSystemContext; + + if(extractInitialConfig) + { + depth = Integer.MAX_VALUE; + actuals = true; + includeSystemContext = false; + } + else + { + depth = getDepthParameterFromRequest(request); + actuals = getBooleanParameterFromRequest(request, ACTUALS_PARAM); + includeSystemContext = getBooleanParameterFromRequest(request, INCLUDE_SYS_CONTEXT_PARAM); + } List<Map<String, Object>> output = new ArrayList<Map<String, Object>>(); for(ConfiguredObject configuredObject : allObjects) { output.add(_objectConverter.convertObjectToMap(configuredObject, getConfiguredClass(), - depth, actuals, includeSystemContext)); + depth, actuals, includeSystemContext, extractInitialConfig)); } Writer writer = getOutputWriter(request, response); ObjectMapper mapper = new ObjectMapper(); mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true); - mapper.writeValue(writer, output); + mapper.writeValue(writer, extractInitialConfig && output.size() == 1 ? output.get(0) : output); response.setContentType("application/json"); response.setStatus(HttpServletResponse.SC_OK); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/addPort.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/addPort.html index a0f1d6d440..348b18f355 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/addPort.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/addPort.html @@ -39,6 +39,25 @@ title: 'Enter name of port'"/> </div> </div> + + <div class="clear"> + <div class="formLabel-labelCell"> + <label for="formAddPort.type">Port Type*:</label> + </div> + <div class="formLabel-controlCell"> + <select id="formAddPort.type" + data-dojo-type="dijit.form.FilteringSelect" + data-dojo-props=" + name: 'type', + label: 'Port Type*:', + value: '', + placeHolder: 'port type', + promptMessage: 'Port type', + title: 'Enter port type'"> + </select> + </div> + </div> + <div class="clear"> <div class="formLabel-labelCell"> <label for="formAddPort.port">Port Number*:</label> @@ -54,27 +73,27 @@ title: 'Enter port number'"/> </div> </div> + </div> + + <div id="formAddPort:fieldsProtocols"> <div class="clear"> <div class="formLabel-labelCell"> - <label for="formAddPort.type">Port Type*:</label> + <label for="formAddPort.protocols">Protocols*:</label> </div> <div class="formLabel-controlCell"> - <select id="formAddPort.type" - data-dojo-type="dijit.form.FilteringSelect" + <select id="formAddPort.protocols" + data-dojo-type="dijit.form.MultiSelect" data-dojo-props=" - name: 'type', - label: 'Port Type*:', + name: 'protocols', value: '', - placeHolder: 'port type', - promptMessage: 'Port type', - title: 'Enter port type'"> - <option value="AMQP" selected="selected">AMQP</option> - <option value="JMX">JMX</option> - <option value="HTTP">HTTP</option> + label: 'protocol*:', + promptMessage: 'Protocol to be associated with this port', + title: 'Enter protocol to be associated with this port'"> </select> </div> </div> </div> + <div id="formAddPort:fieldsAuthenticationProvider"> <div class="clear"> <div class="formLabel-labelCell"> @@ -94,6 +113,7 @@ </div> </div> </div> + <div id="formAddPort:fieldsBindingAddress"> <div class="clear"> <div class="formLabel-labelCell"> @@ -110,79 +130,6 @@ </div> </div> </div> - <div id="formAddPort:fieldsAMQP"> - <div class="clear"> - <div class="formLabel-labelCell"> - <label for="formAddPort.protocolsDefault">Support default protocols:</label> - </div> - <div class="formLabel-controlCell"> - <input id="formAddPort.protocolsDefault" type="checkbox" - dojoType="dijit.form.CheckBox" - data-dojo-props="checked: true"/> - </div> - </div> - <div class="clear"> - <div class="formLabel-labelCell"> - <label for="formAddPort.protocolsAMQP">AMQP protocols:</label> - </div> - <div class="formLabel-controlCell"> - <select id="formAddPort.protocolsAMQP" - data-dojo-type="dijit.form.MultiSelect" - data-dojo-props=" - name: 'protocols', - value: '', - placeHolder: 'AMQP protocols', - promptMessage: 'AMQP protocols to be associated with this port', - title: 'Select AMQP protocols to be associated with this port', - multiple: true"> - <option value="AMQP_0_8">AMQP 0.8</option> - <option value="AMQP_0_9">AMQP 0.9</option> - <option value="AMQP_0_9_1">AMQP 0.9.1</option> - <option value="AMQP_0_10">AMQP 0.10</option> - <option value="AMQP_1_0">AMQP 1.0</option> - </select> - </div> - </div> - </div> - <div id="formAddPort:fieldsJMX"> - <div class="clear"> - <div class="formLabel-labelCell"> - <label for="formAddPort.protocolsJMX">JMX protocol*:</label> - </div> - <div class="formLabel-controlCell"> - <select id="formAddPort.protocolsJMX" - data-dojo-type="dijit.form.FilteringSelect" - data-dojo-props=" - name: 'protocols', - value: '', - promptMessage: 'JMX protocol to be associated with this port', - title: 'Enter JMX protocol to be associated with this port'"> - <option value="RMI">RMI</option> - <option value="JMX_RMI">JMX RMI</option> - </select> - </div> - </div> - </div> - - <div id="formAddPort:fieldsHTTP"> - <div class="clear"> - <div class="formLabel-labelCell"> - <label for="formAddPort.protocolsHTTP">HTTP protocols*:</label> - </div> - <div class="formLabel-controlCell"> - <select id="formAddPort.protocolsHTTP" - data-dojo-type="dijit.form.FilteringSelect" - data-dojo-props=" - name: 'protocols', - value: 'HTTP', - label: 'HTTP protocol*:', - promptMessage: 'HTTP protocol to be associated with this port', - title: 'Enter HTTP protocol to be associated with this port'"> - <option value="HTTP">HTTP</option> - </select> - </div> - </div> - </div> <div id="formAddPort:transport" > <div class="clear"> @@ -199,13 +146,11 @@ multiple: true, promptMessage: 'Transport(s)', title: 'Select transports'"> - <option value="TCP">TCP</option> - <option value="SSL">SSL</option> </select> </div> </div> - <div class="clear"/> </div> + <div id="formAddPort:fieldsTransportSSL"> <div class="clear"> <div class="formLabel-labelCell"> @@ -227,6 +172,7 @@ </div> </div> </div> + <div id="formAddPort:fieldsClientAuth"> <div id="formAddPort:fieldsClientAuthCheckboxes"> <div class="clear"> @@ -252,6 +198,7 @@ </div> </div> </div> + <div class="clear"> <div class="formLabel-labelCell"> Trust Stores: @@ -265,7 +212,7 @@ data-dojo-props=" plugins: {indirectSelection: true}, rowSelector:'0px'" - style="height: 100px; width:400px"> + style="height: 100px; width:400px"> <!--todo remove --> <thead> <tr> <th field="name">Name</th> @@ -276,8 +223,9 @@ </div> </div> </div> + <input type="hidden" id="formAddPort.id" name="id"/> - <div class="clear"/> + <div class="clear"></div> <div class="dijitDialogPaneActionBar"> <!-- submit buttons --> <input type="submit" value="Save Port" label="Save Port" dojoType="dijit.form.Button" /> 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 b6e67ddb4e..7076f08b0b 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 @@ -279,3 +279,7 @@ div .messages { border: none; background-color: transparent; } + +.dijitMultiSelect { + width : 14.75em; +} diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/metadata.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/metadata.js index 19ec53744f..901172f80e 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/metadata.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/metadata.js @@ -17,11 +17,12 @@ * under the License. */ define(["dojo/_base/xhr", + "dojo/_base/array", "dojox/lang/functional/object", "qpid/common/properties", "dojo/domReady!" ], - function (xhr, fobject, properties) + function (xhr, array, fobject, properties) { var metadata = { @@ -48,6 +49,22 @@ define(["dojo/_base/xhr", getTypesForCategory: function (category) { return fobject.keys(this.metadata[category]); + }, + extractUniqueListOfValues : function(data) + { + var values = []; + for (i = 0; i < data.length; i++) + { + for (j = 0; j < data[i].length; j++) + { + var current = data[i][j]; + if (array.indexOf(values, current) == -1) + { + values.push(current); + } + } + } + return values; } }; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js index cb0cc792e8..c00c4d10e3 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js @@ -26,7 +26,7 @@ define(["dojo/_base/xhr", "dojo/dom-construct", "dojo/dom-geometry", "dojo/dom-style", - "dojo/window", + "dojo/_base/window", "dojo/query", "dojo/parser", "dojo/store/Memory", @@ -683,7 +683,37 @@ define(["dojo/_base/xhr", return new Memory({ data: typeData }); } - var singleContextVarRegexp = "(\\${[\\w\\.\\-]+})"; + util.setMultiSelectOptions = function(multiSelectWidget, options) + { + util.addMultiSelectOptions(multiSelectWidget, options, true); + } + + util.addMultiSelectOptions = function(multiSelectWidget, options, clearExistingOptions) + { + if (clearExistingOptions) + { + var children = multiSelectWidget.children; + var initialLength = children.length; + for (var i = initialLength - 1; i >= 0 ; i--) + { + var child = children.item(i); + multiSelectWidget.removeChild(child); + } + } + for (var i = 0; i < options.length; i++) + { + // construct new option for list + var newOption = win.doc.createElement('option'); + var value = options[i]; + newOption.innerHTML = value; + newOption.value = value; + + // add new option to list + multiSelectWidget.appendChild(newOption); + } + } + + var singleContextVarRegexp = "(\\${[\\w+\\.\\-:]+})"; util.numericOrContextVarRegexp = function(constraints) { 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 c52553c386..81a21cf736 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 @@ -210,7 +210,7 @@ define(["dojo/_base/xhr", var addPortButton = query(".addPort", contentPane.containerNode)[0]; connect.connect(registry.byNode(addPortButton), "onClick", function(evt){ - addPort.show(null, that.brokerUpdater.brokerData.authenticationproviders, + addPort.show(null, "AMQP", that.brokerUpdater.brokerData.authenticationproviders, that.brokerUpdater.brokerData.keystores, that.brokerUpdater.brokerData.truststores); }); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Exchange.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Exchange.js index cfa985f551..2ac881abc1 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Exchange.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Exchange.js @@ -140,6 +140,7 @@ define(["dojo/_base/xhr", } storeNodes(["name", + "type", "state", "durable", "lifetimePolicy", @@ -197,6 +198,8 @@ define(["dojo/_base/xhr", ExchangeUpdater.prototype.updateHeader = function() { this.name.innerHTML = entities.encode(String(this.exchangeData[ "name" ])); + this["type"].innerHTML = entities.encode(String(this.exchangeData[ "type" ])); + this.state.innerHTML = entities.encode(String(this.exchangeData[ "state" ])); this.durable.innerHTML = entities.encode(String(this.exchangeData[ "durable" ])); this.lifetimePolicy.innerHTML = entities.encode(String(this.exchangeData[ "lifetimePolicy" ])); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Port.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Port.js index 250b85b59f..54391c78f6 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Port.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Port.js @@ -30,8 +30,9 @@ define(["dojo/dom", "qpid/common/util", "qpid/common/formatter", "qpid/management/addPort", + "qpid/common/metadata", "dojo/domReady!"], - function (dom, xhr, parser, query, connect, registry, entities, properties, updater, util, formatter, addPort) { + function (dom, xhr, parser, query, connect, registry, entities, properties, updater, util, formatter, addPort, metadata) { function Port(name, parent, controller) { this.name = name; @@ -104,7 +105,7 @@ define(["dojo/dom", .then(function(data) { var brokerData= data[0]; - addPort.show(that.name, brokerData.authenticationproviders, brokerData.keystores, brokerData.truststores); + addPort.show(that.name, that.portUpdater.portData.type, brokerData.authenticationproviders, brokerData.keystores, brokerData.truststores); } ); } @@ -126,6 +127,7 @@ define(["dojo/dom", storeNodes(["nameValue", "stateValue", + "typeValue", "portValue", "authenticationProviderValue", "protocolsValue", @@ -146,7 +148,7 @@ define(["dojo/dom", xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"}).then(function(data) { - that.keyStoreData = data[0]; + that.portData = data[0]; that.updateHeader(); }); @@ -166,26 +168,26 @@ define(["dojo/dom", return data + "</div>"; } - this.nameValue.innerHTML = entities.encode(String(this.keyStoreData[ "name" ])); - this.stateValue.innerHTML = entities.encode(String(this.keyStoreData[ "state" ])); - this.portValue.innerHTML = entities.encode(String(this.keyStoreData[ "port" ])); - this.authenticationProviderValue.innerHTML = this.keyStoreData[ "authenticationProvider" ] ? entities.encode(String(this.keyStoreData[ "authenticationProvider" ])) : ""; - this.protocolsValue.innerHTML = printArray( "protocols", this.keyStoreData); - this.transportsValue.innerHTML = printArray( "transports", this.keyStoreData); - this.bindingAddressValue.innerHTML = this.keyStoreData[ "bindingAddress" ] ? entities.encode(String(this.keyStoreData[ "bindingAddress" ])) : "" ; - this.keyStoreValue.innerHTML = this.keyStoreData[ "keyStore" ] ? entities.encode(String(this.keyStoreData[ "keyStore" ])) : ""; - this.needClientAuthValue.innerHTML = "<input type='checkbox' disabled='disabled' "+(this.keyStoreData[ "needClientAuth" ] ? "checked='checked'": "")+" />" ; - this.wantClientAuthValue.innerHTML = "<input type='checkbox' disabled='disabled' "+(this.keyStoreData[ "wantClientAuth" ] ? "checked='checked'": "")+" />" ; - this.trustStoresValue.innerHTML = printArray( "trustStores", this.keyStoreData); - var amqpProtocol = this.keyStoreData["protocols"][0] && this.keyStoreData["protocols"][0].indexOf("AMQP") == 0; - this.bindingAddress.style.display= amqpProtocol? "block" : "none"; - var sslTransport = this.keyStoreData["transports"][0] && this.keyStoreData["transports"][0] == "SSL"; - var displayStyle = sslTransport ? "block" : "none"; - this.trustStoresValue.style.display = displayStyle; - this.keyStore.style.display = displayStyle; - this.needClientAuth.style.display = displayStyle; - this.wantClientAuth.style.display = displayStyle; - this.trustStores.style.display = displayStyle; + this.nameValue.innerHTML = entities.encode(String(this.portData[ "name" ])); + this.stateValue.innerHTML = entities.encode(String(this.portData[ "state" ])); + this.typeValue.innerHTML = entities.encode(String(this.portData[ "type" ])); + this.portValue.innerHTML = entities.encode(String(this.portData[ "port" ])); + this.authenticationProviderValue.innerHTML = this.portData[ "authenticationProvider" ] ? entities.encode(String(this.portData[ "authenticationProvider" ])) : ""; + this.protocolsValue.innerHTML = printArray( "protocols", this.portData); + this.transportsValue.innerHTML = printArray( "transports", this.portData); + this.bindingAddressValue.innerHTML = this.portData[ "bindingAddress" ] ? entities.encode(String(this.portData[ "bindingAddress" ])) : "" ; + this.keyStoreValue.innerHTML = this.portData[ "keyStore" ] ? entities.encode(String(this.portData[ "keyStore" ])) : ""; + this.needClientAuthValue.innerHTML = "<input type='checkbox' disabled='disabled' "+(this.portData[ "needClientAuth" ] ? "checked='checked'": "")+" />" ; + this.wantClientAuthValue.innerHTML = "<input type='checkbox' disabled='disabled' "+(this.portData[ "wantClientAuth" ] ? "checked='checked'": "")+" />" ; + this.trustStoresValue.innerHTML = printArray( "trustStores", this.portData); + + var typeMetaData = metadata.getMetaData("Port", this.portData["type"]); + + this.bindingAddress.style.display = "bindingAddress" in typeMetaData.attributes ? "block" : "none"; + this.keyStore.style.display = "keyStore" in typeMetaData.attributes ? "block" : "none"; + this.needClientAuth.style.display = "needClientAuth" in typeMetaData.attributes ? "block" : "none"; + this.wantClientAuth.style.display = "wantClientAuth" in typeMetaData.attributes ? "block" : "none"; + this.trustStores.style.display = "trustStores" in typeMetaData.attributes ? "block" : "none"; }; PortUpdater.prototype.update = function() @@ -195,7 +197,7 @@ define(["dojo/dom", xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"}).then(function(data) { - thisObj.keyStoreData = data[0]; + thisObj.portData = data[0]; thisObj.updateHeader(); }); }; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addPort.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addPort.js index 4a635b1c0d..8a862693cf 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addPort.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addPort.js @@ -33,6 +33,7 @@ define(["dojo/_base/xhr", "dojo/dom-style", "dojo/_base/lang", "qpid/common/util", + "qpid/common/metadata", /* dojox/ validate resources */ "dojox/validate/us", "dojox/validate/web", @@ -55,12 +56,39 @@ define(["dojo/_base/xhr", "dojox/grid/EnhancedGrid", "dojox/grid/enhanced/plugins/IndirectSelection", "dojo/domReady!"], - function (xhr, dom, construct, win, registry, parser, array, event, json, Memory, ObjectStore, FilteringSelect, domStyle, lang, util) { + function (xhr, dom, construct, win, registry, parser, array, event, json, Memory, ObjectStore, FilteringSelect, domStyle, lang, util, metadata) { var addPort = {}; var node = construct.create("div", null, win.body(), "last"); + addPort._typeChanged = function (newValue) + { + var typeMetaData = metadata.getMetaData("Port", newValue); + + //protocols + var protocolsMultiSelect = dom.byId("formAddPort.protocols"); + var protocolValidValues = typeMetaData.attributes.protocols.validValues; + var protocolValues = metadata.extractUniqueListOfValues(protocolValidValues); + util.setMultiSelectOptions(protocolsMultiSelect, protocolValues.sort()); + + //authenticationProvider + registry.byId("formAddPort.authenticationProvider").set("disabled", ! ("authenticationProvider" in typeMetaData.attributes)); + dom.byId("formAddPort:fieldsAuthenticationProvider").style.display = "authenticationProvider" in typeMetaData.attributes ? "block" : "none"; + + //bindingAddress + registry.byId("formAddPort.bindingAddress").set("disabled", ! ("bindingAddress" in typeMetaData.attributes)); + dom.byId("formAddPort:fieldsBindingAddress").style.display = "bindingAddress" in typeMetaData.attributes ? "block" : "none"; + + //transports + var transportsMultiSelect = dom.byId("formAddPort.transports"); + var transportsValidValues = typeMetaData.attributes.transports.validValues; + var transportsValues = metadata.extractUniqueListOfValues(transportsValidValues); + util.setMultiSelectOptions(transportsMultiSelect, transportsValues.sort()); + + toggleSslWidgets(newValue, transportsMultiSelect.value); + }; + var convertToPort = function convertToPort(formValues) { var newPort = {}; @@ -157,189 +185,107 @@ define(["dojo/_base/xhr", return newPort; }; - var toggleSslWidgets = function toggleSslWidgets(protocolType, transportType) + var toggleSslWidgets = function toggleSslWidgets(portType, transportType) { var clientAuthPanel = dojo.byId("formAddPort:fieldsClientAuth"); - var display = clientAuthPanel.style.display; + var transportSSLPanelNode = dom.byId("formAddPort:fieldsTransportSSL"); - if ((transportType == "SSL" || (lang.isArray(transportType) && array.indexOf(transportType, "SSL")>=0)) - && (protocolType == "AMQP" || protocolType == "HTTP")) + if (transportType == "SSL" || (lang.isArray(transportType) && array.indexOf(transportType, "SSL")>=0)) { - clientAuthPanel.style.display = "block"; - registry.byId("formAddPort.needClientAuth").set("disabled", false); - registry.byId("formAddPort.wantClientAuth").set("disabled", false); + var typeMetaData = metadata.getMetaData("Port", portType); + var clientAuth = "needClientAuth" in typeMetaData.attributes || "wantClientAuth" in typeMetaData.attributes; + clientAuthPanel.style.display = clientAuth ? "block" : "none"; + if (clientAuth) + { + registry.byId("formAddPort.needClientAuth").set("disabled", !("needClientAuth" in typeMetaData.attributes)); + registry.byId("formAddPort.wantClientAuth").set("disabled", !("wantClientAuth" in typeMetaData.attributes)); + registry.byId("formAddPort.trustStores").resize(); + } + + transportSSLPanelNode.style.display = "block"; + registry.byId("formAddPort.keyStore").set("disabled", false); } else { clientAuthPanel.style.display = "none"; registry.byId("formAddPort.needClientAuth").set("disabled", true); registry.byId("formAddPort.wantClientAuth").set("disabled", true); - } - var transportSSLPanelNode = dom.byId("formAddPort:fieldsTransportSSL"); - var transportSSLPanelDisplay = transportSSLPanelNode.style.display; - if (transportType == "SSL" || (lang.isArray(transportType) && array.indexOf(transportType, "SSL")>=0)) - { - transportSSLPanelNode.style.display = "block"; - registry.byId("formAddPort.keyStore").set("disabled", false); - } - else - { transportSSLPanelNode.style.display = "none"; registry.byId("formAddPort.keyStore").set("disabled", true); } - if (transportSSLPanelNode.style.display != transportSSLPanelDisplay && transportSSLPanelNode.style.display=="block") - { - registry.byId("formAddPort.trustStores").resize(); - } }; - xhr.get({url: "addPort.html", - sync: true, - load: function(data) { - var theForm; - node.innerHTML = data; - addPort.dialogNode = dom.byId("addPort"); - parser.instantiate([addPort.dialogNode]); - - registry.byId("formAddPort.protocolsDefault").on("change", function(isChecked) { - dijit.byId("formAddPort.protocolsAMQP").set("disabled", isChecked); - }); - - registry.byId("formAddPort.transports").on("change", function(newValue){ - var protocolType = registry.byId("formAddPort.type").value; - if(lang.isArray(newValue) && newValue.length == 2 && protocolType == "JMX") - { - registry.byId("formAddPort.transports").set("value", ["SSL"]); - newValue = "SSL" - } - toggleSslWidgets(protocolType, newValue); - }); - - registry.byId("formAddPort.type").on("change", function(newValue) { - var typeWidget = registry.byId("formAddPort.type"); - var store = typeWidget.store; - store.data.forEach(function(option){ - registry.byId("formAddPort.protocols" + option.value).set("disabled", true); - dom.byId("formAddPort:fields" + option.value).style.display = "none"; - }); - - var isAMQP = ("AMQP" == newValue); - - var isHTTP = ("HTTP" == newValue); - - registry.byId("formAddPort.needClientAuth").set("enabled", isAMQP || isHTTP); - registry.byId("formAddPort.wantClientAuth").set("enabled", isAMQP || isHTTP); - - dom.byId("formAddPort:fields" + newValue).style.display = "block"; - var defaultsAMQPProtocols = registry.byId("formAddPort.protocolsDefault"); - defaultsAMQPProtocols.set("disabled", "AMQP" != newValue) - var protocolsWidget = registry.byId("formAddPort.protocols" + newValue); - if (protocolsWidget) - { - protocolsWidget.set("disabled", (isAMQP && defaultsAMQPProtocols.checked)); - } - - var transportWidget = registry.byId("formAddPort.transports"); - var disableTransportWidget = false; - var toggleSsl = true; - var isRMI = (newValue == "JMX" && registry.byId("formAddPort.protocolsJMX").value == "RMI"); - if (isRMI) - { - if (transportWidget.value != "TCP") - { - transportWidget.set("value", ["TCP"]); - - // changing of transport widget value will cause the call to toggleSslWidgets - toggleSsl = false; - } - disableTransportWidget = true; - - } - else if(newValue == "JMX" ) - { - var transports = transportWidget.value; - if(lang.isArray(transports) && transports.length == 2) - { - transportWidget.set("value", ["SSL"]); - } - } - - - if (toggleSsl) - { - toggleSslWidgets(newValue, transportWidget.value); - } - transportWidget.set("disabled", disableTransportWidget); - registry.byId("formAddPort.authenticationProvider").set("disabled", isRMI); - dom.byId("formAddPort:fieldsAuthenticationProvider").style.display = isRMI? "none" : "block"; - dom.byId("formAddPort:fieldsBindingAddress").style.display = newValue == "JMX" ? "none" : "block"; - dom.byId("formAddPort:transport").style.display = isRMI ? "none" : "block"; - - - - }); - - theForm = registry.byId("formAddPort"); - - registry.byId("formAddPort.protocolsJMX").on("change", function(newValue){ - var isRMI = newValue == "RMI"; - var transportWidget = registry.byId("formAddPort.transports"); - if (isRMI && transportWidget.value != "TCP") - { - transportWidget.set("value", "TCP"); - } - transportWidget.set("disabled", isRMI); - dom.byId("formAddPort:transport").style.display = isRMI ? "none" : "block"; - dom.byId("formAddPort:fieldsAuthenticationProvider").style.display = isRMI? "none" : "block"; - registry.byId("formAddPort.authenticationProvider").set("disabled", isRMI); - }); - - theForm.on("submit", function(e) { - - event.stop(e); - if(theForm.validate()){ - - var newPort = convertToPort(theForm.getValues()); - if ((newPort.needClientAuth || newPort.wantClientAuth) && (!newPort.hasOwnProperty("trustStores") || newPort.trustStores.length==0)) - { - alert("A trust store must be selected when requesting client certificates."); - return false; - } - var that = this; - - xhr.put({url: "api/latest/port/"+encodeURIComponent(newPort.name), sync: true, handleAs: "json", - headers: { "Content-Type": "application/json"}, - putData: json.toJson(newPort), - load: function(x) {that.success = true; }, - error: function(error) {that.success = false; that.failureReason = error;}}); - - if(this.success === true) - { - registry.byId("addPort").hide(); - } - else - { - util.xhrErrorHandler(this.failureReason); - } - - return false; - - - }else{ - alert('Form contains invalid data. Please correct first'); - return false; - } - - }); - }}); - - addPort.show = function(portName, providers, keystores, truststores) { + xhr.get({url: "addPort.html", sync: true, load: function(data) { + var theForm; + node.innerHTML = data; + addPort.dialogNode = dom.byId("addPort"); + parser.instantiate([addPort.dialogNode]); + + //add the port types to formAddPort.type + var portTypeSelect = registry.byId("formAddPort.type"); + var supportedPortTypes = metadata.getTypesForCategory("Port"); + var portTypeSelectStore = util.makeTypeStore(supportedPortTypes); + portTypeSelect.set("store", portTypeSelectStore); + + //add handler for transports change + registry.byId("formAddPort.transports").on("change", function(newValue){ + var portType = portTypeSelect.get("value"); + toggleSslWidgets(portType, newValue); + }); + + + theForm = registry.byId("formAddPort"); + theForm.on("submit", function(e) { + + event.stop(e); + if(theForm.validate()){ + + var newPort = convertToPort(theForm.getValues()); + if ((newPort.needClientAuth || newPort.wantClientAuth) && (!newPort.hasOwnProperty("trustStores") || newPort.trustStores.length==0)) + { + alert("A trust store must be selected when requesting client certificates."); + return false; + } + var that = this; + + xhr.put({url: "api/latest/port/"+encodeURIComponent(newPort.name), sync: true, handleAs: "json", + headers: { "Content-Type": "application/json"}, + putData: json.toJson(newPort), + load: function(x) {that.success = true; }, + error: function(error) {that.success = false; that.failureReason = error;}}); + + if(this.success === true) + { + registry.byId("addPort").hide(); + } + else + { + util.xhrErrorHandler(this.failureReason); + } + + return false; + + + }else{ + alert('Form contains invalid data. Please correct first'); + return false; + } + + }); + }}); + + addPort.show = function(portName, portType, providers, keystores, truststores) { registry.byId("formAddPort").reset(); dojo.byId("formAddPort.id").value = ""; + + var nameWidget = registry.byId("formAddPort.name"); + var typeWidget = registry.byId("formAddPort.type"); + var portWidget = registry.byId("formAddPort.port"); var editWarning = dojo.byId("portEditWarning"); + var providerWidget = registry.byId("formAddPort.authenticationProvider"); if (providers) { @@ -354,7 +300,6 @@ define(["dojo/_base/xhr", } var keystoreWidget = registry.byId("formAddPort.keyStore"); - if (keystores) { var data = []; @@ -384,6 +329,12 @@ define(["dojo/_base/xhr", truststoreWidget.startup(); } + // Editing existing port, de-register existing on change handler if set + if (this.typeChangeHandler) + { + this.typeChangeHandler.remove(); + } + if (portName) { editWarning.style.display = "block"; @@ -395,12 +346,47 @@ define(["dojo/_base/xhr", }).then( function(data){ var port = data[0]; - var nameWidget = registry.byId("formAddPort.name"); nameWidget.set("value", port.name); nameWidget.set("disabled", true); dom.byId("formAddPort.id").value=port.id; + + //type + typeWidget.set("value", portType); + typeWidget.set("disabled", true); + var typeMetaData = metadata.getMetaData("Port", portType); + + //port number + portWidget.set("value", port.port); + portWidget.set("regExpGen", util.numericOrContextVarRegexp); + + //protocols + var protocolsMultiSelect = dom.byId("formAddPort.protocols"); + var protocolValidValues = typeMetaData.attributes.protocols.validValues; + var protocolValues = metadata.extractUniqueListOfValues(protocolValidValues); + util.setMultiSelectOptions(protocolsMultiSelect, protocolValues.sort()); + + var protocolsMultiSelectWidget = registry.byId("formAddPort.protocols"); + protocolsMultiSelectWidget.set("value", port.protocols); + + //authenticationProvider providerWidget.set("value", port.authenticationProvider ? port.authenticationProvider : ""); + + //transports + var transportsMultiSelect = dom.byId("formAddPort.transports"); + var transportsValidValues = typeMetaData.attributes.transports.validValues; + var transportsValues = metadata.extractUniqueListOfValues(transportsValidValues); + util.setMultiSelectOptions(transportsMultiSelect, transportsValues.sort()); + var transportWidget = registry.byId("formAddPort.transports"); + transportWidget.set("value", port.transports); + + //binding address + var bindAddressWidget = registry.byId("formAddPort.bindingAddress"); + bindAddressWidget.set("value", port.bindingAddress ? port.bindingAddress : ""); + bindAddressWidget.set("disabled", ! ("bindingAddress" in typeMetaData.attributes)); + dom.byId("formAddPort:fieldsBindingAddress").style.display = "bindingAddress" in typeMetaData.attributes ? "block" : "none"; + + //ssl keystoreWidget.set("value", port.keyStore ? port.keyStore : ""); if (port.trustStores) { @@ -421,64 +407,9 @@ define(["dojo/_base/xhr", } } - var transportWidget = registry.byId("formAddPort.transports"); - transportWidget.set("value", port.transports); - - var portWidget = registry.byId("formAddPort.port"); - portWidget.set("value", port.port); - portWidget.set("regExpGen", util.numericOrContextVarRegexp); - - var protocols = port.protocols; - var typeWidget = registry.byId("formAddPort.type"); - - var store = typeWidget.store; - store.data.forEach(function(option){ - registry.byId("formAddPort.protocols" + option.value).set("disabled", true); - dom.byId("formAddPort:fields" + option.value).style.display = "none"; - }); - - // identify the type of port using first protocol specified in protocol field if provided - if ( !protocols || protocols.length == 0 || protocols[0].indexOf("AMQP") == 0) - { - typeWidget.set("value", "AMQP"); - var amqpProtocolsWidget = registry.byId("formAddPort.protocolsAMQP"); - var defaultProtocolsWidget = registry.byId("formAddPort.protocolsDefault"); - var addressWidget = registry.byId("formAddPort.bindingAddress"); - addressWidget.set("value", port.bindingAddress); - - if (protocols) - { - amqpProtocolsWidget.set("value", protocols) - amqpProtocolsWidget.set("disabled", false) - defaultProtocolsWidget.set("checked", false); - } - else - { - defaultProtocolsWidget.set("checked", true); - amqpProtocolsWidget.set("disabled", true) - } - - registry.byId("formAddPort.needClientAuth").set("checked", port.needClientAuth); - registry.byId("formAddPort.wantClientAuth").set("checked", port.wantClientAuth); - } - else if (protocols[0].indexOf("RMI") != -1) - { - var jmxProtocolsWidget = registry.byId("formAddPort.protocolsJMX"); - jmxProtocolsWidget.set("disabled", false); - jmxProtocolsWidget.set("value", protocols[0]); - typeWidget.set("value", "JMX"); - } - else if (protocols[0].indexOf("HTTP") == 0) - { - var httpProtocolsWidget = registry.byId("formAddPort.protocolsHTTP"); - httpProtocolsWidget.set("disabled", false); - httpProtocolsWidget.set("value", protocols[0]); - typeWidget.set("value", "HTTP"); - var addressWidget = registry.byId("formAddPort.bindingAddress"); - addressWidget.set("value", port.bindingAddress) - } - dom.byId("formAddPort:fields" + typeWidget.value).style.display = "block"; - typeWidget.set("disabled", true); + // want/need client auth + registry.byId("formAddPort.needClientAuth").set("checked", port.needClientAuth); + registry.byId("formAddPort.wantClientAuth").set("checked", port.wantClientAuth); keystoreWidget.initialValue = port.keyStore; truststoreWidget.initialValue = port.trustStores; @@ -486,31 +417,29 @@ define(["dojo/_base/xhr", providerWidget.initialValue = providerWidget.value; registry.byId("addPort").show(); - util.applyMetadataToWidgets(registry.byId("addPort").domNode, "Port", typeWidget.get("value")); - + util.applyMetadataToWidgets(registry.byId("addPort").domNode, "Port", portType); }); } else { - // Creating new port - var typeWidget = registry.byId("formAddPort.type"); + // Adding new port, register the on change handler + this.typeChangeHandler = typeWidget.on("change", addPort._typeChanged); + if (typeWidget.get("disabled")) { typeWidget.set("disabled", false); } - typeWidget.set("value", "AMQP"); + typeWidget.set("value", portType); - var nameWidget = registry.byId("formAddPort.name"); nameWidget.set("disabled", false); nameWidget.set("regExpGen", util.nameOrContextVarRegexp); - var portWidget = registry.byId("formAddPort.port"); portWidget.set("regExpGen", util.numericOrContextVarRegexp); editWarning.style.display = "none"; registry.byId("addPort").show(); - util.applyMetadataToWidgets(registry.byId("addPort").domNode, "Port", "AMQP"); + util.applyMetadataToWidgets(registry.byId("addPort").domNode, "Port", portType); } }; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/showExchange.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/showExchange.html index 0f9f75817f..b67ea2f590 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/showExchange.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/showExchange.html @@ -25,8 +25,37 @@ <div class="name"></div> </div> <div class="clear"> - <div class="formLabel-labelCell">State:</div> - <div class="state"></div> + <div class="alignLeft"> + + <div class="clear"> + <div class="formLabel-labelCell">Type:</div> + <div class="type formValue-valueCell"></div> + </div> + <div class="clear"> + <div class="formLabel-labelCell">State:</div> + <div class="state formValue-valueCell"></div> + </div> + </div> + <div class="alignRight"> + <div class="clear"> + <div class="formLabel-labelCell">Inbound:</div> + <div class="formValue-valueCell"> + <span class="msgInRate"></span> + <span> msg/s</span> + <span class="bytesInRate">(</span> + <span class="bytesInRateUnits">)</span> + </div> + </div> + <div class="clear"> + <div class="formLabel-labelCell">Dropped:</div> + <div class="formValue-valueCell"> + <span class="msgDropRate"></span> + <span> msg/s</span> + <span class="bytesDropRate">(</span> + <span class="bytesDropRateUnits">)</span> + </div> + </div> + </div> </div> <div class="clear"> <div class="formLabel-labelCell">Durable:</div> @@ -36,33 +65,18 @@ <div class="formLabel-labelCell">Lifespan:</div> <div class="lifetimePolicy"></div> </div> - <div class="clear"> - <div class="formLabel-labelCell">Inbound:</div> - <div> - <span class="msgInRate"></span> - <span> msg/s</span> - <span class="bytesInRate">(</span> - <span class="bytesInRateUnits">)</span> - </div> - </div> - <div class="clear"> - <div class="formLabel-labelCell">Dropped:</div> - <div> - <span class="msgDropRate"></span> - <span> msg/s</span> - <span class="bytesDropRate">(</span> - <span class="bytesDropRateUnits">)</span> - </div> - </div> + <div class="clear"></div> </div> <br/> + <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Bindings'"> <div class="bindings"></div> <button data-dojo-type="dijit.form.Button" class="addBindingButton">Add Binding</button> <button data-dojo-type="dijit.form.Button" class="deleteBindingButton">Delete Binding</button> </div> <br/> + <div class="dijitDialogPaneActionBar"> <button data-dojo-type="dijit.form.Button" class="deleteExchangeButton" type="button">Delete Exchange</button> </div> diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/showPort.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/showPort.html index 62265a7248..1efae12bbf 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/showPort.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/showPort.html @@ -26,6 +26,11 @@ <div class="nameValue"></div> </div> + <div class="clear name"> + <div class="formLabel-labelCell">Port Type:</div> + <div class="typeValue"></div> + </div> + <div class="clear state"> <div class="formLabel-labelCell">State:</div> <div class="stateValue"></div> @@ -36,24 +41,24 @@ <div class="portValue"></div> </div> - <div class="clear authenticationProvider"> - <div class="formLabel-labelCell">Authentication Provider:</div> - <div class="authenticationProviderValue"></div> - </div> - <div class="clear protocols"> <div class="formLabel-labelCell">Protocols:</div> - <div class="protocolsValue"></div> + <div class="protocolsValue multiLineValue"></div> </div> - <div class="clear transports"> - <div class="formLabel-labelCell">Transports:</div> - <div class="transportsValue"></div> - </div> + <div class="clear authenticationProvider"> + <div class="formLabel-labelCell">Authentication Provider:</div> + <div class="authenticationProviderValue"></div> + </div> - <div class="clear bindingAddress"> - <div class="formLabel-labelCell">Binding address:</div> - <div class="bindingAddressValue"></div> + <div class="clear bindingAddress"> + <div class="formLabel-labelCell">Binding address:</div> + <div class="bindingAddressValue"></div> + </div> + + <div class="clear transports"> + <div class="formLabel-labelCell">Transports:</div> + <div class="transportsValue multiLineValue"></div> </div> <div class="clear keyStore"> @@ -73,7 +78,7 @@ <div class="clear trustStores"> <div class="formLabel-labelCell">Trust Stores:</div> - <div class="trustStoresValue"></div> + <div class="trustStoresValue multiLineValue"></div> </div> </div> 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 011b7b995d..15102c8ce4 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 @@ -58,7 +58,7 @@ public class ConfiguredObjectToMapConverterTest extends TestCase when(_configuredObject.getStatistics()).thenReturn(Collections.singletonMap(statisticName, (Number) statisticValue)); Map<String, Object> resultMap = _converter.convertObjectToMap(_configuredObject, ConfiguredObject.class, 0, - false, false); + false, false, false); Map<String, Object> statsAsMap = (Map<String, Object>) resultMap.get(STATISTICS_MAP_KEY); assertNotNull("Statistics should be part of map", statsAsMap); assertEquals("Unexpected number of statistics", 1, statsAsMap.size()); @@ -72,7 +72,7 @@ public class ConfiguredObjectToMapConverterTest extends TestCase configureMockToReturnOneAttribute(_configuredObject, attributeName, attributeValue); Map<String, Object> resultMap = _converter.convertObjectToMap(_configuredObject, ConfiguredObject.class, 0, - false, false); + false, false, false); assertEquals("Unexpected number of attributes", 1, resultMap.size()); assertEquals("Unexpected attribute value", attributeValue, resultMap.get(attributeName)); } @@ -90,7 +90,7 @@ public class ConfiguredObjectToMapConverterTest extends TestCase configureMockToReturnOneAttribute(_configuredObject, attributeName, attributeValue); Map<String, Object> resultMap = _converter.convertObjectToMap(_configuredObject, ConfiguredObject.class, 0, - false, false); + false, false, false); assertEquals("Unexpected number of attributes", 1, resultMap.size()); assertEquals("Unexpected attribute value", "attributeConfiguredObjectName", resultMap.get(attributeName)); } @@ -109,7 +109,7 @@ public class ConfiguredObjectToMapConverterTest extends TestCase when(_configuredObject.getChildren(TestChild.class)).thenReturn(Arrays.asList(mockChild)); Map<String, Object> resultMap = _converter.convertObjectToMap(_configuredObject, ConfiguredObject.class, 1, - false, false); + false, false, false); assertEquals("Unexpected parent map size", 1, resultMap.size()); final List<Map<String, Object>> childList = (List<Map<String, Object>>) resultMap.get("testchilds"); @@ -146,18 +146,18 @@ public class ConfiguredObjectToMapConverterTest extends TestCase Map<String, Object> resultMap = _converter.convertObjectToMap(_configuredObject, ConfiguredObject.class, 1, true, - false); + false, false); assertEquals("Unexpected parent map size", 2, resultMap.size()); assertEquals("Incorrect context", resultMap.get(ConfiguredObject.CONTEXT), actualContext); List<Map<String, Object>> childList = (List<Map<String, Object>>) resultMap.get("testchilds"); assertEquals("Unexpected number of children", 1, childList.size()); Map<String, Object> childMap = childList.get(0); - assertEquals("Unexpected child map size", 2, childMap.size()); assertNotNull(childMap); + assertEquals("Unexpected child map size", 1, childMap.size()); assertEquals("Unexpected child attribute value", childActualAttributeValue, childMap.get(childAttributeName)); - resultMap = _converter.convertObjectToMap(_configuredObject, ConfiguredObject.class, 1, false, false); + resultMap = _converter.convertObjectToMap(_configuredObject, ConfiguredObject.class, 1, false, false, false); assertEquals("Unexpected parent map size", 2, resultMap.size()); Map<String, Object> inheritedContext = new HashMap<>(); inheritedContext.put("key","value"); @@ -166,7 +166,7 @@ public class ConfiguredObjectToMapConverterTest extends TestCase childList = (List<Map<String, Object>>) resultMap.get("testchilds"); assertEquals("Unexpected number of children", 1, childList.size()); childMap = childList.get(0); - assertEquals("Unexpected child map size", 2, childMap.size()); + assertEquals("Unexpected child map size", 1, childMap.size()); assertNotNull(childMap); assertEquals("Unexpected child attribute value", childAttributeValue, childMap.get(childAttributeName)); |