From fa16f0073a6483a5f045b5ec7245f70817104c02 Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Fri, 4 Sep 2009 17:59:31 +0000 Subject: [PATCH] INT-547 The 'selector' element is now supported at top level. --- .../xml/IntegrationNamespaceHandler.java | 1 + .../config/xml/SelectorParser.java | 60 +++++++++++++++++++ .../config/xml/spring-integration-1.0.xsd | 31 ++++++---- .../TopLevelSelectorParserTests-context.xml | 14 +++++ .../config/TopLevelSelectorParserTests.java | 47 +++++++++++++++ 5 files changed, 140 insertions(+), 13 deletions(-) create mode 100644 org.springframework.integration/src/main/java/org/springframework/integration/config/xml/SelectorParser.java create mode 100644 org.springframework.integration/src/test/java/org/springframework/integration/config/TopLevelSelectorParserTests-context.xml create mode 100644 org.springframework.integration/src/test/java/org/springframework/integration/config/TopLevelSelectorParserTests.java diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/IntegrationNamespaceHandler.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/IntegrationNamespaceHandler.java index 4f30b48b88..8a826e9ecd 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/IntegrationNamespaceHandler.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/IntegrationNamespaceHandler.java @@ -50,6 +50,7 @@ public class IntegrationNamespaceHandler extends AbstractIntegrationNamespaceHan registerBeanDefinitionParser("delayer", new DelayerParser()); registerBeanDefinitionParser("bridge", new BridgeParser()); registerBeanDefinitionParser("chain", new ChainParser()); + registerBeanDefinitionParser("selector", new SelectorParser()); registerBeanDefinitionParser("selector-chain", new SelectorChainParser()); registerBeanDefinitionParser("poller", new PollerParser()); registerBeanDefinitionParser("annotation-config", new AnnotationConfigParser()); diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/SelectorParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/SelectorParser.java new file mode 100644 index 0000000000..597af53761 --- /dev/null +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/SelectorParser.java @@ -0,0 +1,60 @@ +/* + * Copyright 2002-2009 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.config.xml; + +import org.w3c.dom.Element; + +import org.springframework.beans.factory.config.RuntimeBeanReference; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; +import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.util.StringUtils; + +/** + * Parser for a top-level <selector/> element. + * + * @author Mark Fisher + * @since 1.0.4 + */ +public class SelectorParser extends AbstractSingleBeanDefinitionParser { + + @Override + protected String getBeanClassName(Element element) { + return IntegrationNamespaceUtils.BASE_PACKAGE + ".filter.MethodInvokingSelector"; + } + + public void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { + String id = element.getAttribute("id"); + if (!StringUtils.hasText(id)) { + parserContext.getReaderContext().error( + "The 'id' attribute is required for a selector.", element); + } + String ref = element.getAttribute("ref"); + if (!StringUtils.hasText(ref)) { + parserContext.getReaderContext().error( + "The 'ref' attribute is required for selector '" + id + "'.", element); + } + String method = element.getAttribute("method"); + if (!StringUtils.hasText(method)) { + parserContext.getReaderContext().error( + "The 'method' attribute is required for selector '" + id + "'.", element); + } + builder.addConstructorArgValue(new RuntimeBeanReference(ref)); + builder.addConstructorArgValue(method); + } + +} diff --git a/org.springframework.integration/src/main/resources/org/springframework/integration/config/xml/spring-integration-1.0.xsd b/org.springframework.integration/src/main/resources/org/springframework/integration/config/xml/spring-integration-1.0.xsd index 9353fbb495..2d430c096d 100644 --- a/org.springframework.integration/src/main/resources/org/springframework/integration/config/xml/spring-integration-1.0.xsd +++ b/org.springframework.integration/src/main/resources/org/springframework/integration/config/xml/spring-integration-1.0.xsd @@ -809,11 +809,11 @@ - Defines a MessageSelector chain. + Defines a MessageSelector chain. - + @@ -837,20 +837,25 @@ - - - Provides a MessageSelector reference. If a method - attribute is set the - referred bean doesn't need to implement the - MessageSelector - interface. - - - - + + + + + + + + + Provides a MessageSelector reference. If a method attribute is set the + referred bean doesn't need to implement the MessageSelector interface. + + + + + + diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/config/TopLevelSelectorParserTests-context.xml b/org.springframework.integration/src/test/java/org/springframework/integration/config/TopLevelSelectorParserTests-context.xml new file mode 100644 index 0000000000..833ff9ca99 --- /dev/null +++ b/org.springframework.integration/src/test/java/org/springframework/integration/config/TopLevelSelectorParserTests-context.xml @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/config/TopLevelSelectorParserTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/config/TopLevelSelectorParserTests.java new file mode 100644 index 0000000000..c0abbd9306 --- /dev/null +++ b/org.springframework.integration/src/test/java/org/springframework/integration/config/TopLevelSelectorParserTests.java @@ -0,0 +1,47 @@ +/* + * Copyright 2002-2009 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.config; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.integration.message.StringMessage; +import org.springframework.integration.selector.MessageSelector; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @author Mark Fisher + */ +@ContextConfiguration +@RunWith(SpringJUnit4ClassRunner.class) +public class TopLevelSelectorParserTests { + + @Autowired + ApplicationContext context; + + @Test + public void topLevelSelector() { + MessageSelector selector = (MessageSelector) context.getBean("selector"); + assertTrue(selector.accept(new StringMessage("test"))); + } + +}