Author: rgodfrey
Date: Fri May 15 10:13:35 2015
New Revision: 1679532

URL: http://svn.apache.org/r1679532
Log:
QPID-6382 : Allow / character in object names (Work by Lorenz Quack and Rob 
Godfrey)

Modified:
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/UserPreferencesServlet.java
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/addQueue.html
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Preferences.js
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/moveCopyMessages.js
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/showMessage.js
    
qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java?rev=1679532&r1=1679531&r2=1679532&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java
 Fri May 15 10:13:35 2015
@@ -22,7 +22,9 @@ package org.apache.qpid.server.managemen
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
 import java.io.Writer;
+import java.net.URLDecoder;
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
 
@@ -284,7 +286,20 @@ public abstract class AbstractServlet ex
         String pathInfo = request.getPathInfo();
         if (pathInfo != null && pathInfo.length() > 0)
         {
-            return pathInfo.substring(1).split("/");
+            String[] pathInfoElements = pathInfo.substring(1).split("/");
+            for (int i = 0; i < pathInfoElements.length; i++)
+            {
+                try
+                {
+                    // double decode to allow slashes in object names. first 
decoding happens in request.getPathInfo().
+                    pathInfoElements[i] = 
URLDecoder.decode(pathInfoElements[i], "UTF-8");
+                }
+                catch (UnsupportedEncodingException e)
+                {
+                    throw new IllegalArgumentException("REST servlet " + 
getServletName() + " could not decode path element: " + pathInfoElements[i], e);
+                }
+            }
+            return pathInfoElements;
         }
         return null;
     }

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/UserPreferencesServlet.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/UserPreferencesServlet.java?rev=1679532&r1=1679531&r2=1679532&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/UserPreferencesServlet.java
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/UserPreferencesServlet.java
 Fri May 15 10:13:35 2015
@@ -22,6 +22,7 @@
 package org.apache.qpid.server.management.plugin.servlet.rest;
 
 import java.io.IOException;
+import java.net.URLDecoder;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -166,17 +167,17 @@ public class UserPreferencesServlet exte
         Collection<AuthenticationProvider> authenticationProviders = 
broker.getAuthenticationProviders();
         Map<String, Set<String>> providerUsers = new HashMap<String, 
Set<String>>();
         Map<String, AuthenticationProvider> requestProviders = new 
HashMap<String, AuthenticationProvider>();
-        for (String path : request.getParameterValues("user"))
+        for (String value : request.getParameterValues("user"))
         {
-            String[] elements = path.split("/");
+            String[] elements = value.split("/");
             if (elements.length != 2)
             {
-                throw new IllegalArgumentException("Illegal user parameter " + 
path);
+                throw new IllegalArgumentException("Illegal user parameter " + 
value);
             }
 
-            String userId = elements[1];
+            String userId = URLDecoder.decode(elements[1], "UTF-8");
 
-            String providerName =  elements[0];
+            String providerName =  URLDecoder.decode(elements[0], "UTF-8");
             Set<String> users = providerUsers.get(providerName);
 
             if (users == null)

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/addQueue.html
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/addQueue.html?rev=1679532&r1=1679531&r2=1679532&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/addQueue.html
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/addQueue.html
 Fri May 15 10:13:35 2015
@@ -33,7 +33,7 @@
                                   required: true,
                                   promptMessage: 'Name of queue',
                                   title: 'Enter a queue name',
-                                  regExp:'^[\x20-\x2e\x30-\x7F]{1,255}$'"/>
+                                  regExp:'^[\x20-\x7F]{1,255}$'"/>
                 </div>
             </div>
             <div class="clear">

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js?rev=1679532&r1=1679531&r2=1679532&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js
 Fri May 15 10:13:35 2015
@@ -321,7 +321,8 @@ define(["dojo/_base/lang",
                {
                     url = url + "/";
                }
-               url = url + encodeURIComponent(modelObj.name)
+               // Double encode the object name in case it contains slashes
+               url = url + 
encodeURIComponent(encodeURIComponent(modelObj.name))
             }
         }
         return "api/latest/" + url;
@@ -335,11 +336,11 @@ define(["dojo/_base/lang",
         {
             if (path)
             {
-                path = encodeURIComponent(parent.name) + "/" + path;
+                path = encodeURIComponent(encodeURIComponent(parent.name)) + 
"/" + path;
             }
             else
             {
-                path = encodeURIComponent(parent.name);
+                path = encodeURIComponent(encodeURIComponent(parent.name));
             }
             parent = parent.parent;
         }

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Preferences.js
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Preferences.js?rev=1679532&r1=1679531&r2=1679532&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Preferences.js
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Preferences.js
 Fri May 15 10:13:35 2015
@@ -240,7 +240,9 @@ function (declare, event, connect, dom,
                           {
                                  for(var i=0; i<users.length; i++)
                                  {
-                                   users[i].id = 
users[i].authenticationProvider + "/" + users[i].name;
+                                     users[i].id = 
encodeURIComponent(users[i].authenticationProvider)
+                                         + "/"
+                                         + encodeURIComponent(users[i].name);
                                  }
                                  that.users = users;
                                  var usersStore = new Memory({data: users, 
idProperty: "id"});
@@ -280,4 +282,4 @@ function (declare, event, connect, dom,
     }
 
   });
-});
\ No newline at end of file
+});

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js?rev=1679532&r1=1679531&r2=1679532&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js
 Fri May 15 10:13:35 2015
@@ -84,8 +84,10 @@ define(["dojo/parser",
 
                             that.queueUpdater = new QueueUpdater(that);
 
-                            var myStore = new JsonRest({target: 
that.management.getFullUrl("service/message/"+ 
encodeURIComponent(that.getVirtualHostName()) +
-                                                                               
"/" + encodeURIComponent(that.getQueueName()))});
+                            // double encode to allow slashes in object names.
+                            var myStore = new JsonRest({target: 
that.management.getFullUrl("service/message/" +
+                                                                               
     encodeURIComponent(encodeURIComponent(that.getVirtualHostName())) +
+                                                                               
    "/" + encodeURIComponent(encodeURIComponent(that.getQueueName())))});
                             var messageGridDiv = 
query(".messages",contentPane.containerNode)[0];
                             that.dataStore =  new ObjectStore({objectStore: 
myStore});
                             var userPreferences = 
this.management.userPreferences;
@@ -185,7 +187,7 @@ define(["dojo/parser",
                if(data.length) {
                    var that = this;
                    if(confirm("Delete " + data.length + " messages?")) {
-                       var query = util.buildDeleteQuery(data, 
"service/message/" + encodeURIComponent(this.getVirtualHostName()) + "/" + 
encodeURIComponent(this.getQueueName()));
+                       var query = util.buildDeleteQuery(data, 
"service/message/" + 
encodeURIComponent(encodeURIComponent(this.getVirtualHostName())) + "/" + 
encodeURIComponent(encodeURIComponent(this.getQueueName())));
                        management.del({url: query}).then(
                            function(result)
                            {
@@ -200,8 +202,8 @@ define(["dojo/parser",
            Queue.prototype.clearQueue = function() {
                var that = this;
                if(confirm("Clear all messages from queue?")) {
-                   var query = "service/message/"+ 
encodeURIComponent(that.getVirtualHostName())
-                       + "/" + encodeURIComponent(that.getQueueName()) + 
"?clear=true";
+                   var query = "service/message/"+ 
encodeURIComponent(encodeURIComponent(that.getVirtualHostName()))
+                       + "/" + 
encodeURIComponent(encodeURIComponent(that.getQueueName())) + "?clear=true";
                    that.success = true
                    this.management.del({url: query}).then(
                        function(data) {

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/moveCopyMessages.js
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/moveCopyMessages.js?rev=1679532&r1=1679531&r2=1679532&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/moveCopyMessages.js
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/moveCopyMessages.js
 Fri May 15 10:13:35 2015
@@ -61,8 +61,8 @@ define(["dojo/dom",
                                     moveMessages.data.destinationQueue = 
theForm.getValues()["queue"];
                                     var that = this;
 
-                                    moveMessages.management.post({url: 
"service/message/"+encodeURIComponent(moveMessages.vhost)
-                                                      
+"/"+encodeURIComponent(moveMessages.queue),
+                                    moveMessages.management.post({url: 
"service/message/"+encodeURIComponent(encodeURIComponent(moveMessages.vhost))
+                                                      
+"/"+encodeURIComponent(encodeURIComponent(moveMessages.queue)),
                                              headers: { "Content-Type": 
"application/json"}},
                                              moveMessages.data,
                                              function(x) {

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/showMessage.js
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/showMessage.js?rev=1679532&r1=1679531&r2=1679532&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/showMessage.js
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/showMessage.js
 Fri May 15 10:13:35 2015
@@ -100,16 +100,17 @@ define(["dojo/dom",
             var contentField = query(".message-content", this.dialogNode)[0];
 
             if(data.mimeType && data.mimeType.match(/text\/.*/)) {
-                showMessage.management.get({url: "service/message-content/" + 
encodeURIComponent(showMessage.virtualhost)
-                                            + "/" + 
encodeURIComponent(showMessage.queue)
-                                            + "/" + 
encodeURIComponent(showMessage.messageNumber),
+                showMessage.management.get({url: "service/message-content/" + 
encodeURIComponent(encodeURIComponent(showMessage.virtualhost))
+                                            + "/" + 
encodeURIComponent(encodeURIComponent(showMessage.queue))
+                                            + "/" + 
encodeURIComponent(encodeURIComponent(showMessage.messageNumber)),
                                             headers: { "Content-Type": 
"text/html"},
                                             handleAs: "text"
                                     }).then(function(obj) { 
contentField.innerHTML = encode(obj); }, util.xhrErrorHandler);
             } else {
-                contentField.innerHTML = "<a href=\"" + 
showMessage.management.getFullUrl("service/message-content/" + 
encodeURIComponent(showMessage.virtualhost)
-                                                            + "/" + 
encodeURIComponent(showMessage.queue)
-                                                            + "/" + 
encodeURIComponent(showMessage.messageNumber))
+                contentField.innerHTML = "<a href=\"" + 
showMessage.management.getFullUrl("service/message-content/"
+                                                            + 
encodeURIComponent(encodeURIComponent(showMessage.virtualhost))
+                                                            + "/" + 
encodeURIComponent(encodeURIComponent(showMessage.queue))
+                                                            + "/" + 
encodeURIComponent(encodeURIComponent(showMessage.messageNumber)))
                                         + "\" target=\"_blank\">Download</a>";
             }
             populatedFields.push(contentField);
@@ -123,9 +124,9 @@ define(["dojo/dom",
             showMessage.queue = obj.queue;
             showMessage.messageNumber = obj.messageNumber;
 
-            showMessage.management.get({url: "service/message/" + 
encodeURIComponent(obj.virtualhost)
-                            + "/" + encodeURIComponent(obj.queue)
-                            + "/" + encodeURIComponent(obj.messageNumber)},
+            showMessage.management.get({url: "service/message/" + 
encodeURIComponent(encodeURIComponent(obj.virtualhost))
+                            + "/" + 
encodeURIComponent(encodeURIComponent(obj.queue))
+                            + "/" + 
encodeURIComponent(encodeURIComponent(obj.messageNumber))},
                      showMessage.populateShowMessage, util.xhrErrorHandler
                     );
         };

Modified: 
qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java?rev=1679532&r1=1679531&r2=1679532&view=diff
==============================================================================
--- 
qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java
 (original)
+++ 
qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java
 Fri May 15 10:13:35 2015
@@ -23,6 +23,7 @@ package org.apache.qpid.systest.rest;
 import static  
org.apache.qpid.server.management.plugin.servlet.rest.RestServlet.SC_UNPROCESSABLE_ENTITY;
 
 import java.io.IOException;
+import java.net.URLEncoder;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -576,6 +577,26 @@ public class VirtualHostRestTest extends
         Asserts.assertQueue(queueName, "standard", queue, null);
     }
 
+    public void testObjectsWithSlashes() throws Exception
+    {
+        String queueName = "testQueue/with/slashes";
+        String queueNameEncoded = URLEncoder.encode(queueName, "UTF-8");
+        String queueNameDoubleEncoded = URLEncoder.encode(queueNameEncoded, 
"UTF-8");
+        String queueUrl = "queue/test/test/" + queueNameDoubleEncoded;
+
+        // Test creation
+        createQueue(queueNameDoubleEncoded, "standard", null);
+        Map<String, Object> hostDetails = 
getRestTestHelper().getJsonAsSingletonList("virtualhost/test");
+        List<Map<String, Object>> queues = (List<Map<String, Object>>) 
hostDetails.get(VirtualHostRestTest.VIRTUALHOST_QUEUES_ATTRIBUTE);
+        Map<String, Object> queue = getRestTestHelper().find(Queue.NAME, 
queueName , queues);
+        Asserts.assertQueue(queueName, "standard", queue);
+
+        // Test deletion
+        int statusCode = getRestTestHelper().submitRequest(queueUrl, "DELETE");
+        assertEquals("Unexpected response code", 200, statusCode);
+        getRestTestHelper().submitRequest(queueUrl, "GET", 
HttpServletResponse.SC_NOT_FOUND);
+    }
+
     private void createExchange(String exchangeName, String exchangeType) 
throws IOException
     {
         Map<String, Object> queueData = new HashMap<String, Object>();



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

Reply via email to