Author: kwall
Date: Sun Jun 21 22:27:00 2015
New Revision: 1686757

URL: http://svn.apache.org/r1686757
Log:
QPID-6547: [Java Client 0-8..0-10]  Prevent client from attempting to make 
bindings to default exchange (when BURL addresses are in use)

* Also prevent the creation of BURL addresses that try to redefine the class of 
the default exchange

Modified:
    
qpid/java/trunk/client/src/main/java/org/apache/qpid/client/AMQDestination.java
    qpid/java/trunk/client/src/main/java/org/apache/qpid/client/AMQSession.java
    
qpid/java/trunk/client/src/test/java/org/apache/qpid/test/unit/client/destinationurl/BindingURLTest.java
    qpid/java/trunk/common/src/main/java/org/apache/qpid/url/AMQBindingURL.java
    
qpid/java/trunk/systests/src/test/java/org/apache/qpid/test/unit/close/TopicPublisherCloseTest.java

Modified: 
qpid/java/trunk/client/src/main/java/org/apache/qpid/client/AMQDestination.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/client/src/main/java/org/apache/qpid/client/AMQDestination.java?rev=1686757&r1=1686756&r2=1686757&view=diff
==============================================================================
--- 
qpid/java/trunk/client/src/main/java/org/apache/qpid/client/AMQDestination.java 
(original)
+++ 
qpid/java/trunk/client/src/main/java/org/apache/qpid/client/AMQDestination.java 
Sun Jun 21 22:27:00 2015
@@ -103,16 +103,6 @@ public abstract class AMQDestination imp
         _isExclusive = exclusive;
     }
 
-    protected AddressHelper getAddrHelper()
-    {
-        return _addrHelper;
-    }
-
-    protected void setAddrHelper(AddressHelper addrHelper)
-    {
-        _addrHelper = addrHelper;
-    }
-
     protected String getName()
     {
         return _name;
@@ -438,6 +428,11 @@ public abstract class AMQDestination imp
         return _exchangeName;
     }
 
+    public boolean isDefaultExchange()
+    {
+        return _exchangeName == null || "".equals(_exchangeName);
+    }
+
     public String getExchangeClass()
     {
         return _exchangeClass;
@@ -871,7 +866,8 @@ public abstract class AMQDestination imp
         _name = name;
     }
 
-    public String getSubject() {
+    public String getSubject()
+    {
         return _subject;
     }
 

Modified: 
qpid/java/trunk/client/src/main/java/org/apache/qpid/client/AMQSession.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/client/src/main/java/org/apache/qpid/client/AMQSession.java?rev=1686757&r1=1686756&r2=1686757&view=diff
==============================================================================
--- qpid/java/trunk/client/src/main/java/org/apache/qpid/client/AMQSession.java 
(original)
+++ qpid/java/trunk/client/src/main/java/org/apache/qpid/client/AMQSession.java 
Sun Jun 21 22:27:00 2015
@@ -2993,7 +2993,7 @@ public abstract class AMQSession<C exten
      *
      * @throws AMQException
      */
-    private void registerConsumer(C consumer, boolean nowait) throws 
AMQException // , FailoverException
+    private void registerConsumer(C consumer, boolean nowait) throws 
AMQException
     {
         AMQDestination amqd = consumer.getDestination();
 
@@ -3012,7 +3012,7 @@ public abstract class AMQSession<C exten
             {
                 declareQueue(amqd, consumer.isNoLocal(), nowait);
             }
-            if (_bindQueues && !amqd.neverDeclare())
+            if (_bindQueues && !amqd.neverDeclare() && 
!amqd.isDefaultExchange())
             {
                 if(!isBound(amqd.getExchangeName(), amqd.getAMQQueueName(), 
amqd.getRoutingKey()))
                 {

Modified: 
qpid/java/trunk/client/src/test/java/org/apache/qpid/test/unit/client/destinationurl/BindingURLTest.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/client/src/test/java/org/apache/qpid/test/unit/client/destinationurl/BindingURLTest.java?rev=1686757&r1=1686756&r2=1686757&view=diff
==============================================================================
--- 
qpid/java/trunk/client/src/test/java/org/apache/qpid/test/unit/client/destinationurl/BindingURLTest.java
 (original)
+++ 
qpid/java/trunk/client/src/test/java/org/apache/qpid/test/unit/client/destinationurl/BindingURLTest.java
 Sun Jun 21 22:27:00 2015
@@ -183,6 +183,34 @@ public class BindingURLTest extends Qpid
 
     }
 
+    public void testRoutingKeyDefaulting_DirectExchangeClass_WithRoutinKey() 
throws Exception
+    {
+        String url = 
"direct://exchangeName/Destination/Queue?routingkey='myroutingkeyoverridesqueue'";
+
+        BindingURL dest = new AMQBindingURL(url);
+
+        assertEquals("direct", dest.getExchangeClass());
+        assertEquals("exchangeName", dest.getExchangeName());
+        assertEquals("Destination", dest.getDestinationName());
+        assertEquals("Queue", dest.getQueueName());
+        assertEquals("myroutingkeyoverridesqueue", dest.getRoutingKey());
+
+    }
+
+    public void testBindingKeyFromRoutingKey() throws Exception
+    {
+        String url = 
"exchangeClass://exchangeName/Destination/?routingkey='routingkey'";
+
+        BindingURL dest = new AMQBindingURL(url);
+
+        assertEquals("exchangeClass", dest.getExchangeClass());
+        assertEquals("exchangeName", dest.getExchangeName());
+        assertEquals("Destination", dest.getDestinationName());
+        assertEquals("", dest.getQueueName());
+        assertEquals(1, dest.getBindingKeys().length);
+        assertEquals("routingkey", dest.getBindingKeys()[0]);
+    }
+
     public void testSingleBindingKeys() throws Exception
     {
         String url = 
"exchangeClass://exchangeName/Destination/?bindingkey='key'";
@@ -214,13 +242,13 @@ public class BindingURLTest extends Qpid
 
     public void testAnonymousExchange() throws Exception
     {
-        String url = "exchangeClass:////Queue";
+        String url = "direct:////Queue";
 
         BindingURL burl = new AMQBindingURL(url);
 
         assertEquals(url, burl.toString());
 
-        assertEquals("exchangeClass", burl.getExchangeClass());
+        assertEquals("direct", burl.getExchangeClass());
         assertEquals("", burl.getExchangeName());
         assertEquals("", burl.getDestinationName());
         assertEquals("Queue", burl.getQueueName());
@@ -268,4 +296,25 @@ public class BindingURLTest extends Qpid
             // PASS
         }
     }
+
+    public void testUnacceptableExchangeClassForDefaultExchange() throws 
Exception
+    {
+        String url = "topic:////Destination/Queue";
+        try
+        {
+            new AMQBindingURL(url);
+            fail("Exception not thrown");
+        }
+        catch(URISyntaxException e)
+        {
+            // PASS
+        }
+    }
+
+    public void testTopicClassImpliesExclusive() throws Exception
+    {
+        String url = "topic://amq.topic//Destination/Queue";
+        AMQBindingURL burl = new AMQBindingURL(url);
+        
assertTrue(Boolean.parseBoolean(burl.getOption(BindingURL.OPTION_EXCLUSIVE)));
+    }
 }

Modified: 
qpid/java/trunk/common/src/main/java/org/apache/qpid/url/AMQBindingURL.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/common/src/main/java/org/apache/qpid/url/AMQBindingURL.java?rev=1686757&r1=1686756&r2=1686757&view=diff
==============================================================================
--- qpid/java/trunk/common/src/main/java/org/apache/qpid/url/AMQBindingURL.java 
(original)
+++ qpid/java/trunk/common/src/main/java/org/apache/qpid/url/AMQBindingURL.java 
Sun Jun 21 22:27:00 2015
@@ -39,15 +39,18 @@ public class AMQBindingURL implements Bi
     private String _destinationName = "";
     private String _queueName = "";
     private String[] _bindingKeys = new String[0];
-    private HashMap<String, String> _options;
+    private Map<String, String> _options;
 
     public AMQBindingURL(String url) throws URISyntaxException
     {
         // format:
         // 
<exch_class>://<exch_name>/[<destination>]/[<queue>]?<option>='<value>'[,<option>='<value>']*
-        _logger.debug("Parsing URL: " + url);
+        if (_logger.isDebugEnabled())
+        {
+            _logger.debug("Parsing URL: " + url);
+        }
         _url = url;
-        _options = new HashMap<String, String>();
+        _options = new HashMap<>();
 
         parseBindingURL();
     }
@@ -55,62 +58,79 @@ public class AMQBindingURL implements Bi
     private void parseBindingURL() throws URISyntaxException
     {
         BindingURLParser parser = new BindingURLParser();
-        parser.parse(_url,this);
-        _logger.debug("URL Parsed: " + this);
+        parser.parse(_url, this);
+
+        if (ExchangeDefaults.DEFAULT_EXCHANGE_NAME.equals(getExchangeName()) &&
+            !ExchangeDefaults.DIRECT_EXCHANGE_CLASS.equals(getExchangeClass()))
+        {
+            throw new URISyntaxException(_url, "Cannot create an address that 
redefines the default exchange"
+             + " to be a '" + getExchangeClass() + "' exchange.  It must be an 
instance of the '"
+             + ExchangeDefaults.DIRECT_EXCHANGE_CLASS + "' exchange.");
+        }
+        if (_logger.isDebugEnabled())
+        {
+            _logger.debug("URL Parsed: " + this);
+        }
     }
 
 
+    @Override
     public String getURL()
     {
         return _url;
     }
 
+    @Override
     public String getExchangeClass()
     {
         return _exchangeClass;
     }
 
-    public void setExchangeClass(String exchangeClass)
+    void setExchangeClass(String exchangeClass)
     {
 
         _exchangeClass = exchangeClass;
-        if (exchangeClass.equals(ExchangeDefaults.TOPIC_EXCHANGE_CLASS))
+        if (ExchangeDefaults.TOPIC_EXCHANGE_CLASS.equals(exchangeClass))
         {
             setOption(BindingURL.OPTION_EXCLUSIVE, "true");
         }
 
     }
 
+    @Override
     public String getExchangeName()
     {
         return _exchangeName;
     }
 
-    public void setExchangeName(String name)
+    void setExchangeName(String name)
     {
         _exchangeName = name;
     }
 
+    @Override
     public String getDestinationName()
     {
         return _destinationName;
     }
 
-    public void setDestinationName(String name)
+    void setDestinationName(String name)
     {
         _destinationName = name;
     }
 
+    @Override
     public String getQueueName()
     {
         return _queueName;
     }
 
-    public void setQueueName(String name)
+    void setQueueName(String name)
     {
         _queueName = name;
     }
 
+    @Override
     public String getOption(String key)
     {
         return _options.get(key);
@@ -135,14 +155,16 @@ public class AMQBindingURL implements Bi
         _options.put(key, value);
     }
 
+    @Override
     public boolean containsOption(String key)
     {
         return _options.containsKey(key);
     }
 
+    @Override
     public String getRoutingKey()
     {
-        if (_exchangeClass.equals(ExchangeDefaults.DIRECT_EXCHANGE_CLASS))
+        if (ExchangeDefaults.DIRECT_EXCHANGE_CLASS.equals(_exchangeClass))
         {
             if (containsOption(BindingURL.OPTION_ROUTING_KEY))
             {
@@ -162,6 +184,7 @@ public class AMQBindingURL implements Bi
         return getDestinationName();
     }
 
+    @Override
     public String[] getBindingKeys()
     {
         if (_bindingKeys != null && _bindingKeys.length>0)
@@ -174,12 +197,12 @@ public class AMQBindingURL implements Bi
         }
     }
 
-    public void setBindingKeys(String[] keys)
+    void setBindingKeys(String[] keys)
     {
         _bindingKeys = keys;
     }
 
-    public void setRoutingKey(String key)
+    void setRoutingKey(String key)
     {
         setOption(OPTION_ROUTING_KEY, key);
     }

Modified: 
qpid/java/trunk/systests/src/test/java/org/apache/qpid/test/unit/close/TopicPublisherCloseTest.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/systests/src/test/java/org/apache/qpid/test/unit/close/TopicPublisherCloseTest.java?rev=1686757&r1=1686756&r2=1686757&view=diff
==============================================================================
--- 
qpid/java/trunk/systests/src/test/java/org/apache/qpid/test/unit/close/TopicPublisherCloseTest.java
 (original)
+++ 
qpid/java/trunk/systests/src/test/java/org/apache/qpid/test/unit/close/TopicPublisherCloseTest.java
 Sun Jun 21 22:27:00 2015
@@ -17,7 +17,8 @@
  * specific language governing permissions and limitations
  * under the License.
  *
- */package org.apache.qpid.test.unit.close;
+ */
+package org.apache.qpid.test.unit.close;
 
 import org.apache.qpid.client.AMQConnection;
 import org.apache.qpid.client.AMQTopic;
@@ -47,9 +48,6 @@ public class TopicPublisherCloseTest ext
 
     public void testAllMethodsThrowAfterConnectionClose() throws Exception
     {
-        // give external brokers a chance to start up
-        Thread.sleep(3000);
-
         AMQConnection connection =   (AMQConnection) getConnection("guest", 
"guest");
 
         Topic destination1 = new AMQTopic(connection, "t1");



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to