Minimizing class loading in parsers and using the parser context error handling capabilities rather than throwing Exceptions or using assertions. This facilitates proper tooling support (INT-114).

This commit is contained in:
Mark Fisher
2008-12-11 17:49:01 +00:00
parent 9463290328
commit 788d177f1a
28 changed files with 173 additions and 152 deletions

View File

@@ -25,8 +25,6 @@ import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
@@ -60,9 +58,12 @@ public abstract class AbstractChannelAdapterParser extends AbstractBeanDefinitio
private String createDirectChannel(Element element, ParserContext parserContext) {
String channelId = element.getAttribute("id");
Assert.hasText(channelId, "The channel-adapter's 'id' attribute is required when no 'channel' "
+ "reference has been provided, because that 'id' would be used for the created channel.");
BeanDefinitionBuilder channelBuilder = BeanDefinitionBuilder.genericBeanDefinition(DirectChannel.class);
if (!StringUtils.hasText(channelId)) {
parserContext.getReaderContext().error("The channel-adapter's 'id' attribute is required when no 'channel' "
+ "reference has been provided, because that 'id' would be used for the created channel.", element);
}
BeanDefinitionBuilder channelBuilder = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".channel.DirectChannel");
BeanDefinitionHolder holder = new BeanDefinitionHolder(channelBuilder.getBeanDefinition(), channelId);
BeanDefinitionReaderUtils.registerBeanDefinition(holder, parserContext.getRegistry());
return channelId;

View File

@@ -26,8 +26,6 @@ import org.springframework.beans.factory.support.ManagedList;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.channel.interceptor.MessageSelectingInterceptor;
import org.springframework.integration.selector.PayloadTypeSelector;
import org.springframework.util.StringUtils;
import org.springframework.util.xml.DomUtils;
@@ -54,12 +52,14 @@ public abstract class AbstractChannelParser extends AbstractBeanDefinitionParser
String datatypeAttr = element.getAttribute("datatype");
if (StringUtils.hasText(datatypeAttr)) {
String[] datatypes = StringUtils.commaDelimitedListToStringArray(datatypeAttr);
RootBeanDefinition selectorDef = new RootBeanDefinition(PayloadTypeSelector.class);
RootBeanDefinition selectorDef = new RootBeanDefinition();
selectorDef.setBeanClassName(IntegrationNamespaceUtils.BASE_PACKAGE + ".selector.PayloadTypeSelector");
selectorDef.getConstructorArgumentValues().addGenericArgumentValue(datatypes);
String selectorBeanName = parserContext.getReaderContext().generateBeanName(selectorDef);
BeanComponentDefinition selectorComponent = new BeanComponentDefinition(selectorDef, selectorBeanName);
parserContext.registerBeanComponent(selectorComponent);
RootBeanDefinition interceptorDef = new RootBeanDefinition(MessageSelectingInterceptor.class);
RootBeanDefinition interceptorDef = new RootBeanDefinition();
interceptorDef.setBeanClassName(IntegrationNamespaceUtils.BASE_PACKAGE + ".channel.interceptor.MessageSelectingInterceptor");
interceptorDef.getConstructorArgumentValues().addGenericArgumentValue(new RuntimeBeanReference(selectorBeanName));
String interceptorBeanName = parserContext.getReaderContext().generateBeanName(interceptorDef);
BeanComponentDefinition interceptorComponent = new BeanComponentDefinition(interceptorDef, interceptorBeanName);

View File

@@ -24,8 +24,6 @@ import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.config.ConsumerEndpointFactoryBean;
import org.springframework.util.xml.DomUtils;
/**
@@ -72,12 +70,14 @@ public abstract class AbstractConsumerEndpointParser extends AbstractBeanDefinit
}
return handlerBeanDefinition;
}
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(ConsumerEndpointFactoryBean.class);
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".config.ConsumerEndpointFactoryBean");
String handlerBeanName = BeanDefinitionReaderUtils.registerWithGeneratedName(handlerBeanDefinition, parserContext.getRegistry());
builder.addConstructorArgReference(handlerBeanName);
String inputChannelName = element.getAttribute(inputChannelAttributeName);
if (!parserContext.getRegistry().containsBeanDefinition(inputChannelName)) {
BeanDefinitionBuilder channelDef = BeanDefinitionBuilder.genericBeanDefinition(DirectChannel.class);
BeanDefinitionBuilder channelDef = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".channel.DirectChannel");
BeanDefinitionHolder holder = new BeanDefinitionHolder(channelDef.getBeanDefinition(), inputChannelName);
BeanDefinitionReaderUtils.registerBeanDefinition(holder, parserContext.getRegistry());
}

View File

@@ -22,8 +22,7 @@ import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.config.ConsumerEndpointFactoryBean;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.springframework.util.xml.DomUtils;
/**
@@ -36,10 +35,14 @@ public abstract class AbstractOutboundChannelAdapterParser extends AbstractChann
@Override
protected AbstractBeanDefinition doParse(Element element, ParserContext parserContext, String channelName) {
Element pollerElement = DomUtils.getChildElementByTagName(element, "poller");
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(ConsumerEndpointFactoryBean.class);
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".config.ConsumerEndpointFactoryBean");
builder.addConstructorArgReference(this.parseAndRegisterConsumer(element, parserContext));
if (pollerElement != null) {
Assert.hasText(channelName, "outbound channel adapter with a 'poller' requires a 'channel' to poll");
if (!StringUtils.hasText(channelName)) {
parserContext.getReaderContext().error(
"outbound channel adapter with a 'poller' requires a 'channel' to poll", element);
}
IntegrationNamespaceUtils.configurePollerMetadata(pollerElement, builder, parserContext);
}
builder.addPropertyValue("inputChannelName", channelName);
@@ -53,7 +56,10 @@ public abstract class AbstractOutboundChannelAdapterParser extends AbstractChann
*/
protected String parseAndRegisterConsumer(Element element, ParserContext parserContext) {
AbstractBeanDefinition definition = this.parseConsumer(element, parserContext);
Assert.notNull(definition, "Consumer parsing must return a BeanDefinition.");
if (definition == null) {
parserContext.getReaderContext().error(
"Consumer parsing must return a BeanDefinition.", element);
}
return BeanDefinitionReaderUtils.registerWithGeneratedName(
definition, parserContext.getRegistry());
}

View File

@@ -21,8 +21,7 @@ import org.w3c.dom.Element;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.config.SourcePollingChannelAdapterFactoryBean;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.springframework.util.xml.DomUtils;
/**
@@ -35,8 +34,11 @@ public abstract class AbstractPollingInboundChannelAdapterParser extends Abstrac
@Override
protected AbstractBeanDefinition doParse(Element element, ParserContext parserContext, String channelName) {
String source = this.parseSource(element, parserContext);
Assert.hasText(source, "failed to parse source");
BeanDefinitionBuilder adapterBuilder = BeanDefinitionBuilder.genericBeanDefinition(SourcePollingChannelAdapterFactoryBean.class);
if (!StringUtils.hasText(source)) {
parserContext.getReaderContext().error("failed to parse source", element);
}
BeanDefinitionBuilder adapterBuilder = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".config.SourcePollingChannelAdapterFactoryBean");
adapterBuilder.addPropertyReference("source", source);
adapterBuilder.addPropertyReference("outputChannel", channelName);
Element pollerElement = DomUtils.getChildElementByTagName(element, "poller");

View File

@@ -21,9 +21,6 @@ import org.w3c.dom.Element;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.aggregator.CompletionStrategyAdapter;
import org.springframework.integration.aggregator.MethodInvokingAggregator;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
@@ -56,9 +53,12 @@ public class AggregatorParser extends AbstractConsumerEndpointParser {
@Override
protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MethodInvokingAggregator.class);
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".aggregator.MethodInvokingAggregator");
String ref = element.getAttribute(REF_ATTRIBUTE);
Assert.hasText(ref, "The '" + REF_ATTRIBUTE + "' attribute is required.");
if (!StringUtils.hasText(ref)) {
parserContext.getReaderContext().error("The '" + REF_ATTRIBUTE + "' attribute is required.", element);
}
builder.addConstructorArgReference(ref);
if (StringUtils.hasText(element.getAttribute(METHOD_ATTRIBUTE))) {
String method = element.getAttribute(METHOD_ATTRIBUTE);
@@ -87,7 +87,8 @@ public class AggregatorParser extends AbstractConsumerEndpointParser {
}
private String createCompletionStrategyAdapter(String ref, String method, ParserContext parserContext) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(CompletionStrategyAdapter.class);
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".aggregator.CompletionStrategyAdapter");
builder.addConstructorArgReference(ref);
builder.addConstructorArgValue(method);
return BeanDefinitionReaderUtils.registerWithGeneratedName(builder.getBeanDefinition(), parserContext.getRegistry());

View File

@@ -24,25 +24,28 @@ import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.config.annotation.MessagingAnnotationPostProcessor;
/**
* Parser for the <annotation-config> element of the integration namespace.
* Adds a {@link MessagingAnnotationPostProcessor} to the application context.
* Adds a {@link org.springframework.integration.config.annotation.MessagingAnnotationPostProcessor}
* to the application context.
*
* @author Mark Fisher
*/
public class AnnotationConfigParser extends AbstractSingleBeanDefinitionParser {
private final static String PACKAGE_NAME = IntegrationNamespaceUtils.BASE_PACKAGE + ".config.annotation";
@Override
protected Class<?> getBeanClass(Element element) {
return MessagingAnnotationPostProcessor.class;
protected String getBeanClassName(Element element) {
return PACKAGE_NAME + ".MessagingAnnotationPostProcessor";
}
@Override
protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext)
throws BeanDefinitionStoreException {
return "internal." + MessagingAnnotationPostProcessor.class.getName();
return PACKAGE_NAME + ".internalMessagingAnnotationPostProcessor";
}
@Override

View File

@@ -25,7 +25,6 @@ import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.context.event.SimpleApplicationEventMulticaster;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.core.task.TaskExecutor;
import org.springframework.integration.context.IntegrationContextUtils;
@@ -40,8 +39,8 @@ import org.springframework.util.StringUtils;
public class ApplicationEventMulticasterParser extends AbstractSingleBeanDefinitionParser {
@Override
protected Class<?> getBeanClass(Element element) {
return SimpleApplicationEventMulticaster.class;
protected String getBeanClassName(Element element) {
return "org.springframework.context.event.SimpleApplicationEventMulticaster";
}
@Override

View File

@@ -20,7 +20,6 @@ import org.w3c.dom.Element;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.handler.BridgeHandler;
/**
* Parser for the &lt;bridge&gt; element.
@@ -31,7 +30,8 @@ public class BridgeParser extends AbstractConsumerEndpointParser {
@Override
protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) {
return BeanDefinitionBuilder.genericBeanDefinition(BridgeHandler.class);
return BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".handler.BridgeHandler");
}
}

View File

@@ -21,14 +21,12 @@ import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.support.ManagedList;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.handler.MessageHandlerChain;
import org.springframework.util.Assert;
/**
* Parser for the &lt;chain&gt; element.
@@ -40,7 +38,8 @@ public class ChainParser extends AbstractConsumerEndpointParser {
@Override
@SuppressWarnings("unchecked")
protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MessageHandlerChain.class);
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".handler.MessageHandlerChain");
ManagedList handlerList = new ManagedList();
NodeList children = element.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
@@ -56,10 +55,13 @@ public class ChainParser extends AbstractConsumerEndpointParser {
private String parseChild(Element element, ParserContext parserContext, BeanDefinition parentDefinition) {
BeanDefinition beanDefinition = parserContext.getDelegate().parseCustomElement(element, parentDefinition);
Assert.notNull(beanDefinition, "BeanDefinition must not be null");
Assert.isInstanceOf(AbstractBeanDefinition.class, beanDefinition);
return BeanDefinitionReaderUtils.registerWithGeneratedName(
(AbstractBeanDefinition) beanDefinition, parserContext.getRegistry());
if (beanDefinition == null) {
parserContext.getReaderContext().error("child BeanDefinition must not be null", element);
}
String beanName = BeanDefinitionReaderUtils.generateBeanName(beanDefinition, parserContext.getRegistry());
BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, beanName);
BeanDefinitionReaderUtils.registerBeanDefinition(holder, parserContext.getRegistry());
return beanName;
}
}

View File

@@ -21,9 +21,6 @@ import org.w3c.dom.Element;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.filter.MessageFilter;
import org.springframework.integration.filter.MethodInvokingSelector;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
@@ -35,7 +32,8 @@ public class FilterParser extends AbstractConsumerEndpointParser {
@Override
protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MessageFilter.class);
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".filter.MessageFilter");
builder.addConstructorArgReference(this.parseSelector(element, parserContext));
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "throw-exception-on-rejection");
return builder;
@@ -43,12 +41,15 @@ public class FilterParser extends AbstractConsumerEndpointParser {
private String parseSelector(Element element, ParserContext parserContext) {
String ref = element.getAttribute("ref");
Assert.hasText(ref, "The 'ref' attribute is required.");
if (!StringUtils.hasText(ref)) {
parserContext.getReaderContext().error("The 'ref' attribute is required.", element);
}
String method = element.getAttribute("method");
if (!StringUtils.hasText(method)) {
return ref;
}
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MethodInvokingSelector.class);
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".filter.MethodInvokingSelector");
builder.addConstructorArgReference(ref);
builder.addConstructorArgValue(method);
return BeanDefinitionReaderUtils.registerWithGeneratedName(

View File

@@ -20,7 +20,6 @@ import org.w3c.dom.Element;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser;
import org.springframework.integration.gateway.GatewayProxyFactoryBean;
import org.springframework.util.ObjectUtils;
/**
@@ -36,8 +35,8 @@ public class GatewayParser extends AbstractSimpleBeanDefinitionParser {
@Override
protected Class<?> getBeanClass(Element element) {
return GatewayProxyFactoryBean.class;
protected String getBeanClassName(Element element) {
return IntegrationNamespaceUtils.BASE_PACKAGE + ".gateway.GatewayProxyFactoryBean";
}
@Override

View File

@@ -21,8 +21,6 @@ import org.w3c.dom.Element;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.message.MethodInvokingMessageSource;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
@@ -35,10 +33,13 @@ public class MethodInvokingInboundChannelAdapterParser extends AbstractPollingIn
@Override
protected String parseSource(Element element, ParserContext parserContext) {
String sourceRef = element.getAttribute("ref");
Assert.hasText(sourceRef, "The 'ref' attribute is required.");
if (!StringUtils.hasText(sourceRef)) {
parserContext.getReaderContext().error("The 'ref' attribute is required.", element);
}
String methodName = element.getAttribute("method");
if (StringUtils.hasText(methodName)) {
BeanDefinitionBuilder invokerBuilder = BeanDefinitionBuilder.genericBeanDefinition(MethodInvokingMessageSource.class);
BeanDefinitionBuilder invokerBuilder = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".message.MethodInvokingMessageSource");
invokerBuilder.addPropertyReference("object", sourceRef);
invokerBuilder.addPropertyValue("methodName", methodName);
sourceRef = BeanDefinitionReaderUtils.registerWithGeneratedName(

View File

@@ -22,8 +22,6 @@ import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.handler.MethodInvokingMessageHandler;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
@@ -36,7 +34,9 @@ public class MethodInvokingOutboundChannelAdapterParser extends AbstractOutbound
@Override
protected String parseAndRegisterConsumer(Element element, ParserContext parserContext) {
String consumerRef = element.getAttribute("ref");
Assert.isTrue(StringUtils.hasText(consumerRef), "The 'ref' attribute is required.");
if (!StringUtils.hasText(consumerRef)) {
parserContext.getReaderContext().error("The 'ref' attribute is required.", element);
}
if (element.hasAttribute("method")) {
consumerRef = BeanDefinitionReaderUtils.registerWithGeneratedName(
this.parseConsumer(element, parserContext), parserContext.getRegistry());
@@ -46,7 +46,8 @@ public class MethodInvokingOutboundChannelAdapterParser extends AbstractOutbound
@Override
protected AbstractBeanDefinition parseConsumer(Element element, ParserContext parserContext) {
BeanDefinitionBuilder invokerBuilder = BeanDefinitionBuilder.genericBeanDefinition(MethodInvokingMessageHandler.class);
BeanDefinitionBuilder invokerBuilder = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".handler.MethodInvokingMessageHandler");
invokerBuilder.addConstructorArgReference(element.getAttribute("ref"));
invokerBuilder.addConstructorArgValue(element.getAttribute("method"));
return invokerBuilder.getBeanDefinition();

View File

@@ -20,10 +20,6 @@ import org.w3c.dom.Element;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.channel.PriorityChannel;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.channel.RendezvousChannel;
import org.springframework.util.StringUtils;
import org.springframework.util.xml.DomUtils;
@@ -34,7 +30,7 @@ import org.springframework.util.xml.DomUtils;
*/
public class PointToPointChannelParser extends AbstractChannelParser {
private static final String CAPACITY_ATTRIBUTE = "capacity";
private static final String CHANNEL_PACKAGE = IntegrationNamespaceUtils.BASE_PACKAGE + ".channel";
@Override
@@ -42,11 +38,11 @@ public class PointToPointChannelParser extends AbstractChannelParser {
BeanDefinitionBuilder builder = null;
Element queueElement = null;
if ((queueElement = DomUtils.getChildElementByTagName(element, "queue")) != null) {
builder = BeanDefinitionBuilder.genericBeanDefinition(QueueChannel.class);
builder = BeanDefinitionBuilder.genericBeanDefinition(CHANNEL_PACKAGE + ".QueueChannel");
this.parseQueueCapacity(builder, queueElement);
}
else if ((queueElement = DomUtils.getChildElementByTagName(element, "priority-queue")) != null) {
builder = BeanDefinitionBuilder.genericBeanDefinition(PriorityChannel.class);
builder = BeanDefinitionBuilder.genericBeanDefinition(CHANNEL_PACKAGE + ".PriorityChannel");
this.parseQueueCapacity(builder, queueElement);
String comparatorRef = queueElement.getAttribute("comparator");
if (StringUtils.hasText(comparatorRef)) {
@@ -54,16 +50,16 @@ public class PointToPointChannelParser extends AbstractChannelParser {
}
}
else if ((queueElement = DomUtils.getChildElementByTagName(element, "rendezvous-queue")) != null) {
builder = BeanDefinitionBuilder.genericBeanDefinition(RendezvousChannel.class);
builder = BeanDefinitionBuilder.genericBeanDefinition(CHANNEL_PACKAGE + ".RendezvousChannel");
}
else {
builder = BeanDefinitionBuilder.genericBeanDefinition(DirectChannel.class);
builder = BeanDefinitionBuilder.genericBeanDefinition(CHANNEL_PACKAGE + ".DirectChannel");
}
return builder;
}
private void parseQueueCapacity(BeanDefinitionBuilder builder, Element queueElement) {
String capacity = queueElement.getAttribute(CAPACITY_ATTRIBUTE);
String capacity = queueElement.getAttribute("capacity");
if (StringUtils.hasText(capacity)) {
builder.addConstructorArgValue(Integer.valueOf(capacity));
}

View File

@@ -27,11 +27,8 @@ import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.context.IntegrationContextUtils;
import org.springframework.integration.scheduling.CronTrigger;
import org.springframework.integration.scheduling.IntervalTrigger;
import org.springframework.integration.scheduling.PollerMetadata;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.springframework.util.xml.DomUtils;
/**
@@ -45,8 +42,9 @@ public class PollerParser extends AbstractBeanDefinitionParser {
protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) throws BeanDefinitionStoreException {
String id = super.resolveId(element, definition, parserContext);
if (element.getAttribute("default").equals("true")) {
Assert.isTrue(!parserContext.getRegistry().isBeanNameInUse(IntegrationContextUtils.DEFAULT_POLLER_METADATA_BEAN_NAME),
"only one default <poller/> element is allowed per context");
if (parserContext.getRegistry().isBeanNameInUse(IntegrationContextUtils.DEFAULT_POLLER_METADATA_BEAN_NAME)) {
parserContext.getReaderContext().error("only one default <poller/> element is allowed per context", element);
}
parserContext.getRegistry().registerAlias(id, IntegrationContextUtils.DEFAULT_POLLER_METADATA_BEAN_NAME);
}
return id;
@@ -54,9 +52,12 @@ public class PollerParser extends AbstractBeanDefinitionParser {
@Override
protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
BeanDefinitionBuilder metadataBuilder = BeanDefinitionBuilder.genericBeanDefinition(PollerMetadata.class);
Assert.isTrue(!element.hasAttribute("ref"),
"the 'ref' attribute must not be present on a 'poller' element submitted to the parser");
BeanDefinitionBuilder metadataBuilder = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".scheduling.PollerMetadata");
if (element.hasAttribute("ref")) {
parserContext.getReaderContext().error(
"the 'ref' attribute must not be present on a 'poller' element submitted to the parser", element);
}
configureTrigger(element, metadataBuilder, parserContext);
IntegrationNamespaceUtils.setValueIfAttributeDefined(metadataBuilder, element, "max-messages-per-poll");
Element txElement = DomUtils.getChildElementByTagName(element, "transactional");
@@ -75,8 +76,10 @@ public class PollerParser extends AbstractBeanDefinitionParser {
}
else {
Element cronElement = DomUtils.getChildElementByTagName(pollerElement, "cron-trigger");
Assert.notNull(cronElement,
"A <poller> element must include either an <interval-trigger/> or <cron-trigger/> child element.");
if (cronElement == null) {
parserContext.getReaderContext().error(
"A <poller> element must include either an <interval-trigger/> or <cron-trigger/> child element.", pollerElement);
}
triggerBeanName = parseCronTrigger(cronElement, parserContext);
}
targetBuilder.addPropertyReference("trigger", triggerBeanName);
@@ -87,9 +90,12 @@ public class PollerParser extends AbstractBeanDefinitionParser {
*/
private String parseIntervalTrigger(Element element, ParserContext parserContext) {
String interval = element.getAttribute("interval");
Assert.hasText(interval, "the 'interval' attribute is required for an <interval-trigger/>");
if (!StringUtils.hasText(interval)) {
parserContext.getReaderContext().error("the 'interval' attribute is required for an <interval-trigger/>", element);
}
TimeUnit timeUnit = TimeUnit.valueOf(element.getAttribute("time-unit"));
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(IntervalTrigger.class);
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".scheduling.IntervalTrigger");
builder.addConstructorArgValue(interval);
builder.addConstructorArgValue(timeUnit);
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "initial-delay");
@@ -102,8 +108,11 @@ public class PollerParser extends AbstractBeanDefinitionParser {
*/
private String parseCronTrigger(Element element, ParserContext parserContext) {
String cronExpression = element.getAttribute("expression");
Assert.hasText(cronExpression, "the 'expression' attribute is required for a <cron-trigger/>");
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(CronTrigger.class);
if (!StringUtils.hasText(cronExpression)) {
parserContext.getReaderContext().error("the 'expression' attribute is required for a <cron-trigger/>", element);
}
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".scheduling.CronTrigger");
builder.addConstructorArgValue(cronExpression);
return BeanDefinitionReaderUtils.registerWithGeneratedName(builder.getBeanDefinition(), parserContext.getRegistry());
}

View File

@@ -20,7 +20,6 @@ import org.w3c.dom.Element;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.channel.PublishSubscribeChannel;
import org.springframework.util.StringUtils;
/**
@@ -32,7 +31,8 @@ public class PublishSubscribeChannelParser extends AbstractChannelParser {
@Override
protected BeanDefinitionBuilder buildBeanDefinition(Element element, ParserContext parserContext) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(PublishSubscribeChannel.class);
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".channel.PublishSubscribeChannel");
String taskExecutorRef = element.getAttribute("task-executor");
if (StringUtils.hasText(taskExecutorRef)) {
builder.addConstructorArgReference(taskExecutorRef);

View File

@@ -20,7 +20,6 @@ import org.w3c.dom.Element;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.aggregator.Resequencer;
/**
* Parser for the &lt;resequencer&gt; element.
@@ -29,31 +28,17 @@ import org.springframework.integration.aggregator.Resequencer;
*/
public class ResequencerParser extends AbstractConsumerEndpointParser {
private static final String DISCARD_CHANNEL_ATTRIBUTE = "discard-channel";
private static final String SEND_TIMEOUT_ATTRIBUTE = "send-timeout";
private static final String RELEASE_PARTIAL_SEQUENCES = "release-partial-sequences";
private static final String SEND_PARTIAL_RESULT_ON_TIMEOUT_ATTRIBUTE = "send-partial-result-on-timeout";
private static final String REAPER_INTERVAL_ATTRIBUTE = "reaper-interval";
private static final String TRACKED_CORRELATION_ID_CAPACITY_ATTRIBUTE = "tracked-correlation-id-capacity";
private static final String TIMEOUT_ATTRIBUTE = "timeout";
@Override
protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(Resequencer.class);
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, DISCARD_CHANNEL_ATTRIBUTE);
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, SEND_TIMEOUT_ATTRIBUTE);
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, RELEASE_PARTIAL_SEQUENCES);
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, SEND_PARTIAL_RESULT_ON_TIMEOUT_ATTRIBUTE);
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, REAPER_INTERVAL_ATTRIBUTE);
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, TRACKED_CORRELATION_ID_CAPACITY_ATTRIBUTE);
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, TIMEOUT_ATTRIBUTE);
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".aggregator.Resequencer");
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "discard-channel");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "send-timeout");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "release-partial-sequences");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "send-partial-result-on-timeout");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "reaper-interval");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "tracked-correlation-id-capacity");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "timeout");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "auto-startup");
return builder;
}

View File

@@ -21,9 +21,6 @@ import org.w3c.dom.Element;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.channel.BeanFactoryChannelResolver;
import org.springframework.integration.config.RouterFactoryBean;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
@@ -36,14 +33,18 @@ public class RouterParser extends AbstractConsumerEndpointParser {
@Override
protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) {
String ref = element.getAttribute(REF_ATTRIBUTE);
Assert.hasText(ref, "The '" + REF_ATTRIBUTE + "' attribute is required.");
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(RouterFactoryBean.class);
if (!StringUtils.hasText(ref)) {
parserContext.getReaderContext().error("The '" + REF_ATTRIBUTE + "' attribute is required.", element);
}
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".config.RouterFactoryBean");
builder.addPropertyReference("targetObject", ref);
if (StringUtils.hasText(element.getAttribute(METHOD_ATTRIBUTE))) {
String method = element.getAttribute(METHOD_ATTRIBUTE);
builder.addPropertyValue("targetMethodName", method);
}
BeanDefinitionBuilder resolverBuilder = BeanDefinitionBuilder.genericBeanDefinition(BeanFactoryChannelResolver.class);
BeanDefinitionBuilder resolverBuilder = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".channel.BeanFactoryChannelResolver");
String resolverBeanName = BeanDefinitionReaderUtils.registerWithGeneratedName(
resolverBuilder.getBeanDefinition(), parserContext.getRegistry());
builder.addPropertyReference("channelResolver", resolverBeanName);

View File

@@ -26,8 +26,7 @@ import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.support.ManagedList;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.selector.MessageSelectorChain;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
* Parser for the &lt;selector-chain/&gt; element.
@@ -36,13 +35,18 @@ import org.springframework.util.Assert;
*/
public class SelectorChainParser extends AbstractSingleBeanDefinitionParser {
private static final String SELECTOR_CHAIN_CLASSNAME = IntegrationNamespaceUtils.BASE_PACKAGE + ".selector.MessageSelectorChain";
@Override
protected Class<?> getBeanClass(Element element) {
return MessageSelectorChain.class;
protected String getBeanClassName(Element element) {
return SELECTOR_CHAIN_CLASSNAME;
}
public void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
Assert.hasText(element.getAttribute("id"), "id is required");
if (!StringUtils.hasText(element.getAttribute("id"))) {
parserContext.getReaderContext().error("id is required", element);
}
this.parseSelectorChain(builder, element, parserContext);
}
@@ -61,7 +65,7 @@ public class SelectorChainParser extends AbstractSingleBeanDefinitionParser {
}
else if ("selector-chain".equals(nodeName)) {
BeanDefinitionBuilder nestedBuilder =
BeanDefinitionBuilder.genericBeanDefinition(MessageSelectorChain.class);
BeanDefinitionBuilder.genericBeanDefinition(SELECTOR_CHAIN_CLASSNAME);
this.parseSelectorChain(nestedBuilder, (Element) child, parserContext);
String nestedBeanName = BeanDefinitionReaderUtils.registerWithGeneratedName(
nestedBuilder.getBeanDefinition(), parserContext.getRegistry());

View File

@@ -20,8 +20,6 @@ import org.w3c.dom.Element;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.handler.ServiceActivatingHandler;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
@@ -33,9 +31,12 @@ public class ServiceActivatorParser extends AbstractConsumerEndpointParser {
@Override
protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(ServiceActivatingHandler.class);
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".handler.ServiceActivatingHandler");
String ref = element.getAttribute(REF_ATTRIBUTE);
Assert.hasText(ref, "The '" + REF_ATTRIBUTE + "' attribute is required.");
if (!StringUtils.hasText(ref)) {
parserContext.getReaderContext().error("The '" + REF_ATTRIBUTE + "' attribute is required.", element);
}
builder.addConstructorArgReference(ref);
if (StringUtils.hasText(element.getAttribute(METHOD_ATTRIBUTE))) {
String method = element.getAttribute(METHOD_ATTRIBUTE);

View File

@@ -93,7 +93,7 @@ public class SimpleHeaderEnricherParser extends AbstractTransformerParser {
headers.put(name, value);
}
}
this.postProcessHeaders(element, headers);
this.postProcessHeaders(element, headers, parserContext);
builder.addConstructorArgValue(headers);
builder.addPropertyValue("overwrite", this.shouldOverwrite(element));
}
@@ -101,7 +101,7 @@ public class SimpleHeaderEnricherParser extends AbstractTransformerParser {
/**
* Subclasses may implement this method to provide additional headers.
*/
protected void postProcessHeaders(Element element, ManagedMap headers) {
protected void postProcessHeaders(Element element, ManagedMap headers, ParserContext parserContext) {
}
}

View File

@@ -20,7 +20,6 @@ import org.w3c.dom.Element;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.config.SplitterFactoryBean;
import org.springframework.util.StringUtils;
/**
@@ -32,7 +31,8 @@ public class SplitterParser extends AbstractConsumerEndpointParser {
@Override
protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(SplitterFactoryBean.class);
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".config.SplitterFactoryBean");
if (element.hasAttribute(REF_ATTRIBUTE)) {
String ref = element.getAttribute(REF_ATTRIBUTE);
builder.addPropertyReference("targetObject", ref);

View File

@@ -22,8 +22,8 @@ import org.w3c.dom.NodeList;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.ManagedMap;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.core.MessageHeaders;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
@@ -49,7 +49,7 @@ public class StandardHeaderEnricherParser extends SimpleHeaderEnricherParser {
@Override
@SuppressWarnings("unchecked")
protected void postProcessHeaders(Element element, ManagedMap headers) {
protected void postProcessHeaders(Element element, ManagedMap headers, ParserContext parserContext) {
NodeList childNodes = element.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
Node node = childNodes.item(i);
@@ -60,7 +60,10 @@ public class StandardHeaderEnricherParser extends SimpleHeaderEnricherParser {
String ref = headerElement.getAttribute("ref");
boolean isValue = StringUtils.hasText(value);
boolean isRef = StringUtils.hasText(ref);
Assert.isTrue(isValue ^ isRef, "Exactly one of the 'value' or 'ref' attributes is required.");
if (!(isValue ^ isRef)) {
parserContext.getReaderContext().error(
"Exactly one of the 'value' or 'ref' attributes is required.", element);
}
if (isValue) {
headers.put(name, value);
}

View File

@@ -20,7 +20,6 @@ import org.w3c.dom.Element;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.channel.ThreadLocalChannel;
/**
* Parser for the &lt;thread-local-channel&gt; element.
@@ -31,7 +30,8 @@ public class ThreadLocalChannelParser extends AbstractChannelParser {
@Override
protected BeanDefinitionBuilder buildBeanDefinition(Element element, ParserContext parserContext) {
return BeanDefinitionBuilder.genericBeanDefinition(ThreadLocalChannel.class);
return BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".channel.ThreadLocalChannel");
}
}

View File

@@ -23,10 +23,11 @@ import org.w3c.dom.Element;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.util.StringUtils;
/**
* Parser for the 'thread-pool-task-executor' element.
*
* @author Mark Fisher
*/
public class ThreadPoolTaskExecutorParser extends AbstractSimpleBeanDefinitionParser {
@@ -39,8 +40,8 @@ public class ThreadPoolTaskExecutorParser extends AbstractSimpleBeanDefinitionPa
@Override
protected Class<?> getBeanClass(Element element) {
return ThreadPoolTaskExecutor.class;
protected String getBeanClassName(Element element) {
return "org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor";
}
@Override

View File

@@ -21,9 +21,6 @@ import org.w3c.dom.Element;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.transformer.MessageTransformingHandler;
import org.springframework.integration.transformer.MethodInvokingTransformer;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
@@ -33,21 +30,28 @@ import org.springframework.util.StringUtils;
*/
public class TransformerParser extends AbstractConsumerEndpointParser {
private final static String TRANSFORMER_PACKAGE = IntegrationNamespaceUtils.BASE_PACKAGE + ".transformer";
@Override
protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MessageTransformingHandler.class);
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
TRANSFORMER_PACKAGE + ".MessageTransformingHandler");
builder.addConstructorArgReference(this.parseTransformer(element, parserContext));
return builder;
}
private String parseTransformer(Element element, ParserContext parserContext) {
String ref = element.getAttribute("ref");
Assert.hasText(ref, "The 'ref' attribute is required.");
if (!StringUtils.hasText(ref)) {
parserContext.getReaderContext().error("The 'ref' attribute is required.", element);
}
String method = element.getAttribute("method");
if (!StringUtils.hasText(method)) {
return ref;
}
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MethodInvokingTransformer.class);
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
TRANSFORMER_PACKAGE + ".MethodInvokingTransformer");
builder.addConstructorArgReference(ref);
builder.addConstructorArgValue(method);
return BeanDefinitionReaderUtils.registerWithGeneratedName(

View File

@@ -21,8 +21,6 @@ import org.w3c.dom.Element;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.channel.interceptor.WireTap;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
@@ -33,9 +31,12 @@ import org.springframework.util.StringUtils;
public class WireTapParser implements BeanDefinitionRegisteringParser {
public String parse(Element element, ParserContext parserContext) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(WireTap.class);
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
IntegrationNamespaceUtils.BASE_PACKAGE + ".channel.interceptor.WireTap");
String targetRef = element.getAttribute("channel");
Assert.hasText(targetRef, "the 'channel' attribute is required");
if (!StringUtils.hasText(targetRef)) {
parserContext.getReaderContext().error("The 'channel' attribute is required.", element);
}
builder.addConstructorArgReference(targetRef);
String selectorRef = element.getAttribute("selector");
if (StringUtils.hasText(selectorRef)) {