diff options
| author | Keith Wall <kwall@apache.org> | 2015-03-03 14:56:40 +0000 |
|---|---|---|
| committer | Keith Wall <kwall@apache.org> | 2015-03-03 14:56:40 +0000 |
| commit | 9dc57fe738f366d875c2319dafdfa2c50ce2f20b (patch) | |
| tree | be6634866a966f358fcb1ba6ba29dfb5c9c340c1 /qpid/java/broker-plugins | |
| parent | fe37626d4fd8fb3ee5b3146a5159024a3d6d3357 (diff) | |
| download | qpid-python-9dc57fe738f366d875c2319dafdfa2c50ce2f20b.tar.gz | |
merge from trunk
git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/QPID-6262-JavaBrokerNIO@1663717 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java/broker-plugins')
89 files changed, 2062 insertions, 432 deletions
diff --git a/qpid/java/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerConnectionDelegate.java b/qpid/java/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerConnectionDelegate.java index 78228c209f..6e2a6cac7d 100644 --- a/qpid/java/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerConnectionDelegate.java +++ b/qpid/java/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerConnectionDelegate.java @@ -184,7 +184,8 @@ public class ServerConnectionDelegate extends ServerDelegate vhostName = ""; } - vhost = ((AmqpPort)sconn.getPort()).getVirtualHost(vhostName); + AmqpPort port = (AmqpPort) sconn.getPort(); + vhost = port.getVirtualHost(vhostName); @@ -193,14 +194,28 @@ public class ServerConnectionDelegate extends ServerDelegate if (vhost.getState() != State.ACTIVE) { sconn.setState(Connection.State.CLOSING); - sconn.invoke(new ConnectionClose(ConnectionCloseCode.CONNECTION_FORCED, "Virtual host '"+vhostName+"' is not active")); + final String redirectHost = vhost.getRedirectHost(port); + if(redirectHost == null) + { + sconn.invoke(new ConnectionClose(ConnectionCloseCode.CONNECTION_FORCED, + "Virtual host '" + vhostName + "' is not active")); + } + else + { + sconn.invoke(new ConnectionRedirect(redirectHost, new ArrayList<Object>())); + } return; } sconn.setVirtualHost(vhost); try { - vhost.getSecurityManager().authoriseCreateConnection(sconn); + if(!vhost.authoriseCreateConnection(sconn)) + { + sconn.setState(Connection.State.CLOSING); + sconn.invoke(new ConnectionClose(ConnectionCloseCode.CONNECTION_FORCED, "Connection not authorized")); + return; + } } catch (AccessControlException e) { @@ -215,7 +230,8 @@ public class ServerConnectionDelegate extends ServerDelegate else { sconn.setState(Connection.State.CLOSING); - sconn.invoke(new ConnectionClose(ConnectionCloseCode.INVALID_PATH, "Unknown virtualhost '"+vhostName+"'")); + sconn.invoke(new ConnectionClose(ConnectionCloseCode.INVALID_PATH, + "Unknown virtualhost '" + vhostName + "'")); } } diff --git a/qpid/java/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerSessionDelegate.java b/qpid/java/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerSessionDelegate.java index c42630d0c6..dd634c36ff 100644 --- a/qpid/java/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerSessionDelegate.java +++ b/qpid/java/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerSessionDelegate.java @@ -33,6 +33,7 @@ import java.util.UUID; import org.apache.log4j.Logger; +import org.apache.qpid.common.AMQPFilterTypes; import org.apache.qpid.exchange.ExchangeDefaults; import org.apache.qpid.protocol.AMQConstant; import org.apache.qpid.server.protocol.ServerProtocolEngine; @@ -40,8 +41,10 @@ import org.apache.qpid.server.consumer.ConsumerImpl; import org.apache.qpid.server.exchange.ExchangeImpl; import org.apache.qpid.server.virtualhost.VirtualHostUnavailableException; import org.apache.qpid.server.filter.AMQInvalidArgumentException; +import org.apache.qpid.server.filter.ArrivalTimeFilter; import org.apache.qpid.server.filter.FilterManager; import org.apache.qpid.server.filter.FilterManagerFactory; +import org.apache.qpid.server.filter.MessageFilter; import org.apache.qpid.server.logging.messages.ChannelMessages; import org.apache.qpid.server.logging.messages.ExchangeMessages; import org.apache.qpid.server.message.InstanceProperties; @@ -259,6 +262,43 @@ public class ServerSessionDelegate extends SessionDelegate return; } + + if(method.hasArguments() && method.getArguments().containsKey(AMQPFilterTypes.REPLAY_PERIOD.toString())) + { + Object value = method.getArguments().get(AMQPFilterTypes.REPLAY_PERIOD.toString()); + final long period; + if(value instanceof Number) + { + period = ((Number)value).longValue(); + } + else if(value instanceof String) + { + try + { + period = Long.parseLong(value.toString()); + } + catch (NumberFormatException e) + { + exception(session, method, ExecutionErrorCode.ILLEGAL_ARGUMENT, "Cannot parse value " + value + " as a number for filter " + AMQPFilterTypes.REPLAY_PERIOD.toString()); + return; + } + } + else + { + exception(session, method, ExecutionErrorCode.ILLEGAL_ARGUMENT, "Cannot parse value " + value + " as a number for filter " + AMQPFilterTypes.REPLAY_PERIOD.toString()); + return; + } + final long startingFrom = System.currentTimeMillis() - (1000l * period); + if(filterManager == null) + { + filterManager = new FilterManager(); + } + MessageFilter filter = new ArrivalTimeFilter(startingFrom); + filterManager.add(filter.getName(), filter); + + } + + ConsumerTarget_0_10 target = new ConsumerTarget_0_10((ServerSession)session, destination, method.getAcceptMode(), method.getAcquireMode(), @@ -1609,4 +1649,5 @@ public class ServerSessionDelegate extends SessionDelegate { } } + } diff --git a/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQChannel.java b/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQChannel.java index 9631530f90..18ebc94187 100644 --- a/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQChannel.java +++ b/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQChannel.java @@ -59,11 +59,11 @@ import org.apache.qpid.server.consumer.ConsumerImpl; import org.apache.qpid.server.consumer.ConsumerTarget; import org.apache.qpid.server.exchange.ExchangeImpl; import org.apache.qpid.server.filter.AMQInvalidArgumentException; +import org.apache.qpid.server.filter.ArrivalTimeFilter; import org.apache.qpid.server.filter.FilterManager; import org.apache.qpid.server.filter.FilterManagerFactory; import org.apache.qpid.server.filter.Filterable; import org.apache.qpid.server.filter.MessageFilter; -import org.apache.qpid.server.filter.SimpleFilterManager; import org.apache.qpid.server.flow.FlowCreditManager; import org.apache.qpid.server.logging.LogMessage; import org.apache.qpid.server.logging.LogSubject; @@ -673,7 +673,7 @@ public class AMQChannel * @param tag the tag chosen by the client (if null, server will generate one) * @param sources the queues to subscribe to * @param acks Are acks enabled for this subscriber - * @param filters Filters to apply to this subscriber + * @param arguments Filters to apply to this subscriber * * @param exclusive Flag requesting exclusive access to the queue * @return the consumer tag. This is returned to the subscriber and used in subsequent unsubscribe requests @@ -681,7 +681,7 @@ public class AMQChannel * @throws org.apache.qpid.AMQException if something goes wrong */ public AMQShortString consumeFromSource(AMQShortString tag, Collection<MessageSource> sources, boolean acks, - FieldTable filters, boolean exclusive, boolean noLocal) + FieldTable arguments, boolean exclusive, boolean noLocal) throws MessageSource.ExistingConsumerPreventsExclusive, MessageSource.ExistingExclusiveConsumer, AMQInvalidArgumentException, @@ -700,19 +700,19 @@ public class AMQChannel ConsumerTarget_0_8 target; EnumSet<ConsumerImpl.Option> options = EnumSet.noneOf(ConsumerImpl.Option.class); - if(filters != null && Boolean.TRUE.equals(filters.get(AMQPFilterTypes.NO_CONSUME.getValue()))) + if(arguments != null && Boolean.TRUE.equals(arguments.get(AMQPFilterTypes.NO_CONSUME.getValue()))) { - target = ConsumerTarget_0_8.createBrowserTarget(this, tag, filters, _noAckCreditManager); + target = ConsumerTarget_0_8.createBrowserTarget(this, tag, arguments, _noAckCreditManager); } else if(acks) { - target = ConsumerTarget_0_8.createAckTarget(this, tag, filters, _creditManager); + target = ConsumerTarget_0_8.createAckTarget(this, tag, arguments, _creditManager); options.add(ConsumerImpl.Option.ACQUIRES); options.add(ConsumerImpl.Option.SEES_REQUEUES); } else { - target = ConsumerTarget_0_8.createNoAckTarget(this, tag, filters, _noAckCreditManager); + target = ConsumerTarget_0_8.createNoAckTarget(this, tag, arguments, _noAckCreditManager); options.add(ConsumerImpl.Option.ACQUIRES); options.add(ConsumerImpl.Option.SEES_REQUEUES); } @@ -732,23 +732,66 @@ public class AMQChannel try { - FilterManager filterManager = FilterManagerFactory.createManager(FieldTable.convertToMap(filters)); + FilterManager filterManager = FilterManagerFactory.createManager(FieldTable.convertToMap(arguments)); if(noLocal) { if(filterManager == null) { - filterManager = new SimpleFilterManager(); + filterManager = new FilterManager(); } final Object connectionReference = getConnectionReference(); - filterManager.add(new MessageFilter() + MessageFilter filter = new MessageFilter() { + + @Override + public String getName() + { + return AMQPFilterTypes.NO_LOCAL.toString(); + } + @Override public boolean matches(final Filterable message) { return message.getConnectionReference() != connectionReference; } - }); + }; + filterManager.add(filter.getName(), filter); + } + + if(arguments != null && arguments.containsKey(AMQPFilterTypes.REPLAY_PERIOD.toString())) + { + Object value = arguments.get(AMQPFilterTypes.REPLAY_PERIOD.toString()); + final long period; + if(value instanceof Number) + { + period = ((Number)value).longValue(); + } + else if(value instanceof String) + { + try + { + period = Long.parseLong(value.toString()); + } + catch (NumberFormatException e) + { + throw new AMQInvalidArgumentException("Cannot parse value " + value + " as a number for filter " + AMQPFilterTypes.REPLAY_PERIOD.toString()); + } + } + else + { + throw new AMQInvalidArgumentException("Cannot parse value " + value + " as a number for filter " + AMQPFilterTypes.REPLAY_PERIOD.toString()); + } + + final long startingFrom = System.currentTimeMillis() - (1000l * period); + if(filterManager == null) + { + filterManager = new FilterManager(); + } + MessageFilter filter = new ArrivalTimeFilter(startingFrom); + filterManager.add(filter.getName(), filter); + } + for(MessageSource source : sources) { ConsumerImpl sub = diff --git a/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java b/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java index 659207d9e8..d58ac36ff5 100644 --- a/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java +++ b/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java @@ -1565,7 +1565,7 @@ public class AMQProtocolEngine implements ServerProtocolEngine, virtualHostStr = virtualHostName == null ? null : virtualHostName.toString(); } - VirtualHostImpl virtualHost = ((AmqpPort)getPort()).getVirtualHost(virtualHostStr); + VirtualHostImpl<?,?,?> virtualHost = ((AmqpPort)getPort()).getVirtualHost(virtualHostStr); if (virtualHost == null) { @@ -1578,8 +1578,16 @@ public class AMQProtocolEngine implements ServerProtocolEngine, // Check virtualhost access if (virtualHost.getState() != State.ACTIVE) { - closeConnection(AMQConstant.CONNECTION_FORCED, - "Virtual host '" + virtualHost.getName() + "' is not active",0); + String redirectHost = virtualHost.getRedirectHost(getPort()); + if(redirectHost != null) + { + closeConnection(0, new AMQFrame(0,new ConnectionRedirectBody(getProtocolVersion(),AMQShortString.valueOf(redirectHost), null))); + } + else + { + closeConnection(AMQConstant.CONNECTION_FORCED, + "Virtual host '" + virtualHost.getName() + "' is not active", 0); + } } else @@ -1587,21 +1595,29 @@ public class AMQProtocolEngine implements ServerProtocolEngine, setVirtualHost(virtualHost); try { - virtualHost.getSecurityManager().authoriseCreateConnection(this); - if (getContextKey() == null) + + if(virtualHost.authoriseCreateConnection(this)) { - setContextKey(new AMQShortString(Long.toString(System.currentTimeMillis()))); - } + if (getContextKey() == null) + { + setContextKey(new AMQShortString(Long.toString(System.currentTimeMillis()))); + } + + MethodRegistry methodRegistry = getMethodRegistry(); + AMQMethodBody responseBody = methodRegistry.createConnectionOpenOkBody(virtualHostName); - MethodRegistry methodRegistry = getMethodRegistry(); - AMQMethodBody responseBody = methodRegistry.createConnectionOpenOkBody(virtualHostName); + writeFrame(responseBody.generateFrame(0)); + _state = ConnectionState.OPEN; - writeFrame(responseBody.generateFrame(0)); - _state = ConnectionState.OPEN; + } + else + { + closeConnection(AMQConstant.ACCESS_REFUSED, "Connection refused",0); + } } catch (AccessControlException e) { - closeConnection(AMQConstant.ACCESS_REFUSED, e.getMessage(),0); + closeConnection(AMQConstant.ACCESS_REFUSED, e.getMessage(), 0); } } } @@ -1767,7 +1783,7 @@ public class AMQProtocolEngine implements ServerProtocolEngine, _logger.info("Locale selected: " + locale); SubjectCreator subjectCreator = getSubjectCreator(); - SaslServer ss = null; + SaslServer ss; try { ss = subjectCreator.createSaslServer(String.valueOf(mechanism), diff --git a/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLink_1_0.java b/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLink_1_0.java index 6a202998f4..fe36ba91cb 100644 --- a/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLink_1_0.java +++ b/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLink_1_0.java @@ -65,8 +65,8 @@ import org.apache.qpid.filter.selector.ParseException; import org.apache.qpid.server.binding.BindingImpl; import org.apache.qpid.server.consumer.ConsumerImpl; import org.apache.qpid.server.exchange.ExchangeImpl; +import org.apache.qpid.server.filter.FilterManager; import org.apache.qpid.server.filter.JMSSelectorFilter; -import org.apache.qpid.server.filter.SimpleFilterManager; import org.apache.qpid.server.message.MessageInstance; import org.apache.qpid.server.message.MessageSource; import org.apache.qpid.server.model.ExclusivityPolicy; @@ -154,15 +154,7 @@ public class SendingLink_1_0 implements SendingLinkListener, Link_1_0, DeliveryS actualFilters.put(entry.getKey(), entry.getValue()); } - catch (ParseException e) - { - Error error = new Error(); - error.setCondition(AmqpError.INVALID_FIELD); - error.setDescription("Invalid JMS Selector: " + selectorFilter.getValue()); - error.setInfo(Collections.singletonMap(Symbol.valueOf("field"), Symbol.valueOf("filter"))); - throw new AmqpErrorException(error); - } - catch (SelectorParsingException e) + catch (ParseException | SelectorParsingException e) { Error error = new Error(); error.setCondition(AmqpError.INVALID_FIELD); @@ -374,8 +366,16 @@ public class SendingLink_1_0 implements SendingLinkListener, Link_1_0, DeliveryS { name = getEndpoint().getName(); } + + FilterManager filters = null; + if(messageFilter != null) + { + filters = new FilterManager(); + filters.add(messageFilter.getName(), messageFilter); + } + _consumer = _queue.addConsumer(_target, - messageFilter == null ? null : new SimpleFilterManager(messageFilter), + filters, Message_1_0.class, name, options); } catch (MessageSource.ExistingExclusiveConsumer e) diff --git a/qpid/java/broker-plugins/derby-store/src/main/java/resources/js/qpid/management/virtualhost/derby/add.js b/qpid/java/broker-plugins/derby-store/src/main/java/resources/js/qpid/management/virtualhost/derby/add.js index 7b12d10343..323b8e9750 100644 --- a/qpid/java/broker-plugins/derby-store/src/main/java/resources/js/qpid/management/virtualhost/derby/add.js +++ b/qpid/java/broker-plugins/derby-store/src/main/java/resources/js/qpid/management/virtualhost/derby/add.js @@ -34,10 +34,11 @@ define(["dojo/_base/xhr", show: function (data) { this.containerNode = domConstruct.create("div", {innerHTML: template}, data.containerNode); - parser.parse(this.containerNode); - - registry.byId("addVirtualHost.storeUnderfullSize").set("regExpGen", util.numericOrContextVarRegexp); - registry.byId("addVirtualHost.storeOverfullSize").set("regExpGen", util.numericOrContextVarRegexp); + parser.parse(this.containerNode).then(function(instances) + { + registry.byId("addVirtualHost.storeUnderfullSize").set("regExpGen", util.numericOrContextVarRegexp); + registry.byId("addVirtualHost.storeOverfullSize").set("regExpGen", util.numericOrContextVarRegexp); + }); } }; } diff --git a/qpid/java/broker-plugins/derby-store/src/main/java/resources/js/qpid/management/virtualhost/derby/edit.js b/qpid/java/broker-plugins/derby-store/src/main/java/resources/js/qpid/management/virtualhost/derby/edit.js index a8b68a0c16..c1018313b8 100644 --- a/qpid/java/broker-plugins/derby-store/src/main/java/resources/js/qpid/management/virtualhost/derby/edit.js +++ b/qpid/java/broker-plugins/derby-store/src/main/java/resources/js/qpid/management/virtualhost/derby/edit.js @@ -22,10 +22,12 @@ define(["qpid/common/util", "dijit/registry", "dojo/domReady!"], return { show: function(data) { - util.buildEditUI(data.containerNode, "virtualhost/sizemonitoring/edit.html", "editVirtualHost.", null, null); - - registry.byId("editVirtualHost.storeUnderfullSize").set("regExpGen", util.numericOrContextVarRegexp); - registry.byId("editVirtualHost.storeOverfullSize").set("regExpGen", util.numericOrContextVarRegexp); + util.parseHtmlIntoDiv(data.containerNode, "virtualhost/sizemonitoring/edit.html", + function() + { + registry.byId("editVirtualHost.storeUnderfullSize").set("regExpGen", util.numericOrContextVarRegexp); + registry.byId("editVirtualHost.storeOverfullSize").set("regExpGen", util.numericOrContextVarRegexp); + }); } }; } diff --git a/qpid/java/broker-plugins/derby-store/src/main/java/resources/js/qpid/management/virtualhostnode/derby/edit.js b/qpid/java/broker-plugins/derby-store/src/main/java/resources/js/qpid/management/virtualhostnode/derby/edit.js index 5fa0443185..a7f5d05719 100644 --- a/qpid/java/broker-plugins/derby-store/src/main/java/resources/js/qpid/management/virtualhostnode/derby/edit.js +++ b/qpid/java/broker-plugins/derby-store/src/main/java/resources/js/qpid/management/virtualhostnode/derby/edit.js @@ -22,8 +22,11 @@ define(["qpid/common/util", "dijit/registry", "dojo/domReady!"], return { show: function(data) { - util.buildEditUI(data.containerNode, "virtualhostnode/filebased/edit.html", "editVirtualHostNode.", ["storePath"], data.data); - registry.byId("editVirtualHostNode.storePath").set("disabled", data.data.state != "STOPPED"); + util.parseHtmlIntoDiv(data.containerNode, "virtualhostnode/filebased/edit.html", + function() + { + registry.byId("editVirtualHostNode.storePath").set("disabled", data.data.state != "STOPPED"); + }); } }; } diff --git a/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/resources/js/qpid/management/store/pool/bonecp/show.js b/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/resources/js/qpid/management/store/pool/bonecp/show.js index 31e5db5035..3d15cdbc37 100644 --- a/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/resources/js/qpid/management/store/pool/bonecp/show.js +++ b/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/resources/js/qpid/management/store/pool/bonecp/show.js @@ -40,13 +40,15 @@ define(["dojo/_base/xhr", sync: true, load: function(template) { containerNode.innerHTML = template; - parser.parse(containerNode); + parser.parse(containerNode).then(function(instances) + { + for(var i=0; i<fieldNames.length;i++) + { + var fieldName = fieldNames[i]; + that[fieldName]= query("." + fieldName, containerNode)[0]; + } + }); }}); - for(var i=0; i<fieldNames.length;i++) - { - var fieldName = fieldNames[i]; - this[fieldName]= query("." + fieldName, containerNode)[0]; - } } BoneCP.prototype.update=function(data) diff --git a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/add.js b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/add.js index beb298e988..8de6206373 100644 --- a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/add.js +++ b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/add.js @@ -36,12 +36,18 @@ define(["dojo/_base/xhr", return { show: function (data) { + var that = this; this.containerNode = domConstruct.create("div", {innerHTML: template}, data.containerNode); - parser.parse(this.containerNode); - + parser.parse(this.containerNode).then(function(instances) + { + that._postParse(data); + }); + }, + _postParse: function (data) + { + var that = this; registry.byId("addVirtualHost.connectionUrl").set("regExpGen", util.jdbcUrlOrContextVarRegexp); registry.byId("addVirtualHost.username").set("regExpGen", util.nameOrContextVarRegexp); - var poolTypes = json.parse(poolTypeJsonString); var poolTypesData = []; for (var i =0 ; i < poolTypes.length; i++) diff --git a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/edit.js b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/edit.js index 90fc246276..4a2a3763bd 100644 --- a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/edit.js +++ b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/edit.js @@ -29,12 +29,15 @@ define(["qpid/common/util", function (util, poolTypeJsonString, array, json, string, Memory, dom, domConstruct, registry) { - var fieldNames = ["connectionUrl", "username", "connectionPoolType"]; return { show: function(data) { - util.buildEditUI(data.containerNode, "virtualhost/jdbc/edit.html", "editVirtualHost.", fieldNames, data.data); - + var that = this; + util.parseHtmlIntoDiv(data.containerNode, "virtualhost/jdbc/edit.html", + function(){that._postParse(data)}); + }, + _postParse: function(data) + { registry.byId("editVirtualHost.connectionUrl").set("regExpGen", util.jdbcUrlOrContextVarRegexp); registry.byId("editVirtualHost.username").set("regExpGen", util.nameOrContextVarRegexp); diff --git a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/show.js b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/show.js index d3fdf50769..b717f2091d 100644 --- a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/show.js +++ b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhost/jdbc/show.js @@ -25,9 +25,12 @@ define(["qpid/common/util", "dojo/query", "dojo/_base/array", "dojo/dom-construc function JDBC(data) { - util.buildUI(data.containerNode, data.parent, "virtualhostnode/jdbc/show.html", fieldNames, this); - this.usernameAttributeContainer=query(".usernameAttributeContainer", data.containerNode)[0]; - this.connectionPoolTypeAttributeContainer=query(".connectionPoolTypeAttributeContainer", data.containerNode)[0]; + var that = this; + util.buildUI(data.containerNode, data.parent, "virtualhostnode/jdbc/show.html", fieldNames, this, function() + { + that.usernameAttributeContainer=query(".usernameAttributeContainer", data.containerNode)[0]; + that.connectionPoolTypeAttributeContainer=query(".connectionPoolTypeAttributeContainer", data.containerNode)[0]; + }); } JDBC.prototype.update = function(data) diff --git a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/add.js b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/add.js index d5a7b43aae..071c0c8b23 100644 --- a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/add.js +++ b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/add.js @@ -38,9 +38,16 @@ define(["dojo/_base/xhr", return { show: function (data) { + var that = this; this.containerNode = domConstruct.create("div", {innerHTML: template}, data.containerNode); - parser.parse(this.containerNode); - + parser.parse(this.containerNode).then(function(instances) + { + that._postParse(data); + }); + }, + _postParse: function(data) + { + var that = this; registry.byId("addVirtualHostNode.connectionUrl").set("regExpGen", util.jdbcUrlOrContextVarRegexp); registry.byId("addVirtualHostNode.username").set("regExpGen", util.nameOrContextVarRegexp); diff --git a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/edit.js b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/edit.js index 828369cae0..cccfa95d4c 100644 --- a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/edit.js +++ b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/edit.js @@ -28,12 +28,14 @@ define(["qpid/common/util", "dojo/domReady!"], function (util, poolTypeJsonString, array, json, string, Memory, dom, domConstruct, registry) { - var fieldNames = ["connectionUrl", "username", "connectionPoolType"]; return { show: function(data) { - util.buildEditUI(data.containerNode, "virtualhostnode/jdbc/edit.html", "editVirtualHostNode.", fieldNames, data.data); - + var that = this; + util.parseHtmlIntoDiv(data.containerNode, "virtualhostnode/jdbc/edit.html", function(){ that._postParse(data);}); + }, + _postParse: function(data) + { registry.byId("editVirtualHostNode.connectionUrl").set("regExpGen", util.jdbcUrlOrContextVarRegexp); registry.byId("editVirtualHostNode.username").set("regExpGen", util.nameOrContextVarRegexp); diff --git a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/show.js b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/show.js index 15c237d0a2..019962fc64 100644 --- a/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/show.js +++ b/qpid/java/broker-plugins/jdbc-store/src/main/java/resources/js/qpid/management/virtualhostnode/jdbc/show.js @@ -27,10 +27,13 @@ define(["qpid/common/util", "dojo/query", "dojo/_base/array", "dojo/dom-construc function Jdbc(data) { this.parent = data.parent; - util.buildUI(data.containerNode, data.parent, "virtualhostnode/jdbc/show.html", fieldNames, this); - - this.usernameAttributeContainer=query(".usernameAttributeContainer", data.containerNode)[0]; - this.connectionPoolTypeAttributeContainer=query(".connectionPoolTypeAttributeContainer", data.containerNode)[0]; + var that = this; + util.buildUI(data.containerNode, data.parent, "virtualhostnode/jdbc/show.html", fieldNames, this, + function() + { + that.usernameAttributeContainer=query(".usernameAttributeContainer", data.containerNode)[0]; + that.connectionPoolTypeAttributeContainer=query(".connectionPoolTypeAttributeContainer", data.containerNode)[0]; + }); } Jdbc.prototype.update=function(data) 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 4e340c7b72..69920ff488 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 @@ -69,6 +69,7 @@ import org.apache.qpid.server.management.plugin.servlet.rest.LogoutServlet; import org.apache.qpid.server.management.plugin.servlet.rest.MessageContentServlet; import org.apache.qpid.server.management.plugin.servlet.rest.MessageServlet; import org.apache.qpid.server.management.plugin.servlet.rest.MetaDataServlet; +import org.apache.qpid.server.management.plugin.servlet.rest.QueueReportServlet; import org.apache.qpid.server.management.plugin.servlet.rest.RestServlet; import org.apache.qpid.server.management.plugin.servlet.rest.SaslServlet; import org.apache.qpid.server.management.plugin.servlet.rest.StructureServlet; @@ -304,6 +305,8 @@ public class HttpManagement extends AbstractPluginAdapter<HttpManagement> implem root.addServlet(new ServletHolder(new StructureServlet()), "/service/structure"); root.addServlet(new ServletHolder(new MessageServlet()), "/service/message/*"); root.addServlet(new ServletHolder(new MessageContentServlet()), "/service/message-content/*"); + root.addServlet(new ServletHolder(new QueueReportServlet()), "/service/queuereport/*"); + root.addServlet(new ServletHolder(new LogRecordsServlet()), "/service/logrecords"); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/report/QueueBinaryReport.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/report/QueueBinaryReport.java new file mode 100644 index 0000000000..d842de3f1b --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/report/QueueBinaryReport.java @@ -0,0 +1,28 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.server.management.plugin.report; + +public abstract class QueueBinaryReport extends QueueReport<byte[]> +{ + public QueueBinaryReport() + { + } +} diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/report/QueueReport.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/report/QueueReport.java new file mode 100644 index 0000000000..23b24aaf8d --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/report/QueueReport.java @@ -0,0 +1,161 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.server.management.plugin.report; + +import org.apache.qpid.server.model.Queue; +import org.apache.qpid.server.model.VirtualHost; + +/** + * <p> + * The QueueReport class provides an extension point for installations to provide custom management reporting on + * queues through the REST API. + * </p> + * + * <p> + * A custom QueueReport must extend either {@link org.apache.qpid.server.management.plugin.report.QueueTextReport} + * or {@link org.apache.qpid.server.management.plugin.report.QueueBinaryReport}. The report implementation must + * define a {@link #getName() name} which is unique amongst all installed reports. The report class must be present + * in the classpath of the broker, and a provider-configuration file named + * org.apache.qpid.server.management.plugin.report.QueueReport must be added in the resource directory + * META-INF/services directory with the binary name of the implementation (as described in + * {@link java.util.ServiceLoader ServiceLoader}). + * </p> + * + * <h3>Running reports</h3> + * <p> + * The report can be run using the URL: + * {@code http://<broker>/service/queuereport/<virtualhost name>/<queue name>/<report name>[?param1=x¶m2=y...]} + * </p> + * + * <h4>Report Parameters</h4> + * + * <p> + * Reports can take parameters from the query string of the HTTP request. For every parameter in the query string + * the system will look for a setter on the report object with either a String or String[] parameter. Thus if + * the query string contains {@code foo=bar}, then the system will look for a setter {@code setFoo(String value)} or + * {@code setFoo(String[] value)}. If the same parameter occurs multiple times in the query string then only the + * array variant of the setter will be called. + * </p> + * <p> + * Setters for the parameters are guaranteed to be called before the first message is added to the report. + * </p> + * + * <p> + * NOTE: In order to comply with the requirements of the {@link java.util.ServiceLoader ServiceLoader} api, all + * implementations of QueueReport MUST provide a public no-args constructor. + * </p> + * @param <T> + */ +public abstract class QueueReport<T> +{ + private Queue<?> _queue; + + QueueReport() + { + + } + + /** + * Gets the name of the report. + * <p> + * The name of the report must be unique amongst all installed implementations. The name of the report + * is examined by the Qpid immediately upon construction. The name should not change during + * the lifetime of the object (the value is only meaningful to the system at the time of initial construction) + * and all instances of the same concrete implementation should have the same name. + * </p> + * @return the name of the report + */ + public abstract String getName(); + + /** + * Get the name of the queue against which the report is being run. + * + * @return the name of the queue + */ + public final String getQueueName() + { + return _queue.getName(); + } + + final void setQueue(final Queue<?> queue) + { + _queue = queue; + } + + /** + * Get the name of the virtual host against which the report is being run. + * + * @return the name of the virtual host + */ + public final String getVirtualHostName() + { + return _queue.getParent(VirtualHost.class).getName(); + } + + /** + * + * The value returned by getContentType() will be used to set the Content-Type HTTP header field + * + * @return the value to use for the content-type HTTP header field + */ + public abstract String getContentType(); + + /** + * Called by the system to add a message to the report. + * + * <p> + * The method is called by the system for every message on the queue, or until {@link #isComplete()} returns true. + * </p> + * @param reportableMessage the message to add to the report + */ + public abstract void addMessage(final ReportableMessage reportableMessage); + + /** + * Informs the system if the report is complete (i.e. does not need to report on any more messages). + * + * <p> + * This method will be called by the system after each message is {@link #addMessage(ReportableMessage) added} + * to the report. If a report is only interested in some messages, and can determine that the addition of more + * messages will not vary the content of the report, then it can return true. + * </p> + * <p> + * If this method always returns false, then all messages from the queue will be added to the report. + * </p> + * <p> + * NOTE: Retrieving content or properties of the message may require it to be reloaded from disk, and so care + * should be taken by reports to only access properties/content of the message if it is going to be required + * for the report production. + * </p> + * + * @return true if the report does not want to report on any more messages in the queue + */ + public abstract boolean isComplete(); + + /** + * Called by the system to get the content of the report to retrun to the user. + * <p> + * The system guarantees to only call this method once + * </p> + * @return the report content. + */ + public abstract T getReport(); + +} diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/report/QueueTextReport.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/report/QueueTextReport.java new file mode 100644 index 0000000000..09bc5c4229 --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/report/QueueTextReport.java @@ -0,0 +1,28 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.server.management.plugin.report; + +public abstract class QueueTextReport extends QueueReport<String> +{ + public QueueTextReport() + { + } +} diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/report/ReportRunner.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/report/ReportRunner.java new file mode 100644 index 0000000000..2a05cfc9a1 --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/report/ReportRunner.java @@ -0,0 +1,408 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.server.management.plugin.report; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.ServiceLoader; +import java.util.Set; +import java.util.UUID; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.qpid.server.message.AMQMessageHeader; +import org.apache.qpid.server.message.ServerMessage; +import org.apache.qpid.server.model.Queue; +import org.apache.qpid.server.queue.QueueEntry; +import org.apache.qpid.server.queue.QueueEntryVisitor; + +public class ReportRunner<T> +{ + private static final Logger LOGGER = LoggerFactory.getLogger(ReportRunner.class); + + private static final Set<Class> IMMUTABLE_CLASSES = new HashSet<>(Arrays.<Class>asList( + Boolean.class, + Byte.class, + Short.class, + Character.class, + Integer.class, + Long.class, + Float.class, + Double.class, + UUID.class, + Date.class, + String.class + )); + + private ReportRunner(final QueueReport<T> report) + { + _report = report; + } + + public boolean isBinaryReport() + { + return _report instanceof QueueBinaryReport; + } + + public static ReportRunner<?> createRunner(final String reportName, final Map<String, String[]> parameterMap) + { + QueueReport<?> report = getReport(reportName); + setReportParameters(report, parameterMap); + return new ReportRunner<>(report); + } + + private static void setReportParameters(final QueueReport<?> report, final Map<String, String[]> parameterMap) + { + if(parameterMap != null && !parameterMap.isEmpty()) + { + Class<? extends QueueReport> clazz = report.getClass(); + for(Map.Entry<String,String[]> entry : parameterMap.entrySet()) + { + String key = entry.getKey(); + String[] value = entry.getValue(); + if(isValidName(key)) + { + + StringBuilder setterName = new StringBuilder("set"); + setterName.append(key.substring(0,1).toUpperCase()); + if(key.length()>1) + { + setterName.append(key.substring(1)); + } + Method method = null; + try + { + + if (value == null || value.length == 0 || value.length == 1) + { + try + { + method = clazz.getMethod(setterName.toString(), String.class); + method.invoke(report, value == null || value.length == 0 ? null : value[0]); + } + catch (NoSuchMethodException | IllegalAccessException e) + { + method = null; + } + } + if (method == null) + { + try + { + method = clazz.getMethod(setterName.toString(), String[].class); + method.invoke(report, new Object[] { value }); + } + catch (NoSuchMethodException | IllegalAccessException e) + { + LOGGER.info("Unknown parameter '" + + key + + "' (no setter) for report " + + report.getName()); + } + } + } + catch (InvocationTargetException e) + { + LOGGER.info("Error setting parameter '" + key + "' for report " + report.getName(), e); + } + } + else + { + LOGGER.info("Invalid parameter name '" + key + "' running report " + report.getName()); + } + } + } + } + + private static boolean isValidName(final String key) + { + if(key != null && key.length() != 0) + { + if(Character.isJavaIdentifierStart(key.charAt(0))) + { + for(int i = 1; i < key.length(); i++) + { + if(!Character.isJavaIdentifierPart(key.charAt(i))) + { + return false; + } + } + return true; + } + + } + return false; + + } + + private static QueueReport<?> getReport(final String reportName) + { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + for (final QueueReport report : ServiceLoader.load(QueueReport.class, classLoader)) + { + if (report.getName().equals(reportName)) + { + try + { + return report.getClass().newInstance(); + } + catch (InstantiationException | IllegalAccessException e) + { + // can't happen as by definition must have public noargs constructor + } + } + } + throw new IllegalArgumentException("Unknown report: " + reportName); + } + + public String getContentType() + { + return _report.getContentType(); + } + + + private static class ReportVisitor implements QueueEntryVisitor + { + + private final QueueReport _report; + + public ReportVisitor(final QueueReport report) + { + _report = report; + } + + @Override + public boolean visit(final QueueEntry entry) + { + _report.addMessage(convertMessage(entry.getMessage())); + return _report.isComplete(); + } + + + } + + + private static ReportableMessage convertMessage(final ServerMessage message) + { + return new ReportableMessage() + { + @Override + public String getInitialRoutingAddress() + { + return message.getInitialRoutingAddress(); + } + + @Override + public ReportableMessageHeader getMessageHeader() + { + return convertMessageHeader(message.getMessageHeader()); + } + + @Override + public ByteBuffer getContent() + { + ByteBuffer content = message.getContent(0, (int) getSize()); + + return content.asReadOnlyBuffer(); + } + + @Override + public boolean isPersistent() + { + return message.isPersistent(); + } + + @Override + public long getSize() + { + return message.getSize(); + } + + @Override + public long getExpiration() + { + return message.getExpiration(); + } + + @Override + public long getMessageNumber() + { + return message.getMessageNumber(); + } + + @Override + public long getArrivalTime() + { + return message.getArrivalTime(); + } + }; + } + + private static ReportableMessageHeader convertMessageHeader(final AMQMessageHeader messageHeader) + { + return new ReportableMessageHeader() + { + @Override + public String getCorrelationId() + { + return messageHeader.getCorrelationId(); + } + + @Override + public long getExpiration() + { + return messageHeader.getExpiration(); + } + + @Override + public String getUserId() + { + return messageHeader.getUserId(); + } + + @Override + public String getAppId() + { + return messageHeader.getAppId(); + } + + @Override + public String getMessageId() + { + return messageHeader.getMessageId(); + } + + @Override + public String getMimeType() + { + return messageHeader.getMimeType(); + } + + @Override + public String getEncoding() + { + return messageHeader.getEncoding(); + } + + @Override + public byte getPriority() + { + return messageHeader.getPriority(); + } + + @Override + public long getTimestamp() + { + return messageHeader.getTimestamp(); + } + + @Override + public String getType() + { + return messageHeader.getType(); + } + + @Override + public String getReplyTo() + { + return messageHeader.getReplyTo(); + } + + @Override + public Object getHeader(final String name) + { + return makeImmutable(messageHeader.getHeader(name)); + } + + @Override + public boolean containsHeaders(final Set<String> names) + { + return messageHeader.containsHeaders(names); + } + + @Override + public boolean containsHeader(final String name) + { + return messageHeader.containsHeader(name); + } + + @Override + public Collection<String> getHeaderNames() + { + return Collections.unmodifiableCollection(messageHeader.getHeaderNames()); + } + }; + } + + private static Object makeImmutable(final Object value) + { + if(value == null || IMMUTABLE_CLASSES.contains(value.getClass())) + { + return value; + } + else if(value instanceof byte[]) + { + return ByteBuffer.wrap((byte[])value).asReadOnlyBuffer(); + } + else if(value instanceof List) + { + List orig = (List) value; + List<Object> copy = new ArrayList<>(orig.size()); + for(Object element : orig) + { + copy.add(makeImmutable(element)); + } + return copy; + } + else if(value instanceof Map) + { + Map<?,?> orig = (Map<?,?>) value; + LinkedHashMap<Object,Object> copy = new LinkedHashMap<>(); + for(Map.Entry<?,?> entry : orig.entrySet()) + { + copy.put(makeImmutable(entry.getKey()),makeImmutable(entry.getValue())); + } + return copy; + } + else return null; + } + + private final QueueReport<T> _report; + + public final T runReport(Queue<?> queue) + { + _report.setQueue(queue); + ReportVisitor visitor = new ReportVisitor(_report); + queue.visit(visitor); + return _report.getReport(); + } +} diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/report/ReportableMessage.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/report/ReportableMessage.java new file mode 100644 index 0000000000..00b6c4abeb --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/report/ReportableMessage.java @@ -0,0 +1,42 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.server.management.plugin.report; + +import java.nio.ByteBuffer; + +public interface ReportableMessage +{ + String getInitialRoutingAddress(); + + ReportableMessageHeader getMessageHeader(); + + public ByteBuffer getContent(); + + boolean isPersistent(); + + long getSize(); + + long getExpiration(); + + long getMessageNumber(); + + long getArrivalTime(); +} diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/report/ReportableMessageHeader.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/report/ReportableMessageHeader.java new file mode 100644 index 0000000000..e78415f8d0 --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/report/ReportableMessageHeader.java @@ -0,0 +1,58 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.server.management.plugin.report; + +import java.util.Collection; +import java.util.Set; + +public interface ReportableMessageHeader +{ + String getCorrelationId(); + + long getExpiration(); + + String getUserId(); + + String getAppId(); + + String getMessageId(); + + String getMimeType(); + + String getEncoding(); + + byte getPriority(); + + long getTimestamp(); + + String getType(); + + String getReplyTo(); + + Object getHeader(String name); + + boolean containsHeaders(Set<String> names); + + boolean containsHeader(String name); + + Collection<String> getHeaderNames(); + +} 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 331b50ea7c..0f1b7d03e9 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 @@ -162,14 +162,14 @@ public class ConfiguredObjectToMapConverter .getAttributeTypes(confObject.getClass()) .get(name); - if (attribute.isSecure() && !(isSecureTransport && extractAsConfig)) + if (attribute.isSecureValue(value) && !(isSecureTransport && extractAsConfig)) { // do not expose actual secure attribute value // getAttribute() returns encoded value value = confObject.getAttribute(name); } - if(attribute.isOversized() && !extractAsConfig) + if(attribute.isOversized() && !extractAsConfig && !useActualValues) { String valueString = String.valueOf(value); if(valueString.length() > oversizeThreshold) diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/QueueReportServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/QueueReportServlet.java new file mode 100644 index 0000000000..2b3def2dab --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/QueueReportServlet.java @@ -0,0 +1,103 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.server.management.plugin.servlet.rest; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.qpid.server.management.plugin.report.ReportRunner; +import org.apache.qpid.server.model.Queue; +import org.apache.qpid.server.model.VirtualHost; + +public class QueueReportServlet extends AbstractServlet +{ + @Override + protected void doGetWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response) throws + IOException, + ServletException + { + String[] pathInfoElements = getPathInfoElements(request); + if(pathInfoElements != null && pathInfoElements.length == 3) + { + Queue<?> queue = getQueueFromRequest(request); + ReportRunner<?> reportRunner = ReportRunner.createRunner(pathInfoElements[2],request.getParameterMap()); + Object output = reportRunner.runReport(queue); + response.setContentType(reportRunner.getContentType()); + if(reportRunner.isBinaryReport()) + { + response.getOutputStream().write((byte[])output); + } + else + { + response.getWriter().write((String)output); + } + } + else + { + throw new IllegalArgumentException("Invalid path is specified"); + } + + } + + private Queue<?> getQueueFromRequest(HttpServletRequest request) + { + String[] pathInfoElements = getPathInfoElements(request); + if(pathInfoElements == null || pathInfoElements.length < 2) + { + throw new IllegalArgumentException("Invalid path is specified"); + } + String vhostName = pathInfoElements[0]; + String queueName = pathInfoElements[1]; + + VirtualHost<?,?,?> vhost = getBroker().findVirtualHostByName(vhostName); + if (vhost == null) + { + throw new IllegalArgumentException("Could not find virtual host with name '" + vhostName + "'"); + } + + Queue queueFromVirtualHost = getQueueFromVirtualHost(queueName, vhost); + if (queueFromVirtualHost == null) + { + throw new IllegalArgumentException("Could not find queue with name '" + queueName + "' on virtual host '" + vhost.getName() + "'"); + } + return queueFromVirtualHost; + } + + private Queue getQueueFromVirtualHost(String queueName, VirtualHost<?,?,?> vhost) + { + Queue queue = null; + + for(Queue<?> q : vhost.getQueues()) + { + + if(q.getName().equals(queueName)) + { + queue = q; + break; + } + } + return queue; + } + +} 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 b787e701ec..10b79987a5 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 @@ -159,6 +159,23 @@ </div> </div> + <div id="formAddPort:maxOpenConnections" > + <div class="clear"> + <div class="formLabel-labelCell"> + <label for="formAddPort.transports">Maximum number of connections:</label> + </div> + <div class="formLabel-controlCell"> + <input id="formAddPort.maxOpenConnections" type="text" + data-dojo-type="dijit.form.ValidationTextBox" + data-dojo-props=" + name: 'maxOpenConnections', + placeHolder: 'maximum number of connections', + promptMessage: 'Maximum number of concurrent connections permitted by this port. The <code>-1</code> signifies no limit is imposed.', + title: 'Enter a maximum number of connections'"/> + </div> + </div> + </div> + <div id="formAddPort:fieldsTransportSSL"> <div class="clear"> <div class="formLabel-labelCell"> diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/editVirtualHostNode.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/editVirtualHostNode.html index cee18f7185..59597845a2 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/editVirtualHostNode.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/editVirtualHostNode.html @@ -19,31 +19,34 @@ <div class="dijitHidden"> <div data-dojo-type="dijit/Dialog" data-dojo-props="title:'Edit Virtual Host'" id="editVirtualHostNodeDialog"> <form id="editVirtualHostNodeForm" method="post" data-dojo-type="dijit/form/Form"> - <div id="editVirtualHostNode.contentPane"> - <div class="editNoteBanner">NOTE: All changes will only take effect after Virtual Host Node restart.</div> - <div class="clear"> - <div class="formLabel-labelCell tableContainer-labelCell">Name*:</div> - <div class="formLabel-controlCell tableContainer-valueCell"> - <input type="text" id="editVirtualHostNode.name" - data-dojo-type="dijit/form/ValidationTextBox" - data-dojo-props=" + <div id="editVirtualHostNode.allFields"> + <div id="editVirtualHostNode.contentPane"> + <div class="editNoteBanner">NOTE: All changes will only take effect after Virtual Host Node restart.</div> + <div class="clear"> + <div class="formLabel-labelCell tableContainer-labelCell">Name*:</div> + <div class="formLabel-controlCell tableContainer-valueCell"> + <input type="text" id="editVirtualHostNode.name" + data-dojo-type="dijit/form/ValidationTextBox" + data-dojo-props=" name: 'name', placeHolder: 'name', required: true, missingMessage: 'Name must be supplied', disabled: true, title: 'Enter virtual host name'" /> - </div> - </div> + </div> + </div> - <div id="editVirtualHostNode.typeFields"></div> + <div id="editVirtualHostNode.typeFields"></div> - <div class="clear"></div> + <div class="clear"></div> - <div data-dojo-type="dijit/TitlePane" data-dojo-props="title: 'Context variables', open: false"> - <div id="editVirtualHostNode.context" ></div> + <div data-dojo-type="dijit/TitlePane" data-dojo-props="title: 'Context variables', open: false"> + <div id="editVirtualHostNode.context" ></div> + </div> + </div> </div> - </div> + <div class="dijitDialogPaneActionBar qpidDialogPaneActionBar"> <button data-dojo-type="dijit/form/Button" id="editVirtualHostNode.saveButton" data-dojo-props="label: 'Save'">Save</button> <button data-dojo-type="dijit/form/Button" id="editVirtualHostNode.cancelButton" data-dojo-props="label: 'Cancel'" ></button> diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ResourceWidget.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ResourceWidget.js index f603c96ff3..bee38149da 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ResourceWidget.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ResourceWidget.js @@ -44,6 +44,7 @@ function (declare, array, lang, util, _WidgetBase, _TemplatedMixin, _WidgetsInTe fileReaderSupported: window.FileReader ? true : false, displayWarningWhenFileReaderUnsupported: false, isDebug: false, + uploaded: false, buildRendering: function() { @@ -74,7 +75,7 @@ function (declare, array, lang, util, _WidgetBase, _TemplatedMixin, _WidgetsInTe { // Fall back for IE8/9 which do not support FileReader this.uploadFields.style.display = "none"; - if (displayWarningWhenFileReaderUnsupported) + if (this.displayWarningWhenFileReaderUnsupported) { this.unsupportedWarning.className = this.unsupportedWarning.className.replace("hidden", ""); } @@ -127,6 +128,7 @@ function (declare, array, lang, util, _WidgetBase, _TemplatedMixin, _WidgetsInTe }, _fileClearButtonClicked: function(event) { + this.uploaded = false; this.uploader.reset(); this.set("value", this._resetValue); }, @@ -134,20 +136,17 @@ function (declare, array, lang, util, _WidgetBase, _TemplatedMixin, _WidgetsInTe { var serverPathValue = this.resourceLocation.get("value") || this._resetValue; this.set("value", serverPathValue); + if (this.uploaded ) + { + this.uploaded = !serverPathValue; + } }, _setValueAttr: function(newValue, priorityChange) { - var isDataUrl = newValue && newValue.indexOf("data:") == 0; + var isDataUrl = this.uploaded || ( newValue && newValue.indexOf("data:") == 0 ); if (isDataUrl) { - this.uploadData.style.display = "block"; - this.selectedFileStatus.className = "loadedIcon"; - this.selectedFile.innerHTML = this.selectedFileName || "uploaded data"; - this.resourceLocation.set("value", ""); - this.resourceLocation.setDisabled(true); - this.resourceLocation.set("required", false); - this.clearButton.setDisabled(false); - this.selectedFileStatus.className = "loadedIcon"; + this._initUploaded(true); } else { @@ -172,6 +171,25 @@ function (declare, array, lang, util, _WidgetBase, _TemplatedMixin, _WidgetsInTe _setPlaceHolderAttr: function(newValue) { this.resourceLocation.set("placeHolder", newValue); + }, + _setUploadedAttr: function(uploaded) + { + this.uploaded = uploaded; + this._initUploaded(uploaded); + }, + _initUploaded: function(uploaded) + { + if (uploaded) + { + this.uploadData.style.display = "block"; + this.selectedFileStatus.className = "loadedIcon"; + this.selectedFile.innerHTML = this.selectedFileName || "uploaded data"; + this.resourceLocation.set("value", ""); + this.resourceLocation.setDisabled(true); + this.resourceLocation.set("required", false); + this.clearButton.setDisabled(false); + this.selectedFileStatus.className = "loadedIcon"; + } } } ); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/grid/ColumnDefDialog.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/grid/ColumnDefDialog.js index d285dfaad6..a0b62082cb 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/grid/ColumnDefDialog.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/grid/ColumnDefDialog.js @@ -45,10 +45,15 @@ return declare("qpid.common.grid.ColumnDefDialog", null, { constructor: function(args){ var grid = this.grid = args.grid; - + var that = this; this.containerNode = dom.create("div", {innerHTML: template}); - parser.parse(this.containerNode); - + parser.parse(this.containerNode).then(function(instances) + { + that._postParse(); + }); + }, + _postParse: function() + { var submitButton = registry.byNode(query(".displayButton", this.containerNode)[0]); this.closeButton = registry.byNode(query(".cancelButton", this.containerNode)[0]); var columnsContainer = query(".columnList", this.containerNode)[0]; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/grid/RowNumberLimitDialog.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/grid/RowNumberLimitDialog.js index db3ae5a2ea..e78670bf57 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/grid/RowNumberLimitDialog.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/grid/RowNumberLimitDialog.js @@ -41,11 +41,17 @@ return declare("qpid.management.logs.RowNumberLimitDialog", null, { grid: null, dialog: null, - constructor: function(domNode, limitChangedCallback){ - + constructor: function(domNode, limitChangedCallback) + { + var that = this; this.containerNode = dom.create("div", {innerHTML: template}); - parser.parse(this.containerNode); - + parser.parse(this.containerNode).then(function(instances) + { + that._postParse(domNode, limitChangedCallback); + }); + }, + _postParse: function(domNode, limitChangedCallback) + { this.rowNumberLimit = registry.byNode(query(".rowNumberLimit", this.containerNode)[0]) this.submitButton = registry.byNode(query(".submitButton", this.containerNode)[0]); this.closeButton = registry.byNode(query(".cancelButton", this.containerNode)[0]); 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 60be40b62b..746eb4bbbc 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 @@ -528,40 +528,41 @@ define(["dojo/_base/xhr", return object1 === object2; } - util.parseHtmlIntoDiv = function(containerNode, htmlTemplateLocation) + util.parseHtmlIntoDiv = function(containerNode, htmlTemplateLocation, postParseCallback) { xhr.get({url: htmlTemplateLocation, sync: true, load: function(template) { containerNode.innerHTML = template; - parser.parse(containerNode); + parser.parse(containerNode).then(function(instances) + { + if (postParseCallback && typeof postParseCallback == "function") + { + postParseCallback(); + } + }); }}); } - util.buildUI = function(containerNode, parent, htmlTemplateLocation, fieldNames, obj) + util.buildUI = function(containerNode, parent, htmlTemplateLocation, fieldNames, obj, postParseCallback) { - this.parseHtmlIntoDiv(containerNode, htmlTemplateLocation); - if (fieldNames && obj) - { - for(var i=0; i<fieldNames.length;i++) + this.parseHtmlIntoDiv(containerNode, htmlTemplateLocation, + function() + { + if (fieldNames && obj) { - var fieldName = fieldNames[i]; - obj[fieldName]= query("." + fieldName, containerNode)[0]; + for(var i=0; i<fieldNames.length;i++) + { + var fieldName = fieldNames[i]; + obj[fieldName]= query("." + fieldName, containerNode)[0]; + } } - } - } - util.buildEditUI = function(containerNode, htmlTemplateLocation, fieldNamePrefix, fieldNames, data) - { - this.parseHtmlIntoDiv(containerNode, htmlTemplateLocation); - if (fieldNames) - { - for(var i = 0; i < fieldNames.length; i++) - { - var fieldName = fieldNames[i]; - var widget = registry.byId(fieldNamePrefix + fieldName); - widget.set("value", data[fieldName]); - } - } + if (postParseCallback && typeof postParseCallback == "function") + { + postParseCallback(); + } + }); + } util.updateUI = function(data, fieldNames, obj) @@ -736,6 +737,11 @@ define(["dojo/_base/xhr", return "^(\\d+)|" + singleContextVarRegexp + "$"; } + util.signedOrContextVarRegexp = function(constraints) + { + return "^(-?\\d+)|" + singleContextVarRegexp + "$"; + } + util.nameOrContextVarRegexp = function(constraints) { return "^(\\w+)|" + singleContextVarRegexp + "$"; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AccessControlProvider.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AccessControlProvider.js index 1d4cc1447b..cf95a23819 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AccessControlProvider.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AccessControlProvider.js @@ -52,17 +52,19 @@ define(["dojo/_base/xhr", sync: true, load: function(data) { contentPane.containerNode.innerHTML = data; - parser.parse(contentPane.containerNode); + parser.parse(contentPane.containerNode).then(function(instances) + { - that.accessControlProviderUpdater = new AccessControlProviderUpdater(contentPane.containerNode, that.modelObj, that.controller); + that.accessControlProviderUpdater = new AccessControlProviderUpdater(contentPane.containerNode, that.modelObj, that.controller); - var deleteButton = query(".deleteAccessControlProviderButton", contentPane.containerNode)[0]; - var deleteWidget = registry.byNode(deleteButton); - connect.connect(deleteWidget, "onClick", + var deleteButton = query(".deleteAccessControlProviderButton", contentPane.containerNode)[0]; + var deleteWidget = registry.byNode(deleteButton); + connect.connect(deleteWidget, "onClick", function(evt){ event.stop(evt); that.deleteAccessControlProvider(); }); + }); }}); }; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AuthenticationProvider.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AuthenticationProvider.js index 8545d2da75..cf9c32496a 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AuthenticationProvider.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AuthenticationProvider.js @@ -56,7 +56,8 @@ define(["dojo/_base/xhr", sync: true, load: function(data) { contentPane.containerNode.innerHTML = data; - parser.parse(contentPane.containerNode); + parser.parse(contentPane.containerNode).then(function(instances) + { var authProviderUpdater = new AuthProviderUpdater(contentPane.containerNode, that.modelObj, that.controller, that); that.authProviderUpdater = authProviderUpdater; @@ -97,6 +98,7 @@ define(["dojo/_base/xhr", } updater.add( that.authProviderUpdater ); + }); }}); }; 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 a0a2e8324f..9720bc988b 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 @@ -82,14 +82,10 @@ define(["dojo/_base/xhr", sync: true, load: function(data) { contentPane.containerNode.innerHTML = data; - parser.parse(contentPane.containerNode); - + parser.parse(contentPane.containerNode).then(function(instances) + { that.brokerUpdater = new BrokerUpdater(contentPane.containerNode, that.modelObj, that.controller); - updater.add( that.brokerUpdater ); - - that.brokerUpdater.update(); - var logViewerButton = query(".logViewer", contentPane.containerNode)[0]; registry.byNode(logViewerButton).on("click", function(evt){ that.controller.show("logViewer", ""); @@ -233,6 +229,7 @@ define(["dojo/_base/xhr", "Are you sure you want to delete access control provider"); } ); + }); }}); }; @@ -554,6 +551,9 @@ define(["dojo/_base/xhr", }); }, gridProperties, EnhancedGrid); that.displayACLWarnMessage(aclData); + + updater.add( that); + }); } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Connection.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Connection.js index 34d9a9b2de..bbb4dc8322 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Connection.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Connection.js @@ -50,14 +50,12 @@ define(["dojo/_base/xhr", sync: true, load: function(data) { contentPane.containerNode.innerHTML = data; - parser.parse(contentPane.containerNode); - - that.connectionUpdater = new ConnectionUpdater(contentPane.containerNode, that.modelObj, that.controller); - - updater.add( that.connectionUpdater ); - - that.connectionUpdater.update(); - + parser.parse(contentPane.containerNode).then(function(instances) + { + that.connectionUpdater = new ConnectionUpdater(contentPane.containerNode, that.modelObj, that.controller); + updater.add( that.connectionUpdater ); + that.connectionUpdater.update(); + }); }}); }; 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 2ac881abc1..1f1b8361a2 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 @@ -69,7 +69,8 @@ define(["dojo/_base/xhr", sync: true, load: function(data) { contentPane.containerNode.innerHTML = data; - parser.parse(contentPane.containerNode); + parser.parse(contentPane.containerNode).then(function(instances) + { that.exchangeUpdater = new ExchangeUpdater(contentPane.containerNode, that.modelObj, that.controller); @@ -106,7 +107,7 @@ define(["dojo/_base/xhr", that.deleteExchange(); }); } - + }); }}); }; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js index f739e52665..9b32d0e6b2 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js @@ -56,8 +56,13 @@ define(["dojo/_base/xhr", var that = this; this.contentPane = contentPane; contentPane.containerNode.innerHTML = template; - parser.parse(contentPane.containerNode); + parser.parse(contentPane.containerNode).then(function(instances) { that.onOpen(); }); + }; + GroupProvider.prototype.onOpen = function() + { + var that = this; + var contentPane = this.contentPane; this.groupProviderUpdater = new GroupProviderUpdater(contentPane.containerNode, this.modelObj, this.controller); // load data diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/KeyStore.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/KeyStore.js index 0f23053c2d..dfcb712740 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/KeyStore.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/KeyStore.js @@ -51,7 +51,8 @@ define(["dojo/dom", sync: true, load: function(data) { contentPane.containerNode.innerHTML = data; - parser.parse(contentPane.containerNode); + parser.parse(contentPane.containerNode).then(function(instances) + { that.keyStoreUpdater = new KeyStoreUpdater(contentPane.containerNode, that.modelObj, that.controller, that.url); that.keyStoreUpdater.update(); @@ -75,6 +76,7 @@ define(["dojo/dom", addStore.show(data[0], that.url); }); }); + }); }}); }; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Plugin.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Plugin.js index 47f6cffe5a..300754ed8c 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Plugin.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Plugin.js @@ -48,9 +48,10 @@ define(["dojo/_base/xhr", sync: true, load: function(data) { contentPane.containerNode.innerHTML = data; - parser.parse(contentPane.containerNode); - - that.pluginUpdater = new PluginUpdater(contentPane.containerNode, that.modelObj, that.controller); + parser.parse(contentPane.containerNode).then(function(instances) + { + that.pluginUpdater = new PluginUpdater(contentPane.containerNode, that.modelObj, that.controller); + }); }}); }; 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 1bf41ec730..91407c0e83 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 @@ -51,8 +51,8 @@ define(["dojo/dom", sync: true, load: function(data) { contentPane.containerNode.innerHTML = data; - parser.parse(contentPane.containerNode); - + parser.parse(contentPane.containerNode).then(function(instances) + { that.portUpdater = new PortUpdater(contentPane.containerNode, that.modelObj, that.controller, "api/latest/port/" + encodeURIComponent(that.name)); updater.add( that.portUpdater ); @@ -72,6 +72,7 @@ define(["dojo/dom", function(evt){ that.showEditDialog(); }); + }); }}); }; @@ -137,12 +138,15 @@ define(["dojo/dom", "needClientAuthValue", "wantClientAuthValue", "trustStoresValue", + "connectionCountValue", + "maxOpenConnectionsValue", "authenticationProvider", "bindingAddress", "keyStore", "needClientAuth", "wantClientAuth", - "trustStores" + "trustStores", + "maxOpenConnections" ]); this.query = url; @@ -150,6 +154,7 @@ define(["dojo/dom", xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"}).then(function(data) { that.portData = data[0]; + util.flattenStatistics( that.portData ); that.updateHeader(); }); @@ -177,6 +182,9 @@ define(["dojo/dom", 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.connectionCountValue.innerHTML = this.portData[ "connectionCount" ] ? entities.encode(String(this.portData[ "connectionCount" ])) : "0" ; + this.maxOpenConnectionsValue.innerHTML = (this.portData[ "maxOpenConnections" ] && this.portData[ "maxOpenConnections" ] >= 0) ? entities.encode(String(this.portData[ "maxOpenConnections" ])) : "(no limit)" ; + 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'": "")+" />" ; @@ -190,6 +198,9 @@ define(["dojo/dom", 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"; + + this.maxOpenConnections.style.display = "maxOpenConnections" in typeMetaData.attributes ? "block" : "none"; + }; PortUpdater.prototype.update = function() @@ -200,6 +211,7 @@ define(["dojo/dom", xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"}).then(function(data) { thisObj.portData = data[0]; + util.flattenStatistics( thisObj.portData ); thisObj.updateHeader(); }); }; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Preferences.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Preferences.js index f9982a1699..c8e1d17e06 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Preferences.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Preferences.js @@ -65,8 +65,15 @@ function (declare, xhr, event, connect, dom, domConstruct, parser, json, Memory, this.userPreferences = {}; this.domNode = domConstruct.create("div", {innerHTML: markup}); - this.preferencesDialog = parser.parse(this.domNode)[0]; - + parser.parse(this.domNode).then(function(instances) + { + that._postParse(); + }); + }, + _postParse: function() + { + var that = this; + this.preferencesDialog = registry.byId("preferences.preferencesDialog"); for(var i=0; i<preferenceNames.length; i++) { var name = preferenceNames[i]; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/PreferencesProvider.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/PreferencesProvider.js index 0d40669823..c145ba0d34 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/PreferencesProvider.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/PreferencesProvider.js @@ -51,8 +51,8 @@ define(["dojo/_base/xhr", sync: true, load: function(data) { node.innerHTML = data; - parser.parse(node); - + parser.parse(node).then(function(instances) + { that.containerNode = node; that.parentObject = parentObject; that.preferencesProviderType=query(".preferencesProviderType", node)[0]; @@ -65,6 +65,7 @@ define(["dojo/_base/xhr", editPreferencesProviderWidget.on("click", function(evt){ event.stop(evt); that.editPreferencesProvider();}); var deletePreferencesProviderWidget = registry.byNode(that.deletePreferencesProviderButton); deletePreferencesProviderWidget.on("click", function(evt){ event.stop(evt); that.deletePreferencesProvider();}); + }); }}); }; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js index 5b441a7b2f..55d0df1241 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js @@ -79,7 +79,8 @@ define(["dojo/_base/xhr", sync: true, load: function(data) { contentPane.containerNode.innerHTML = data; - parser.parse(contentPane.containerNode); + parser.parse(contentPane.containerNode).then(function(instances) + { that.queueUpdater = new QueueUpdater(contentPane.containerNode, that, that.controller); @@ -180,6 +181,8 @@ define(["dojo/_base/xhr", editQueue.show({nodeName:that.modelObj.parent.parent.name, hostName:that.modelObj.parent.name,queueName:that.name}); }); UserPreferences.addListener(that); + + }); }}); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/TrustStore.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/TrustStore.js index 82e2b204f9..fa6b63212e 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/TrustStore.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/TrustStore.js @@ -51,7 +51,8 @@ define(["dojo/dom", sync: true, load: function(data) { contentPane.containerNode.innerHTML = data; - parser.parse(contentPane.containerNode); + parser.parse(contentPane.containerNode).then(function(instances) + { that.keyStoreUpdater = new KeyStoreUpdater(contentPane.containerNode, that.modelObj, that.controller, that.url); that.keyStoreUpdater.update(); @@ -75,6 +76,7 @@ define(["dojo/dom", addStore.show(data[0], that.url); }); }); + }); }}); }; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js index 434e119736..e4482cc39e 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js @@ -55,8 +55,8 @@ define(["dojo/_base/xhr", load: function(data) { var containerNode = contentPane.containerNode; containerNode.innerHTML = data; - parser.parse(containerNode); - + parser.parse(containerNode).then(function(instances) + { that.vhostUpdater = new Updater(containerNode, that.modelObj, that.controller, that); var addQueueButton = query(".addQueueButton", containerNode)[0]; @@ -149,6 +149,7 @@ define(["dojo/_base/xhr", that.vhostUpdater.update(); updater.add( that.vhostUpdater ); + }); }}); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHostNode.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHostNode.js index 76eaadad18..837ff04c78 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHostNode.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHostNode.js @@ -56,8 +56,10 @@ define(["dojo/_base/xhr", sync: true, load: function(data) { contentPane.containerNode.innerHTML = data; - parser.parse(contentPane.containerNode); - that.onOpen(contentPane.containerNode) + parser.parse(contentPane.containerNode).then(function(instances) + { + that.onOpen(contentPane.containerNode) + }); }}); }; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/accesscontrolprovider/AclFile.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/accesscontrolprovider/AclFile.js index 12c8677c11..e8250217c6 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/accesscontrolprovider/AclFile.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/accesscontrolprovider/AclFile.js @@ -53,14 +53,14 @@ define(["dojo/_base/xhr", sync: true, load: function(data) { node.innerHTML = data; - parser.parse(node); - + parser.parse(node).then(function(instances) + { that.groupDatabaseUpdater= new AclFileUpdater(node, aclProviderObj, controller); updater.add( that.groupDatabaseUpdater); that.groupDatabaseUpdater.update(); - + }); }}); } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/accesscontrolprovider/aclfile/add.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/accesscontrolprovider/aclfile/add.js index e42dafb3c3..2c25149091 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/accesscontrolprovider/aclfile/add.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/accesscontrolprovider/aclfile/add.js @@ -31,8 +31,11 @@ define(["dojo/dom","dojo/query","dijit/registry","qpid/common/util"], show: function(data) { var that=this; - util.parseHtmlIntoDiv(data.containerNode, "accesscontrolprovider/aclfile/add.html"); - + util.parseHtmlIntoDiv(data.containerNode, "accesscontrolprovider/aclfile/add.html", function(){that._postParse(data);}); + }, + _postParse: function(data) + { + var that=this; this.aclServerPath = registry.byId("addAccessControlProvider.serverPath"); this.aclUploadFields = dom.byId("addAccessControlProvider.uploadFields"); this.aclSelectedFileContainer = dom.byId("addAccessControlProvider.selectedFile"); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAccessControlProvider.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAccessControlProvider.js index 38a6c8e841..83bf23f669 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAccessControlProvider.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAccessControlProvider.js @@ -53,8 +53,11 @@ define(["dojo/_base/lang", { var that=this; this.containerNode = construct.create("div", {innerHTML: template}); - parser.parse(this.containerNode); - + parser.parse(this.containerNode).then(function(instances){ that._postParse(); }); + }, + _postParse: function() + { + var that=this; this.accessControlProviderName = registry.byId("addAccessControlProvider.name"); this.accessControlProviderName.set("regExpGen", util.nameOrContextVarRegexp); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAuthenticationProvider.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAuthenticationProvider.js index 17b7edcec9..ccae89d6c1 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAuthenticationProvider.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAuthenticationProvider.js @@ -56,8 +56,11 @@ define(["dojo/_base/xhr", { var that=this; this.containerNode = construct.create("div", {innerHTML: template}); - parser.parse(this.containerNode); - + parser.parse(this.containerNode).then(function(instances) { that._postParse(); }); + }, + _postParse: function() + { + var that = this; this.authenticationProviderName = registry.byId("addAuthenticationProvider.name"); this.authenticationProviderName.set("regExpGen", util.nameOrContextVarRegexp); this.authenticationProviderName.on("change", function(newValue){that.preferencesProviderForm.preferencesProviderNameWidget.set("value",newValue);}); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js index f158b8ceb6..81ce40ebe9 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js @@ -53,8 +53,11 @@ define([ { var that=this; this.containerNode = construct.create("div", {innerHTML: template}); - parser.parse(this.containerNode); - + parser.parse(this.containerNode).then(function(instances) { that._postParse(); }); + }, + _postParse: function() + { + var that=this; this.groupProviderName = registry.byId("addGroupProvider.name"); this.groupProviderName.set("regExpGen", util.nameOrContextVarRegexp); 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 43ccdfff70..befb5df9c1 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 @@ -79,6 +79,10 @@ define(["dojo/_base/xhr", registry.byId("formAddPort.bindingAddress").set("disabled", ! ("bindingAddress" in typeMetaData.attributes)); dom.byId("formAddPort:fieldsBindingAddress").style.display = "bindingAddress" in typeMetaData.attributes ? "block" : "none"; + //maxOpenConnections + registry.byId("formAddPort.maxOpenConnections").set("disabled", ! ("maxOpenConnections" in typeMetaData.attributes)); + dom.byId("formAddPort:maxOpenConnections").style.display = "maxOpenConnections" in typeMetaData.attributes ? "block" : "none"; + //transports var transportsMultiSelect = dom.byId("formAddPort.transports"); var transportsValidValues = typeMetaData.attributes.transports.validValues; @@ -314,6 +318,7 @@ define(["dojo/_base/xhr", var nameWidget = registry.byId("formAddPort.name"); var typeWidget = registry.byId("formAddPort.type"); var portWidget = registry.byId("formAddPort.port"); + var maxOpenConnectionsWidget = registry.byId("formAddPort.maxOpenConnections"); var editWarning = dojo.byId("portEditWarning"); var providerWidget = registry.byId("formAddPort.authenticationProvider"); @@ -418,6 +423,13 @@ define(["dojo/_base/xhr", bindAddressWidget.set("disabled", ! ("bindingAddress" in typeMetaData.attributes)); dom.byId("formAddPort:fieldsBindingAddress").style.display = "bindingAddress" in typeMetaData.attributes ? "block" : "none"; + //maxOpenConnections + var maxOpenConnectionsWidget = registry.byId("formAddPort.maxOpenConnections"); + maxOpenConnectionsWidget.set("regExpGen", util.signedOrContextVarRegexp); + maxOpenConnectionsWidget.set("value", port.maxOpenConnections ? port.maxOpenConnections : ""); + maxOpenConnectionsWidget.set("disabled", ! ("maxOpenConnections" in typeMetaData.attributes)); + dom.byId("formAddPort:maxOpenConnections").style.display = "maxOpenConnections" in typeMetaData.attributes ? "block" : "none"; + //ssl keystoreWidget.set("value", port.keyStore ? port.keyStore : ""); if (port.trustStores) @@ -447,6 +459,7 @@ define(["dojo/_base/xhr", truststoreWidget.initialValue = port.trustStores; transportWidget.initialValue = transportWidget.value; providerWidget.initialValue = providerWidget.value; + maxOpenConnectionsWidget.initialValue = maxOpenConnectionsWidget.value; registry.byId("addPort").show(); util.applyMetadataToWidgets(registry.byId("addPort").domNode, "Port", portType); @@ -465,8 +478,8 @@ define(["dojo/_base/xhr", nameWidget.set("disabled", false); nameWidget.set("regExpGen", util.nameOrContextVarRegexp); - portWidget.set("regExpGen", util.numericOrContextVarRegexp); + maxOpenConnectionsWidget.set("regExpGen", util.signedOrContextVarRegexp); editWarning.style.display = "none"; registry.byId("addPort").show(); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addPreferencesProvider.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addPreferencesProvider.js index 072b202b23..2136318dfb 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addPreferencesProvider.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addPreferencesProvider.js @@ -40,8 +40,11 @@ define([ { var that=this; this.containerNode = construct.create("div", {innerHTML: template}); - parser.parse(this.containerNode); - + parser.parse(this.containerNode).then(function(instances) { that._postParse(); }); + }, + _postParse: function() + { + var that=this; this.preferencesProviderForm = registry.byId("addPreferencesProvider.preferencesProvider"); this.dialog = registry.byId("addPreferencesProvider"); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addStore.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addStore.js index 5a42f12870..caf14d0cc8 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addStore.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addStore.js @@ -53,8 +53,11 @@ define(["dojo/_base/lang", { var that=this; this.containerNode = construct.create("div", {innerHTML: template}); - parser.parse(this.containerNode); - + parser.parse(this.containerNode).then(function(instances) { that._postParse(); }); + }, + _postParse: function() + { + var that=this; this.storeName = registry.byId("addStore.name"); this.storeName.set("regExpGen", util.nameOrContextVarRegexp); @@ -81,11 +84,11 @@ define(["dojo/_base/lang", show: function(effectiveData) { this.effectiveData = effectiveData; + this._destroyTypeFields(this.containerNode); this.storeForm.reset(); if (effectiveData) { - this._destroyTypeFields(this.containerNode); this._initFields(effectiveData); } this.storeName.set("disabled", effectiveData == null ? false : true); @@ -185,11 +188,6 @@ define(["dojo/_base/lang", { typeUI.show({containerNode:typeFieldsContainer, parent: that, data: that.initialData, effectiveData: that.effectiveData}); util.applyMetadataToWidgets(typeFieldsContainer, category, type); - if (that.effectiveData) - { - typeUI.update(that.effectiveData); - that.effectiveData = undefined; - } } catch(e) { diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addVirtualHostNodeAndVirtualHost.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addVirtualHostNodeAndVirtualHost.js index f379361a09..21927ea0e5 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addVirtualHostNodeAndVirtualHost.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addVirtualHostNodeAndVirtualHost.js @@ -57,8 +57,11 @@ define(["dojo/_base/xhr", { var that=this; this.containerNode = domConstruct.create("div", {innerHTML: template}); - parser.parse(this.containerNode); - + parser.parse(this.containerNode).then(function(instances) { that._postParse(); }); + }, + _postParse: function() + { + var that=this; var virtualHostNodeName = registry.byId("addVirtualHostNode.nodeName"); virtualHostNodeName.set("regExpGen", util.nameOrContextVarRegexp); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js index 96083843fa..e6f2249f65 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js @@ -51,8 +51,10 @@ define(["dojo/_base/xhr", sync: true, load: function(data) { node.innerHTML = data; - parser.parse(node); - that.init(node, authProviderObj, controller); + parser.parse(node).then(function(instances) + { + that.init(node, authProviderObj, controller); + }); }}); } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/base64md5passwordfile/add.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/base64md5passwordfile/add.js index a593b14fd6..cbc5ce356d 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/base64md5passwordfile/add.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/base64md5passwordfile/add.js @@ -24,12 +24,15 @@ define(["dojo/query","dijit/registry","qpid/common/util"], return { show: function(data) { - util.parseHtmlIntoDiv(data.containerNode, "authenticationprovider/filebased/add.html"); - if (data.data) + util.parseHtmlIntoDiv(data.containerNode, "authenticationprovider/filebased/add.html", + function() { - var path = registry.byNode(query(".path", data.containerNode)[0]); - path.set("value", data.data.path); - } + if (data.data) + { + var path = registry.byNode(query(".path", data.containerNode)[0]); + path.set("value", data.data.path); + } + }); } }; } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/external/add.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/external/add.js index 6147bf5249..979a10cae9 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/external/add.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/external/add.js @@ -24,12 +24,15 @@ define(["dojo/query","dijit/registry","qpid/common/util"], return { show: function(data) { - util.parseHtmlIntoDiv(data.containerNode, "authenticationprovider/external/add.html"); - if (data.data) + util.parseHtmlIntoDiv(data.containerNode, "authenticationprovider/external/add.html", + function() { - var useFullDN = registry.byNode(query(".useFullDN", data.containerNode)[0]); - useFullDN.set("value", data.data.useFullDN); - } + if (data.data) + { + var useFullDN = registry.byNode(query(".useFullDN", data.containerNode)[0]); + useFullDN.set("value", data.data.useFullDN); + } + }); } }; } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/plainpasswordfile/add.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/plainpasswordfile/add.js index a593b14fd6..cbc5ce356d 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/plainpasswordfile/add.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/plainpasswordfile/add.js @@ -24,12 +24,15 @@ define(["dojo/query","dijit/registry","qpid/common/util"], return { show: function(data) { - util.parseHtmlIntoDiv(data.containerNode, "authenticationprovider/filebased/add.html"); - if (data.data) + util.parseHtmlIntoDiv(data.containerNode, "authenticationprovider/filebased/add.html", + function() { - var path = registry.byNode(query(".path", data.containerNode)[0]); - path.set("value", data.data.path); - } + if (data.data) + { + var path = registry.byNode(query(".path", data.containerNode)[0]); + path.set("value", data.data.path); + } + }); } }; } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/simpleldap/add.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/simpleldap/add.js index 2c0dc688e9..4e04bfd6f0 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/simpleldap/add.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/simpleldap/add.js @@ -24,8 +24,11 @@ define(["dojo/_base/xhr","dojo/query","dijit/registry","qpid/common/util","qpid/ return { show: function(data) { - util.parseHtmlIntoDiv(data.containerNode, "authenticationprovider/simpleldap/add.html"); - + var that = this; + util.parseHtmlIntoDiv(data.containerNode, "authenticationprovider/simpleldap/add.html", function(){that._postParse(data);}); + }, + _postParse: function(data) + { var that = this; xhr.get({url: "api/latest/truststore", sync: true, handleAs: "json"}).then( function(trustStores) diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editBroker.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editBroker.js index 07938fe8e7..08a4a84d47 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editBroker.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editBroker.js @@ -55,8 +55,11 @@ define(["dojo/_base/xhr", { var that=this; this.containerNode = domConstruct.create("div", {innerHTML: template}); - parser.parse(this.containerNode); - + parser.parse(this.containerNode).then(function(instances){ that._postParse();}); + }, + _postParse: function() + { + var that=this; this.dialog = registry.byId("editBrokerDialog"); this.saveButton = registry.byId("editBroker.saveButton"); this.cancelButton = registry.byId("editBroker.cancelButton"); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editQueue.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editQueue.js index 06c9672efe..91fc9891cf 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editQueue.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editQueue.js @@ -79,7 +79,11 @@ define(["dojo/_base/xhr", { var that=this; this.containerNode = domConstruct.create("div", {innerHTML: template}); - parser.parse(this.containerNode); + parser.parse(this.containerNode).then(function(instances){ that._postParse();}); + }, + _postParse: function() + { + var that=this; this.allFieldsContainer = dom.byId("formEditQueue.allFields"); this.dialog = registry.byId("editQueue"); this.saveButton = registry.byId("formEditQueue.saveButton"); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHost.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHost.js index 849fd9378c..b47052b546 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHost.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHost.js @@ -56,7 +56,11 @@ define(["dojo/_base/xhr", { var that=this; this.containerNode = domConstruct.create("div", {innerHTML: template}); - parser.parse(this.containerNode); + parser.parse(this.containerNode).then(function(instances){ that._postParse();}); + }, + _postParse: function() + { + var that=this; this.allFieldsContainer = dom.byId("editVirtualHost.allFields"); this.typeFieldsContainer = dom.byId("editVirtualHost.typeFields"); this.dialog = registry.byId("editVirtualHostDialog"); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHostNode.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHostNode.js index 4f815f1f1d..b5a7edab2d 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHostNode.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHostNode.js @@ -52,7 +52,12 @@ define(["dojo/_base/xhr", { var that=this; this.containerNode = domConstruct.create("div", {innerHTML: template}); - parser.parse(this.containerNode); + parser.parse(this.containerNode).then(function(instances){ that._postParse();}); + }, + _postParse: function() + { + var that=this; + this.allFieldsContainer = dom.byId("editVirtualHostNode.allFields"); this.typeFieldsContainer = dom.byId("editVirtualHostNode.typeFields"); this.dialog = registry.byId("editVirtualHostNodeDialog"); this.saveButton = registry.byId("editVirtualHostNode.saveButton"); @@ -160,7 +165,7 @@ define(["dojo/_base/xhr", TypeUI.show({containerNode:that.typeFieldsContainer, parent: that, data: actualData, effectiveData: effectiveData}); that.form.connectChildren(); - util.applyMetadataToWidgets(that.allFieldsContainer, "VirtualHostNode", actualData.type); + util.applyToWidgets(that.allFieldsContainer, "VirtualHostNode", actualData.type, actualData); } catch(e) { diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/group/Group.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/group/Group.js index 8ac6be04cc..7832941e71 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/group/Group.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/group/Group.js @@ -76,8 +76,8 @@ define(["dojo/_base/xhr", sync: true, load: function(data) { contentPane.containerNode.innerHTML = data; - parser.parse(contentPane.containerNode); - + parser.parse(contentPane.containerNode).then(function(instances) + { that.groupUpdater = new GroupUpdater(contentPane.containerNode, that, that.controller); that.groupUpdater.update(); updater.add( that.groupUpdater ); @@ -100,6 +100,7 @@ define(["dojo/_base/xhr", "Are you sure you want to remove group member"); } ); + }); }}); }; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/GroupManagingGroupProvider.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/GroupManagingGroupProvider.js index ea12280d0d..5788fad8af 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/GroupManagingGroupProvider.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/GroupManagingGroupProvider.js @@ -54,9 +54,9 @@ define(["dojo/_base/xhr", var that = this; this.name = groupProviderObj.name; node.innerHTML = template; - parser.parse(node); this.controller = controller; - + parser.parse(node).then(function(instances) + { var groupDiv = query(".groups", node)[0]; var gridProperties = { @@ -75,7 +75,7 @@ define(["dojo/_base/xhr", indirectSelection: true }}; - this.groupsGrid = new UpdatableStore([], groupDiv, + that.groupsGrid = new UpdatableStore([], groupDiv, [ { name: "Group Name", field: "name", width: "100%" } ], function(obj) { connect.connect(obj.grid, "onRowDblClick", obj.grid, @@ -86,10 +86,11 @@ define(["dojo/_base/xhr", that.controller.show("group", name, groupProviderObj, theItem.id); }); }, gridProperties, EnhancedGrid); - var addGroupButton = query(".addGroupButton", node)[0]; - registry.byNode(addGroupButton).on("click", function(evt){ addGroup.show(groupProviderObj.name) }); - var deleteWidget = registry.byNode(query(".deleteGroupButton", node)[0]); - deleteWidget.on("click", function(evt){ event.stop(evt); that.deleteGroups(); }); + var addGroupButton = query(".addGroupButton", node)[0]; + registry.byNode(addGroupButton).on("click", function(evt){ addGroup.show(groupProviderObj.name) }); + var deleteWidget = registry.byNode(query(".deleteGroupButton", node)[0]); + deleteWidget.on("click", function(evt){ event.stop(evt); that.deleteGroups(); }); + }); } GroupManagingGroupProvider.prototype.deleteGroups = function() diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/groupfile/add.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/groupfile/add.js index f28f250134..6543d6a797 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/groupfile/add.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/groupfile/add.js @@ -25,12 +25,15 @@ define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/comm return { show: function(data) { var that=this; - util.parseHtmlIntoDiv(data.containerNode, "groupprovider/groupfile/add.html"); - if (data.data) + util.parseHtmlIntoDiv(data.containerNode, "groupprovider/groupfile/add.html", + function() { - var pathWidget = registry.byNode(query(".addGroupProviderPath", data.containerNode)[0]); - pathWidget.set("value", data.data.path); - } + if (data.data) + { + var pathWidget = registry.byNode(query(".addGroupProviderPath", data.containerNode)[0]); + pathWidget.set("value", data.data.path); + } + }); } }; } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logs/LogFileDownloadDialog.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logs/LogFileDownloadDialog.js index 29054b5379..c013a88d0a 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logs/LogFileDownloadDialog.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logs/LogFileDownloadDialog.js @@ -51,9 +51,13 @@ return declare("qpid.management.logs.LogFileDownloadDialog", null, { closeButton: null, constructor: function(args){ + var that = this; this.containerNode = domConstruct.create("div", {innerHTML: template}); - parser.parse(this.containerNode); - + parser.parse(this.containerNode).then(function(instances){that._postParse();}); + }, + _postParse: function() + { + var that = this; this.logFileTreeDiv = query(".logFilesGrid", this.containerNode)[0]; this.downloadLogsButton = registry.byNode(query(".downloadLogsButton", this.containerNode)[0]); this.closeButton = registry.byNode(query(".downloadLogsDialogCloseButton", this.containerNode)[0]); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logs/LogViewer.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logs/LogViewer.js index 470ad28cd2..4a76110a58 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logs/LogViewer.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logs/LogViewer.js @@ -62,9 +62,13 @@ define(["dojo/_base/xhr", this.contentPane = contentPane; this.contentPane.containerNode.innerHTML = markup; - parser.parse(this.contentPane.containerNode); + parser.parse(this.contentPane.containerNode).then(function(instances){self._postParse();}); + }; + LogViewer.prototype._postParse = function() + { + var self = this; - this.downloadLogsButton = registry.byNode(query(".downloadLogs", contentPane.containerNode)[0]); + this.downloadLogsButton = registry.byNode(query(".downloadLogs", this.contentPane.containerNode)[0]); this.downloadLogDialog = new LogFileDownloadDialog(); this.downloadLogsButton.on("click", function(evt){ diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/plugin/managementhttp.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/plugin/managementhttp.js index 69f520bf42..4c32cce7cd 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/plugin/managementhttp.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/plugin/managementhttp.js @@ -47,14 +47,15 @@ define(["dojo/_base/xhr", sync: true, load: function(data) { node.innerHTML = data; - parser.parse(node); - + parser.parse(node).then(function(instances) + { that.managementHttpUpdater= new ManagementHttpUpdater(node, pluginObject, controller); that.managementHttpUpdater.update(true); updater.add( that.managementHttpUpdater); var editButton = query(".editPluginButton", node)[0]; connect.connect(registry.byNode(editButton), "onClick", function(evt){ that.edit(); }); + }); }}); } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/plugin/managementjmx.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/plugin/managementjmx.js index 3579d258e9..4141b6b670 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/plugin/managementjmx.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/plugin/managementjmx.js @@ -43,14 +43,15 @@ define(["dojo/_base/xhr", sync: true, load: function(data) { node.innerHTML = data; - parser.parse(node); - + parser.parse(node).then(function(instances) + { that.managementJmxUpdater= new ManagementJmxUpdater(node, pluginObject, controller); that.managementJmxUpdater.update(true); updater.add( that.managementJmxUpdater); var editButton = query(".editPluginButton", node)[0]; connect.connect(registry.byNode(editButton), "onClick", function(evt){ that.edit(); }); + }); }}); } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/preferencesprovider/filesystempreferences/add.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/preferencesprovider/filesystempreferences/add.js index d030ea2832..929d318b4f 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/preferencesprovider/filesystempreferences/add.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/preferencesprovider/filesystempreferences/add.js @@ -23,12 +23,15 @@ define(["dojo/query", "dijit/registry", "qpid/common/util"], return { show: function (data) { - util.parseHtmlIntoDiv(data.containerNode, "preferencesprovider/filesystempreferences/add.html"); - if (data.data) + util.parseHtmlIntoDiv(data.containerNode, "preferencesprovider/filesystempreferences/add.html", + function() { - var pathWidget = registry.byNode(query(".addPreferencesProviderPath", data.containerNode)[0]); - pathWidget.set("value", data.data.path); - } + if (data.data) + { + var pathWidget = registry.byNode(query(".addPreferencesProviderPath", data.containerNode)[0]); + pathWidget.set("value", data.data.path); + } + }); } }; } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/preferencesprovider/filesystempreferences/show.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/preferencesprovider/filesystempreferences/show.js index 46dedcc9f5..660b6673f2 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/preferencesprovider/filesystempreferences/show.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/preferencesprovider/filesystempreferences/show.js @@ -32,8 +32,10 @@ define(["dojo/_base/xhr", sync: true, load: function(template) { containerNode.innerHTML = template; - parser.parse(containerNode); - that.preferencesProviderPath=query(".fileSystemPreferencesProviderPath", containerNode)[0]; + parser.parse(containerNode).then(function(instances) + { + that.preferencesProviderPath=query(".fileSystemPreferencesProviderPath", containerNode)[0]; + }); }}); } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filekeystore/add.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filekeystore/add.js index b4c45d8f99..dfe8e5059a 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filekeystore/add.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filekeystore/add.js @@ -18,30 +18,41 @@ * under the License. * */ -define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/common/util", "qpid/common/metadata"], - function (dom, query, array, registry, util, metadata) +define(["dojo/dom", + "dojo/query", + "dojo/_base/array", + "dijit/registry", + "qpid/common/util", + "qpid/common/metadata", + "dojo/parser", + "dojo/text!store/filekeystore/add.html", + "dojo/domReady!"], + function (dom, query, array, registry, util, metadata, parser, template) { var addKeyStore = { - init: function() - { - }, show: function(data) { var that=this; - util.parseHtmlIntoDiv(data.containerNode, "store/filekeystore/add.html"); - this.containerNode = data.containerNode; + data.containerNode.innerHTML = template; + parser.parse(this.containerNode).then(function(instances) + { + that.keyStoreOldBrowserWarning = dom.byId("addStore.oldBrowserWarning"); - this.keyStoreOldBrowserWarning = dom.byId("addStore.oldBrowserWarning"); + if (!window.FileReader) + { + that.keyStoreOldBrowserWarning.innerHTML = "File upload requires a more recent browser with HTML5 support"; + that.keyStoreOldBrowserWarning.className = that.keyStoreOldBrowserWarning.className.replace("hidden", ""); + } - this.addButton = data.parent.addButton; + if (data.effectiveData) + { + that.update(data.effectiveData); + } - if (!window.FileReader) - { - this.keyStoreOldBrowserWarning.innerHTML = "File upload requires a more recent browser with HTML5 support"; - this.keyStoreOldBrowserWarning.className = this.keyStoreOldBrowserWarning.className.replace("hidden", ""); - } + util.applyMetadataToWidgets(data.containerNode, "KeyStore", "FileKeyStore"); + }); }, update: function(effectiveData) { @@ -53,28 +64,38 @@ define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/comm if (name in attributes ) { var attribute = attributes[name]; - if (attribute.secure || attribute.oversize) - { - item.set("required", false); - item.set("placeHolder", effectiveData[name]); - } - else + var value = effectiveData[name]; + if (value) { - item.set("value", effectiveData[name]); + if (attribute.secure) + { + if (!/^\*+/.test(value) ) + { + item.set("value", value); + } + else + { + item.set("required", false); + if (name == "storeUrl") + { + item.set("uploaded", true) + } + else + { + item.set("placeHolder", value); + } + } + } + else + { + item.set("value", value); + } } } }); } }; - try - { - addKeyStore.init(); - } - catch(e) - { - console.warn(e); - } return addKeyStore; } ); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filetruststore/add.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filetruststore/add.js index e04ee1a835..5893ce0d2d 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filetruststore/add.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filetruststore/add.js @@ -18,31 +18,42 @@ * under the License. * */ -define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/common/util", "qpid/common/metadata"], - function (dom, query, array, registry, util, metadata) +define(["dojo/dom", + "dojo/query", + "dojo/_base/array", + "dijit/registry", + "qpid/common/util", + "qpid/common/metadata", + "dojo/parser", + "dojo/text!store/filetruststore/add.html", + "dojo/domReady!"], + function (dom, query, array, registry, util, metadata, parser, template) { var addTrustStore = { - init: function() - { - }, show: function(data) { var that=this; - util.parseHtmlIntoDiv(data.containerNode, "store/filetruststore/add.html"); - this.containerNode = data.containerNode; + data.containerNode.innerHTML = template; + parser.parse(this.containerNode).then(function(instances) + { + that.keyStoreOldBrowserWarning = dom.byId("addStore.oldBrowserWarning"); - this.keyStoreOldBrowserWarning = dom.byId("addStore.oldBrowserWarning"); + if (!window.FileReader) + { + // Fall back for IE8/9 which do not support FileReader + that.keyStoreOldBrowserWarning.innerHTML = "File upload requires a more recent browser with HTML5 support"; + that.keyStoreOldBrowserWarning.className = that.keyStoreOldBrowserWarning.className.replace("hidden", ""); + } - this.addButton = data.parent.addButton; + if (data.effectiveData) + { + that.update(data.effectiveData); + } - if (!window.FileReader) - { - // Fall back for IE8/9 which do not support FileReader - this.keyStoreOldBrowserWarning.innerHTML = "File upload requires a more recent browser with HTML5 support"; - this.keyStoreOldBrowserWarning.className = this.keyStoreOldBrowserWarning.className.replace("hidden", ""); - } + util.applyMetadataToWidgets(data.containerNode, "TrustStore", "FileTrustStore"); + }); }, update: function(effectiveData) { @@ -54,14 +65,25 @@ define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/comm if (name in attributes ) { var attribute = attributes[name]; - if (attribute.secure || attribute.oversize) - { - item.set("required", false); - item.set("placeHolder", effectiveData[name]); - } - else + var value = effectiveData[name]; + if (value) { - item.set("value", effectiveData[name]); + if (attribute.secure) + { + if (!/^\*+/.test(value) ) + { + item.set("value", value); + } + else + { + item.set("placeHolder", value); + item.set("required", false); + } + } + else + { + item.set("value", value); + } } } }); @@ -69,14 +91,6 @@ define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/comm } }; - try - { - addTrustStore.init(); - } - catch(e) - { - console.warn(e); - } return addTrustStore; } ); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavakeystore/add.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavakeystore/add.js index 0d74699d79..5c25ae2cc6 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavakeystore/add.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavakeystore/add.js @@ -18,64 +18,85 @@ * under the License. * */ -define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/common/util", "qpid/common/metadata", "qpid/common/ResourceWidget"], - function (dom, query, array, registry, util, metadata) +define(["dojo/dom", + "dojo/query", + "dojo/_base/array", + "dijit/registry", + "qpid/common/util", + "qpid/common/metadata", + "dojo/parser", + "dojo/text!store/nonjavakeystore/add.html", + "qpid/common/ResourceWidget", + "dojo/domReady!"], + function (dom, query, array, registry, util, metadata, parser, template) { var addKeyStore = { - init: function() - { - }, show: function(data) { var that=this; - util.parseHtmlIntoDiv(data.containerNode, "store/nonjavakeystore/add.html"); - - this.keyStoreOldBrowserWarning = dom.byId("addStore.oldBrowserWarning"); - this.addButton = data.parent.addButton; this.containerNode = data.containerNode; - - if (!window.FileReader) + data.containerNode.innerHTML = template; + parser.parse(this.containerNode).then(function(instances) { - this.keyStoreOldBrowserWarning.innerHTML = "File upload requires a more recent browser with HTML5 support"; - this.keyStoreOldBrowserWarning.className = this.keyStoreOldBrowserWarning.className.replace("hidden", ""); - } + that.keyStoreOldBrowserWarning = dom.byId("addStore.oldBrowserWarning"); + + if (!window.FileReader) + { + that.keyStoreOldBrowserWarning.innerHTML = "File upload requires a more recent browser with HTML5 support"; + that.keyStoreOldBrowserWarning.className = that.keyStoreOldBrowserWarning.className.replace("hidden", ""); + } + + if (data.effectiveData) + { + that.update(data.effectiveData); + } + + util.applyMetadataToWidgets(data.containerNode, "KeyStore", "NonJavaKeyStore"); + }); }, update: function(effectiveData) { - if (effectiveData) - { - var attributes = metadata.getMetaData("KeyStore", "NonJavaKeyStore").attributes; - var widgets = registry.findWidgets(this.containerNode); - array.forEach(widgets, function(item) + var attributes = metadata.getMetaData("KeyStore", "NonJavaKeyStore").attributes; + var widgets = registry.findWidgets(this.containerNode); + array.forEach(widgets, function(item) + { + var name = item.id.replace("addStore.",""); + if (name in attributes ) { - var name = item.id.replace("addStore.",""); - if (name in attributes ) + var attribute = attributes[name]; + var value = effectiveData[name]; + if (value) { - var attribute = attributes[name]; - if (attribute.oversize || attribute.secure) + if (attribute.secure) { - item.set("required", false); - item.set("placeHolder", effectiveData[name]); + if (!/^\*+/.test(value) ) + { + item.set("value", value); + } + else + { + item.set("required", false); + if (name == "privateKeyUrl") + { + item.set("uploaded", true) + } + else + { + item.set("placeHolder", value); + } + } } else { - item.set("value", effectiveData[name]); + item.set("value", value); } } - }); - } + } + }); } }; - try - { - addKeyStore.init(); - } - catch(e) - { - console.warn(e); - } return addKeyStore; } ); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavatruststore/add.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavatruststore/add.js index 53e3b43082..550c388910 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavatruststore/add.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavatruststore/add.js @@ -18,64 +18,77 @@ * under the License. * */ -define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/common/util", "qpid/common/metadata"], - function (dom, query, array, registry, util, metadata) +define(["dojo/dom", + "dojo/query", + "dojo/_base/array", + "dijit/registry", + "qpid/common/util", + "qpid/common/metadata", + "dojo/parser", + "dojo/text!store/nonjavatruststore/add.html", + "dojo/domReady!"], + function (dom, query, array, registry, util, metadata, parser, template) { var addKeyStore = { - init: function() - { - }, show: function(data) { var that=this; - util.parseHtmlIntoDiv(data.containerNode, "store/nonjavatruststore/add.html"); - - this.keyStoreOldBrowserWarning = dom.byId("addStore.oldBrowserWarning"); - this.addButton = data.parent.addButton; this.containerNode = data.containerNode; - - if (!window.FileReader) + data.containerNode.innerHTML = template; + parser.parse(this.containerNode).then(function(instances) { - this.keyStoreOldBrowserWarning.innerHTML = "File upload requires a more recent browser with HTML5 support"; - this.keyStoreOldBrowserWarning.className = this.keyStoreOldBrowserWarning.className.replace("hidden", ""); - } + that.keyStoreOldBrowserWarning = dom.byId("addStore.oldBrowserWarning"); + + if (!window.FileReader) + { + that.keyStoreOldBrowserWarning.innerHTML = "File upload requires a more recent browser with HTML5 support"; + that.keyStoreOldBrowserWarning.className = that.keyStoreOldBrowserWarning.className.replace("hidden", ""); + } + + if (data.effectiveData) + { + that.update(data.effectiveData); + } + + util.applyMetadataToWidgets(data.containerNode, "TrustStore", "NonJavaTrustStore"); + }); }, update: function(effectiveData) { - if (effectiveData) - { - var attributes = metadata.getMetaData("TrustStore", "NonJavaTrustStore").attributes; - var widgets = registry.findWidgets(this.containerNode); - array.forEach(widgets, function(item) + var attributes = metadata.getMetaData("TrustStore", "NonJavaTrustStore").attributes; + var widgets = registry.findWidgets(this.containerNode); + array.forEach(widgets, function(item) + { + var name = item.id.replace("addStore.",""); + if (name in attributes ) { - var name = item.id.replace("addStore.",""); - if (name in attributes ) + var attribute = attributes[name]; + var value = effectiveData[name]; + if (value) { - var attribute = attributes[name]; - if (attribute.oversize || attribute.secure) + if (attribute.secure) { - item.set("required", false); - item.set("placeHolder", effectiveData[name]); + if (!/^\*+/.test(value) ) + { + item.set("value", value); + } + else + { + item.set("placeHolder", value); + item.set("required", false); + } } else { - item.set("value", effectiveData[name]); + item.set("value", value); } } - }); - } + } + }); } }; - try - { - addKeyStore.init(); - } - catch(e) - { - console.warn(e); - } return addKeyStore; } ); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavatruststore/show.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavatruststore/show.js index 89b0b5d88f..7d78026d05 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavatruststore/show.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavatruststore/show.js @@ -36,10 +36,12 @@ define(["dojo/query", { this.fields.push(name); } - util.buildUI(data.containerNode, data.parent, "store/nonjavatruststore/show.html", this.fields, this); - var gridNode = query(".details", data.containerNode)[0]; - var dateTimeFormatter = function(value){ return value ? UserPreferences.formatDateTime(value, {addOffset: true, appendTimeZone: true}) : "";}; - this.detailsGrid = new UpdatableStore([], + var that = this; + util.buildUI(data.containerNode, data.parent, "store/nonjavatruststore/show.html", this.fields, this, function() + { + var gridNode = query(".details", data.containerNode)[0]; + var dateTimeFormatter = function(value){ return value ? UserPreferences.formatDateTime(value, {addOffset: true, appendTimeZone: true}) : "";}; + that.detailsGrid = new UpdatableStore([], gridNode, [ { name: 'Subject', field: 'SUBJECT_NAME', width: '25%' }, @@ -47,6 +49,7 @@ define(["dojo/query", { name: 'Valid from', field: 'VALID_START', width: '25%', formatter: dateTimeFormatter }, { name: 'Valid to', field: 'VALID_END', width: '25%', formatter: dateTimeFormatter} ]); + }); } NonJavaTrustStore.prototype.update = function(data) diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/virtualhost/providedstore/add.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/virtualhost/providedstore/add.js index 7d14c6450f..c4e44f5027 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/virtualhost/providedstore/add.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/virtualhost/providedstore/add.js @@ -32,9 +32,12 @@ define(["dojo/_base/xhr", return { show: function (data) { + var that= this; this.containerNode = domConstruct.create("div", {innerHTML: template}, data.containerNode); - parser.parse(this.containerNode); - + parser.parse(this.containerNode).then(function(instances) {that._postParse(data);}); + }, + _postParse: function(data) + { registry.byId("addVirtualHost.storeUnderfullSize").set("regExpGen", util.numericOrContextVarRegexp); registry.byId("addVirtualHost.storeOverfullSize").set("regExpGen", util.numericOrContextVarRegexp); @@ -42,6 +45,7 @@ define(["dojo/_base/xhr", { dom.byId("addVirtualHost.diskFlowControls").style.display = "none"; } + } }; } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/virtualhost/providedstore/edit.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/virtualhost/providedstore/edit.js index 6264d81335..3a305fb016 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/virtualhost/providedstore/edit.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/virtualhost/providedstore/edit.js @@ -20,14 +20,15 @@ define(["dijit/registry", "qpid/common/util", "dojo/domReady!"], function (registry, util) { - var fieldNames = ["storeUnderfullSize", "storeOverfullSize"]; return { show: function(data) { - util.buildEditUI(data.containerNode, "virtualhost/providedstore/edit.html", "editVirtualHost.", fieldNames, data.data); - - registry.byId("editVirtualHost.storeUnderfullSize").set("regExpGen", util.numericOrContextVarRegexp); - registry.byId("editVirtualHost.storeOverfullSize").set("regExpGen", util.numericOrContextVarRegexp); + util.parseHtmlIntoDiv(data.containerNode, "virtualhost/providedstore/edit.html", + function() + { + registry.byId("editVirtualHost.storeUnderfullSize").set("regExpGen", util.numericOrContextVarRegexp); + registry.byId("editVirtualHost.storeOverfullSize").set("regExpGen", util.numericOrContextVarRegexp); + }); } }; } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/virtualhostnode/json/edit.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/virtualhostnode/json/edit.js index 35ecbec315..4c70b4a22d 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/virtualhostnode/json/edit.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/virtualhostnode/json/edit.js @@ -22,8 +22,11 @@ define(["qpid/common/util", "dijit/registry", "dojo/domReady!"], return { show: function(data) { - util.buildEditUI(data.containerNode, "virtualhostnode/filebased/edit.html", "editVirtualHostNode.", ["storePath"], data.data); - registry.byId("editVirtualHostNode.storePath").set("disabled", !(data.data.state == "STOPPED" || data.data.state == "ERRORED")); + util.parseHtmlIntoDiv(data.containerNode, "virtualhostnode/filebased/edit.html", + function() + { + registry.byId("editVirtualHostNode.storePath").set("disabled", !(data.data.state == "STOPPED" || data.data.state == "ERRORED")); + }); } }; } 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 32071e262d..5e324bd219 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 @@ -25,61 +25,72 @@ <div class="formLabel-labelCell">Name:</div> <div class="nameValue"></div> </div> - - <div class="clear type"> - <div class="formLabel-labelCell">Port Type:</div> - <div class="typeValue"></div> + <div class="clear"></div> + <div class="alignLeft"> + <div class="clear type"> + <div class="formLabel-labelCell">Port Type:</div> + <div class="formValue-valueCell typeValue"></div> + </div> </div> + <div class="alignRight"> + <div class="clear maxOpenConnections"> + <div class="formLabel-labelCell">Open connections (current/maximum):</div> + <div class="formValue-valueCell"> + <span class="connectionCountValue"></span><span>/</span><span class="maxOpenConnectionsValue"></span> + </div> + </div> + </div> - <div class="clear state"> + <div class="clear state"> <div class="formLabel-labelCell">State:</div> - <div class="stateValue"></div> - </div> + <div class="formValue-valueCell stateValue"></div> + </div> - <div class="clear port"> + <div class="clear port"> <div class="formLabel-labelCell">Port Number:</div> - <div class="portValue"></div> - </div> + <div class="formValue-valueCell portValue"></div> + </div> - <div class="clear protocols"> + <div class="clear protocols"> <div class="formLabel-labelCell">Protocols:</div> - <div class="protocolsValue multiLineValue"></div> - </div> + <div class="formValue-valueCell protocolsValue multiLineValue"></div> + </div> <div class="clear authenticationProvider"> - <div class="formLabel-labelCell">Authentication Provider:</div> - <div class="authenticationProviderValue"></div> + <div class="formLabel-labelCell">Authentication Provider:</div> + <div class="formValue-valueCell authenticationProviderValue"></div> </div> <div class="clear bindingAddress"> - <div class="formLabel-labelCell">Binding address:</div> - <div class="bindingAddressValue"></div> + <div class="formLabel-labelCell">Binding address:</div> + <div class="formValue-valueCell bindingAddressValue"></div> </div> <div class="clear transports"> <div class="formLabel-labelCell">Transports:</div> - <div class="transportsValue multiLineValue"></div> - </div> + <div class="formValue-valueCell transportsValue multiLineValue"></div> + </div> - <div class="clear keyStore"> - <div class="formLabel-labelCell">Key Store:</div> - <div class="keyStoreValue"></div> - </div> + <div class="clear keyStore"> + <div class="formLabel-labelCell">Key Store:</div> + <div class="formValue-valueCell keyStoreValue"></div> + </div> - <div class="clear needClientAuth"> - <div class="formLabel-labelCell">Need SSL Client Certificate:</div> - <div class="needClientAuthValue"></div> - </div> + <div class="clear needClientAuth"> + <div class="formLabel-labelCell">Need SSL Client Certificate:</div> + <div class="formValue-valueCell needClientAuthValue"></div> + </div> - <div class="clear wantClientAuth"> - <div class="formLabel-labelCell">Want SSL Client Certificate:</div> - <div class="wantClientAuthValue"></div> - </div> + <div class="clear wantClientAuth"> + <div class="formLabel-labelCell">Want SSL Client Certificate:</div> + <div class="formValue-valueCell wantClientAuthValue"></div> + </div> + + <div class="clear trustStores"> + <div class="formLabel-labelCell">Trust Stores:</div> + <div class="formValue-valueCell trustStoresValue multiLineValue"></div> + </div> - <div class="clear trustStores"> - <div class="formLabel-labelCell">Trust Stores:</div> - <div class="trustStoresValue multiLineValue"></div> - </div> <div class="clear"></div> </div> <br/> diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/showQueue.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/showQueue.html index a068868e7f..7132dd8105 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/showQueue.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/showQueue.html @@ -25,7 +25,7 @@ <div class="formLabel-labelCell">Name:</div> <div class="name formValue-valueCell"></div> </div> - <div class="clear"> + <div class="clear"></div> <div class="alignLeft"> <div class="clear"> <div class="formLabel-labelCell">Type:</div> diff --git a/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/report/ReportRunnerTest.java b/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/report/ReportRunnerTest.java new file mode 100644 index 0000000000..38432a26f4 --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/report/ReportRunnerTest.java @@ -0,0 +1,186 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.server.management.plugin.report; + +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.io.ByteArrayOutputStream; +import java.io.ObjectOutputStream; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.mockito.ArgumentCaptor; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +import org.apache.qpid.server.message.AMQMessageHeader; +import org.apache.qpid.server.message.ServerMessage; +import org.apache.qpid.server.model.Queue; +import org.apache.qpid.server.queue.AMQQueue; +import org.apache.qpid.server.queue.QueueEntry; +import org.apache.qpid.server.queue.QueueEntryVisitor; +import org.apache.qpid.test.utils.QpidTestCase; + +public class ReportRunnerTest extends QpidTestCase +{ + public void testTextReportCountsMessages() + { + ReportRunner<String> runner = (ReportRunner<String>) ReportRunner.createRunner(TestTextReport.NAME, + Collections.<String, String[]>emptyMap()); + Queue queue = createMockQueue(); + assertEquals("There are 0 messages on the queue.", runner.runReport(queue)); + + runner = (ReportRunner<String>) ReportRunner.createRunner(TestTextReport.NAME, + Collections.<String, String[]>emptyMap()); + Queue queue1 = createMockQueue(mock(ServerMessage.class)); + assertEquals("There are 1 messages on the queue.", runner.runReport(queue1)); + + runner = (ReportRunner<String>) ReportRunner.createRunner(TestTextReport.NAME, + Collections.<String, String[]>emptyMap()); + Queue queue2 = createMockQueue(mock(ServerMessage.class), mock(ServerMessage.class)); + assertEquals("There are 2 messages on the queue.", runner.runReport(queue2)); + } + + public void testTextReportSingleStringParam() + { + Queue queue2 = createMockQueue(mock(ServerMessage.class), mock(ServerMessage.class)); + + Map<String, String[]> parameterMap = new HashMap<>(); + parameterMap.put("stringParam", new String[]{"hello world"}); + ReportRunner<String> runner = + (ReportRunner<String>) ReportRunner.createRunner(TestTextReport.NAME, parameterMap); + assertEquals("There are 2 messages on the queue. stringParam = hello world.", runner.runReport(queue2)); + } + + public void testTextReportSingleStringArrayParam() + { + Queue queue = createMockQueue(); + + Map<String, String[]> parameterMap = new HashMap<>(); + parameterMap.put("stringArrayParam", new String[] { "hello world", "goodbye"}); + ReportRunner<String> runner = (ReportRunner<String>) ReportRunner.createRunner(TestTextReport.NAME, parameterMap); + assertEquals("There are 0 messages on the queue. stringArrayParam = [hello world, goodbye].", runner.runReport(queue)); + + } + + + public void testTextReportBothParams() + { + Queue queue = createMockQueue(); + + Map<String, String[]> parameterMap = new HashMap<>(); + parameterMap.put("stringParam", new String[]{"hello world"}); + parameterMap.put("stringArrayParam", new String[] { "hello world", "goodbye"}); + ReportRunner<String> runner = (ReportRunner<String>) ReportRunner.createRunner(TestTextReport.NAME, parameterMap); + assertEquals("There are 0 messages on the queue. stringParam = hello world. stringArrayParam = [hello world, goodbye].", runner.runReport(queue)); + + } + + public void testInvalidReportName() + { + try + { + ReportRunner.createRunner("unknown", Collections.<String, String[]>emptyMap()); + fail("Unknown report name should throw exception"); + } + catch(IllegalArgumentException e) + { + assertEquals("Unknown report: unknown", e.getMessage()); + } + } + + public void testBinaryReportWithLimit() throws Exception + { + Queue queue = createMockQueue(createMessageWithAppProperties(Collections.<String,Object>singletonMap("key",1)), + createMessageWithAppProperties(Collections.<String,Object>singletonMap("key",2)), + createMessageWithAppProperties(Collections.<String, Object>singletonMap("key", 3)), + createMessageWithAppProperties(Collections.<String, Object>singletonMap("key", 4))); + Map<String, String[]> parameterMap = new HashMap<>(); + parameterMap.put("propertyName", new String[]{"key"}); + parameterMap.put("limit", new String[] { "3" }); + + ReportRunner<byte[]> runner = (ReportRunner<byte[]>) ReportRunner.createRunner(TestBinaryReport.NAME, parameterMap); + + ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + ObjectOutputStream objects = new ObjectOutputStream(bytes); + objects.writeObject(Integer.valueOf(1)); + objects.writeObject(Integer.valueOf(2)); + objects.writeObject(Integer.valueOf(3)); + objects.flush(); + byte[] expected = bytes.toByteArray(); + byte[] actual = runner.runReport(queue); + assertTrue("Output not as expected", Arrays.equals(expected, actual)); + } + + private ServerMessage<?> createMessageWithAppProperties(final Map<String,Object> props) + { + ServerMessage<?> message = mock(ServerMessage.class); + final AMQMessageHeader header = mock(AMQMessageHeader.class); + when(message.getMessageHeader()).thenReturn(header); + final ArgumentCaptor<String> headerNameCaptor = ArgumentCaptor.forClass(String.class); + when(header.getHeader(headerNameCaptor.capture())).thenAnswer(new Answer<Object>() + { + @Override + public Object answer(final InvocationOnMock invocation) throws Throwable + { + String header = headerNameCaptor.getValue(); + return props.get(header); + } + }); + when(header.getHeaderNames()).thenReturn(props.keySet()); + return message; + } + + private Queue createMockQueue(final ServerMessage<?>... messages) + { + final AMQQueue queue = mock(AMQQueue.class); + final ArgumentCaptor<QueueEntryVisitor> captor = ArgumentCaptor.forClass(QueueEntryVisitor.class); + doAnswer(new Answer() + { + @Override + public Object answer(final InvocationOnMock invocation) throws Throwable + { + QueueEntryVisitor visitor = captor.getValue(); + for(ServerMessage<?> message : messages) + { + if(visitor.visit(makeEntry(queue, message))) + { + break; + } + } + return null; + } + }).when(queue).visit(captor.capture()); + return queue; + } + + private QueueEntry makeEntry(final AMQQueue queue, final ServerMessage<?> message) + { + QueueEntry entry = mock(QueueEntry.class); + when(entry.getQueue()).thenReturn(queue); + when(entry.getMessage()).thenReturn(message); + return entry; + } +} diff --git a/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/report/TestBinaryReport.java b/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/report/TestBinaryReport.java new file mode 100644 index 0000000000..fc5e93631e --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/report/TestBinaryReport.java @@ -0,0 +1,114 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.server.management.plugin.report; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; + +public class TestBinaryReport extends QueueBinaryReport +{ + + + private int _limit; + private String _propertyName; + private int _count; + private final ByteArrayOutputStream _bytesOutputStream = new ByteArrayOutputStream(); + private final ObjectOutputStream _objectOutputStream; + public static final String NAME = "testBinary"; + + public TestBinaryReport() + { + try + { + _objectOutputStream = new ObjectOutputStream(_bytesOutputStream); + } + catch (IOException e) + { + throw new RuntimeException(e); + } + ; + } + + @Override + public String getName() + { + return NAME; + } + + @Override + public String getContentType() + { + return "application/octet-stream"; + } + + @Override + public void addMessage(final ReportableMessage reportableMessage) + { + if(_propertyName != null) + { + Object value = reportableMessage.getMessageHeader().getHeader(_propertyName); + if(value != null) + { + try + { + _objectOutputStream.writeObject(value); + } + catch (IOException e) + { + // ignore + } + } + } + _count++; + } + + @Override + public boolean isComplete() + { + return _limit != 0 && _count >= _limit; + } + + @Override + public byte[] getReport() + { + try + { + _objectOutputStream.flush(); + + return _bytesOutputStream.toByteArray(); + } + catch (IOException e) + { + throw new RuntimeException(e); + } + } + + public void setLimit(final String limit) + { + _limit = Integer.parseInt(limit); + } + + public void setPropertyName(final String propertyName) + { + this._propertyName = propertyName; + } +} diff --git a/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/report/TestTextReport.java b/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/report/TestTextReport.java new file mode 100644 index 0000000000..7f9e1e2962 --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/report/TestTextReport.java @@ -0,0 +1,84 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.server.management.plugin.report; + +import java.util.Arrays; + +public class TestTextReport extends QueueTextReport +{ + public static final String NAME = "testText"; + private int _count; + private String _stringParam; + private String[] _stringArrayParam; + + @Override + public String getName() + { + return NAME; + } + + @Override + public String getContentType() + { + return "text/plain"; + } + + @Override + public void addMessage(final ReportableMessage reportableMessage) + { + _count++; + } + + @Override + public boolean isComplete() + { + return false; + } + + @Override + public String getReport() + { + StringBuilder result = new StringBuilder("There are " + _count + " messages on the queue."); + if(_stringParam != null) + { + result.append(" stringParam = " + _stringParam + "."); + } + if(_stringArrayParam != null) + { + result.append(" stringArrayParam = " + Arrays.asList(_stringArrayParam) + "."); + } + return result.toString(); + } + + @SuppressWarnings("unused") + public void setStringParam(final String value) + { + _stringParam = value; + } + + @SuppressWarnings("unused") + public void setStringArrayParam(final String[] value) + { + _stringArrayParam = value; + } + + +} 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 b3c9bd911f..5fb73c8ee4 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 @@ -313,6 +313,7 @@ public class ConfiguredObjectToMapConverterTest extends TestCase Map<String, ConfiguredObjectAttribute<?, ?>> attributeTypes = typeRegistry.getAttributeTypes(TestChild.class); ConfiguredObjectAttribute secureAttribute = mock(ConfiguredObjectAttribute.class); when(secureAttribute.isSecure()).thenReturn(true); + when(secureAttribute.isSecureValue(any())).thenReturn(true); when(attributeTypes.get(eq("secureAttribute"))).thenReturn(secureAttribute); TestChild mockChild = mock(TestChild.class); diff --git a/qpid/java/broker-plugins/management-http/src/test/resources/META-INF/services/org.apache.qpid.server.management.plugin.report.QueueReport b/qpid/java/broker-plugins/management-http/src/test/resources/META-INF/services/org.apache.qpid.server.management.plugin.report.QueueReport new file mode 100644 index 0000000000..7d25ec4378 --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/test/resources/META-INF/services/org.apache.qpid.server.management.plugin.report.QueueReport @@ -0,0 +1,2 @@ +org.apache.qpid.server.management.plugin.report.TestTextReport +org.apache.qpid.server.management.plugin.report.TestBinaryReport diff --git a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/mbeans/ConnectionMBean.java b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/mbeans/ConnectionMBean.java index a016ff9d9d..0787e404fa 100644 --- a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/mbeans/ConnectionMBean.java +++ b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/mbeans/ConnectionMBean.java @@ -100,7 +100,7 @@ public class ConnectionMBean extends AbstractStatisticsGatheringMBean<Connection public String getObjectInstanceName() { - return ObjectName.quote(getRemoteAddress()); + return ObjectName.quote(getConfiguredObject().getName()); } @Override diff --git a/qpid/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/server/jmx/mbeans/ConnectionMBeanTest.java b/qpid/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/server/jmx/mbeans/ConnectionMBeanTest.java index 8754f9a465..232094ce9e 100644 --- a/qpid/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/server/jmx/mbeans/ConnectionMBeanTest.java +++ b/qpid/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/server/jmx/mbeans/ConnectionMBeanTest.java @@ -159,9 +159,9 @@ public class ConnectionMBeanTest extends TestCase public void testGetObjectInstanceName() { - String remoteAddress = "testRemoteAddress"; - String quotedRemoteAddress = "\"testRemoteAddress\""; - when(_mockConnection.getAttribute(Connection.REMOTE_ADDRESS)).thenReturn(remoteAddress); + String name = "[1] 127.0.0.1:5555"; + String quotedRemoteAddress = "\"" + name +"\""; + when(_mockConnection.getName()).thenReturn(name); String objectInstanceName = _connectionMBean.getObjectInstanceName(); assertEquals(quotedRemoteAddress, objectInstanceName); } |
