summaryrefslogtreecommitdiff
path: root/qpid/java/broker-plugins
diff options
context:
space:
mode:
authorKeith Wall <kwall@apache.org>2014-07-30 22:24:19 +0000
committerKeith Wall <kwall@apache.org>2014-07-30 22:24:19 +0000
commit660fb9713deb72f0ce35a5ca960f6e37dc14ab14 (patch)
treeed5d4ffff7e3ef1967b1740d5d9a5fdfb79afc08 /qpid/java/broker-plugins
parent7a1cecd5056d9f923bca6447c684f3d4ee6ebcc6 (diff)
downloadqpid-python-660fb9713deb72f0ce35a5ca960f6e37dc14ab14.tar.gz
QPID-5944: [Java Broker] Expose queue clear management operation to the REST API and Web Management Console
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1614783 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java/broker-plugins')
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java87
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js26
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js16
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/FileGroupManager.js14
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/showQueue.html1
5 files changed, 109 insertions, 35 deletions
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java
index 3ee53ad892..531ea1e3c1 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java
@@ -170,7 +170,7 @@ public class MessageServlet extends AbstractServlet
_messageIds = messageIds;
}
-
+ @Override
public void withinTransaction(final VirtualHost.Transaction txn)
{
@@ -208,6 +208,7 @@ public class MessageServlet extends AbstractServlet
_destinationQueue = destinationQueue;
}
+ @Override
protected void updateEntry(QueueEntry entry, VirtualHost.Transaction txn)
{
txn.move(entry, _destinationQueue);
@@ -224,6 +225,7 @@ public class MessageServlet extends AbstractServlet
_destinationQueue = destinationQueue;
}
+ @Override
protected void updateEntry(QueueEntry entry, VirtualHost.Transaction txn)
{
txn.copy(entry, _destinationQueue);
@@ -237,6 +239,7 @@ public class MessageServlet extends AbstractServlet
super(sourceQueue, messageIds);
}
+ @Override
protected void updateEntry(QueueEntry entry, VirtualHost.Transaction txn)
{
txn.dequeue(entry);
@@ -244,6 +247,34 @@ public class MessageServlet extends AbstractServlet
}
+ private static class ClearQueueTransaction implements VirtualHost.TransactionalOperation
+ {
+ private final Queue _queue;
+
+ protected ClearQueueTransaction(Queue queue)
+ {
+ _queue = queue;
+ }
+
+ @Override
+ public void withinTransaction(final VirtualHost.Transaction txn)
+ {
+ _queue.visit(new QueueEntryVisitor()
+ {
+
+ public boolean visit(final QueueEntry entry)
+ {
+ final ServerMessage message = entry.getMessage();
+ if(message != null)
+ {
+ txn.dequeue(entry);
+ }
+ return false;
+ }
+ });
+
+ }
+ }
private class MessageCollector implements QueueEntryVisitor
{
@@ -426,7 +457,7 @@ public class MessageServlet extends AbstractServlet
final Queue destinationQueue = getQueueFromVirtualHost(destQueueName, vhost);
- final List messageIds = new ArrayList((List) providedObject.get("messages"));
+ final List<Long> messageIds = new ArrayList<Long>((List<Long>) providedObject.get("messages"));
QueueEntryTransaction txn =
isMoveTransaction
? new MoveTransaction(sourceQueue, messageIds, destinationQueue)
@@ -446,31 +477,33 @@ public class MessageServlet extends AbstractServlet
}
}
-
/*
- * DELETE removes messages from the queue
+ * DELETE removes specified messages from, or clears the queue
*/
@Override
- protected void doDeleteWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response)
+ protected void doDeleteWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
+ final Queue<?> queue = getQueueFromRequest(request);
- final Queue<?> sourceQueue = getQueueFromRequest(request);
-
- final VirtualHost<?,?,?> vhost = sourceQueue.getParent(VirtualHost.class);
+ final VirtualHost<?,?,?> vhost = queue.getParent(VirtualHost.class);
+ boolean clearQueue = Boolean.parseBoolean(request.getParameter("clear"));
-
- final List<Long> messageIds = new ArrayList<Long>();
- for(String idStr : request.getParameterValues("id"))
- {
- messageIds.add(Long.valueOf(idStr));
- }
-
- // FIXME: added temporary authorization check until we introduce management layer
- // and review current ACL rules to have common rules for all management interfaces
try
{
- authorizeMethod("deleteMessages", vhost);
- vhost.executeTransaction(new DeleteTransaction(sourceQueue, messageIds));
+ if (clearQueue)
+ {
+ clearQueue(queue, vhost);
+ }
+ else
+ {
+ final List<Long> messageIds = new ArrayList<>();
+ for(String idStr : request.getParameterValues("id"))
+ {
+ messageIds.add(Long.valueOf(idStr));
+ }
+
+ deleteMessages(queue, vhost, messageIds);
+ }
response.setStatus(HttpServletResponse.SC_OK);
}
catch (AccessControlException e)
@@ -480,6 +513,22 @@ public class MessageServlet extends AbstractServlet
}
+ private void deleteMessages(final Queue<?> queue, final VirtualHost<?, ?, ?> vhost, final List<Long> messageIds)
+ {
+ // FIXME: added temporary authorization check until we introduce management layer
+ // and review current ACL rules to have common rules for all management interfaces
+ authorizeMethod("deleteMessages", vhost);
+ vhost.executeTransaction(new DeleteTransaction(queue, messageIds));
+ }
+
+ private void clearQueue(final Queue<?> queue, final VirtualHost<?, ?, ?> vhost)
+ {
+ // FIXME: added temporary authorization check until we introduce management layer
+ // and review current ACL rules to have common rules for all management interfaces
+ authorizeMethod("clearQueue", vhost);
+ vhost.executeTransaction(new ClearQueueTransaction(queue));
+ }
+
private void authorizeMethod(String methodName, VirtualHost<?,?,?> vhost)
{
SecurityManager securityManager = getBroker().getSecurityManager();
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 3371445e5b..25c0740730 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
@@ -135,6 +135,13 @@ define(["dojo/_base/xhr",
event.stop(evt);
that.deleteMessages();
});
+ var clearQueueButton = query(".clearQueueButton", contentPane.containerNode)[0];
+ var clearQueueWidget = registry.byNode(clearQueueButton);
+ connect.connect(clearQueueWidget, "onClick",
+ function(evt){
+ event.stop(evt);
+ that.clearQueue();
+ });
var moveMessagesButton = query(".moveMessagesButton", contentPane.containerNode)[0];
connect.connect(registry.byNode(moveMessagesButton), "onClick",
function(evt){
@@ -203,7 +210,24 @@ define(["dojo/_base/xhr",
}
}
};
-
+ Queue.prototype.clearQueue = function() {
+ var that = this;
+ if(confirm("Clear all messages from queue?")) {
+ var query = "service/message/"+ encodeURIComponent(that.getVirtualHostName())
+ + "/" + encodeURIComponent(that.getQueueName()) + "?clear=true";
+ that.success = true
+ xhr.del({url: query, sync: true, handleAs: "json"}).then(
+ function(data) {
+ that.grid.setQuery({id: "*"});
+ that.grid.selection.deselectAll();
+ that.queueUpdater.update();
+ },
+ function(error) {that.success = false; that.failureReason = error;});
+ if(!that.success ) {
+ alert("Error:" + this.failureReason);
+ }
+ }
+ };
Queue.prototype.moveOrCopyMessages = function(obj) {
var that = this;
var move = obj.move;
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 bd45d0b488..c5875d59ea 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
@@ -109,14 +109,14 @@ define(["dojo/_base/xhr",
var addUserButton = query(".addUserButton", node)[0];
connect.connect(registry.byNode(addUserButton), "onClick", function(evt){ addUser.show(that.name) });
- var deleteMessagesButton = query(".deleteUserButton", node)[0];
- var deleteWidget = registry.byNode(deleteMessagesButton);
- connect.connect(deleteWidget, "onClick",
- function(evt){
- event.stop(evt);
- that.deleteUsers();
- });
- }
+ var deleteUserButton = query(".deleteUserButton", node)[0];
+ var deleteWidget = registry.byNode(deleteUserButton);
+ connect.connect(deleteWidget, "onClick",
+ function(evt){
+ event.stop(evt);
+ that.deleteUsers();
+ });
+}
DatabaseAuthManager.prototype.deleteUsers = function()
{
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/FileGroupManager.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/FileGroupManager.js
index 55d6645a49..c8f991260c 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/FileGroupManager.js
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/FileGroupManager.js
@@ -125,13 +125,13 @@ define(["dojo/_base/xhr",
var addGroupButton = query(".addGroupButton", node)[0];
connect.connect(registry.byNode(addGroupButton), "onClick", function(evt){ addGroup.show(groupProviderObj.name) });
- var deleteMessagesButton = query(".deleteGroupButton", node)[0];
- var deleteWidget = registry.byNode(deleteMessagesButton);
- connect.connect(deleteWidget, "onClick",
- function(evt){
- event.stop(evt);
- that.deleteGroups();
- });
+ var deleteGroupButton = query(".deleteGroupButton", node)[0];
+ var deleteWidget = registry.byNode(deleteGroupButton);
+ connect.connect(deleteWidget, "onClick",
+ function(evt){
+ event.stop(evt);
+ that.deleteGroups();
+ });
});
}
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 48a85d68a0..5e6c59eafb 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
@@ -128,6 +128,7 @@
<div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Messages'">
<div class="messages"></div>
<button data-dojo-type="dijit.form.Button" class="deleteMessagesButton" type="button">Delete Messages</button>
+ <button data-dojo-type="dijit.form.Button" class="clearQueueButton" type="button">Clear Queue</button>
<button data-dojo-type="dijit.form.Button" class="moveMessagesButton" type="button">Move Messages</button>
<button data-dojo-type="dijit.form.Button" class="copyMessagesButton" type="button">Copy Messages</button>
</div>