[jboss-cvs] JBoss Messaging SVN: r2827 - in trunk: tests/src/org/jboss/test/messaging/jms and 1 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Jul 3 08:00:15 EDT 2007


Author: sergeypk
Date: 2007-07-03 08:00:14 -0400 (Tue, 03 Jul 2007)
New Revision: 2827

Modified:
   trunk/src/main/org/jboss/messaging/util/MessageQueueNameHelper.java
   trunk/tests/src/org/jboss/test/messaging/jms/DurableSubscriptionTest.java
   trunk/tests/src/org/jboss/test/messaging/jms/util/MessageQueueNameHelperTest.java
Log:
http://jira.jboss.com/jira/browse/JBMESSAGING-1008 - escape client id and subscription name to allow them to contain dots.

Modified: trunk/src/main/org/jboss/messaging/util/MessageQueueNameHelper.java
===================================================================
--- trunk/src/main/org/jboss/messaging/util/MessageQueueNameHelper.java	2007-07-03 01:53:40 UTC (rev 2826)
+++ trunk/src/main/org/jboss/messaging/util/MessageQueueNameHelper.java	2007-07-03 12:00:14 UTC (rev 2827)
@@ -21,7 +21,6 @@
  */
 package org.jboss.messaging.util;
 
-import java.util.StringTokenizer;
 
 /**
  * A MessageQueueNameHelper
@@ -45,6 +44,8 @@
    
    private String subName;
    
+   private static char ESCAPE = '\\';
+   private static char SEPARATOR_CHAR = '.';
    private static String SEPARATOR = ".";
    
    private MessageQueueNameHelper(String messageQueueName)
@@ -54,30 +55,55 @@
          throw new IllegalArgumentException("Message queue name is null");
       }
       
-      StringTokenizer tok = new StringTokenizer(messageQueueName, SEPARATOR);
+      StringBuffer[] parts = new StringBuffer[2];
+      int currentPart = 0;
       
-      int count = 0;
+      parts[0] = new StringBuffer();
+      parts[1] = new StringBuffer();
       
-      while (tok.hasMoreElements())
+      int pos = 0;
+      while (pos < messageQueueName.length())
       {
-         String token = (String)tok.nextElement();
-         
-         if (count == 0)
+         char ch = messageQueueName.charAt(pos);
+         pos++;
+
+         if (ch == SEPARATOR_CHAR)
          {
-            clientId = token;
+            currentPart++;
+            if (currentPart >= parts.length)
+            {
+               throw new IllegalArgumentException("Invalid message queue name: " + messageQueueName);
+            }
+            
+            continue;
          }
-         else if (count == 1)
+
+         if (ch == ESCAPE)
          {
-            subName = token;
+            if (pos >= messageQueueName.length())
+            {
+               throw new IllegalArgumentException("Invalid message queue name: " + messageQueueName);
+            }
+            ch = messageQueueName.charAt(pos);
+            pos++;
          }
-         count++;   
+
+         parts[currentPart].append(ch);
       }
       
-      if (count != 2)
+      if (currentPart != 1)
       {
          throw new IllegalArgumentException("Invalid message queue name: " + messageQueueName);
       }
+      
+      clientId = parts[0].toString();
+      subName = parts[1].toString();
    }
+   
+   private static String escape(String input)
+   {
+      return input.replace("\\", "\\\\").replace(".", "\\.");
+   }
 
    public String getClientId()
    {
@@ -105,6 +131,6 @@
          throw new IllegalArgumentException("Subscription name is null");
       }
       
-      return clientID + SEPARATOR + subName;
+      return escape(clientID) + SEPARATOR + escape(subName);
    }      
 }

Modified: trunk/tests/src/org/jboss/test/messaging/jms/DurableSubscriptionTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/DurableSubscriptionTest.java	2007-07-03 01:53:40 UTC (rev 2826)
+++ trunk/tests/src/org/jboss/test/messaging/jms/DurableSubscriptionTest.java	2007-07-03 12:00:14 UTC (rev 2827)
@@ -555,6 +555,38 @@
       conn.close();
    }
 
+   public void testDurableSubscriptionWithPeriodsInName() throws Exception
+   {
+      ConnectionFactory cf = (ConnectionFactory)ic.lookup("ConnectionFactory");
+      Topic topic = (Topic)ic.lookup("/topic/Topic");
+
+      Connection conn = cf.createConnection();
+      conn.setClientID(".client.id.with.periods.");
+
+      Session s = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+      TopicSubscriber subscriber = s.createDurableSubscriber(topic, ".subscription.name.with.periods.");
+      
+      ServerManagement.undeployTopic("Topic");
+      ServerManagement.deployTopic("Topic");
+      
+      topic = (Topic)ic.lookup("/topic/Topic");
+      s.createProducer(topic).send(s.createTextMessage("Subscription test"));
+      
+      conn.start();
+
+      Message m = subscriber.receive(1000L);
+      
+      assertNotNull(m);
+      assertTrue(m instanceof TextMessage);
+
+      subscriber.close();
+      
+      s.unsubscribe(".subscription.name.with.periods.");
+
+      conn.close();
+   }
+
    // Package protected ---------------------------------------------
 
    // Protected -----------------------------------------------------

Modified: trunk/tests/src/org/jboss/test/messaging/jms/util/MessageQueueNameHelperTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/util/MessageQueueNameHelperTest.java	2007-07-03 01:53:40 UTC (rev 2826)
+++ trunk/tests/src/org/jboss/test/messaging/jms/util/MessageQueueNameHelperTest.java	2007-07-03 12:00:14 UTC (rev 2827)
@@ -59,6 +59,20 @@
       
       assertEquals("clientid456.mysub2", name);
    }
+   
+   public void testEscaping()
+   {
+      String clientID = ".client.id.";
+      String subscriptionName = ".subscription.name.";
+      
+      String queueName = MessageQueueNameHelper.createSubscriptionName(clientID, subscriptionName);
+      assertEquals("\\.client\\.id\\..\\.subscription\\.name\\.", queueName);
+      
+      MessageQueueNameHelper helper = MessageQueueNameHelper.createHelper(queueName);
+      
+      assertEquals(clientID, helper.getClientId());
+      assertEquals(subscriptionName, helper.getSubName());
+   }
 
    // Package protected ---------------------------------------------
    




More information about the jboss-cvs-commits mailing list