All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
io.bitsensor.plugins.shaded.org.springframework.amqp.rabbit.config.ListenerContainerParser Maven / Gradle / Ivy
/*
* Copyright 2002-2016 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 io.bitsensor.plugins.shaded.io.bitsensor.plugins.shaded.org.springframework.amqp.rabbit.config;
import java.util.ArrayList;
import java.util.List;
import org.w3c.dom.Element;
import io.bitsensor.plugins.shaded.io.bitsensor.plugins.shaded.org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;
import io.bitsensor.plugins.shaded.org.springframework.beans.factory.config.BeanDefinition;
import io.bitsensor.plugins.shaded.org.springframework.beans.factory.config.BeanDefinitionHolder;
import io.bitsensor.plugins.shaded.org.springframework.beans.factory.config.ConstructorArgumentValues;
import io.bitsensor.plugins.shaded.org.springframework.beans.factory.config.RuntimeBeanReference;
import io.bitsensor.plugins.shaded.org.springframework.beans.factory.config.TypedStringValue;
import io.bitsensor.plugins.shaded.org.springframework.beans.factory.parsing.BeanComponentDefinition;
import io.bitsensor.plugins.shaded.org.springframework.beans.factory.parsing.CompositeComponentDefinition;
import io.bitsensor.plugins.shaded.org.springframework.beans.factory.support.BeanDefinitionBuilder;
import io.bitsensor.plugins.shaded.org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import io.bitsensor.plugins.shaded.org.springframework.beans.factory.support.ManagedList;
import io.bitsensor.plugins.shaded.org.springframework.beans.factory.support.ManagedMap;
import io.bitsensor.plugins.shaded.org.springframework.beans.factory.support.RootBeanDefinition;
import io.bitsensor.plugins.shaded.org.springframework.beans.factory.xml.BeanDefinitionParser;
import io.bitsensor.plugins.shaded.org.springframework.beans.factory.xml.ParserContext;
import io.bitsensor.plugins.shaded.org.springframework.util.StringUtils;
import io.bitsensor.plugins.shaded.org.springframework.util.xml.DomUtils;
/**
* @author Mark Fisher
* @author Gary Russell
* @since 1.0
*/
class ListenerContainerParser implements BeanDefinitionParser {
private static final String LISTENER_ELEMENT = "listener";
private static final String ID_ATTRIBUTE = "id";
private static final String GROUP_ATTRIBUTE = "group";
private static final String QUEUE_NAMES_ATTRIBUTE = "queue-names";
private static final String QUEUES_ATTRIBUTE = "queues";
private static final String REF_ATTRIBUTE = "ref";
private static final String METHOD_ATTRIBUTE = "method";
private static final String MESSAGE_CONVERTER_ATTRIBUTE = "message-converter";
private static final String RESPONSE_EXCHANGE_ATTRIBUTE = "response-exchange";
private static final String RESPONSE_ROUTING_KEY_ATTRIBUTE = "response-routing-key";
private static final String EXCLUSIVE = "exclusive";
@SuppressWarnings("unchecked")
@Override
public BeanDefinition parse(Element element, ParserContext parserContext) {
CompositeComponentDefinition compositeDef = new CompositeComponentDefinition(element.getTagName(),
parserContext.extractSource(element));
parserContext.pushContainingComponent(compositeDef);
String group = element.getAttribute(GROUP_ATTRIBUTE);
ManagedList containerList = null;
if (StringUtils.hasText(group)) {
BeanDefinition groupDef;
if (parserContext.getRegistry().containsBeanDefinition(group)) {
groupDef = parserContext.getRegistry().getBeanDefinition(group);
}
else {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(ArrayList.class);
builder.addConstructorArgValue(new ManagedList());
groupDef = builder.getBeanDefinition();
BeanDefinitionHolder holder = new BeanDefinitionHolder(groupDef, group);
BeanDefinitionReaderUtils.registerBeanDefinition(holder, parserContext.getRegistry());
}
ConstructorArgumentValues constructorArgumentValues = groupDef.getConstructorArgumentValues();
if (!ArrayList.class.getName().equals(groupDef.getBeanClassName())
|| constructorArgumentValues.getArgumentCount() != 1
|| constructorArgumentValues.getIndexedArgumentValue(0, ManagedList.class) == null) {
parserContext.getReaderContext().error("Unexpected configuration for bean " + group, element);
}
containerList = (ManagedList) constructorArgumentValues
.getIndexedArgumentValue(0, ManagedList.class).getValue();
}
List childElements = DomUtils.getChildElementsByTagName(element, LISTENER_ELEMENT);
for (int i = 0; i < childElements.size(); i++) {
parseListener(childElements.get(i), element, parserContext, containerList);
}
parserContext.popAndRegisterContainingComponent();
return null;
}
private void parseListener(Element listenerEle, Element containerEle, ParserContext parserContext,
ManagedList containerList) {
RootBeanDefinition listenerDef = new RootBeanDefinition();
listenerDef.setSource(parserContext.extractSource(listenerEle));
String ref = listenerEle.getAttribute(REF_ATTRIBUTE);
if (!StringUtils.hasText(ref)) {
parserContext.getReaderContext().error("Listener 'ref' attribute contains empty value.", listenerEle);
}
else {
listenerDef.getPropertyValues().add("delegate", new RuntimeBeanReference(ref));
}
String method = null;
if (listenerEle.hasAttribute(METHOD_ATTRIBUTE)) {
method = listenerEle.getAttribute(METHOD_ATTRIBUTE);
if (!StringUtils.hasText(method)) {
parserContext.getReaderContext()
.error("Listener 'method' attribute contains empty value.", listenerEle);
}
}
listenerDef.getPropertyValues().add("defaultListenerMethod", method);
if (containerEle.hasAttribute(MESSAGE_CONVERTER_ATTRIBUTE)) {
String messageConverter = containerEle.getAttribute(MESSAGE_CONVERTER_ATTRIBUTE);
if (!StringUtils.hasText(messageConverter)) {
parserContext.getReaderContext().error(
"Listener container 'message-converter' attribute contains empty value.", containerEle);
}
else {
listenerDef.getPropertyValues().add("messageConverter", new RuntimeBeanReference(messageConverter));
}
}
BeanDefinition containerDef = RabbitNamespaceUtils.parseContainer(containerEle, parserContext);
if (listenerEle.hasAttribute(RESPONSE_EXCHANGE_ATTRIBUTE)) {
String responseExchange = listenerEle.getAttribute(RESPONSE_EXCHANGE_ATTRIBUTE);
listenerDef.getPropertyValues().add("responseExchange", responseExchange);
}
if (listenerEle.hasAttribute(RESPONSE_ROUTING_KEY_ATTRIBUTE)) {
String responseRoutingKey = listenerEle.getAttribute(RESPONSE_ROUTING_KEY_ATTRIBUTE);
listenerDef.getPropertyValues().add("responseRoutingKey", responseRoutingKey);
}
listenerDef.setBeanClass(MessageListenerAdapter.class);
containerDef.getPropertyValues().add("messageListener", listenerDef);
String exclusive = listenerEle.getAttribute(EXCLUSIVE);
if (StringUtils.hasText(exclusive)) {
containerDef.getPropertyValues().add("exclusive", exclusive);
}
String childElementId = listenerEle.getAttribute(ID_ATTRIBUTE);
String containerBeanName = StringUtils.hasText(childElementId) ? childElementId :
BeanDefinitionReaderUtils.generateBeanName(containerDef, parserContext.getRegistry());
if (!NamespaceUtils.isAttributeDefined(listenerEle, QUEUE_NAMES_ATTRIBUTE)
&& !NamespaceUtils.isAttributeDefined(listenerEle, QUEUES_ATTRIBUTE)) {
parserContext.getReaderContext().error("Listener 'queue-names' or 'queues' attribute must be provided.",
listenerEle);
}
if (NamespaceUtils.isAttributeDefined(listenerEle, QUEUE_NAMES_ATTRIBUTE)
&& NamespaceUtils.isAttributeDefined(listenerEle, QUEUES_ATTRIBUTE)) {
parserContext.getReaderContext().error("Listener 'queue-names' or 'queues' attribute must be provided but not both.",
listenerEle);
}
String queueNames = listenerEle.getAttribute(QUEUE_NAMES_ATTRIBUTE);
if (StringUtils.hasText(queueNames)) {
String[] names = StringUtils.commaDelimitedListToStringArray(queueNames);
List values = new ManagedList();
for (int i = 0; i < names.length; i++) {
values.add(new TypedStringValue(names[i].trim()));
}
containerDef.getPropertyValues().add("queueNames", values);
}
String queues = listenerEle.getAttribute(QUEUES_ATTRIBUTE);
if (StringUtils.hasText(queues)) {
String[] names = StringUtils.commaDelimitedListToStringArray(queues);
List values = new ManagedList();
for (int i = 0; i < names.length; i++) {
values.add(new RuntimeBeanReference(names[i].trim()));
}
containerDef.getPropertyValues().add("queues", values);
}
ManagedMap args = new ManagedMap();
String priority = listenerEle.getAttribute("priority");
if (StringUtils.hasText(priority)) {
args.put("x-priority", new TypedStringValue(priority, Integer.class));
}
if (args.size() > 0) {
containerDef.getPropertyValues().add("consumerArguments", args);
}
String admin = listenerEle.getAttribute("admin");
if (StringUtils.hasText(admin)) {
containerDef.getPropertyValues().add("rabbitAdmin", new RuntimeBeanReference(admin));
}
// Register the listener and fire event
parserContext.registerBeanComponent(new BeanComponentDefinition(containerDef, containerBeanName));
if (containerList != null) {
containerList.add(new RuntimeBeanReference(containerBeanName));
}
}
}