diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/config/AbstractRemoteFileInboundChannelAdapterParser.java b/spring-integration-file/src/main/java/org/springframework/integration/file/config/AbstractRemoteFileInboundChannelAdapterParser.java index 29ef3435bf..4ae92babc9 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/config/AbstractRemoteFileInboundChannelAdapterParser.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/config/AbstractRemoteFileInboundChannelAdapterParser.java @@ -19,7 +19,6 @@ package org.springframework.integration.file.config; import org.w3c.dom.Element; import org.springframework.beans.BeanMetadataElement; -import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.integration.config.xml.AbstractPollingInboundChannelAdapterParser; @@ -27,7 +26,7 @@ import org.springframework.integration.config.xml.IntegrationNamespaceUtils; import org.springframework.util.StringUtils; /** - * Parser for 'sftp:inbound-channel-adapter' + * Abstract base class for parsing remote file inbound channel adapters. * * @author Oleg Zhurakousky * @author Mark Fisher @@ -36,7 +35,7 @@ import org.springframework.util.StringUtils; public abstract class AbstractRemoteFileInboundChannelAdapterParser extends AbstractPollingInboundChannelAdapterParser { @Override - protected BeanMetadataElement parseSource(Element element, ParserContext parserContext) { + protected final BeanMetadataElement parseSource(Element element, ParserContext parserContext) { // build the SessionFactory BeanDefinitionBuilder sessionFactoryBuilder = BeanDefinitionBuilder.genericBeanDefinition( "org.springframework.integration.file.remote.session.CachingSessionFactory"); @@ -48,27 +47,7 @@ public abstract class AbstractRemoteFileInboundChannelAdapterParser extends Abst synchronizerBuilder.addConstructorArgValue(sessionFactoryBuilder.getBeanDefinition()); IntegrationNamespaceUtils.setValueIfAttributeDefined(synchronizerBuilder, element, "remote-directory"); IntegrationNamespaceUtils.setValueIfAttributeDefined(synchronizerBuilder, element, "delete-remote-files"); - - // configure the FileListFilter if relevant attributes are present - String fileNamePattern = element.getAttribute("filename-pattern"); - String filter = element.getAttribute("filter"); - boolean hasFileNamePattern = StringUtils.hasText(fileNamePattern); - boolean hasFilter = StringUtils.hasText(filter); - if (hasFileNamePattern || hasFilter) { - if (!(hasFileNamePattern ^ hasFilter)) { - throw new BeanDefinitionStoreException("at most one of 'filename-pattern' or 'filter' " + - "is allowed on remote file inbound adapter"); - } - } - if (hasFileNamePattern) { - BeanDefinitionBuilder filterBuilder = BeanDefinitionBuilder.genericBeanDefinition( - this.getSimplePatternFileListFilterClassname()); - filterBuilder.addConstructorArgValue(fileNamePattern); - synchronizerBuilder.addPropertyValue("filter", filterBuilder.getBeanDefinition()); - } - else if (hasFilter) { - synchronizerBuilder.addPropertyReference("filter", filter); - } + this.configureFilter(synchronizerBuilder, element, parserContext); // build the MessageSource BeanDefinitionBuilder messageSourceBuilder = BeanDefinitionBuilder.genericBeanDefinition(this.getMessageSourceClassname()); @@ -78,10 +57,52 @@ public abstract class AbstractRemoteFileInboundChannelAdapterParser extends Abst return messageSourceBuilder.getBeanDefinition(); } + private void configureFilter(BeanDefinitionBuilder synchronizerBuilder, Element element, ParserContext parserContext) { + String filter = element.getAttribute("filter"); + String fileNamePattern = element.getAttribute("filename-pattern"); + String fileNameRegex = element.getAttribute("filename-regex"); + boolean hasFilter = StringUtils.hasText(filter); + boolean hasFileNamePattern = StringUtils.hasText(fileNamePattern); + boolean hasFileNameRegex = StringUtils.hasText(fileNameRegex); + if (hasFilter || hasFileNamePattern || hasFileNameRegex) { + int count = 0; + if (hasFilter) { + count++; + } + if (hasFileNamePattern) { + count++; + } + if (hasFileNameRegex) { + count++; + } + if (count != 1) { + parserContext.getReaderContext().error("at most one of 'filename-pattern', " + + "'filename-regex', or 'filter' is allowed on remote file inbound adapter", element); + } + if (hasFilter) { + synchronizerBuilder.addPropertyReference("filter", filter); + } + else if (hasFileNamePattern) { + BeanDefinitionBuilder filterBuilder = BeanDefinitionBuilder.genericBeanDefinition( + this.getSimplePatternFileListFilterClassname()); + filterBuilder.addConstructorArgValue(fileNamePattern); + synchronizerBuilder.addPropertyValue("filter", filterBuilder.getBeanDefinition()); + } + else if (hasFileNameRegex) { + BeanDefinitionBuilder filterBuilder = BeanDefinitionBuilder.genericBeanDefinition( + this.getRegexPatternFileListFilterClassname()); + filterBuilder.addConstructorArgValue(fileNameRegex); + synchronizerBuilder.addPropertyValue("filter", filterBuilder.getBeanDefinition()); + } + } + } + protected abstract String getMessageSourceClassname(); protected abstract String getInboundFileSynchronizerClassname(); protected abstract String getSimplePatternFileListFilterClassname(); + protected abstract String getRegexPatternFileListFilterClassname(); + } diff --git a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/config/FtpInboundChannelAdapterParser.java b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/config/FtpInboundChannelAdapterParser.java index b3e9e65041..0e29f546bb 100644 --- a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/config/FtpInboundChannelAdapterParser.java +++ b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/config/FtpInboundChannelAdapterParser.java @@ -42,4 +42,9 @@ public class FtpInboundChannelAdapterParser extends AbstractRemoteFileInboundCha return BASE_PACKAGE + ".filters.FtpSimplePatternFileListFilter"; } + @Override + protected String getRegexPatternFileListFilterClassname() { + return BASE_PACKAGE + ".filters.FtpRegexPatternFileListFilter"; + } + } diff --git a/spring-integration-ftp/src/main/resources/org/springframework/integration/ftp/config/spring-integration-ftp-2.0.xsd b/spring-integration-ftp/src/main/resources/org/springframework/integration/ftp/config/spring-integration-ftp-2.0.xsd index e8c02330bc..7f81c0f728 100644 --- a/spring-integration-ftp/src/main/resources/org/springframework/integration/ftp/config/spring-integration-ftp-2.0.xsd +++ b/spring-integration-ftp/src/main/resources/org/springframework/integration/ftp/config/spring-integration-ftp-2.0.xsd @@ -55,6 +55,7 @@ + diff --git a/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/config/FtpInboundChannelAdapterParserTests-context.xml b/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/config/FtpInboundChannelAdapterParserTests-context.xml index 1234166c34..8103d67f4a 100644 --- a/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/config/FtpInboundChannelAdapterParserTests-context.xml +++ b/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/config/FtpInboundChannelAdapterParserTests-context.xml @@ -16,7 +16,7 @@ charset="UTF-8" auto-create-local-directory="true" delete-remote-files="true" - filename-pattern=".?txt" + filename-pattern="*.txt" local-directory="." remote-directory="foo/bar"> diff --git a/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/config/FtpsInboundChannelAdapterParserTests-context.xml b/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/config/FtpsInboundChannelAdapterParserTests-context.xml index 17d14d4d09..15e3d723de 100644 --- a/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/config/FtpsInboundChannelAdapterParserTests-context.xml +++ b/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/config/FtpsInboundChannelAdapterParserTests-context.xml @@ -35,7 +35,7 @@ charset="UTF-8" auto-create-local-directory="true" delete-remote-files="true" - filename-pattern=".?txt" + filename-regex="[0-9]+\.txt" local-directory="." remote-directory="foo/bar"> diff --git a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/config/SftpInboundChannelAdapterParser.java b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/config/SftpInboundChannelAdapterParser.java index 35f690b8c0..51c95948d8 100644 --- a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/config/SftpInboundChannelAdapterParser.java +++ b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/config/SftpInboundChannelAdapterParser.java @@ -44,4 +44,9 @@ public class SftpInboundChannelAdapterParser extends AbstractRemoteFileInboundCh return BASE_PACKAGE + ".filters.SftpSimplePatternFileListFilter"; } + @Override + protected String getRegexPatternFileListFilterClassname() { + return BASE_PACKAGE + ".filters.SftpRegexPatternFileListFilter"; + } + } diff --git a/spring-integration-sftp/src/main/resources/org/springframework/integration/sftp/config/spring-integration-sftp-2.0.xsd b/spring-integration-sftp/src/main/resources/org/springframework/integration/sftp/config/spring-integration-sftp-2.0.xsd index 18a69e171d..99327fcca5 100644 --- a/spring-integration-sftp/src/main/resources/org/springframework/integration/sftp/config/spring-integration-sftp-2.0.xsd +++ b/spring-integration-sftp/src/main/resources/org/springframework/integration/sftp/config/spring-integration-sftp-2.0.xsd @@ -107,6 +107,7 @@ + diff --git a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/config/InboundChannelAdapaterParserTests-context.xml b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/config/InboundChannelAdapaterParserTests-context.xml index dce36f0ff2..8603a55d89 100644 --- a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/config/InboundChannelAdapaterParserTests-context.xml +++ b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/config/InboundChannelAdapaterParserTests-context.xml @@ -38,7 +38,7 @@