INT-677, Added inner handler recognition to Filter, modified/re-factored Test cases structure and updated documentation
This commit is contained in:
@@ -18,6 +18,7 @@ package org.springframework.integration.config.xml;
|
||||
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
|
||||
import org.springframework.beans.factory.xml.ParserContext;
|
||||
@@ -27,6 +28,7 @@ import org.springframework.util.StringUtils;
|
||||
* Parser for the <filter/> element.
|
||||
*
|
||||
* @author Mark Fisher
|
||||
* @author Oleg Zhurakousky
|
||||
*/
|
||||
public class FilterParser extends AbstractConsumerEndpointParser {
|
||||
|
||||
@@ -34,16 +36,24 @@ public class FilterParser extends AbstractConsumerEndpointParser {
|
||||
protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) {
|
||||
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
|
||||
IntegrationNamespaceUtils.BASE_PACKAGE + ".filter.MessageFilter");
|
||||
builder.addConstructorArgReference(this.parseSelector(element, parserContext));
|
||||
|
||||
builder.addConstructorArgReference((String) this.parseSelector(element, parserContext));
|
||||
|
||||
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "discard-channel");
|
||||
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "throw-exception-on-rejection");
|
||||
return builder;
|
||||
}
|
||||
|
||||
private String parseSelector(Element element, ParserContext parserContext) {
|
||||
String ref = element.getAttribute("ref");
|
||||
if (!StringUtils.hasText(ref)) {
|
||||
parserContext.getReaderContext().error("The 'ref' attribute is required.", element);
|
||||
BeanDefinition innerHandlerDefinition = this.parseInnerHandlerDefinition(element, parserContext);
|
||||
String ref = null;
|
||||
if (innerHandlerDefinition == null){
|
||||
ref = element.getAttribute("ref");
|
||||
if (!StringUtils.hasText(ref)) {
|
||||
parserContext.getReaderContext().error("Either \"ref\" attribute or inner bean (<bean/>) definition of concrete implementation of " +
|
||||
"this MessageFilter is required.", element);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
String method = element.getAttribute("method");
|
||||
if (!StringUtils.hasText(method)) {
|
||||
@@ -51,10 +61,14 @@ public class FilterParser extends AbstractConsumerEndpointParser {
|
||||
}
|
||||
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
|
||||
IntegrationNamespaceUtils.BASE_PACKAGE + ".filter.MethodInvokingSelector");
|
||||
builder.addConstructorArgReference(ref);
|
||||
if (innerHandlerDefinition != null){
|
||||
builder.addConstructorArgValue(innerHandlerDefinition);
|
||||
} else {
|
||||
builder.addConstructorArgReference(ref);
|
||||
}
|
||||
|
||||
builder.getRawBeanDefinition().getConstructorArgumentValues().addGenericArgumentValue(method, "java.lang.String");
|
||||
return BeanDefinitionReaderUtils.registerWithGeneratedName(
|
||||
builder.getBeanDefinition(), parserContext.getRegistry());
|
||||
return BeanDefinitionReaderUtils.registerWithGeneratedName(builder.getBeanDefinition(), parserContext.getRegistry());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -843,7 +843,7 @@
|
||||
</xsd:annotation>
|
||||
<xsd:complexType>
|
||||
<xsd:complexContent>
|
||||
<xsd:extension base="handlerEndpointType">
|
||||
<xsd:extension base="innerEndpointDefinitionAware">
|
||||
<xsd:attribute name="discard-channel" type="xsd:string" />
|
||||
<xsd:attribute name="throw-exception-on-rejection"
|
||||
type="xsd:string" default="false" />
|
||||
|
||||
Reference in New Issue
Block a user