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:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 <bridge> 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");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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 <chain> 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 <resequencer> 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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 <selector-chain/> 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());
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 <thread-local-channel> 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");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
Reference in New Issue
Block a user