QPID-8572: [Broker-J] The binding is broken when queue and exchange have the same name (#131)
diff --git a/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java b/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
index 7491c44..17f62f9 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
@@ -30,6 +30,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@@ -798,12 +799,12 @@
private MessageDestination getOpenedMessageDestination(final String name)
{
MessageDestination destination = getVirtualHost().getSystemDestination(name);
- if(destination == null)
+ if (destination == null)
{
destination = getVirtualHost().getChildByName(Exchange.class, name);
}
-
- if(destination == null)
+ // handle same exchange and queue name (QPID-8572)
+ if (destination == null || Objects.equals(this, destination))
{
destination = getVirtualHost().getChildByName(Queue.class, name);
}
diff --git a/broker-core/src/test/java/org/apache/qpid/server/exchange/TopicExchangeTest.java b/broker-core/src/test/java/org/apache/qpid/server/exchange/TopicExchangeTest.java
index 9bbb4da..1e64ee9 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/exchange/TopicExchangeTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/exchange/TopicExchangeTest.java
@@ -29,6 +29,7 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@@ -37,6 +38,7 @@
import org.junit.Before;
import org.junit.Test;
+import org.apache.qpid.server.binding.BindingImpl;
import org.apache.qpid.server.message.AMQMessageHeader;
import org.apache.qpid.server.message.InstanceProperties;
import org.apache.qpid.server.message.RoutingResult;
@@ -657,6 +659,27 @@
assertTrue("Message should be be possible to route using old binding", result2.hasRoutes());
}
+ @Test
+ public void testBindingWithSameDestinationName()
+ {
+ String name = "test123";
+
+ Map<String, Object> queueAttributes = new HashMap<>();
+ queueAttributes.put(Queue.NAME, name);
+ queueAttributes.put(Queue.DURABLE, false);
+ Queue<?> queue = (Queue<?>) _vhost.createChild(Queue.class, queueAttributes);
+
+ Map<String, Object> exchangeAttributes = new HashMap<>();
+ exchangeAttributes.put(Exchange.NAME, name);
+ exchangeAttributes.put(Exchange.DURABLE, false);
+ exchangeAttributes.put(Exchange.TYPE, ExchangeDefaults.TOPIC_EXCHANGE_CLASS);
+ exchangeAttributes.put(Exchange.DURABLE_BINDINGS, Arrays.asList(new BindingImpl("#", name, new HashMap<>())));
+ Exchange<?> exchange = (Exchange<?>) _vhost.createChild(Exchange.class, exchangeAttributes);
+
+ assertEquals(1, queue.getBindingCount());
+ assertEquals(1, exchange.getBindingCount());
+ }
+
private ServerMessage<?> createTestMessage(Map<String, Object> headerValues)
{
AMQMessageHeader header = mock(AMQMessageHeader.class);