You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by or...@apache.org on 2015/03/13 10:21:17 UTC

svn commit: r1666380 - in /qpid/trunk/qpid/java: broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ broker-plugins/management-http/src/main/java/resources/js/qpid/management/ broker-plugins/management-ht...

Author: orudyy
Date: Fri Mar 13 09:21:16 2015
New Revision: 1666380

URL: http://svn.apache.org/r1666380
Log:
QPID-6438: [Java Broker] Extend REST interfaces to result in errors when object already exist on create and when object does not exist on update

Modified:
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAccessControlProvider.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAuthenticationProvider.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addBinding.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/js/qpid/management/addGroupProvider.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addPort.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addQueue.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addStore.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addVirtualHostNodeAndVirtualHost.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/editBroker.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editQueue.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHost.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHostNode.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/group/addGroupMember.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/GroupManagingGroupProvider.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/preferencesprovider/PreferencesProviderForm.js
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/RestTestHelper.java
    qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/GroupRestTest.java
    qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/UserRestTest.java
    qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostNodeRestTest.java
    qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.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/RestServlet.java?rev=1666380&r1=1666379&r2=1666380&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java Fri Mar 13 09:21:16 2015
@@ -412,15 +412,16 @@ public class RestServlet extends Abstrac
 
     private void performCreateOrUpdate(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
     {
-        boolean createOrUpdate = "PUT".equalsIgnoreCase(request.getMethod());
-
         response.setContentType("application/json");
 
         List<String> names = new ArrayList<String>();
         String[] pathInfoElements = getPathInfoElements(request);
+
+        boolean parentRequest = false;
         if (pathInfoElements != null)
         {
-            if (pathInfoElements.length != _hierarchy.length)
+            parentRequest = _hierarchy.length > 0 && pathInfoElements.length == _hierarchy.length - 1;
+            if (pathInfoElements.length != _hierarchy.length && !parentRequest)
             {
                 throw new IllegalArgumentException("Path to object to create must be fully specified. "
                                                    + "Found "
@@ -432,6 +433,10 @@ public class RestServlet extends Abstrac
             }
             names.addAll(Arrays.asList(pathInfoElements));
         }
+        else
+        {
+            parentRequest = _hierarchy.length == 1;
+        }
 
         Map<String, Object> providedObject;
 
@@ -469,16 +474,9 @@ public class RestServlet extends Abstrac
         {
             if (_hierarchy.length == 0)
             {
-                if (!createOrUpdate)
-                {
-                    sendErrorResponse(request, response,
-                            "Only object creation is allowed with POST requests. Use PUT method to update broker attributes");
-                    return;
-                }
-
                 try
                 {
-                    doUpdate(getBroker(), providedObject);
+                    getBroker().setAttributes(providedObject);
                     response.setStatus(HttpServletResponse.SC_OK);
                 }
                 catch (RuntimeException e)
@@ -487,19 +485,22 @@ public class RestServlet extends Abstrac
                 }
                 return;
             }
-            else
+            else if (!parentRequest)
             {
                 throw new ServletException("Cannot identify request target object");
             }
         }
 
-        providedObject.put("name", names.get(names.size() - 1));
+        if (!parentRequest)
+        {
+            providedObject.put("name", names.get(names.size() - 1));
+        }
 
         @SuppressWarnings("unchecked")
         Collection<ConfiguredObject>[] objects = new Collection[_hierarchy.length];
         if (_hierarchy.length == 1)
         {
-            createOrUpdate(providedObject, _hierarchy[0], getBroker(), null, request, response, createOrUpdate);
+            createOrUpdate(providedObject, _hierarchy[0], getBroker(), null, request, response, parentRequest);
         }
         else
         {
@@ -562,30 +563,38 @@ public class RestServlet extends Abstrac
             ConfiguredObject theParent = parents.remove(0);
             ConfiguredObject[] otherParents = parents.toArray(new ConfiguredObject[parents.size()]);
 
-            createOrUpdate(providedObject, objClass, theParent, otherParents, request, response, createOrUpdate);
+            createOrUpdate(providedObject, objClass, theParent, otherParents, request, response, parentRequest);
         }
     }
 
     private void createOrUpdate(Map<String, Object> providedObject, Class<? extends ConfiguredObject> objClass,
             ConfiguredObject theParent, ConfiguredObject[] otherParents, HttpServletRequest request,
-            HttpServletResponse response, boolean createOrUpdate) throws IOException
+            HttpServletResponse response, boolean parentRequest) throws IOException
     {
         try
         {
             Collection<? extends ConfiguredObject> existingChildren = theParent.getChildren(objClass);
 
-            if (createOrUpdate)
+            if (!parentRequest)
             {
                 for (ConfiguredObject obj : existingChildren)
                 {
                     if ((providedObject.containsKey("id") && String.valueOf(providedObject.get("id")).equals(obj.getId().toString()))
                             || (obj.getName().equals(providedObject.get("name")) && equalParents(obj, otherParents, objClass)))
                     {
-                        doUpdate(obj, providedObject);
+                        obj.setAttributes(providedObject);
                         response.setStatus(HttpServletResponse.SC_OK);
                         return;
                     }
                 }
+
+                if ("POST".equalsIgnoreCase(request.getMethod()))
+                {
+                    sendErrorResponse(request, response, HttpServletResponse.SC_NOT_FOUND, "Object with "
+                            +  (providedObject.containsKey("id") ? " id '" + providedObject.get("id") : " name '" + providedObject.get("name"))
+                            + "' does not exist!" );
+                    return;
+                }
             }
 
             theParent.createChild(objClass, providedObject, otherParents);
@@ -597,11 +606,6 @@ public class RestServlet extends Abstrac
         }
     }
 
-    private void doUpdate(ConfiguredObject obj, Map<String, Object> providedObject)
-    {
-        obj.setAttributes(providedObject);
-    }
-
     private boolean equalParents(ConfiguredObject obj, ConfiguredObject[] otherParents, Class<? extends ConfiguredObject> objClass)
     {
         if(otherParents == null || otherParents.length == 0)
@@ -644,6 +648,7 @@ public class RestServlet extends Abstrac
         }
         else
         {
+            int responseCode = HttpServletResponse.SC_CONFLICT;
             String message = e.getMessage();
             if (e instanceof IllegalConfigurationException || e instanceof IllegalArgumentException)
             {
@@ -661,14 +666,15 @@ public class RestServlet extends Abstrac
                 LOGGER.warn("Unexpected exception processing request ", e);
             }
 
-            sendErrorResponse(request, response, message);
+
+            sendErrorResponse(request, response, responseCode, message);
 
         }
     }
 
-    private void sendErrorResponse(HttpServletRequest request, HttpServletResponse response, String message) throws IOException
+    private void sendErrorResponse(HttpServletRequest request, HttpServletResponse response, int responseCode, String message) throws IOException
     {
-        response.setStatus(HttpServletResponse.SC_CONFLICT);
+        response.setStatus(responseCode);
 
         response.setContentType("application/json");
         response.setCharacterEncoding("UTF-8");

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAccessControlProvider.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAccessControlProvider.js?rev=1666380&r1=1666379&r2=1666380&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAccessControlProvider.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAccessControlProvider.js Fri Mar 13 09:21:16 2015
@@ -100,10 +100,8 @@ define(["dojo/_base/lang",
                 if (this.accessControlProviderForm.validate())
                 {
                     var accessControlProviderData = util.getFormWidgetValues(this.accessControlProviderForm, this.initialData);
-                    var encodedAccessControlProviderName = encodeURIComponent(this.accessControlProviderName.value);
                     var that = this;
-                    util.post("api/latest/accesscontrolprovider/" + encodedAccessControlProviderName,
-                              accessControlProviderData, function(x){that.dialog.hide();});
+                    util.post("api/latest/accesscontrolprovider", accessControlProviderData, function(x){that.dialog.hide();});
                 }
                 else
                 {

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAuthenticationProvider.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAuthenticationProvider.js?rev=1666380&r1=1666379&r2=1666380&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAuthenticationProvider.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAuthenticationProvider.js Fri Mar 13 09:21:16 2015
@@ -150,15 +150,17 @@ define(["dojo/_base/xhr",
             {
                 if(this.authenticationProviderForm.validate() && this.preferencesProviderForm.validate())
                 {
-                    var success = false,failureReason=null;
-
                     var authenticationProviderData = util.getFormWidgetValues(this.authenticationProviderForm, this.initialData);
 
-                    var encodedAuthenticationProviderName = encodeURIComponent(this.authenticationProviderName.value);
                     var that = this;
-
-                    var methodName = this.initialData ? "put" : "post";
-                    util[methodName]("api/latest/authenticationprovider/" + encodedAuthenticationProviderName, authenticationProviderData,
+                    var encodedAuthenticationProviderName = encodeURIComponent(this.authenticationProviderName.value);
+                    var url = "api/latest/authenticationprovider";
+                    if (this.initialData && this.initialData.id)
+                    {
+                        // update request
+                        url += "/" + encodedAuthenticationProviderName;
+                    }
+                    util.post(url, authenticationProviderData,
                      function(x){
                         var preferencesProviderResult = that.preferencesProviderForm.submit(encodedAuthenticationProviderName);
                         if (preferencesProviderResult.success == true)

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addBinding.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addBinding.js?rev=1666380&r1=1666379&r2=1666380&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addBinding.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addBinding.js Fri Mar 13 09:21:16 2015
@@ -311,8 +311,7 @@ define(["dojo/_base/connect",
                                     var url = "api/latest/binding/"+encodeURIComponent(addBinding.vhostnode)
                                             + "/"+encodeURIComponent(addBinding.vhost)
                                             + "/"+encodeURIComponent(newBinding.exchange)
-                                            + "/"+encodeURIComponent(newBinding.queue)
-                                            + "/"+encodeURIComponent(newBinding.name);
+                                            + "/"+encodeURIComponent(newBinding.queue);
                                     util.post(url, newBinding, function(x){registry.byId("addBinding").hide();});
                                     return false;
                                 }else{

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=1666380&r1=1666379&r2=1666380&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 Fri Mar 13 09:21:16 2015
@@ -111,8 +111,7 @@ define(["dojo/_base/xhr",
                                     var newExchange = convertToExchange(theForm.getValues());
                                     var that = this;
                                     util.post("api/latest/exchange/" + encodeURIComponent(addExchange.vhostnode)
-                                            + "/" + encodeURIComponent(addExchange.vhost)
-                                            + "/" + encodeURIComponent(newExchange.name),
+                                            + "/" + encodeURIComponent(addExchange.vhost),
                                             newExchange, function(x){ registry.byId("addExchange").hide(); });
                                     return false;
 

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js?rev=1666380&r1=1666379&r2=1666380&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js Fri Mar 13 09:21:16 2015
@@ -120,13 +120,17 @@ define([
             {
                 if (this.groupProviderForm.validate())
                 {
-                    var success = false,failureReason=null;
-
                     var groupProviderData = util.getFormWidgetValues(this.groupProviderForm, this.initialData);
-                    var encodedName = encodeURIComponent(this.groupProviderName.value);
+
                     var that = this;
-                    var method = this.initialData ? "put" : "post";
-                    util[method]("api/latest/groupprovider/" + encodedName, groupProviderData, function(x){that.dialog.hide();});
+                    var url = "api/latest/groupprovider";
+                    if (this.initialData)
+                    {
+                        // update request
+                        url += "/" +  encodeURIComponent(this.groupProviderName.value)
+                    }
+
+                    util.post( url,groupProviderData, function(x){that.dialog.hide();});
                 }
                 else
                 {

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addPort.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addPort.js?rev=1666380&r1=1666379&r2=1666380&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addPort.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addPort.js Fri Mar 13 09:21:16 2015
@@ -267,8 +267,13 @@ define(["dojo/_base/xhr",
                 alert("A trust store must be selected when requesting client certificates.");
                 return false;
               }
-              var method = registry.byId("formAddPort.name").get("disabled") ? "put" : "post";
-              util[method]("api/latest/port/" + encodeURIComponent(newPort.name), newPort, function(x){registry.byId("addPort").hide()});
+              var url = "api/latest/port";
+              if (registry.byId("formAddPort.name").get("disabled"))
+              {
+                // update request
+                url += "/" + encodeURIComponent(newPort.name);
+              }
+              util.post(url, newPort, function(x){registry.byId("addPort").hide()});
               return false;
             } else
             {

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addQueue.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addQueue.js?rev=1666380&r1=1666379&r2=1666380&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addQueue.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addQueue.js Fri Mar 13 09:21:16 2015
@@ -150,7 +150,7 @@ define(["dojo/_base/xhr",
 
                                     var newQueue = convertToQueue(theForm.getValues());
                                     util.post("api/latest/queue/" + encodeURIComponent(addQueue.vhostnode)
-                                            + "/"+encodeURIComponent(addQueue.vhost) + "/" + encodeURIComponent(newQueue.name),
+                                            + "/"+encodeURIComponent(addQueue.vhost),
                                             newQueue, function(x){registry.byId("addQueue").hide();});
                                     return false;
 

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addStore.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addStore.js?rev=1666380&r1=1666379&r2=1666380&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addStore.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addStore.js Fri Mar 13 09:21:16 2015
@@ -129,11 +129,15 @@ define(["dojo/_base/lang",
                     var success = false,failureReason=null;
 
                     var storeData = util.getFormWidgetValues(this.storeForm, this.initialData);
-                    var encodedStoreName = encodeURIComponent(this.storeName.value);
-                    var encodedCategory = encodeURIComponent(this.category.toLowerCase());
                     var that = this;
-                    var method = this.effectiveData ? "put" : "post";
-                    util[method]("api/latest/" + encodedCategory + "/" + encodedStoreName, storeData, function(x){that.dialog.hide();});
+                    var url = "api/latest/" + encodeURIComponent(this.category.toLowerCase());
+
+                    if (this.effectiveData)
+                    {
+                        // update request
+                        url += "/" + encodeURIComponent(this.storeName.value);
+                    }
+                    util.post(url, storeData, function(x){that.dialog.hide();});
                 }
                 else
                 {

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addVirtualHostNodeAndVirtualHost.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addVirtualHostNodeAndVirtualHost.js?rev=1666380&r1=1666379&r2=1666380&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addVirtualHostNodeAndVirtualHost.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addVirtualHostNodeAndVirtualHost.js Fri Mar 13 09:21:16 2015
@@ -340,8 +340,7 @@ define([
         }
 
         var that = this;
-        var encodedVirtualHostNodeName = encodeURIComponent(virtualHostNodeData.name);
-        util.post("api/latest/virtualhostnode/" + encodedVirtualHostNodeName, virtualHostNodeData, function(x){that.dialog.hide();});
+        util.post("api/latest/virtualhostnode", virtualHostNodeData, function(x){that.dialog.hide();});
       },
       _getValues: function (form)
       {

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=1666380&r1=1666379&r2=1666380&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 Fri Mar 13 09:21:16 2015
@@ -200,8 +200,7 @@ define(["dojo/_base/xhr",
                                     var newUser = convertToUser(theForm.getValues());
 
 
-                                    var url = "api/latest/user/"+encodeURIComponent(addUser.authProvider) +
-                                        "/"+encodeURIComponent(newUser.name);
+                                    var url = "api/latest/user/"+encodeURIComponent(addUser.authProvider);
                                     util.post(url, newUser, function(x){registry.byId("addUser").hide();});
                                     return false;
 
@@ -248,7 +247,7 @@ define(["dojo/_base/xhr",
                             var url = "api/latest/user/"+encodeURIComponent(setPassword.authProvider) +
                                 "/"+encodeURIComponent(newUser.name);
 
-                            util.put(url, newUser, function(x){registry.byId("setPassword").hide();});
+                            util.post(url, newUser, function(x){registry.byId("setPassword").hide();});
                             return false;
 
 

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editBroker.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editBroker.js?rev=1666380&r1=1666379&r2=1666380&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editBroker.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editBroker.js Fri Mar 13 09:21:16 2015
@@ -128,25 +128,8 @@ define(["dojo/_base/xhr",
                 data["context"] = context;
               }
 
-              var success = false,failureReason=null;
-              xhr.put({
-                  url: this.query,
-                  sync: true,
-                  handleAs: "json",
-                  headers: { "Content-Type": "application/json"},
-                  putData: json.stringify(data),
-                  load: function(x) {success = true; },
-                  error: function(error) {success = false; failureReason = error;}
-              });
-
-              if(success === true)
-              {
-                  this.dialog.hide();
-              }
-              else
-              {
-                  util.xhrErrorHandler(failureReason);
-              }
+              var that = this;
+              util.post(this.query, data, function(x){that.dialog.hide()})
           }
           else
           {

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editQueue.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editQueue.js?rev=1666380&r1=1666379&r2=1666380&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editQueue.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editQueue.js Fri Mar 13 09:21:16 2015
@@ -163,25 +163,8 @@ define(["dojo/_base/xhr",
               {
                 data["context"] = context;
               }
-              var success = false,failureReason=null;
-              xhr.put({
-                  url: this.query,
-                  sync: true,
-                  handleAs: "json",
-                  headers: { "Content-Type": "application/json"},
-                  putData: json.stringify(data),
-                  load: function(x) {success = true; },
-                  error: function(error) {success = false; failureReason = error;}
-              });
-
-              if(success === true)
-              {
-                  this.dialog.hide();
-              }
-              else
-              {
-                  util.xhrErrorHandler(failureReason);
-              }
+              var that = this;
+              util.post(this.query, data, function(x){that.dialog.hide()});
           }
           else
           {

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHost.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHost.js?rev=1666380&r1=1666379&r2=1666380&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHost.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHost.js Fri Mar 13 09:21:16 2015
@@ -128,25 +128,8 @@ define(["dojo/_base/xhr",
               {
                 data["context"] = context;
               }
-              var success = false,failureReason=null;
-              xhr.put({
-                  url: this.query,
-                  sync: true,
-                  handleAs: "json",
-                  headers: { "Content-Type": "application/json"},
-                  putData: json.stringify(data),
-                  load: function(x) {success = true; },
-                  error: function(error) {success = false; failureReason = error;}
-              });
-
-              if(success === true)
-              {
-                  this.dialog.hide();
-              }
-              else
-              {
-                  util.xhrErrorHandler(failureReason);
-              }
+              var that=this;
+              util.post(this.query, data, function(x){ that.dialog.hide();} );
           }
           else
           {

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHostNode.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHostNode.js?rev=1666380&r1=1666379&r2=1666380&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHostNode.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/editVirtualHostNode.js Fri Mar 13 09:21:16 2015
@@ -120,25 +120,8 @@ define(["dojo/_base/xhr",
               {
                 data["context"] = context;
               }
-              var success = false,failureReason=null;
-              xhr.put({
-                  url: this.query,
-                  sync: true,
-                  handleAs: "json",
-                  headers: { "Content-Type": "application/json"},
-                  putData: json.stringify(data),
-                  load: function(x) {success = true; },
-                  error: function(error) {success = false; failureReason = error;}
-              });
-
-              if(success === true)
-              {
-                  this.dialog.hide();
-              }
-              else
-              {
-                  util.xhrErrorHandler(failureReason);
-              }
+              var that = this;
+              util.post(this.query, data, function(x){ that.dialog.hide();} );
           }
           else
           {

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/group/addGroupMember.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/group/addGroupMember.js?rev=1666380&r1=1666379&r2=1666380&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/group/addGroupMember.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/group/addGroupMember.js Fri Mar 13 09:21:16 2015
@@ -73,8 +73,7 @@ define(["dojo/_base/xhr",
                                     var that = this;
 
                                     var url = "api/latest/groupmember/"+encodeURIComponent(addGroupMember.groupProvider) +
-                                              "/" + encodeURIComponent(addGroupMember.group) +
-                                              "/" + encodeURIComponent(newGroupMember.name);
+                                              "/" + encodeURIComponent(addGroupMember.group);
                                     util.post(url, newGroupMember, function(x){registry.byId("addGroupMember").hide();});
                                     return false;
 

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/GroupManagingGroupProvider.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/GroupManagingGroupProvider.js?rev=1666380&r1=1666379&r2=1666380&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/GroupManagingGroupProvider.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/GroupManagingGroupProvider.js Fri Mar 13 09:21:16 2015
@@ -173,10 +173,7 @@ define(["dojo/_base/xhr",
 
                                     var newGroup = convertToGroup(theForm.getValues());
 
-
-                                    var url = "api/latest/group/"+encodeURIComponent(addGroup.groupProvider) +
-                                        "/"+encodeURIComponent(newGroup.name);
-
+                                    var url = "api/latest/group/"+encodeURIComponent(addGroup.groupProvider);
                                     util.post(url, newGroup, function(x){registry.byId("addGroup").hide();});
                                     return false;
 

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/preferencesprovider/PreferencesProviderForm.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/preferencesprovider/PreferencesProviderForm.js?rev=1666380&r1=1666379&r2=1666380&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/preferencesprovider/PreferencesProviderForm.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/preferencesprovider/PreferencesProviderForm.js Fri Mar 13 09:21:16 2015
@@ -87,26 +87,13 @@ function (util, metadata, xhr, declare,
         {
             var preferencesProviderData = util.getFormWidgetValues(this.preferencesProviderForm, this.data)
             var encodedPreferencesProviderName = encodeURIComponent(this.preferencesProviderNameWidget.get("value"));
-            var url = "api/latest/preferencesprovider/" + encodedAuthenticationProviderName + "/" + encodedPreferencesProviderName;
+            var url = "api/latest/preferencesprovider/" + encodedAuthenticationProviderName;
             if (this.data)
             {
-                var success = false;
-                            var failureReason = null;
-                            xhr.put({
-                                url: url,
-                                sync: true,
-                                handleAs: "json",
-                                headers: { "Content-Type": "application/json"},
-                                putData: json.stringify(preferencesProviderData),
-                                load: function (x) { success = true; },
-                                error: function (error) { success = false; failureReason = error; }
-                            });
-                return { success: success, failureReason: failureReason };
-            }
-            else
-            {
-                return util.post(url, preferencesProviderData);
+                // update request
+                url += "/" + encodedPreferencesProviderName;
             }
+            return util.post(url, preferencesProviderData);
         }
         return { success: true, failureReason: null };
     },

Modified: qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/RestTestHelper.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/RestTestHelper.java?rev=1666380&r1=1666379&r2=1666380&view=diff
==============================================================================
--- qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/RestTestHelper.java (original)
+++ qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/RestTestHelper.java Fri Mar 13 09:21:16 2015
@@ -307,7 +307,7 @@ public class RestTestHelper
     {
         HttpURLConnection connection = openManagementConnection(
                 "groupmember/" + encodeAsUTF(groupProviderName) + "/"+ encodeAsUTF(groupName) + "/" +  encodeAsUTF(memberName),
-                "POST");
+                "PUT");
 
         Map<String, Object> groupMemberData = new HashMap<String, Object>();
         // TODO add type
@@ -360,7 +360,7 @@ public class RestTestHelper
     {
         HttpURLConnection connection = openManagementConnection(
                 "group/" + encodeAsUTF(groupProviderName) + "/"+ encodeAsUTF(groupName),
-                "POST");
+                "PUT");
 
         Map<String, Object> groupData = new HashMap<String, Object>();
         writeJsonRequest(connection, groupData);

Modified: qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/GroupRestTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/GroupRestTest.java?rev=1666380&r1=1666379&r2=1666380&view=diff
==============================================================================
--- qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/GroupRestTest.java (original)
+++ qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/GroupRestTest.java Fri Mar 13 09:21:16 2015
@@ -74,7 +74,7 @@ public class GroupRestTest extends QpidR
         assertEquals(EXISTING_MEMBER, (String)member1.get(GroupMember.NAME));
     }
 
-    public void testCreateNewMemberByPut() throws Exception
+    public void testCreateNewMemberByPutUsingMemberURI() throws Exception
     {
         Map<String, Object> group = getRestTestHelper().getJsonAsSingletonList("group/" + FILE_GROUP_MANAGER + "/myGroup");
         getRestTestHelper().assertNumberOfGroupMembers(group, 1);
@@ -86,19 +86,36 @@ public class GroupRestTest extends QpidR
         assertEquals("Unexpected group name", NEW_MEMBER, member.get(GroupMember.NAME));
     }
 
-    public void testCreateNewMemberByPost() throws Exception
+    public void testCreateNewMemberByPostUsingParentURI() throws Exception
     {
         Map<String, Object> group = getRestTestHelper().getJsonAsSingletonList("group/" + FILE_GROUP_MANAGER + "/myGroup");
         getRestTestHelper().assertNumberOfGroupMembers(group, 1);
 
-        String url = "groupmember/" + FILE_GROUP_MANAGER + "/"+ GROUP_NAME + "/" +  NEW_MEMBER;
-        getRestTestHelper().submitRequest(url, "POST", Collections.<String, Object>emptyMap(), HttpServletResponse.SC_CREATED);
+        String url = "groupmember/" + FILE_GROUP_MANAGER + "/"+ GROUP_NAME;
+        Map<String, Object> data = Collections.<String, Object>singletonMap("name", NEW_MEMBER);
+        getRestTestHelper().submitRequest(url, "POST", data, HttpServletResponse.SC_CREATED);
 
-        Map<String, Object> member = getRestTestHelper().getJsonAsSingletonList(url);
+        Map<String, Object> member = getRestTestHelper().getJsonAsSingletonList(url + "/" +  NEW_MEMBER);
+        assertEquals("Unexpected group name", NEW_MEMBER, member.get(GroupMember.NAME));
+
+        // verify that second creation request fails
+        getRestTestHelper().submitRequest(url, "POST", data, HttpServletResponse.SC_CONFLICT);
+    }
+
+    public void testCreateNewMemberByPutUsingParentURI() throws Exception
+    {
+        Map<String, Object> group = getRestTestHelper().getJsonAsSingletonList("group/" + FILE_GROUP_MANAGER + "/myGroup");
+        getRestTestHelper().assertNumberOfGroupMembers(group, 1);
+
+        String url = "groupmember/" + FILE_GROUP_MANAGER + "/"+ GROUP_NAME;
+        Map<String, Object> data = Collections.<String, Object>singletonMap("name", NEW_MEMBER);
+        getRestTestHelper().submitRequest(url, "PUT", data, HttpServletResponse.SC_CREATED);
+
+        Map<String, Object> member = getRestTestHelper().getJsonAsSingletonList(url + "/" +  NEW_MEMBER);
         assertEquals("Unexpected group name", NEW_MEMBER, member.get(GroupMember.NAME));
 
-        // verify that second creation request by POST fails
-        getRestTestHelper().submitRequest(url, "POST", Collections.<String, Object>emptyMap(), HttpServletResponse.SC_CONFLICT);
+        // verify that second creation request fails
+        getRestTestHelper().submitRequest(url, "PUT", data, HttpServletResponse.SC_CONFLICT);
     }
 
     public void testRemoveMemberFromGroup() throws Exception

Modified: qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/UserRestTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/UserRestTest.java?rev=1666380&r1=1666379&r2=1666380&view=diff
==============================================================================
--- qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/UserRestTest.java (original)
+++ qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/UserRestTest.java Fri Mar 13 09:21:16 2015
@@ -67,7 +67,7 @@ public class UserRestTest extends QpidRe
         }
     }
 
-    public void testCreateUserByPut() throws Exception
+    public void testCreateUserByPutUsingUserURI() throws Exception
     {
         String userName = getTestName();
         getRestTestHelper().createOrUpdateUser(userName, "newPassword");
@@ -78,17 +78,18 @@ public class UserRestTest extends QpidRe
         assertEquals("Unexpected user name", userName, userDetails.get(User.NAME));
     }
 
-    public void testCreateUserByPost() throws Exception
+    public void testCreateUserByPostUsingParentURI() throws Exception
     {
         String userName = getTestName();
 
         Map<String,Object> userAttributes = new HashMap<>();
         userAttributes.put("password", "newPassword");
+        userAttributes.put("name", userName);
 
-        String url = "user/" + TestBrokerConfiguration.ENTRY_NAME_AUTHENTICATION_PROVIDER + "/" + userName;
+        String url = "user/" + TestBrokerConfiguration.ENTRY_NAME_AUTHENTICATION_PROVIDER;
         getRestTestHelper().submitRequest(url, "POST", userAttributes, HttpServletResponse.SC_CREATED);
 
-        Map<String, Object> userDetails = getRestTestHelper().getJsonAsSingletonList(url);
+        Map<String, Object> userDetails = getRestTestHelper().getJsonAsSingletonList(url+ "/" + userName);
         assertUser(userDetails);
         assertEquals("Unexpected user name", userName, userDetails.get(User.NAME));
 
@@ -96,6 +97,40 @@ public class UserRestTest extends QpidRe
         getRestTestHelper().submitRequest(url, "POST", userAttributes, HttpServletResponse.SC_CONFLICT);
     }
 
+    public void testCreateUserByPutUsingParentURI() throws Exception
+    {
+        String userName = getTestName();
+
+        Map<String,Object> userAttributes = new HashMap<>();
+        userAttributes.put("password", "newPassword");
+        userAttributes.put("name", userName);
+
+        String url = "user/" + TestBrokerConfiguration.ENTRY_NAME_AUTHENTICATION_PROVIDER;
+        getRestTestHelper().submitRequest(url, "PUT", userAttributes, HttpServletResponse.SC_CREATED);
+
+        Map<String, Object> userDetails = getRestTestHelper().getJsonAsSingletonList(url+ "/" + userName);
+        assertUser(userDetails);
+        assertEquals("Unexpected user name", userName, userDetails.get(User.NAME));
+
+        // verify that second create request fails
+        getRestTestHelper().submitRequest(url, "PUT", userAttributes, HttpServletResponse.SC_CONFLICT);
+    }
+
+    public void testSetPasswordForNonExistingUserByPostFails() throws Exception
+    {
+        String userName = getTestName();
+
+        Map<String,Object> userAttributes = new HashMap<>();
+        userAttributes.put("password", "newPassword");
+        userAttributes.put("name", userName);
+
+        String url = "user/" + TestBrokerConfiguration.ENTRY_NAME_AUTHENTICATION_PROVIDER + "/" + userName;
+        getRestTestHelper().submitRequest(url, "POST", userAttributes, HttpServletResponse.SC_NOT_FOUND);
+
+        List<Map<String, Object>> userDetails = getRestTestHelper().getJsonAsList(url);
+        assertTrue("User should not be created", userDetails.isEmpty());
+    }
+
     public void testDelete() throws Exception
     {
         String userName = getTestName();

Modified: qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostNodeRestTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostNodeRestTest.java?rev=1666380&r1=1666379&r2=1666380&view=diff
==============================================================================
--- qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostNodeRestTest.java (original)
+++ qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostNodeRestTest.java Fri Mar 13 09:21:16 2015
@@ -126,23 +126,40 @@ public class VirtualHostNodeRestTest  ex
         assertEquals(newDescription, virtualhostNode.get(VirtualHostNode.DESCRIPTION));
     }
 
-    public void testCreateVirtualHostNodeByPost() throws Exception
+    public void testCreateVirtualHostNodeByPostUsingParentURI() throws Exception
     {
         String nodeName = getTestName();
         Map<String, Object> nodeData = new HashMap<>();
         nodeData.put(VirtualHostNode.NAME, nodeName);
         nodeData.put(VirtualHostNode.TYPE, getTestProfileVirtualHostNodeType());
 
-        String url = "virtualhostnode/" + nodeName;
+        String url = "virtualhostnode";
         getRestTestHelper().submitRequest(url, "POST", nodeData, HttpServletResponse.SC_CREATED);
 
-        Map<String, Object> virtualhostNode = getRestTestHelper().getJsonAsSingletonList(url);
+        Map<String, Object> virtualhostNode = getRestTestHelper().getJsonAsSingletonList(url + "/" + nodeName);
         Asserts.assertVirtualHostNode(nodeName, virtualhostNode);
 
         // verify that second create request fails
         getRestTestHelper().submitRequest(url, "POST", nodeData, HttpServletResponse.SC_CONFLICT);
     }
 
+    public void testCreateVirtualHostNodeByPutUsingParentURI() throws Exception
+    {
+        String nodeName = getTestName();
+        Map<String, Object> nodeData = new HashMap<>();
+        nodeData.put(VirtualHostNode.NAME, nodeName);
+        nodeData.put(VirtualHostNode.TYPE, getTestProfileVirtualHostNodeType());
+
+        String url = "virtualhostnode";
+        getRestTestHelper().submitRequest(url, "PUT", nodeData, HttpServletResponse.SC_CREATED);
+
+        Map<String, Object> virtualhostNode = getRestTestHelper().getJsonAsSingletonList(url + "/" + nodeName);
+        Asserts.assertVirtualHostNode(nodeName, virtualhostNode);
+
+        // verify that second create request fails
+        getRestTestHelper().submitRequest(url, "PUT", nodeData, HttpServletResponse.SC_CONFLICT);
+    }
+
     private void createAndDeleteVirtualHostNode(final String virtualhostNodeType,
                                                 final String nodeName,
                                                 final File storePathAsFile) throws Exception

Modified: qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java?rev=1666380&r1=1666379&r2=1666380&view=diff
==============================================================================
--- qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java (original)
+++ qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java Fri Mar 13 09:21:16 2015
@@ -31,7 +31,6 @@ import javax.jms.Destination;
 import javax.jms.Session;
 import javax.servlet.http.HttpServletResponse;
 
-import org.apache.qpid.server.virtualhost.ProvidedStoreVirtualHostImpl;
 import org.apache.qpid.client.AMQConnection;
 import org.apache.qpid.server.model.Exchange;
 import org.apache.qpid.server.model.Queue;
@@ -118,8 +117,8 @@ public class VirtualHostRestTest extends
 
     public void testCreateProvidedVirtualHost() throws Exception
     {
-        String hostName = getTestName();
-        createVirtualHost(hostName, ProvidedStoreVirtualHostImpl.VIRTUAL_HOST_TYPE, "PUT");
+        Map<String, Object> requestData = submitVirtualHost(true, "PUT", HttpServletResponse.SC_CREATED);
+        String hostName = (String)requestData.get(VirtualHost.NAME);
 
         Map<String, Object> hostDetails = getRestTestHelper().getJsonAsSingletonList("virtualhost/" + EMPTY_VIRTUALHOSTNODE_NAME + "/" + hostName);
         Asserts.assertVirtualHost(hostName, hostDetails);
@@ -127,42 +126,53 @@ public class VirtualHostRestTest extends
         assertNewVirtualHost(hostDetails);
     }
 
-    public void testCreateVirtualHostByPut() throws Exception
+    public void testCreateVirtualHostByPutUsingParentURI() throws Exception
     {
-        String hostName = getTestName();
-        String vhnType = getTestProfileVirtualHostNodeType();
-        if (JsonVirtualHostNodeImpl.VIRTUAL_HOST_NODE_TYPE.equals(vhnType))
-        {
-            vhnType = DerbyVirtualHostImpl.VIRTUAL_HOST_TYPE;
-        }
-        createVirtualHost(hostName, vhnType, "PUT");
-        Map<String, Object> hostDetails = getRestTestHelper().getJsonAsSingletonList("virtualhost/" + EMPTY_VIRTUALHOSTNODE_NAME + "/" + hostName);
-        Asserts.assertVirtualHost(hostName, hostDetails);
+        Map<String, Object> data = submitVirtualHost(true, "PUT", HttpServletResponse.SC_CREATED);
+        String hostName = (String)data.get(VirtualHost.NAME);
 
+        String url = "virtualhost/" + EMPTY_VIRTUALHOSTNODE_NAME + "/" + hostName;
+        Map<String, Object> hostDetails = getRestTestHelper().getJsonAsSingletonList(url);
+        Asserts.assertVirtualHost(hostName, hostDetails);
         assertNewVirtualHost(hostDetails);
+
+        // verify second create request fails
+        submitVirtualHost(true, "PUT", HttpServletResponse.SC_CONFLICT);
     }
 
-    public void testCreateVirtualHostByPost() throws Exception
+    public void testCreateVirtualHostByPostUsingParentURI() throws Exception
     {
-        String hostName = getTestName();
-        String type = getTestProfileVirtualHostNodeType();
-        if (JsonVirtualHostNodeImpl.VIRTUAL_HOST_NODE_TYPE.equals(type))
-        {
-            type = DerbyVirtualHostImpl.VIRTUAL_HOST_TYPE;
-        }
-        Map<String, Object> data = new HashMap<>();
-        data.put(VirtualHost.NAME, hostName);
-        data.put(VirtualHost.TYPE, type);
-
-        String url = "virtualhost/" + EMPTY_VIRTUALHOSTNODE_NAME + "/" + hostName;
-        getRestTestHelper().submitRequest(url, "POST", data, HttpServletResponse.SC_CREATED);
+        Map<String, Object> data = submitVirtualHost(true, "POST", HttpServletResponse.SC_CREATED);
+        String hostName = (String)data.get(VirtualHost.NAME);
 
-        Map<String, Object> hostDetails = getRestTestHelper().getJsonAsSingletonList(url);
+        Map<String, Object> hostDetails = getRestTestHelper().getJsonAsSingletonList("virtualhost/" + EMPTY_VIRTUALHOSTNODE_NAME + "/" + hostName);
         Asserts.assertVirtualHost(hostName, hostDetails);
         assertNewVirtualHost(hostDetails);
 
         // verify second create request fails
-        getRestTestHelper().submitRequest(url, "POST", data, HttpServletResponse.SC_CONFLICT);
+        submitVirtualHost(true, "POST", HttpServletResponse.SC_CONFLICT);
+    }
+
+    public void testCreateVirtualHostByPutUsingVirtualHostURI() throws Exception
+    {
+        Map<String, Object> data = submitVirtualHost(false, "PUT", HttpServletResponse.SC_CREATED);
+        String hostName = (String)data.get(VirtualHost.NAME);
+        Map<String, Object> hostDetails = getRestTestHelper().getJsonAsSingletonList("virtualhost/" + EMPTY_VIRTUALHOSTNODE_NAME + "/" + hostName);
+        Asserts.assertVirtualHost(hostName, hostDetails);
+
+        assertNewVirtualHost(hostDetails);
+
+        // verify VH is updated successfully
+        submitVirtualHost(false, "PUT", HttpServletResponse.SC_OK);
+    }
+
+    public void testCreateVirtualHostByPostUsingVirtualHostURI() throws Exception
+    {
+        Map<String, Object> data = submitVirtualHost(false, "POST", HttpServletResponse.SC_NOT_FOUND);
+
+        String hostName = (String)data.get(VirtualHost.NAME);
+        List<Map<String, Object>> hostDetails = getRestTestHelper().getJsonAsList("virtualhost/" + EMPTY_VIRTUALHOSTNODE_NAME + "/" + hostName);
+        assertTrue("VH should not exist", hostDetails.isEmpty());
     }
 
     public void testDeleteHost() throws Exception
@@ -180,7 +190,17 @@ public class VirtualHostRestTest extends
         getRestTestHelper().submitRequest("virtualhost/" + TEST1_VIRTUALHOST, "DELETE", HttpServletResponse.SC_CONFLICT);
     }
 
-    public void testMutateAttributes() throws Exception
+    public void testUpdateByPut() throws Exception
+    {
+        assertVirtualHostUpdate("PUT");
+    }
+
+    public void testUpdateByPost() throws Exception
+    {
+        assertVirtualHostUpdate("PUT");
+    }
+
+    private void assertVirtualHostUpdate(String method) throws IOException
     {
         String hostToUpdate = TEST3_VIRTUALHOST;
         String restHostUrl = "virtualhost/" + hostToUpdate + "/" + hostToUpdate;
@@ -189,7 +209,7 @@ public class VirtualHostRestTest extends
         Asserts.assertVirtualHost(hostToUpdate, hostDetails);
 
         Map<String, Object> newAttributes = Collections.<String, Object>singletonMap(VirtualHost.DESCRIPTION, "This is a virtual host");
-        getRestTestHelper().submitRequest(restHostUrl, "PUT", newAttributes, HttpServletResponse.SC_OK);
+        getRestTestHelper().submitRequest(restHostUrl, method, newAttributes, HttpServletResponse.SC_OK);
 
         Map<String, Object> rereadHostDetails = getRestTestHelper().getJsonAsSingletonList(restHostUrl);
         Asserts.assertVirtualHost(hostToUpdate, rereadHostDetails);
@@ -598,17 +618,28 @@ public class VirtualHostRestTest extends
         return getRestTestHelper().submitRequest("queue/test/test/" + queueName, "PUT", queueData);
     }
 
-    private void createVirtualHost(final String virtualHostName,
-                                   final String virtualHostType, String method) throws IOException
+    private Map<String, Object> submitVirtualHost(boolean useParentURI, String method, int statusCode) throws IOException
     {
+        String hostName = getTestName();
+        String type = getTestProfileVirtualHostNodeType();
+        if (JsonVirtualHostNodeImpl.VIRTUAL_HOST_NODE_TYPE.equals(type))
+        {
+            type = DerbyVirtualHostImpl.VIRTUAL_HOST_TYPE;
+        }
         Map<String, Object> virtualhostData = new HashMap<>();
-        virtualhostData.put(VirtualHost.NAME, virtualHostName);
-        virtualhostData.put(VirtualHost.TYPE, virtualHostType);
+        virtualhostData.put(VirtualHost.NAME, hostName);
+        virtualhostData.put(VirtualHost.TYPE, type);
 
-        getRestTestHelper().submitRequest("virtualhost/" + EMPTY_VIRTUALHOSTNODE_NAME + "/" + virtualHostName,
+        String url = "virtualhost/" + EMPTY_VIRTUALHOSTNODE_NAME;
+        if (!useParentURI)
+        {
+            url += "/" + hostName;
+        }
+        getRestTestHelper().submitRequest(url,
                                           method,
                                           virtualhostData,
-                                          HttpServletResponse.SC_CREATED);
+                                          statusCode);
+        return virtualhostData;
     }
 
     private void assertNewVirtualHost(Map<String, Object> hostDetails)



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