diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/AbstractInboundRemoteFileSystemSychronizer.java b/spring-integration-file/src/main/java/org/springframework/integration/file/AbstractInboundRemoteFileSystemSychronizer.java
deleted file mode 100644
index b560747508..0000000000
--- a/spring-integration-file/src/main/java/org/springframework/integration/file/AbstractInboundRemoteFileSystemSychronizer.java
+++ /dev/null
@@ -1,161 +0,0 @@
-package org.springframework.integration.file;
-
-import org.springframework.core.io.Resource;
-import org.springframework.integration.endpoint.AbstractEndpoint;
-import org.springframework.integration.file.entries.AcceptAllEntryListFilter;
-import org.springframework.integration.file.entries.EntryListFilter;
-import org.springframework.scheduling.Trigger;
-import org.springframework.util.Assert;
-
-import java.util.concurrent.ScheduledFuture;
-
-
-/**
- * Strategy class charged with knowing how to connect to a remote file system, scan it for new files and then downloading the file.
- *
- * The implementation should run through any configured {@link org.springframework.integration.file.entries.EntryListFilter}s
- * to ensure the entry is worth downloading.
- *
- * @author Josh Long
- */
-public abstract class AbstractInboundRemoteFileSystemSychronizer extends AbstractEndpoint {
- /**
- * Should we delete the source file?
- * For an FTP server, for example, this would delete the original FTPFile instance
- *
- * At the moment I can simply see this triggering an implementation specific {@link org.springframework.integration.file.AbstractInboundRemoteFileSystemSychronizer.EntryAcknowledgmentStrategy}
- * implementation that knows how to delete an entry on the remote file system.
- */
- protected boolean shouldDeleteSourceFile;
-
- /**
- * the directory we're writing our synchronizations to
- */
- protected volatile Resource localDirectory;
-
- /**
- * a {@link org.springframework.integration.file.entries.EntryListFilter} that we're running against the remote file system view!
- */
- protected volatile EntryListFilter filter = new AcceptAllEntryListFilter();
-
- /**
- * the {@link java.util.concurrent.ScheduledFuture} instance we get when we schedule our {@link AbstractInboundRemoteFileSystemSychronizer.SynchronizeTask}
- */
- protected ScheduledFuture> scheduledFuture;
-
- /**
- * Used to store the {@link org.springframework.integration.file.AbstractInboundRemoteFileSystemSychronizer.EntryAcknowledgmentStrategy} implementation
- */
- protected EntryAcknowledgmentStrategy entryAcknowledgmentStrategy;
-
- /**
- * Obviously thread safe - simply provides a NOOP impl so we don't have to keep dancing around NPE's
- */
- private EntryAcknowledgmentStrategy noOpEntryAcknowledgmentStrategy = new EntryAcknowledgmentStrategy() {
- public void acknowledge(Object o, T msg) {
- }
- };
-
- public void setEntryAcknowledgmentStrategy(EntryAcknowledgmentStrategy entryAcknowledgmentStrategy) {
- this.entryAcknowledgmentStrategy = entryAcknowledgmentStrategy;
- }
-
- public void setShouldDeleteSourceFile(boolean shouldDeleteSourceFile) {
- this.shouldDeleteSourceFile = shouldDeleteSourceFile;
- }
-
- public void setLocalDirectory(Resource localDirectory) {
- this.localDirectory = localDirectory;
- }
-
- public void setFilter(EntryListFilter filter) {
- this.filter = filter;
- }
-
- /**
- * @param usefulContextOrClientData this is context information to be passed to the individual {@link org.springframework.integration.file.AbstractInboundRemoteFileSystemSychronizer.EntryAcknowledgmentStrategy} implementation.
- * {@link org.springframework.integration.file.AbstractInboundRemoteFileSystemSychronizer.EntryAcknowledgmentStrategy#acknowledge(Object, Object)} will be called
- * in line with the {@link org.springframework.integration.core.MessageSource#receive()} call so this could conceivably be a 'live' stateful
- * client (a connection?) that is inappropriate to cache as it has per-request state.
- * @param t leverages strategy implementations to enable different behavior. It's a hook to the entry ({@link T}) after it's been successfully downloaded.
- * Conceptually, you might delete the remote one or rename it or something
- * @throws Throwable escape hatch exception, let the adapter deal with it.
- */
- protected void acknowledge(Object usefulContextOrClientData, T t)
- throws Throwable {
- Assert.notNull(this.entryAcknowledgmentStrategy != null, "entryAcknowledgmentStrategy can't be null!");
- this.entryAcknowledgmentStrategy.acknowledge(usefulContextOrClientData, t);
- }
-
- /**
- * This is the callback where we need the implementation to do some specific work
- *
- * @throws Exception thrown if anything goes wrong
- */
- protected abstract void syncRemoteToLocalFileSystem()
- throws Exception;
-
- /**
- * {@inheritDoc}
- */
- protected void doStop() {
- Assert.notNull(this.scheduledFuture, "the 'scheduledFuture' can't be null!");
- this.scheduledFuture.cancel(true);
- }
-
- /**
- * Returns a value in millis dictating how frequently the trigger should fire
- *
- * @return a {@link org.springframework.scheduling.Trigger} implementation (likely,
- * {@link org.springframework.scheduling.support.PeriodicTrigger})
- */
- protected abstract Trigger getTrigger();
-
- /**
- * {@inheritDoc}
- */
- protected void doStart() {
- if (this.entryAcknowledgmentStrategy == null) {
- this.entryAcknowledgmentStrategy = noOpEntryAcknowledgmentStrategy;
- }
-
- this.scheduledFuture = this.getTaskScheduler().schedule(new SynchronizeTask(), this.getTrigger());
- }
-
- /**
- * Strategy interface to expose a hook for dispatching, moving, or deleting the file once it's been delivered.
- * This will typically be a NOOP for the implementation. Adapters should (for consistency) expose an attribute
- * dictating whether the adapter will delete the source entry on the remote file system.
- * This is the file-system version of an ack-mode. Future implementations should consider
- * exposing a custom attribute that plugs a custom {@link org.springframework.integration.file.AbstractInboundRemoteFileSystemSychronizer.EntryAcknowledgmentStrategy}
- * into the pipeline and also some more advanced scenarios (i.e., 'move file to another folder on delete ', or 'rename on delete')
- *
- * @param the entry type (file, sftp, ftp, ...)
- */
- public static interface EntryAcknowledgmentStrategy {
- /**
- * Semantics are simple. You get a pointer to the entry just processed and any kind of helper data you could ask for. Since the strategy is a
- * singleton and the clients you might ask for as context data are pooled, it's not recommended that you try to cache them.
- *
- * @param useful any context data
- * @param msg the data / file / entry you want to process -- specific to sublcasses
- * @throws Exception thrown for any old reason
- */
- void acknowledge(Object useful, T msg) throws Exception;
- }
-
- /**
- * This {@link Runnable} is launched as a background thread and is used to babysit the
- * {@link org.springframework.integration.file.AbstractInboundRemoteFileSystemSychronizer#localDirectory},
- * queueing and delivering accumulated files as possible.
- */
- class SynchronizeTask implements Runnable {
- public void run() {
- try {
- syncRemoteToLocalFileSystem();
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- }
-}
diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/AbstractInboundRemoteFileSystemSynchronizingMessageSource.java b/spring-integration-file/src/main/java/org/springframework/integration/file/AbstractInboundRemoteFileSystemSynchronizingMessageSource.java
deleted file mode 100644
index 0c908a29dc..0000000000
--- a/spring-integration-file/src/main/java/org/springframework/integration/file/AbstractInboundRemoteFileSystemSynchronizingMessageSource.java
+++ /dev/null
@@ -1,135 +0,0 @@
-package org.springframework.integration.file;
-
-import org.springframework.core.io.Resource;
-import org.springframework.integration.Message;
-import org.springframework.integration.MessagingException;
-import org.springframework.integration.core.MessageSource;
-import org.springframework.integration.endpoint.AbstractEndpoint;
-import org.springframework.integration.endpoint.MessageProducerSupport;
-import org.springframework.integration.file.entries.*;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.util.Arrays;
-import java.util.regex.Pattern;
-
-
-/**
- * Ultimately, this factors out a lot of the common logic between the FTP and SFTP adapters. Designed to be extendable to handle
- * adapters whose task it is to synchronize a remote file system with a local file system (NB: this does *NOT* handle pushing files TO the remote
- * file system that exist uniquely in the local file system. It only handles bringing down the remote file system - as you'd expect
- * an 'inbound' adapter would).
- *
- * The base class supports configuration of whether the remote file system and local file system's directories should
- * be created on start (what 'creating a directory' means to the specific adapter is of course implementaton specific).
- *
- * This class is to be used as a pair with an implementation of
- * {@link org.springframework.integration.file.AbstractInboundRemoteFileSystemSychronizer}. This synchronizer
- * must handle the work of actually connecting to the remote file system and delivering new {@link java.io.File}s.
- * The synchronizer is designed to be
- *
- * @author Josh Long
- */
-public abstract class AbstractInboundRemoteFileSystemSynchronizingMessageSource> extends MessageProducerSupport implements MessageSource {
- /**
- * Extension used when downloading files. We change it right after we know it's downloaded
- */
- public static final String INCOMPLETE_EXTENSION = ".INCOMPLETE";
-
- /**
- * Should the endpoint attempt to create the local directory and / or the remote directory?
- */
- protected volatile boolean autoCreateDirectories = true;
-
- /**
- * An implementation that will handle the chores of actually connecting to and syncing up the remote FS with the local one, in an inbound direction
- */
- protected volatile T synchronizer;
-
- /**
- * What directory should things be synced to locally ?
- */
- protected volatile Resource localDirectory;
-
- /**
- * The actual {@link FileReadingMessageSource} that we continue to trust to do the job monitoring the filesystem once files are moved down
- */
- protected volatile FileReadingMessageSource fileSource;
-
- /**
- * The predicate to use in scanning the remote Fs for downloads
- */
- protected EntryListFilter remotePredicate;
-
- public void setAutoCreateDirectories(boolean autoCreateDirectories) {
- this.autoCreateDirectories = autoCreateDirectories;
- }
-
- public void setSynchronizer(T synchronizer) {
- this.synchronizer = synchronizer;
- }
-
- public void setLocalDirectory(Resource localDirectory) {
- this.localDirectory = localDirectory;
- }
-
- public void setRemotePredicate(EntryListFilter remotePredicate) {
- this.remotePredicate = remotePredicate;
- }
-
- @SuppressWarnings("unchecked")
- private EntryListFilter buildFilter() {
- FileEntryNamer fileEntryNamer = new FileEntryNamer();
- Pattern completePattern = Pattern.compile("^.*(?(
- Arrays.asList(
- new AcceptOnceEntryFileListFilter(), new PatternMatchingEntryListFilter(fileEntryNamer, completePattern)));
- }
-
- @Override
- protected void onInit() {
- try {
- if (this.remotePredicate != null) {
- this.synchronizer.setFilter(this.remotePredicate);
- }
-
- if (this.localDirectory != null && !this.localDirectory.exists()){
- if (this.autoCreateDirectories){
- logger.debug("The '" + localDirectory + "' directory doesn't exist. Creating " + this.localDirectory);
- this.localDirectory.getFile().mkdirs();
- } else {
- throw new FileNotFoundException(localDirectory.getFilename());
- }
- }
-
- /**
- * Handles making sure the remote files get here in one piece
- */
- this.synchronizer.setLocalDirectory(this.localDirectory);
- this.synchronizer.setTaskScheduler(this.getTaskScheduler());
- this.synchronizer.setBeanFactory(this.getBeanFactory());
- this.synchronizer.setPhase(this.getPhase());
- this.synchronizer.setBeanName(this.getComponentName());
-
- /**
- * Handles forwarding files once they ultimately appear in the {@link #localDirectory}
- */
- this.fileSource = new FileReadingMessageSource();
- this.fileSource.setFilter(buildFilter());
- this.fileSource.setDirectory(this.localDirectory.getFile());
- this.fileSource.afterPropertiesSet();
- this.synchronizer.afterPropertiesSet();
- } catch (Exception e) {
- if (e instanceof RuntimeException){
- throw (RuntimeException)e;
- } else {
- throw new MessagingException("Failure during initialization of MessageSource for: " + this.getComponentType(), e);
- }
- }
-
- }
-
- public Message receive() {
- return this.fileSource.receive();
- }
-}
diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/synchronization/AbstractInboundRemoteFileSystemSychronizer.java b/spring-integration-file/src/main/java/org/springframework/integration/file/synchronization/AbstractInboundRemoteFileSystemSychronizer.java
new file mode 100644
index 0000000000..772e4ad571
--- /dev/null
+++ b/spring-integration-file/src/main/java/org/springframework/integration/file/synchronization/AbstractInboundRemoteFileSystemSychronizer.java
@@ -0,0 +1,190 @@
+/*
+ * Copyright 2002-2010 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.file.synchronization;
+
+import org.springframework.core.io.Resource;
+import org.springframework.integration.MessagingException;
+import org.springframework.integration.endpoint.AbstractEndpoint;
+import org.springframework.integration.file.entries.AcceptAllEntryListFilter;
+import org.springframework.integration.file.entries.EntryListFilter;
+import org.springframework.scheduling.Trigger;
+import org.springframework.util.Assert;
+
+import java.util.concurrent.ScheduledFuture;
+
+/**
+ * Base class charged with knowing how to connect to a remote file system,
+ * scan it for new files and then download the files.
+ *
+ * The implementation should run through any configured
+ * {@link org.springframework.integration.file.entries.EntryListFilter}s to
+ * ensure the entry is acceptable.
+ *
+ * @author Josh Long
+ */
+public abstract class AbstractInboundRemoteFileSystemSychronizer extends AbstractEndpoint {
+
+ /**
+ * Should we delete the source file? For an FTP
+ * server, for example, this would delete the original FTPFile instance.
+ */
+ protected boolean shouldDeleteSourceFile;
+
+ /**
+ * The directory to which we write our synchronizations.
+ */
+ protected volatile Resource localDirectory;
+
+ /**
+ * An {@link EntryListFilter} that runs against the remote file system view.
+ */
+ protected volatile EntryListFilter filter = new AcceptAllEntryListFilter();
+
+ /**
+ * The {@link ScheduledFuture} instance we get when we
+ * schedule our {@link SynchronizeTask}
+ */
+ protected ScheduledFuture> scheduledFuture;
+
+ /**
+ * The {@link EntryAcknowledgmentStrategy} implementation.
+ */
+ protected EntryAcknowledgmentStrategy entryAcknowledgmentStrategy;
+
+
+ public void setEntryAcknowledgmentStrategy(EntryAcknowledgmentStrategy entryAcknowledgmentStrategy) {
+ this.entryAcknowledgmentStrategy = entryAcknowledgmentStrategy;
+ }
+
+ public void setShouldDeleteSourceFile(boolean shouldDeleteSourceFile) {
+ this.shouldDeleteSourceFile = shouldDeleteSourceFile;
+ }
+
+ public void setLocalDirectory(Resource localDirectory) {
+ this.localDirectory = localDirectory;
+ }
+
+ public void setFilter(EntryListFilter filter) {
+ this.filter = filter;
+ }
+
+ /**
+ * @param usefulContextOrClientData
+ * this is context information to be passed to the individual {@link EntryAcknowledgmentStrategy}.
+ * {@link EntryAcknowledgmentStrategy#acknowledge(Object, Object)} will be called in line with the
+ * {@link org.springframework.integration.core.MessageSource#receive()} call so this could conceivably
+ * be a 'live' stateful client (a connection?) that is inappropriate to cache as it has per-request state.
+ * @param t
+ * leverages strategy implementations to enable different
+ * behavior. It's a hook to the entry ({@link T}) after it's been
+ * successfully downloaded. Conceptually, you might delete the
+ * remote one or rename it, etc.
+ * @throws Throwable
+ * escape hatch exception, let the adapter deal with it.
+ */
+ protected void acknowledge(Object usefulContextOrClientData, T t) throws Throwable {
+ Assert.notNull(this.entryAcknowledgmentStrategy != null,
+ "entryAcknowledgmentStrategy can't be null!");
+ this.entryAcknowledgmentStrategy.acknowledge(usefulContextOrClientData, t);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void doStart() {
+ if (this.entryAcknowledgmentStrategy == null) {
+ this.entryAcknowledgmentStrategy = new EntryAcknowledgmentStrategy() {
+ public void acknowledge(Object o, T msg) {
+ // no-op
+ }
+ };
+ }
+ this.scheduledFuture = this.getTaskScheduler().schedule(new SynchronizeTask(), this.getTrigger());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void doStop() {
+ if (this.scheduledFuture != null) {
+ this.scheduledFuture.cancel(true);
+ }
+ }
+
+ /**
+ * Returns the {@link Trigger} that dictates how frequently the trigger should fire.
+ */
+ protected abstract Trigger getTrigger();
+
+ /**
+ * This is the callback where we need the implementation to do some specific work
+ */
+ protected abstract void syncRemoteToLocalFileSystem() throws Exception;
+
+
+ /**
+ * This {@link Runnable} is launched as a background thread and is used to manage the
+ * {@link AbstractInboundRemoteFileSystemSychronizer#localDirectory} by queueing and
+ * delivering accumulated files as possible.
+ */
+ class SynchronizeTask implements Runnable {
+ public void run() {
+ try {
+ syncRemoteToLocalFileSystem();
+ }
+ catch (RuntimeException e) {
+ throw e;
+ }
+ catch (Exception e) {
+ throw new MessagingException("failure occurred in synchronization task", e);
+ }
+ }
+ }
+
+
+ /**
+ * Strategy interface to expose a hook for dispatching, moving, or deleting
+ * the file once it has been delivered. This will typically be a NOOP for the
+ * implementation. Adapters should (for consistency) expose an attribute
+ * dictating whether the adapter will delete the source
+ * entry on the remote file system. This is the file-system version of an
+ * ack-mode. Future implementations should consider exposing a
+ * custom attribute that plugs a custom {@link EntryAcknowledgmentStrategy}
+ * into the pipeline and also some more advanced scenarios (i.e., 'move file
+ * to another folder on delete ', or 'rename on delete')
+ *
+ * @param the entry type (file, sftp, ftp, ...)
+ */
+ public static interface EntryAcknowledgmentStrategy {
+
+ /**
+ * Semantics are simple. You get a pointer to the entry just processed
+ * and any kind of helper data you could ask for. Since the strategy is
+ * a singleton and the clients you might ask for as context data are
+ * pooled, it's not recommended that you try to cache them.
+ *
+ * @param useful
+ * any context data
+ * @param msg
+ * the data / file / entry you want to process -- specific to subclasses
+ * @throws Exception in case of an error while acknowledging
+ */
+ void acknowledge(Object useful, T msg) throws Exception;
+
+ }
+
+}
diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/synchronization/AbstractInboundRemoteFileSystemSynchronizingMessageSource.java b/spring-integration-file/src/main/java/org/springframework/integration/file/synchronization/AbstractInboundRemoteFileSystemSynchronizingMessageSource.java
new file mode 100644
index 0000000000..45896881e5
--- /dev/null
+++ b/spring-integration-file/src/main/java/org/springframework/integration/file/synchronization/AbstractInboundRemoteFileSystemSynchronizingMessageSource.java
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2002-2010 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.file.synchronization;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.Arrays;
+import java.util.regex.Pattern;
+
+import org.springframework.core.io.Resource;
+import org.springframework.integration.Message;
+import org.springframework.integration.MessagingException;
+import org.springframework.integration.core.MessageSource;
+import org.springframework.integration.endpoint.MessageProducerSupport;
+import org.springframework.integration.file.FileReadingMessageSource;
+import org.springframework.integration.file.entries.AcceptOnceEntryFileListFilter;
+import org.springframework.integration.file.entries.CompositeEntryListFilter;
+import org.springframework.integration.file.entries.EntryListFilter;
+import org.springframework.integration.file.entries.FileEntryNamer;
+import org.springframework.integration.file.entries.PatternMatchingEntryListFilter;
+
+/**
+ * Factors out the common logic between the FTP and SFTP adapters. Designed to
+ * be extensible to handle adapters whose task it is to synchronize a remote
+ * file system with a local file system (NB: this does *NOT* handle pushing
+ * files TO the remote file system that exist uniquely in the local file system.
+ * It only handles pulling from the remote file system - as you would expect
+ * from an 'inbound' adapter).
+ *
+ * The base class supports configuration of whether the remote file system and
+ * local file system's directories should be created on start (what 'creating a
+ * directory' means to the specific adapter is of course implementaton
+ * specific).
+ *
+ * This class is to be used as a pair with an implementation of
+ * {@link AbstractInboundRemoteFileSystemSychronizer}. The synchronizer must
+ * handle the work of actually connecting to the remote file system and
+ * delivering new {@link File}s.
+ *
+ * @author Josh Long
+ */
+public abstract class AbstractInboundRemoteFileSystemSynchronizingMessageSource>
+ extends MessageProducerSupport implements MessageSource {
+
+ /**
+ * Extension used when downloading files. We change it right after we know it's downloaded.
+ */
+ public static final String INCOMPLETE_EXTENSION = ".INCOMPLETE";
+
+ /**
+ * Should the endpoint attempt to create the local directory and/or the remote directory?
+ */
+ protected volatile boolean autoCreateDirectories = true;
+
+ /**
+ * An implementation that will handle the chores of actually connecting to and synching up
+ * the remote file system with the local one, in an inbound direction.
+ */
+ protected volatile T synchronizer;
+
+ /**
+ * Directory to which things should be synched locally.
+ */
+ protected volatile Resource localDirectory;
+
+ /**
+ * The actual {@link FileReadingMessageSource} that monitors the local filesystem once files are synched.
+ */
+ protected volatile FileReadingMessageSource fileSource;
+
+ /**
+ * The predicate to use in scanning the remote File system for downloads.
+ */
+ protected EntryListFilter remotePredicate;
+
+
+ public void setAutoCreateDirectories(boolean autoCreateDirectories) {
+ this.autoCreateDirectories = autoCreateDirectories;
+ }
+
+ public void setSynchronizer(T synchronizer) {
+ this.synchronizer = synchronizer;
+ }
+
+ public void setLocalDirectory(Resource localDirectory) {
+ this.localDirectory = localDirectory;
+ }
+
+ public void setRemotePredicate(EntryListFilter remotePredicate) {
+ this.remotePredicate = remotePredicate;
+ }
+
+ @Override
+ protected void onInit() {
+ try {
+ if (this.remotePredicate != null) {
+ this.synchronizer.setFilter(this.remotePredicate);
+ }
+ if (this.localDirectory != null && !this.localDirectory.exists()) {
+ if (this.autoCreateDirectories) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("The '" + this.localDirectory + "' directory doesn't exist; Will create.");
+ }
+ this.localDirectory.getFile().mkdirs();
+ }
+ else {
+ throw new FileNotFoundException(this.localDirectory.getFilename());
+ }
+ }
+
+ /**
+ * Make sure the remote files get here.
+ */
+ this.synchronizer.setLocalDirectory(this.localDirectory);
+ this.synchronizer.setTaskScheduler(this.getTaskScheduler());
+ this.synchronizer.setBeanFactory(this.getBeanFactory());
+ this.synchronizer.setPhase(this.getPhase());
+ this.synchronizer.setBeanName(this.getComponentName());
+
+ /**
+ * Forwards files once they ultimately appear in the {@link #localDirectory}.
+ */
+ this.fileSource = new FileReadingMessageSource();
+ this.fileSource.setFilter(this.buildFilter());
+ this.fileSource.setDirectory(this.localDirectory.getFile());
+ this.fileSource.afterPropertiesSet();
+ this.synchronizer.afterPropertiesSet();
+ }
+ catch (RuntimeException e) {
+ throw e;
+ }
+ catch (Exception e) {
+ throw new MessagingException("Failure during initialization of MessageSource for: "
+ + this.getComponentType(), e);
+ }
+ }
+
+ public Message receive() {
+ return this.fileSource.receive();
+ }
+
+ @SuppressWarnings("unchecked")
+ private EntryListFilter buildFilter() {
+ FileEntryNamer fileEntryNamer = new FileEntryNamer();
+ Pattern completePattern = Pattern.compile("^.*(?(Arrays.asList(
+ new AcceptOnceEntryFileListFilter(),
+ new PatternMatchingEntryListFilter(fileEntryNamer, completePattern)));
+ }
+
+}
diff --git a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/FtpInboundRemoteFileSystemSynchronizer.java b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/FtpInboundRemoteFileSystemSynchronizer.java
index ca49d602a0..1ae78b1254 100644
--- a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/FtpInboundRemoteFileSystemSynchronizer.java
+++ b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/FtpInboundRemoteFileSystemSynchronizer.java
@@ -20,8 +20,8 @@ import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.springframework.core.io.Resource;
import org.springframework.integration.MessagingException;
-import org.springframework.integration.file.AbstractInboundRemoteFileSystemSychronizer;
-import org.springframework.integration.file.AbstractInboundRemoteFileSystemSynchronizingMessageSource;
+import org.springframework.integration.file.synchronization.AbstractInboundRemoteFileSystemSychronizer;
+import org.springframework.integration.file.synchronization.AbstractInboundRemoteFileSystemSynchronizingMessageSource;
import org.springframework.integration.ftp.FtpClientPool;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.support.PeriodicTrigger;
@@ -34,7 +34,7 @@ import java.io.IOException;
import java.util.Collection;
/**
- * An FTP-adapter implementation of {@link org.springframework.integration.file.AbstractInboundRemoteFileSystemSychronizer}
+ * An FTP-adapter implementation of {@link org.springframework.integration.file.synchronization.AbstractInboundRemoteFileSystemSychronizer}
*
* @author Iwein Fuld
* @author Josh Long
diff --git a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/FtpInboundRemoteFileSystemSynchronizingMessageSource.java b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/FtpInboundRemoteFileSystemSynchronizingMessageSource.java
index 3494d98703..9b48d4e055 100644
--- a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/FtpInboundRemoteFileSystemSynchronizingMessageSource.java
+++ b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/FtpInboundRemoteFileSystemSynchronizingMessageSource.java
@@ -18,7 +18,7 @@ package org.springframework.integration.ftp;
import org.apache.commons.net.ftp.FTPFile;
-import org.springframework.integration.file.AbstractInboundRemoteFileSystemSynchronizingMessageSource;
+import org.springframework.integration.file.synchronization.AbstractInboundRemoteFileSystemSynchronizingMessageSource;
/**
* A {@link org.springframework.integration.core.MessageSource} implementation for FTP.
diff --git a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/impl/SftpInboundRemoteFileSystemSynchronizer.java b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/impl/SftpInboundRemoteFileSystemSynchronizer.java
index 2c922976db..cde8fbacbc 100644
--- a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/impl/SftpInboundRemoteFileSystemSynchronizer.java
+++ b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/impl/SftpInboundRemoteFileSystemSynchronizer.java
@@ -21,8 +21,8 @@ import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.core.io.Resource;
import org.springframework.integration.MessagingException;
-import org.springframework.integration.file.AbstractInboundRemoteFileSystemSychronizer;
-import org.springframework.integration.file.AbstractInboundRemoteFileSystemSynchronizingMessageSource;
+import org.springframework.integration.file.synchronization.AbstractInboundRemoteFileSystemSychronizer;
+import org.springframework.integration.file.synchronization.AbstractInboundRemoteFileSystemSynchronizingMessageSource;
import org.springframework.integration.sftp.SftpSession;
import org.springframework.integration.sftp.SftpSessionPool;
import org.springframework.scheduling.Trigger;
diff --git a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/impl/SftpInboundRemoteFileSystemSynchronizingMessageSource.java b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/impl/SftpInboundRemoteFileSystemSynchronizingMessageSource.java
index 73632b7c3c..180f5ba07f 100644
--- a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/impl/SftpInboundRemoteFileSystemSynchronizingMessageSource.java
+++ b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/impl/SftpInboundRemoteFileSystemSynchronizingMessageSource.java
@@ -17,7 +17,8 @@ package org.springframework.integration.sftp.impl;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.SftpATTRS;
-import org.springframework.integration.file.AbstractInboundRemoteFileSystemSynchronizingMessageSource;
+
+import org.springframework.integration.file.synchronization.AbstractInboundRemoteFileSystemSynchronizingMessageSource;
import org.springframework.integration.sftp.SftpSession;
import org.springframework.integration.sftp.SftpSessionPool;
import org.springframework.util.Assert;
diff --git a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/impl/SftpInboundRemoteFileSystemSynchronizerTests.java b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/impl/SftpInboundRemoteFileSystemSynchronizerTests.java
index 1c5eb5e876..9f0107ab00 100644
--- a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/impl/SftpInboundRemoteFileSystemSynchronizerTests.java
+++ b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/impl/SftpInboundRemoteFileSystemSynchronizerTests.java
@@ -25,7 +25,7 @@ import org.junit.Before;
import org.junit.Test;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
-import org.springframework.integration.file.AbstractInboundRemoteFileSystemSychronizer.EntryAcknowledgmentStrategy;
+import org.springframework.integration.file.synchronization.AbstractInboundRemoteFileSystemSychronizer.EntryAcknowledgmentStrategy;
import org.springframework.integration.sftp.SftpSession;
import org.springframework.util.ReflectionUtils;