diff --git a/spring-amqp-core/src/main/java/org/springframework/amqp/core/Binding.java b/spring-amqp-core/src/main/java/org/springframework/amqp/core/Binding.java index 3e369a4e..8ccc9ff4 100644 --- a/spring-amqp-core/src/main/java/org/springframework/amqp/core/Binding.java +++ b/spring-amqp-core/src/main/java/org/springframework/amqp/core/Binding.java @@ -75,4 +75,9 @@ public class Binding { return DestinationType.QUEUE.equals(destinationType); } + @Override + public String toString() { + return "Binding [destination=" + destination + ", exchange=" + exchange + ", routingKey=" + routingKey + "]"; + } + } diff --git a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/BindingFactoryBean.java b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/BindingFactoryBean.java new file mode 100644 index 00000000..ca30b888 --- /dev/null +++ b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/BindingFactoryBean.java @@ -0,0 +1,76 @@ +/* + * Copyright 2002-2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ +package org.springframework.amqp.rabbit.config; + +import java.util.Map; + +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.core.Binding.DestinationType; +import org.springframework.amqp.core.Exchange; +import org.springframework.amqp.core.Queue; +import org.springframework.beans.factory.FactoryBean; + +/** + * @author Dave Syer + * + */ +public class BindingFactoryBean implements FactoryBean { + + private Map arguments; + private String routingKey = ""; + private String exchange; + private Queue destinationQueue; + private Exchange destinationExchange; + + public void setArguments(Map arguments) { + this.arguments = arguments; + } + + public void setRoutingKey(String routingKey) { + this.routingKey = routingKey; + } + + public void setExchange(String exchange) { + this.exchange = exchange; + } + + public void setDestinationQueue(Queue destinationQueue) { + this.destinationQueue = destinationQueue; + } + + public void setDestinationExchange(Exchange destinationExchange) { + this.destinationExchange = destinationExchange; + } + + public Binding getObject() throws Exception { + String destination; + DestinationType destinationType; + if (destinationQueue != null) { + destination = destinationQueue.getName(); + destinationType = DestinationType.QUEUE; + } else { + destination = destinationExchange.getName(); + destinationType = DestinationType.EXCHANGE; + } + return new Binding(destination, destinationType, exchange, routingKey, arguments); + } + + public Class getObjectType() { + return Binding.class; + } + + public boolean isSingleton() { + return true; + } + +} diff --git a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/DirectExchangeParser.java b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/DirectExchangeParser.java index d5629df5..13743515 100644 --- a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/DirectExchangeParser.java +++ b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/DirectExchangeParser.java @@ -15,8 +15,6 @@ package org.springframework.amqp.rabbit.config; import java.util.Collections; -import org.springframework.amqp.core.Binding; -import org.springframework.amqp.core.Binding.DestinationType; import org.springframework.amqp.core.DirectExchange; import org.springframework.beans.factory.config.TypedStringValue; import org.springframework.beans.factory.support.AbstractBeanDefinition; @@ -41,16 +39,15 @@ public class DirectExchangeParser extends AbstractExchangeParser { @Override protected AbstractBeanDefinition parseBinding(String exchangeName, Element binding, ParserContext parserContext) { - BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(Binding.class); - builder.addConstructorArgValue(new TypedStringValue(binding.getAttribute(BINDING_QUEUE_ATTR))); - builder.addConstructorArgValue(DestinationType.EXCHANGE); - builder.addConstructorArgValue(new TypedStringValue(exchangeName)); + BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(BindingFactoryBean.class); + builder.addPropertyReference("destinationQueue", binding.getAttribute(BINDING_QUEUE_ATTR)); + builder.addPropertyValue("exchange", new TypedStringValue(exchangeName)); String bindingKey = binding.getAttribute(BINDING_KEY_ATTR); if (!StringUtils.hasText(bindingKey)) { bindingKey = ""; } - builder.addConstructorArgValue(new TypedStringValue(bindingKey)); - builder.addConstructorArgValue(Collections.emptyMap()); + builder.addPropertyValue("routingKey", new TypedStringValue(bindingKey)); + builder.addPropertyValue("arguments", Collections.emptyMap()); return builder.getBeanDefinition(); } diff --git a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/FanoutExchangeParser.java b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/FanoutExchangeParser.java index 7e4dd989..abbcaedb 100644 --- a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/FanoutExchangeParser.java +++ b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/FanoutExchangeParser.java @@ -15,8 +15,6 @@ package org.springframework.amqp.rabbit.config; import java.util.Collections; -import org.springframework.amqp.core.Binding; -import org.springframework.amqp.core.Binding.DestinationType; import org.springframework.amqp.core.FanoutExchange; import org.springframework.beans.factory.config.TypedStringValue; import org.springframework.beans.factory.support.AbstractBeanDefinition; @@ -37,12 +35,10 @@ public class FanoutExchangeParser extends AbstractExchangeParser { @Override protected AbstractBeanDefinition parseBinding(String exchangeName, Element binding, ParserContext parserContext) { - BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(Binding.class); - builder.addConstructorArgValue(new TypedStringValue(binding.getAttribute(BINDING_QUEUE_ATTR))); - builder.addConstructorArgValue(DestinationType.EXCHANGE); - builder.addConstructorArgValue(new TypedStringValue(exchangeName)); - builder.addConstructorArgValue(""); - builder.addConstructorArgValue(Collections.emptyMap()); + BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(BindingFactoryBean.class); + builder.addPropertyReference("destinationQueue", binding.getAttribute(BINDING_QUEUE_ATTR)); + builder.addPropertyValue("exchange", new TypedStringValue(exchangeName)); + builder.addPropertyValue("arguments", Collections.emptyMap()); return builder.getBeanDefinition(); } diff --git a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/HeadersExchangeParser.java b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/HeadersExchangeParser.java index d7e059d9..d59d3627 100644 --- a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/HeadersExchangeParser.java +++ b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/HeadersExchangeParser.java @@ -16,8 +16,6 @@ package org.springframework.amqp.rabbit.config; -import org.springframework.amqp.core.Binding; -import org.springframework.amqp.core.Binding.DestinationType; import org.springframework.amqp.core.HeadersExchange; import org.springframework.beans.factory.config.TypedStringValue; import org.springframework.beans.factory.support.AbstractBeanDefinition; @@ -39,16 +37,14 @@ public class HeadersExchangeParser extends AbstractExchangeParser { @Override protected AbstractBeanDefinition parseBinding(String exchangeName, Element binding, ParserContext parserContext) { - BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(Binding.class); - builder.addConstructorArgValue(new TypedStringValue(binding.getAttribute(BINDING_QUEUE_ATTR))); - builder.addConstructorArgValue(DestinationType.EXCHANGE); - builder.addConstructorArgValue(new TypedStringValue(exchangeName)); - builder.addConstructorArgValue(""); + BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(BindingFactoryBean.class); + builder.addPropertyReference("destinationQueue", binding.getAttribute(BINDING_QUEUE_ATTR)); + builder.addPropertyValue("exchange", new TypedStringValue(exchangeName)); ManagedMap map = new ManagedMap(); String key = binding.getAttribute("key"); String value = binding.getAttribute("value"); map.put(new TypedStringValue(key), new TypedStringValue(value)); - builder.addConstructorArgValue(map); + builder.addPropertyValue("arguments", map); return builder.getBeanDefinition(); } diff --git a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/TopicExchangeParser.java b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/TopicExchangeParser.java index cdf0c67c..3a5b9eff 100644 --- a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/TopicExchangeParser.java +++ b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/TopicExchangeParser.java @@ -18,8 +18,6 @@ package org.springframework.amqp.rabbit.config; import java.util.Collections; -import org.springframework.amqp.core.Binding; -import org.springframework.amqp.core.Binding.DestinationType; import org.springframework.amqp.core.TopicExchange; import org.springframework.beans.factory.config.TypedStringValue; import org.springframework.beans.factory.support.AbstractBeanDefinition; @@ -42,12 +40,11 @@ public class TopicExchangeParser extends AbstractExchangeParser { @Override protected AbstractBeanDefinition parseBinding(String exchangeName, Element binding, ParserContext parserContext) { - BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(Binding.class); - builder.addConstructorArgValue(new TypedStringValue(binding.getAttribute(BINDING_QUEUE_ATTR))); - builder.addConstructorArgValue(DestinationType.EXCHANGE); - builder.addConstructorArgValue(new TypedStringValue(exchangeName)); - builder.addConstructorArgValue(new TypedStringValue(binding.getAttribute(BINDING_PATTERN_ATTR))); - builder.addConstructorArgValue(Collections.emptyMap()); + BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(BindingFactoryBean.class); + builder.addPropertyReference("destinationQueue", binding.getAttribute(BINDING_QUEUE_ATTR)); + builder.addPropertyValue("exchange", new TypedStringValue(exchangeName)); + builder.addPropertyValue("routingKey", new TypedStringValue(binding.getAttribute(BINDING_PATTERN_ATTR))); + builder.addPropertyValue("arguments", Collections.emptyMap()); return builder.getBeanDefinition(); }