summaryrefslogtreecommitdiff
path: root/qpid/java/broker-plugins/management-http
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/java/broker-plugins/management-http')
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java2
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/FileServlet.java2
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java190
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java32
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/addPort.html126
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/css/common.css4
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/metadata.js19
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js34
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js2
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Exchange.js3
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Port.js50
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addPort.js391
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/showExchange.html54
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/showPort.html33
-rw-r--r--qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverterTest.java16
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));