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