INT-677, Added inner handler recognition to Filter, modified/re-factored Test cases structure and updated documentation

This commit is contained in:
Oleg Zhurakousky
2009-06-29 00:22:54 +00:00
parent e6062ba749
commit 39a6beefef
5 changed files with 140 additions and 63 deletions

View File

@@ -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());
}
}

View File

@@ -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" />