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]