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