You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kw...@apache.org on 2014/07/31 00:24:20 UTC
svn commit: r1614783 - in /qpid/trunk/qpid: doc/book/src/java-broker/
java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/
java/broker-plugins/management-http/src/main/java/resources/
java/broker-plug...
Author: kwall
Date: Wed Jul 30 22:24:19 2014
New Revision: 1614783
URL: http://svn.apache.org/r1614783
Log:
QPID-5944: [Java Broker] Expose queue clear management operation to the REST API and Web Management Console
Modified:
qpid/trunk/qpid/doc/book/src/java-broker/Java-Broker-Security-ACLs.xml
qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java
qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js
qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js
qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/FileGroupManager.js
qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showQueue.html
qpid/trunk/qpid/java/broker/etc/broker_example.acl
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/MessagesRestTest.java
Modified: qpid/trunk/qpid/doc/book/src/java-broker/Java-Broker-Security-ACLs.xml
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/doc/book/src/java-broker/Java-Broker-Security-ACLs.xml?rev=1614783&r1=1614782&r2=1614783&view=diff
==============================================================================
--- qpid/trunk/qpid/doc/book/src/java-broker/Java-Broker-Security-ACLs.xml (original)
+++ qpid/trunk/qpid/doc/book/src/java-broker/Java-Broker-Security-ACLs.xml Wed Jul 30 22:24:19 2014
@@ -617,7 +617,7 @@ ACL ALLOW-LOG webadmins CREATE USER
ACL ALLOW-LOG webadmins DELETE USER
ACL ALLOW-LOG webadmins UPDATE USER
-# allow to the users from webadmins group to move, copy and delete messagaes
+# allow to the users from webadmins group to move, copy, delete messagaes, and clear the queue
# using REST management interfaces
ACL ALLOW-LOG webadmins UPDATE METHOD
@@ -625,6 +625,7 @@ ACL ALLOW-LOG webadmins UPDATE METHOD
#ACL ALLOW-LOG webadmins UPDATE METHOD component="VirtualHost.Queue" name="moveMessages"
#ACL ALLOW-LOG webadmins UPDATE METHOD component="VirtualHost.Queue" name="copyMessages"
#ACL ALLOW-LOG webadmins UPDATE METHOD component="VirtualHost.Queue" name="deleteMessages"
+#ACL ALLOW-LOG webadmins UPDATE METHOD component="VirtualHost.Queue" name="clearQueue"
ACL DENY-LOG all all
</programlisting>
Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java?rev=1614783&r1=1614782&r2=1614783&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java Wed Jul 30 22:24:19 2014
@@ -170,7 +170,7 @@ public class MessageServlet extends Abst
_messageIds = messageIds;
}
-
+ @Override
public void withinTransaction(final VirtualHost.Transaction txn)
{
@@ -208,6 +208,7 @@ public class MessageServlet extends Abst
_destinationQueue = destinationQueue;
}
+ @Override
protected void updateEntry(QueueEntry entry, VirtualHost.Transaction txn)
{
txn.move(entry, _destinationQueue);
@@ -224,6 +225,7 @@ public class MessageServlet extends Abst
_destinationQueue = destinationQueue;
}
+ @Override
protected void updateEntry(QueueEntry entry, VirtualHost.Transaction txn)
{
txn.copy(entry, _destinationQueue);
@@ -237,6 +239,7 @@ public class MessageServlet extends Abst
super(sourceQueue, messageIds);
}
+ @Override
protected void updateEntry(QueueEntry entry, VirtualHost.Transaction txn)
{
txn.dequeue(entry);
@@ -244,6 +247,34 @@ public class MessageServlet extends Abst
}
+ 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 Abst
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 Abst
}
}
-
/*
- * 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 Abst
}
+ 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();
Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js?rev=1614783&r1=1614782&r2=1614783&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js Wed Jul 30 22:24:19 2014
@@ -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;
Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js?rev=1614783&r1=1614782&r2=1614783&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js Wed Jul 30 22:24:19 2014
@@ -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()
{
Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/FileGroupManager.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/FileGroupManager.js?rev=1614783&r1=1614782&r2=1614783&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/FileGroupManager.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/FileGroupManager.js Wed Jul 30 22:24:19 2014
@@ -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();
+ });
});
}
Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showQueue.html
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showQueue.html?rev=1614783&r1=1614782&r2=1614783&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showQueue.html (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showQueue.html Wed Jul 30 22:24:19 2014
@@ -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>
Modified: qpid/trunk/qpid/java/broker/etc/broker_example.acl
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/etc/broker_example.acl?rev=1614783&r1=1614782&r2=1614783&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/etc/broker_example.acl (original)
+++ qpid/trunk/qpid/java/broker/etc/broker_example.acl Wed Jul 30 22:24:19 2014
@@ -83,6 +83,7 @@ ACL ALLOW webadmins ACCESS_LOGS BROKER
#ACL ALLOW-LOG webadmins UPDATE METHOD component="VirtualHost.Queue" name="moveMessages"
#ACL ALLOW-LOG webadmins UPDATE METHOD component="VirtualHost.Queue" name="copyMessages"
#ACL ALLOW-LOG webadmins UPDATE METHOD component="VirtualHost.Queue" name="deleteMessages"
+#ACL ALLOW-LOG webadmins UPDATE METHOD component="VirtualHost.Queue" name="clearQueue"
### MESSAGING ###
# The 'ACCESS VIRTUALHOST' rules below apply to messaging operations (as opposed to management operations)
Modified: qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/MessagesRestTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/MessagesRestTest.java?rev=1614783&r1=1614782&r2=1614783&view=diff
==============================================================================
--- qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/MessagesRestTest.java (original)
+++ qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/MessagesRestTest.java Wed Jul 30 22:24:19 2014
@@ -35,8 +35,8 @@ import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Session;
+import javax.servlet.http.HttpServletResponse;
-import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
public class MessagesRestTest extends QpidRestTestCase
@@ -161,8 +161,7 @@ public class MessagesRestTest extends Qp
messagesData.put("destinationQueue", queueName2);
messagesData.put("move", Boolean.TRUE);
- int status = getRestTestHelper().submitRequest("/service/message/test/" + queueName, "POST", messagesData);
- assertEquals("Unexpected response code", 200, status);
+ getRestTestHelper().submitRequest("/service/message/test/" + queueName, "POST", messagesData, HttpServletResponse.SC_OK);
// check messages on target queue
List<Map<String, Object>> messages = getRestTestHelper().getJsonAsList("/service/message/test/" + queueName2);
@@ -213,8 +212,7 @@ public class MessagesRestTest extends Qp
messagesData.put("messages", copyMessageIds);
messagesData.put("destinationQueue", queueName2);
- int responseCode = getRestTestHelper().submitRequest("/service/message/test/" + queueName, "POST", messagesData);
- assertEquals("Unexpected response code", 200, responseCode);
+ getRestTestHelper().submitRequest("/service/message/test/" + queueName, "POST", messagesData, HttpServletResponse.SC_OK);
// check messages on target queue
List<Map<String, Object>> messages = getRestTestHelper().getJsonAsList("/service/message/test/" + queueName2);
@@ -252,7 +250,7 @@ public class MessagesRestTest extends Qp
// delete half of the messages
int deleteNumber = ids.size() / 2;
StringBuilder queryString = new StringBuilder();
- List<Long> deleteMessageIds = new ArrayList<Long>();
+ List<Long> deleteMessageIds = new ArrayList<>();
for (int i = 0; i < deleteNumber; i++)
{
Long id = ids.remove(i);
@@ -265,8 +263,7 @@ public class MessagesRestTest extends Qp
}
// delete messages
- int responseCode = getRestTestHelper().submitRequest("/service/message/test/" + queueName + "?" + queryString.toString(), "DELETE");
- assertEquals("Unexpected response code", 200, responseCode);
+ getRestTestHelper().submitRequest("/service/message/test/" + queueName + "?" + queryString.toString(), "DELETE", HttpServletResponse.SC_OK);
// check messages on queue
List<Map<String, Object>> messages = getRestTestHelper().getJsonAsList("/service/message/test/" + queueName);
@@ -284,7 +281,21 @@ public class MessagesRestTest extends Qp
}
}
- private List<Long> getMesssageIds(String queueName) throws IOException, JsonParseException, JsonMappingException
+ public void testClearQueue() throws Exception
+ {
+ String queueName = getTestQueueName();
+
+ // clear queue
+ getRestTestHelper().submitRequest("/service/message/test/" + queueName + "?clear=true", "DELETE", HttpServletResponse.SC_OK);
+
+ // check messages on queue
+ List<Map<String, Object>> messages = getRestTestHelper().getJsonAsList("/service/message/test/" + queueName);
+ assertNotNull("Messages are not found", messages);
+ assertEquals("Unexpected number of messages", 0, messages.size());
+ }
+
+
+ private List<Long> getMesssageIds(String queueName) throws IOException, JsonMappingException
{
List<Map<String, Object>> messages = getRestTestHelper().getJsonAsList("/service/message/test/" + queueName);
List<Long> ids = new ArrayList<Long>();
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org