package org.springframework.amqp.component.xml;
import org.w3c.dom.Element;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.ManagedSet;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import static org.springframework.util.StringUtils.hasText;
import org.springframework.amqp.component.BindingImpl;
import java.util.*;
public class BindingBeanDefinitionParser extends AbstractComponentBeanDefinitionReader {
@Override
protected Class getBeanClass(Element element) {
return BindingImpl.class;
}
@Override
protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
// resolve exchanges
ManagedSet exchangeRefs = handleReferences("exchange", element, parserContext);
if (exchangeRefs.isEmpty())
parserContext.getReaderContext().error("No exchange reference(s) found for binding", element);
builder.addPropertyValue("exchanges", exchangeRefs);
// resolve queues
ManagedSet queueRefs = handleReferences("queue", element, parserContext);
if (queueRefs.isEmpty())
parserContext.getReaderContext().error("No queue reference(s) found for binding", element);
builder.addPropertyValue("queues", queueRefs);
// handle keys
Set<String> allKeys = new HashSet<String>();
String key = element.getAttribute("key");
if (hasText(key))
allKeys.add(key);
String keys = element.getAttribute("keys");
if (hasText(keys))
allKeys.addAll(listTokensToSet(keys));
builder.addPropertyValue("keys", allKeys);
}
protected ManagedSet handleReferences(String component, Element element, ParserContext parserContext) {
return createReferences(parseReferences(component, element), element, parserContext);
}
@SuppressWarnings({"unchecked"})
protected Set<String> parseReferences(String component, Element element) {
Set<String> referenceSet = new HashSet<String>();
String reference = element.getAttribute(String.format("%s-ref", component));
if (hasText(reference))
referenceSet.add(reference);
String referenceList = element.getAttribute(String.format("%s-refs", component));
if (hasText(referenceList))
referenceSet.addAll(listTokensToSet(referenceList));
return referenceSet;
}
@SuppressWarnings({"unchecked"})
protected ManagedSet createReferences(Set<String> referenceSet, Element element, ParserContext parserContext) {
ManagedSet managedSet = new ManagedSet(referenceSet.size());
for (String reference : referenceSet) {
RuntimeBeanReference beanReference = new RuntimeBeanReference(reference);
beanReference.setSource(parserContext.extractSource(element));
managedSet.add(beanReference);
}
return managedSet;
}
}