You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ro...@apache.org on 2012/07/19 13:23:50 UTC

svn commit: r1363298 - in /qpid/trunk/qpid/java: broker-plugins/management-http/src/main/java/resources/ broker-plugins/management-http/src/main/java/resources/js/qpid/common/ broker-plugins/management-http/src/main/java/resources/js/qpid/management/ b...

Author: robbie
Date: Thu Jul 19 11:23:49 2012
New Revision: 1363298

URL: http://svn.apache.org/viewvc?rev=1363298&view=rev
Log:
QPID-4149: Add REST functionality to delete exchanges, queues and bindings, add queue/exchange/binding delete operations into web UI

Applied patch from Oleksandr Rudyy <or...@gmail.com> and myself.

Modified:
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Exchange.js
    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/VirtualHost.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addExchange.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showExchange.html
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showQueue.html
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showVirtualHost.html
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/BindingRestTest.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/VirtualHostRestTest.java
    qpid/trunk/qpid/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/systest/management/jmx/BrokerManagementTest.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeRegistry.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeRegistry.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/VirtualHost.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BindingAdapter.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/ExchangeAdapter.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/QueueAdapter.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js?rev=1363298&r1=1363297&r2=1363298&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js Thu Jul 19 11:23:49 2012
@@ -18,8 +18,8 @@
  * under the License.
  *
  */
-define([],
-       function () {
+define(["dojo/_base/xhr"],
+       function (xhr) {
            var util = {};
            if (Array.isArray) {
                util.isArray = function (object) {
@@ -52,5 +52,69 @@ define([],
                    }
                }
            };
+
+           util.isReservedExchangeName = function(exchangeName)
+           {
+               return exchangeName == null || exchangeName == "" || "<<default>>" == exchangeName || exchangeName.indexOf("amq.") == 0 || exchangeName.indexOf("qpid.") == 0;
+           };
+
+           util.deleteGridSelections = function(updater, gridName, url, confirmationMessageStart)
+           {
+               var grid = updater[gridName].grid;
+               var data = grid.selection.getSelected();
+               if(data.length)
+               {
+                   var confirmationMessage = null;
+                   if (data.length == 1)
+                   {
+                       confirmationMessage = confirmationMessageStart + " '" + data[0].name + "'?";
+                   }
+                   else
+                   {
+                       var names = '';
+                       for(var i = 0; i<data.length; i++)
+                       {
+                           if (names)
+                           {
+                               names += ', ';
+                           }
+                           names += "\""+ data[i].name + "\"";
+                       }
+                       confirmationMessage = confirmationMessageStart + "s " + names + "?";
+                   }
+                   if(confirm(confirmationMessage))
+                   {
+                       var i, queryParam;
+                       for(i = 0; i<data.length; i++)
+                       {
+                           if(queryParam)
+                           {
+                               queryParam += "&";
+                           }
+                           else
+                           {
+                               queryParam = "?";
+                           }
+                           queryParam += "id=" + data[i].id;
+                       }
+                       var query = url + queryParam;
+                       var success = true
+                       var failureReason = "";
+                       xhr.del({url: query, sync: true, handleAs: "json"}).then(
+                           function(data)
+                           {
+                               grid.setQuery({id: "*"});
+                               grid.selection.deselectAll();
+                               updater.update();
+                           },
+                           function(error) {success = false; failureReason = error;});
+                       if(!success )
+                       {
+                           alert("Error:" + failureReason);
+                       }
+                   }
+               }
+           }
+
            return util;
        });
\ No newline at end of file

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Exchange.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Exchange.js?rev=1363298&r1=1363297&r2=1363298&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Exchange.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Exchange.js Thu Jul 19 11:23:49 2012
@@ -29,8 +29,9 @@ define(["dojo/_base/xhr",
         "qpid/common/formatter",
         "qpid/common/UpdatableStore",
         "qpid/management/addBinding",
+        "dojox/grid/EnhancedGrid",
         "dojo/domReady!"],
-       function (xhr, parser, query, connect, registry, properties, updater, util, formatter, UpdatableStore, addBinding) {
+       function (xhr, parser, query, connect, registry, properties, updater, util, formatter, UpdatableStore, addBinding, EnhancedGrid) {
 
            function Exchange(name, parent, controller) {
                this.name = name;
@@ -82,6 +83,27 @@ define(["dojo/_base/xhr",
                                                                   exchange: that.getExchangeName()});
                                             });
 
+                            var deleteBindingButton = query(".deleteBindingButton", contentPane.containerNode)[0];
+                            connect.connect(registry.byNode(deleteBindingButton), "onClick",
+                                            function(evt){
+                                                that.deleteBindings();
+                                            });
+
+                            var isStandard = util.isReservedExchangeName(that.name);
+                            var deleteExchangeButton = query(".deleteExchangeButton", contentPane.containerNode)[0];
+                            var node = registry.byNode(deleteExchangeButton);
+                            if(isStandard)
+                            {
+                                node.set('disabled', true);
+                            }
+                            else
+                            {
+                                connect.connect(node, "onClick",
+                                        function(evt){
+                                            that.deleteExchange();
+                                        });
+                            }
+
                         }});
            };
 
@@ -89,6 +111,15 @@ define(["dojo/_base/xhr",
                updater.remove( this.exchangeUpdater );
            };
 
+           Exchange.prototype.deleteBindings = function()
+           {
+               util.deleteGridSelections(
+                       this.exchangeUpdater,
+                       "bindingsGrid",
+                       "rest/binding/"+ encodeURIComponent(this.getVirtualHostName()) + "/" + encodeURIComponent(this.name),
+                       "Are you sure you want to delete binding for queue");
+           }
+
            function ExchangeUpdater(containerNode, exchangeObj, controller)
            {
                var that = this;
@@ -138,7 +169,21 @@ define(["dojo/_base/xhr",
                                                            [ { name: "Queue",    field: "queue",      width: "90px"},
                                                              { name: "Binding Key", field: "name",          width: "120px"},
                                                              { name: "Arguments",   field: "argumentString",     width: "100%"}
-                                                           ]);
+                                                           ], null, {
+                                                               keepSelection: true,
+                                                               plugins: {
+                                                                         pagination: {
+                                                                             pageSizes: ["10", "25", "50", "100"],
+                                                                             description: true,
+                                                                             sizeSwitch: true,
+                                                                             pageStepper: true,
+                                                                             gotoButton: true,
+                                                                             maxPageStep: 4,
+                                                                             position: "bottom"
+                                                                         },
+                                                                         indirectSelection: true
+
+                                                                }}, EnhancedGrid);
 
                                });
 
@@ -224,6 +269,23 @@ define(["dojo/_base/xhr",
                    });
            };
 
+           Exchange.prototype.deleteExchange = function() {
+               if(confirm("Are you sure you want to delete exchange '" +this.name+"'?")) {
+                   var query = "rest/exchange/"+ encodeURIComponent(this.getVirtualHostName()) + "/" + encodeURIComponent(this.name);
+                   this.success = true
+                   var that = this;
+                   xhr.del({url: query, sync: true, handleAs: "json"}).then(
+                       function(data) {
+                           that.contentPane.onClose()
+                           that.controller.tabContainer.removeChild(that.contentPane);
+                           that.contentPane.destroyRecursive();
+                       },
+                       function(error) {that.success = false; that.failureReason = error;});
+                   if(!this.success ) {
+                       alert("Error:" + this.failureReason);
+                   }
+               }
+           }
 
            return Exchange;
        });

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=1363298&r1=1363297&r2=1363298&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 Thu Jul 19 11:23:49 2012
@@ -157,6 +157,12 @@ define(["dojo/_base/xhr",
                                                                   queue: that.getQueueName()});
                                             });
 
+                            var deleteQueueButton = query(".deleteQueueButton", contentPane.containerNode)[0];
+                            connect.connect(registry.byNode(deleteQueueButton), "onClick",
+                                    function(evt){
+                                        event.stop(evt);
+                                        that.deleteQueue();
+                                    });
                         }});
 
 
@@ -458,6 +464,23 @@ define(["dojo/_base/xhr",
                    });
            };
 
+           Queue.prototype.deleteQueue = function() {
+               if(confirm("Are you sure you want to delete queue '" +this.name+"'?")) {
+                   var query = "rest/queue/"+ encodeURIComponent(this.getVirtualHostName()) + "/" + encodeURIComponent(this.name);
+                   this.success = true
+                   var that = this;
+                   xhr.del({url: query, sync: true, handleAs: "json"}).then(
+                       function(data) {
+                           that.contentPane.onClose()
+                           that.controller.tabContainer.removeChild(that.contentPane);
+                           that.contentPane.destroyRecursive();
+                       },
+                       function(error) {that.success = false; that.failureReason = error;});
+                   if(!this.success ) {
+                       alert("Error:" + this.failureReason);
+                   }
+               }
+           }
 
            return Queue;
        });

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js?rev=1363298&r1=1363297&r2=1363298&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js Thu Jul 19 11:23:49 2012
@@ -30,8 +30,9 @@ define(["dojo/_base/xhr",
         "qpid/common/UpdatableStore",
         "qpid/management/addQueue",
         "qpid/management/addExchange",
+        "dojox/grid/EnhancedGrid",
         "dojo/domReady!"],
-       function (xhr, parser, query, connect, registry, properties, updater, util, formatter, UpdatableStore, addQueue, addExchange) {
+       function (xhr, parser, query, connect, registry, properties, updater, util, formatter, UpdatableStore, addQueue, addExchange, EnhancedGrid) {
 
            function VirtualHost(name, parent, controller) {
                this.name = name;
@@ -66,8 +67,31 @@ define(["dojo/_base/xhr",
                             var addQueueButton = query(".addQueueButton", contentPane.containerNode)[0];
                             connect.connect(registry.byNode(addQueueButton), "onClick", function(evt){ addQueue.show(that.name) });
 
+                            var deleteQueueButton = query(".deleteQueueButton", contentPane.containerNode)[0];
+                            connect.connect(registry.byNode(deleteQueueButton), "onClick",
+                                    function(evt){
+                                        util.deleteGridSelections(
+                                                that.vhostUpdater,
+                                                "queuesGrid",
+                                                "rest/queue/"+ encodeURIComponent(that.name),
+                                                "Are you sure you want to delete queue");
+                                }
+                            );
+
                             var addExchangeButton = query(".addExchangeButton", contentPane.containerNode)[0];
                             connect.connect(registry.byNode(addExchangeButton), "onClick", function(evt){ addExchange.show(that.name) });
+
+                            var deleteExchangeButton = query(".deleteExchangeButton", contentPane.containerNode)[0];
+                            connect.connect(registry.byNode(deleteExchangeButton), "onClick",
+                                    function(evt)
+                                    {
+                                        util.deleteGridSelections(
+                                                that.vhostUpdater,
+                                                "exchangesGrid",
+                                                "rest/exchange/"+ encodeURIComponent(that.name),
+                                                "Are you sure you want to delete exchange");
+                                    }
+                            );
                         }});
 
            };
@@ -76,7 +100,6 @@ define(["dojo/_base/xhr",
                updater.remove( this.vhostUpdater );
            };
 
-
            function Updater(node, vhost, controller)
            {
 
@@ -123,6 +146,22 @@ define(["dojo/_base/xhr",
                        // flatten statistics into attributes
                        util.flattenStatistics( that.vhostData );
 
+                       var gridProperties = {
+                               keepSelection: true,
+                               plugins: {
+                                         pagination: {
+                                             pageSizes: ["10", "25", "50", "100"],
+                                             description: true,
+                                             sizeSwitch: true,
+                                             pageStepper: true,
+                                             gotoButton: true,
+                                             maxPageStep: 4,
+                                             position: "bottom"
+                                         },
+                                         indirectSelection: true
+
+                                }};
+
                    that.updateHeader();
                    that.queuesGrid = new UpdatableStore(that.vhostData.queues, findNode("queues"),
                                                         [ { name: "Name",    field: "name",      width: "90px"},
@@ -138,24 +177,24 @@ define(["dojo/_base/xhr",
                                                                              var queueName = obj.dataStore.getValue(theItem,"name");
                                                                              controller.show("queue", queueName, vhost);
                                                                          });
-                                                        } );
+                                                        } , gridProperties, EnhancedGrid);
 
                    that.exchangesGrid = new UpdatableStore(that.vhostData.exchanges, findNode("exchanges"),
-                                                           [ { name: "Name",    field: "name",      width: "120px"},
-                                                               { name: "Type", field: "type", width: "120px"},
-                                                               { name: "Binding Count", field: "bindingCount",
-                                                                   width: "100%"}
+                                                           [
+                                                             { name: "Name",    field: "name", width: "120px"},
+                                                             { name: "Type", field: "type", width: "120px"},
+                                                             { name: "Binding Count", field: "bindingCount", width: "100%"}
                                                            ],
                                                            function(obj)
                                                            {
                                                                connect.connect(obj.grid, "onRowDblClick", obj.grid,
                                                                             function(evt){
                                                                                 var idx = evt.rowIndex,
-                                                                                    theItem = this.getItem(idx);
+                                                                                theItem = this.getItem(idx);
                                                                                 var exchangeName = obj.dataStore.getValue(theItem,"name");
                                                                                 controller.show("exchange", exchangeName, vhost);
                                                                             });
-                                                           } );
+                                                           } , gridProperties, EnhancedGrid);
 
 
                    that.connectionsGrid = new UpdatableStore(that.vhostData.connections,
@@ -315,6 +354,18 @@ define(["dojo/_base/xhr",
                        // update exchanges
                        thisObj.exchangesGrid.update(thisObj.vhostData.exchanges);
 
+                       var exchangesGrid = thisObj.exchangesGrid.grid;
+                       for(var i=0; i< thisObj.vhostData.exchanges.length; i++)
+                       {
+                           var data = exchangesGrid.getItem(i);
+                           var isStandard = false;
+                           if (data && data.name)
+                           {
+                               isStandard = util.isReservedExchangeName(data.name);
+                           }
+                           exchangesGrid.rowSelectCell.setDisabled(i, isStandard);
+                       }
+
                        // update connections
                        thisObj.connectionsGrid.update(thisObj.vhostData.connections)
 

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addExchange.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addExchange.js?rev=1363298&r1=1363297&r2=1363298&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addExchange.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addExchange.js Thu Jul 19 11:23:49 2012
@@ -109,7 +109,6 @@ define(["dojo/_base/xhr",
 
                                     var newExchange = convertToExchange(theForm.getValues());
                                     var that = this;
-
                                     xhr.put({url: "rest/exchange/"+encodeURIComponent(addExchange.vhost) +
                                                   "/"+encodeURIComponent(newExchange.name), sync: true, handleAs: "json",
                                              headers: { "Content-Type": "application/json"},

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showExchange.html
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showExchange.html?rev=1363298&r1=1363297&r2=1363298&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showExchange.html (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showExchange.html Thu Jul 19 11:23:49 2012
@@ -41,6 +41,10 @@
     <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Bindings'">
         <div class="bindings"></div>
         <button data-dojo-type="dijit.form.Button" class="addBindingButton">Add Binding</button>
+        <button data-dojo-type="dijit.form.Button" class="deleteBindingButton">Delete Binding</button>
     </div>
     <br/>
+    <div class="dijitDialogPaneActionBar">
+        <button data-dojo-type="dijit.form.Button" class="deleteExchangeButton" type="button">Delete Exchange</button>
+    </div>
 </div>

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=1363298&r1=1363297&r2=1363298&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 Thu Jul 19 11:23:49 2012
@@ -97,5 +97,9 @@
 
 
     </div>
+
+    <div class="dijitDialogPaneActionBar">
+        <button data-dojo-type="dijit.form.Button" class="deleteQueueButton" type="button">Delete Queue</button>
+    </div>
 </div>
 

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showVirtualHost.html
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showVirtualHost.html?rev=1363298&r1=1363297&r2=1363298&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showVirtualHost.html (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showVirtualHost.html Thu Jul 19 11:23:49 2012
@@ -43,11 +43,13 @@
     <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Exchanges'">
         <div class="exchanges"></div>
         <button data-dojo-type="dijit.form.Button" class="addExchangeButton">Add Exchange</button>
+        <button data-dojo-type="dijit.form.Button" class="deleteExchangeButton">Delete Exchange</button>
     </div>
     <br/>
     <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Queues'">
         <div class="queues"></div>
         <button data-dojo-type="dijit.form.Button" class="addQueueButton">Add Queue</button>
+        <button data-dojo-type="dijit.form.Button" class="deleteQueueButton">Delete Queue</button>
     </div>
     <br/>
     <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Connections'">

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/BindingRestTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/BindingRestTest.java?rev=1363298&r1=1363297&r2=1363298&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/BindingRestTest.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/BindingRestTest.java Thu Jul 19 11:23:49 2012
@@ -1,5 +1,6 @@
 package org.apache.qpid.server.management.plugin.servlet.rest;
 
+import java.net.HttpURLConnection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -61,4 +62,48 @@ public class BindingRestTest extends Qpi
         Asserts.assertBinding("queue", "amq.direct", bindings.get(0));
     }
 
+
+    public void testDeleteBinding() throws Exception
+    {
+        List<Map<String, Object>> bindings = getJsonAsList("/rest/binding/test/amq.direct/queue/queue");
+        assertEquals("Unexpected number of bindings", 1, bindings.size());
+        Asserts.assertBinding("queue", "amq.direct", bindings.get(0));
+
+        HttpURLConnection connection = openManagementConection("/rest/binding/test/amq.direct/queue/queue", "DELETE");
+        connection.connect();
+        assertEquals("Unexpected response code", 200, connection.getResponseCode());
+
+        bindings = getJsonAsList("/rest/binding/test/amq.direct/queue/queue");
+        assertEquals("Binding should be deleted", 0, bindings.size());
+    }
+
+    public void testDeleteBindingById() throws Exception
+    {
+        Map<String, Object> binding = getJsonAsSingletonList("/rest/binding/test/amq.direct/queue");
+        HttpURLConnection connection = openManagementConection("/rest/binding/test/amq.direct?id=" + binding.get(Binding.ID), "DELETE");
+        connection.connect();
+        assertEquals("Unexpected response code", 200, connection.getResponseCode());
+        List<Map<String, Object>> bindings = getJsonAsList("/rest/binding/test/amq.direct/queue");
+        assertEquals("Binding should be deleted", 0, bindings.size());
+    }
+
+    public void testCreateBinding() throws Exception
+    {
+        String bindingName =  getTestName();
+        Map<String, Object> bindingData = new HashMap<String, Object>();
+        bindingData.put(Binding.NAME, bindingName);
+        bindingData.put(Binding.QUEUE, "queue");
+        bindingData.put(Binding.EXCHANGE, "amq.direct");
+
+        HttpURLConnection connection = openManagementConection("/rest/binding/test/amq.direct/queue/" + bindingName, "PUT");
+        connection.connect();
+        writeJsonRequest(connection, bindingData);
+        int responseCode = connection.getResponseCode();
+        connection.disconnect();
+        assertEquals("Unexpected response code", 201, responseCode);
+        Map<String, Object> binding = getJsonAsSingletonList("/rest/binding/test/amq.direct/queue/" + bindingName);
+
+        Asserts.assertBinding(bindingName, "queue", "amq.direct", binding);
+    }
+
 }

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/VirtualHostRestTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/VirtualHostRestTest.java?rev=1363298&r1=1363297&r2=1363298&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/VirtualHostRestTest.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/VirtualHostRestTest.java Thu Jul 19 11:23:49 2012
@@ -246,6 +246,56 @@ public class VirtualHostRestTest extends
         assertNull("Queue of unsupported type was created", queue);
     }
 
+    public void testDeleteQueue() throws Exception
+    {
+        String queueName = getTestQueueName();
+        createQueue(queueName, null, null);
+
+        HttpURLConnection connection = openManagementConection("/rest/queue/test/" + queueName, "DELETE");
+        connection.connect();
+        assertEquals("Unexpected response code", 200, connection.getResponseCode());
+        List<Map<String, Object>> queues = getJsonAsList("/rest/queue/test/" + queueName);
+        assertEquals("Queue should be deleted", 0, queues.size());
+    }
+
+    public void testDeleteQueueById() throws Exception
+    {
+        String queueName = getTestQueueName();
+        createQueue(queueName, null, null);
+        Map<String, Object> queueDetails = getJsonAsSingletonList("/rest/queue/test/" + queueName);
+
+        HttpURLConnection connection = openManagementConection("/rest/queue/test?id=" + queueDetails.get(Queue.ID), "DELETE");
+        connection.connect();
+        assertEquals("Unexpected response code", 200, connection.getResponseCode());
+        List<Map<String, Object>> queues = getJsonAsList("/rest/queue/test/" + queueName);
+        assertEquals("Queue should be deleted", 0, queues.size());
+    }
+
+    public void testDeleteExchange() throws Exception
+    {
+        String exchangeName = getTestName();
+        createExchange(exchangeName, "direct");
+
+        HttpURLConnection connection = openManagementConection("/rest/exchange/test/" + exchangeName, "DELETE");
+        connection.connect();
+        assertEquals("Unexpected response code", 200, connection.getResponseCode());
+        List<Map<String, Object>> queues = getJsonAsList("/rest/exchange/test/" + exchangeName);
+        assertEquals("Exchange should be deleted", 0, queues.size());
+    }
+
+    public void testDeleteExchangeById() throws Exception
+    {
+        String exchangeName = getTestName();
+        createExchange(exchangeName, "direct");
+        Map<String, Object> echangeDetails = getJsonAsSingletonList("/rest/exchange/test/" + exchangeName);
+
+        HttpURLConnection connection = openManagementConection("/rest/exchange/test?id=" + echangeDetails.get(Exchange.ID), "DELETE");
+        connection.connect();
+        assertEquals("Unexpected response code", 200, connection.getResponseCode());
+        List<Map<String, Object>> queues = getJsonAsList("/rest/exchange/test/" + exchangeName);
+        assertEquals("Exchange should be deleted", 0, queues.size());
+    }
+
     private void createExchange(String exchangeName, String exchangeType) throws IOException
     {
         HttpURLConnection connection = openManagementConection("/rest/exchange/test/" + exchangeName, "PUT");

Modified: qpid/trunk/qpid/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/systest/management/jmx/BrokerManagementTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/systest/management/jmx/BrokerManagementTest.java?rev=1363298&r1=1363297&r2=1363298&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/systest/management/jmx/BrokerManagementTest.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/systest/management/jmx/BrokerManagementTest.java Thu Jul 19 11:23:49 2012
@@ -24,9 +24,6 @@ import org.apache.qpid.management.common
 import org.apache.qpid.test.utils.JMXTestUtils;
 import org.apache.qpid.test.utils.QpidBrokerTestCase;
 
-import javax.management.MBeanException;
-import javax.management.ObjectName;
-
 /**
  * Tests the JMX API for the Managed Broker.
  *
@@ -115,11 +112,10 @@ public class BrokerManagementTest extend
             _managedBroker.unregisterExchange(defaultExchangeName);
             fail("Exception not thrown");
         }
-        catch (MBeanException mbe)
+        catch (UnsupportedOperationException e)
         {
             // PASS
-            assertEquals("Error in unregistering exchange " + defaultExchangeName, mbe.getMessage());
-            assertTrue(mbe.getCause().getMessage().contains("Cannot unregister the default exchange"));
+            assertEquals("'<<default>>' is a reserved exchange and can't be deleted", e.getMessage());
         }
         final ManagedExchange defaultExchange = _jmxUtils.getManagedExchange(defaultExchangeName);
         assertNotNull("Exchange should exist", defaultExchange);

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeRegistry.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeRegistry.java?rev=1363298&r1=1363297&r2=1363298&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeRegistry.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeRegistry.java Thu Jul 19 11:23:49 2012
@@ -225,4 +225,21 @@ public class DefaultExchangeRegistry imp
         }
     }
 
+    public boolean isReservedExchangeName(String name)
+    {
+        if (name == null || "".equals(name) || ExchangeDefaults.DEFAULT_EXCHANGE_NAME.asString().equals(name)
+                || name.startsWith("amq.") || name.startsWith("qpid."))
+        {
+            return true;
+        }
+        Collection<ExchangeType<? extends Exchange>> registeredTypes = _host.getExchangeFactory().getRegisteredTypes();
+        for (ExchangeType<? extends Exchange> type : registeredTypes)
+        {
+            if (type.getDefaultExchangeName().toString().equals(name))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
 }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeRegistry.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeRegistry.java?rev=1363298&r1=1363297&r2=1363298&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeRegistry.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeRegistry.java Thu Jul 19 11:23:49 2012
@@ -62,6 +62,13 @@ public interface ExchangeRegistry
 
     void addRegistryChangeListener(RegistryChangeListener listener);
 
+    /**
+     * Validates the name of user custom exchange.
+     * <p>
+     * Return true if the exchange name is reserved and false otherwise.
+     */
+    boolean isReservedExchangeName(String name);
+
     interface RegistryChangeListener
     {
         void exchangeRegistered(Exchange exchange);

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/VirtualHost.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/VirtualHost.java?rev=1363298&r1=1363297&r2=1363298&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/VirtualHost.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/VirtualHost.java Thu Jul 19 11:23:49 2012
@@ -131,8 +131,6 @@ public interface VirtualHost extends Con
                       boolean exclusive, LifetimePolicy lifetime, long ttl, Map<String, Object> attributes)
                     throws AccessControlException, IllegalArgumentException;
 
-    void deleteQueue(Queue queue) throws AccessControlException, IllegalStateException;
-
     Collection<String> getExchangeTypes();
 
     public static interface Transaction

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BindingAdapter.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BindingAdapter.java?rev=1363298&r1=1363297&r2=1363298&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BindingAdapter.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BindingAdapter.java Thu Jul 19 11:23:49 2012
@@ -31,6 +31,7 @@ import org.apache.qpid.AMQSecurityExcept
 import org.apache.qpid.server.model.Binding;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.Exchange;
+import org.apache.qpid.server.model.IllegalStateTransitionException;
 import org.apache.qpid.server.model.LifetimePolicy;
 import org.apache.qpid.server.model.Queue;
 import org.apache.qpid.server.model.State;
@@ -216,4 +217,16 @@ final class BindingAdapter extends Abstr
     {
         return Binding.AVAILABLE_ATTRIBUTES;
     }
+
+    @Override
+    public State setDesiredState(State currentState, State desiredState) throws IllegalStateTransitionException,
+            AccessControlException
+    {
+        if (desiredState == State.DELETED)
+        {
+            delete();
+            return State.DELETED;
+        }
+        return super.setDesiredState(currentState, desiredState);
+    }
 }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/ExchangeAdapter.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/ExchangeAdapter.java?rev=1363298&r1=1363297&r2=1363298&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/ExchangeAdapter.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/ExchangeAdapter.java Thu Jul 19 11:23:49 2012
@@ -30,9 +30,13 @@ import java.util.Map;
 import org.apache.qpid.AMQException;
 import org.apache.qpid.AMQInternalException;
 import org.apache.qpid.AMQSecurityException;
+import org.apache.qpid.protocol.AMQConstant;
 import org.apache.qpid.server.binding.Binding;
+import org.apache.qpid.server.exchange.ExchangeRegistry;
+import org.apache.qpid.server.exchange.ExchangeType;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.Exchange;
+import org.apache.qpid.server.model.IllegalStateTransitionException;
 import org.apache.qpid.server.model.LifetimePolicy;
 import org.apache.qpid.server.model.Publisher;
 import org.apache.qpid.server.model.Queue;
@@ -50,7 +54,6 @@ final class ExchangeAdapter extends Abst
     private VirtualHostAdapter _vhost;
     private final ExchangeStatistics _statistics;
 
-
     public ExchangeAdapter(final VirtualHostAdapter virtualHostAdapter,
                            final org.apache.qpid.server.exchange.Exchange exchange)
     {
@@ -164,7 +167,21 @@ final class ExchangeAdapter extends Abst
     {
         try
         {
-            _vhost.getVirtualHost().getExchangeRegistry().unregisterExchange(getName(), false);
+            ExchangeRegistry exchangeRegistry = _vhost.getVirtualHost().getExchangeRegistry();
+            if (exchangeRegistry.isReservedExchangeName(getName()))
+            {
+                throw new UnsupportedOperationException("'" + getName() + "' is a reserved exchange and can't be deleted");
+            }
+
+            if(_exchange.hasReferrers())
+            {
+                throw new AMQException( AMQConstant.NOT_ALLOWED, "Exchange in use as an alternate exchange", null);
+            }
+
+            synchronized(exchangeRegistry)
+            {
+                exchangeRegistry.unregisterExchange(getName(), false);
+            }
         }
         catch(AMQException e)
         {
@@ -364,6 +381,18 @@ final class ExchangeAdapter extends Abst
         return AVAILABLE_ATTRIBUTES;
     }
 
+    @Override
+    public State setDesiredState(State currentState, State desiredState) throws IllegalStateTransitionException,
+            AccessControlException
+    {
+        if (desiredState == State.DELETED)
+        {
+            delete();
+            return State.DELETED;
+        }
+        return super.setDesiredState(currentState, desiredState);
+    }
+
     private class ExchangeStatistics implements Statistics
     {
 

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/QueueAdapter.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/QueueAdapter.java?rev=1363298&r1=1363297&r2=1363298&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/QueueAdapter.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/QueueAdapter.java Thu Jul 19 11:23:49 2012
@@ -27,6 +27,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
+
 import org.apache.qpid.AMQException;
 import org.apache.qpid.AMQStoreException;
 import org.apache.qpid.server.binding.Binding;
@@ -34,6 +35,7 @@ import org.apache.qpid.server.model.Conf
 import org.apache.qpid.server.model.ConfiguredObjectFinder;
 import org.apache.qpid.server.model.Consumer;
 import org.apache.qpid.server.model.Exchange;
+import org.apache.qpid.server.model.IllegalStateTransitionException;
 import org.apache.qpid.server.model.LifetimePolicy;
 import org.apache.qpid.server.model.Queue;
 import org.apache.qpid.server.model.QueueNotificationListener;
@@ -130,11 +132,14 @@ final class QueueAdapter extends Abstrac
     {
         try
         {
-            _queue.delete();
-            if (_queue.isDurable())
+            QueueRegistry queueRegistry = _queue.getVirtualHost().getQueueRegistry();
+            synchronized(queueRegistry)
             {
-
-                _queue.getVirtualHost().getMessageStore().removeQueue(_queue);
+                _queue.delete();
+                if (_queue.isDurable())
+                {
+                    _queue.getVirtualHost().getMessageStore().removeQueue(_queue);
+                }
             }
         }
         catch(AMQException e)
@@ -705,4 +710,17 @@ final class QueueAdapter extends Abstrac
             listener.notifyClients(notification, this, notificationMsg);
         }
     }
+
+    @Override
+    public State setDesiredState(State currentState, State desiredState) throws IllegalStateTransitionException,
+            AccessControlException
+    {
+        if (desiredState == State.DELETED)
+        {
+            delete();
+            return State.DELETED;
+        }
+        return super.setDesiredState(currentState, desiredState);
+    }
+
 }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java?rev=1363298&r1=1363297&r2=1363298&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java Thu Jul 19 11:23:49 2012
@@ -228,18 +228,29 @@ final class VirtualHostAdapter extends A
 
         try
         {
-            org.apache.qpid.server.exchange.Exchange exchange =
-                    _virtualHost.getExchangeFactory().createExchange(name, type, durable,
-                                                                     lifetime == LifetimePolicy.AUTO_DELETE);
-            _virtualHost.getExchangeRegistry().registerExchange(exchange);
-            if(durable)
+            ExchangeRegistry exchangeRegistry = _virtualHost.getExchangeRegistry();
+            if (exchangeRegistry.isReservedExchangeName(name))
             {
-                _virtualHost.getMessageStore().createExchange(exchange);
+                throw new UnsupportedOperationException("'" + name + "' is a reserved exchange name");
             }
-
-            synchronized (_exchangeAdapters)
+            synchronized(exchangeRegistry)
             {
-                return _exchangeAdapters.get(exchange);
+                org.apache.qpid.server.exchange.Exchange exchange = exchangeRegistry.getExchange(name);
+                if (exchange != null)
+                {
+                    throw new IllegalArgumentException("Exchange with name '" + name + "' already exists");
+                }
+                exchange = _virtualHost.getExchangeFactory().createExchange(name, type, durable,
+                                                                     lifetime == LifetimePolicy.AUTO_DELETE);
+                _virtualHost.getExchangeRegistry().registerExchange(exchange);
+                if(durable)
+                {
+                    _virtualHost.getMessageStore().createExchange(exchange);
+                }
+                synchronized (_exchangeAdapters)
+                {
+                    return _exchangeAdapters.get(exchange);
+                }
             }
         }
         catch(AMQException e)
@@ -326,23 +337,27 @@ final class VirtualHostAdapter extends A
         }
         try
         {
-            if(_virtualHost.getQueueRegistry().getQueue(name)!=null)
+            QueueRegistry queueRegistry = _virtualHost.getQueueRegistry();
+            synchronized (queueRegistry)
             {
-                throw new IllegalArgumentException("Queue with name "+name+" already exists");
-            }
-            AMQQueue queue =
-                    AMQQueueFactory.createAMQQueueImpl(UUIDGenerator.generateQueueUUID(name, _virtualHost.getName()), name,
-                                                       durable, owner, lifetime == LifetimePolicy.AUTO_DELETE,
-                                                       exclusive, _virtualHost, attributes);
-            _virtualHost.getBindingFactory().addBinding(name, queue, _virtualHost.getExchangeRegistry().getDefaultExchange(), null);
+                if(_virtualHost.getQueueRegistry().getQueue(name)!=null)
+                {
+                    throw new IllegalArgumentException("Queue with name "+name+" already exists");
+                }
+                AMQQueue queue =
+                        AMQQueueFactory.createAMQQueueImpl(UUIDGenerator.generateQueueUUID(name, _virtualHost.getName()), name,
+                                                           durable, owner, lifetime == LifetimePolicy.AUTO_DELETE,
+                                                           exclusive, _virtualHost, attributes);
+                _virtualHost.getBindingFactory().addBinding(name, queue, _virtualHost.getExchangeRegistry().getDefaultExchange(), null);
 
-            if(durable)
-            {
-                _virtualHost.getMessageStore().createQueue(queue, FieldTable.convertToFieldTable(attributes));
-            }
-            synchronized (_queueAdapters)
-            {
-                return _queueAdapters.get(queue);
+                if(durable)
+                {
+                    _virtualHost.getMessageStore().createQueue(queue, FieldTable.convertToFieldTable(attributes));
+                }
+                synchronized (_queueAdapters)
+                {
+                    return _queueAdapters.get(queue);
+                }
             }
 
         }
@@ -569,13 +584,6 @@ final class VirtualHostAdapter extends A
         }
     }
 
-    public void deleteQueue(Queue queue)
-        throws AccessControlException, IllegalStateException
-    {
-        // TODO
-        throw new UnsupportedOperationException("Not Yet Implemented");
-    }
-
     public Collection<String> getExchangeTypes()
     {
         Collection<ExchangeType<? extends org.apache.qpid.server.exchange.Exchange>> types =
@@ -880,4 +888,5 @@ final class VirtualHostAdapter extends A
             }
         }
     }
+
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org