diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/remote/session/CachingSessionFactory.java b/spring-integration-file/src/main/java/org/springframework/integration/file/remote/session/CachingSessionFactory.java index 0072f7730d..46d8f5c9c2 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/remote/session/CachingSessionFactory.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/remote/session/CachingSessionFactory.java @@ -17,7 +17,6 @@ package org.springframework.integration.file.remote.session; import java.io.InputStream; -import java.util.Collection; import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.locks.ReentrantLock; @@ -121,7 +120,7 @@ public class CachingSessionFactory implements SessionFactory, DisposableBean { return this.targetSession.rm(path); } - public Collection ls(String path) { + public F[] ls(String path) { return this.targetSession.ls(path); } diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/remote/session/Session.java b/spring-integration-file/src/main/java/org/springframework/integration/file/remote/session/Session.java index 744f9f6967..0adf602bd4 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/remote/session/Session.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/remote/session/Session.java @@ -17,7 +17,6 @@ package org.springframework.integration.file.remote.session; import java.io.InputStream; -import java.util.Collection; /** * Common abstraction for a Session with a remote File system. @@ -31,7 +30,7 @@ public interface Session { boolean rm(String path); - Collection ls(String path); + F[] ls(String path); InputStream get(String source); diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/remote/synchronizer/AbstractInboundFileSynchronizer.java b/spring-integration-file/src/main/java/org/springframework/integration/file/remote/synchronizer/AbstractInboundFileSynchronizer.java index 5e70994a50..be3e55af01 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/remote/synchronizer/AbstractInboundFileSynchronizer.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/remote/synchronizer/AbstractInboundFileSynchronizer.java @@ -19,6 +19,7 @@ package org.springframework.integration.file.remote.synchronizer; import java.io.File; import java.io.IOException; import java.util.Arrays; +import java.util.Collection; import java.util.List; import org.apache.commons.logging.Log; @@ -30,6 +31,7 @@ import org.springframework.integration.file.filters.FileListFilter; import org.springframework.integration.file.remote.session.Session; import org.springframework.integration.file.remote.session.SessionFactory; import org.springframework.util.Assert; +import org.springframework.util.ObjectUtils; /** * Base class charged with knowing how to connect to a remote file system, @@ -122,6 +124,18 @@ public abstract class AbstractInboundFileSynchronizer implements InboundFileS } } - protected abstract void synchronizeToLocalDirectory(String remoteDirectoryPath, File localDirectory, Session session) throws IOException; + private void synchronizeToLocalDirectory(String remoteDirectoryPath, File localDirectory, Session session) throws IOException { + F[] files = session.ls(remoteDirectoryPath); + if (!ObjectUtils.isEmpty(files)) { + Collection filteredFiles = this.filterFiles(files); + for (F file : filteredFiles) { + if (file != null) { + this.copyFileToLocalDirectory(remoteDirectoryPath, file, localDirectory, session); + } + } + } + } + + protected abstract boolean copyFileToLocalDirectory(String remoteDirectoryPath, F file, File localDirectory, Session session) throws IOException; } diff --git a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/inbound/FtpInboundFileSynchronizer.java b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/inbound/FtpInboundFileSynchronizer.java index 2fc106a79a..80ca841fa9 100644 --- a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/inbound/FtpInboundFileSynchronizer.java +++ b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/inbound/FtpInboundFileSynchronizer.java @@ -20,7 +20,6 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.util.Collection; import org.apache.commons.net.ftp.FTPFile; @@ -29,7 +28,6 @@ import org.springframework.integration.file.remote.session.Session; import org.springframework.integration.file.remote.session.SessionFactory; import org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer; import org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizingMessageSource; -import org.springframework.util.CollectionUtils; import org.springframework.util.FileCopyUtils; /** @@ -49,19 +47,7 @@ public class FtpInboundFileSynchronizer extends AbstractInboundFileSynchronizer< @Override - protected void synchronizeToLocalDirectory(String remoteDirectoryPath, File localDirectory, Session session) throws IOException { - Collection files = session.ls(remoteDirectoryPath); - if (!CollectionUtils.isEmpty(files)) { - Collection filteredFiles = this.filterFiles(files.toArray(new FTPFile[]{})); - for (FTPFile file : filteredFiles) { - if (file != null) { - copyFileToLocalDirectory(remoteDirectoryPath, file, localDirectory, session); - } - } - } - } - - private boolean copyFileToLocalDirectory(String remoteDirectoryPath, FTPFile ftpFile, File localDirectory, Session session) throws IOException { + protected boolean copyFileToLocalDirectory(String remoteDirectoryPath, FTPFile ftpFile, File localDirectory, Session session) throws IOException { if (!ftpFile.isFile()) { return false; } diff --git a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/session/FtpSession.java b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/session/FtpSession.java index eabb91cbfe..5e58ac0bf9 100644 --- a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/session/FtpSession.java +++ b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/session/FtpSession.java @@ -19,9 +19,6 @@ package org.springframework.integration.ftp.session; import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -63,20 +60,15 @@ public class FtpSession implements Session { } @SuppressWarnings({"unchecked", "rawtypes"}) - public Collection ls(String path) { + public FTPFile[] ls(String path) { try { - FTPFile[] files = this.client.listFiles(path); - ArrayList list = new ArrayList(); - for (FTPFile file : files) { - list.add(file); - } - return list; + return this.client.listFiles(path); } catch (IOException e) { if (logger.isWarnEnabled()) { logger.warn("failed to list files", e); } - return Collections.EMPTY_LIST; + return new FTPFile[0]; } } diff --git a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/inbound/SftpInboundFileSynchronizer.java b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/inbound/SftpInboundFileSynchronizer.java index 2bdb555299..9ba5d3f3a5 100644 --- a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/inbound/SftpInboundFileSynchronizer.java +++ b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/inbound/SftpInboundFileSynchronizer.java @@ -20,24 +20,22 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.util.Collection; import org.springframework.integration.MessagingException; import org.springframework.integration.file.remote.session.Session; import org.springframework.integration.file.remote.session.SessionFactory; import org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer; import org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizingMessageSource; -import org.springframework.util.CollectionUtils; import org.springframework.util.FileCopyUtils; import com.jcraft.jsch.ChannelSftp; -import com.jcraft.jsch.ChannelSftp.LsEntry; /** * Handles the synchronization between a remote SFTP directory and a local mount. * * @author Josh Long * @author Oleg Zhurakousky + * @author Mark Fisher * @since 2.0 */ public class SftpInboundFileSynchronizer extends AbstractInboundFileSynchronizer { @@ -48,19 +46,7 @@ public class SftpInboundFileSynchronizer extends AbstractInboundFileSynchronizer @Override - protected void synchronizeToLocalDirectory(String remoteDirectoryPath, File localDirectory, Session session) throws IOException { - Collection files = session.ls(remoteDirectoryPath); - if (!CollectionUtils.isEmpty(files)) { - Collection filteredFiles = this.filterFiles(files.toArray(new LsEntry[]{})); - for (LsEntry file : filteredFiles) { - if (file != null) { - copyFileToLocalDirectory(remoteDirectoryPath, file, localDirectory, session); - } - } - } - } - - private boolean copyFileToLocalDirectory(String remoteDirectoryPath, ChannelSftp.LsEntry entry, File localDirectory, Session session) throws IOException { + protected boolean copyFileToLocalDirectory(String remoteDirectoryPath, ChannelSftp.LsEntry entry, File localDirectory, Session session) throws IOException { if (entry == null || entry.getAttrs() == null || entry.getAttrs().isDir() || entry.getAttrs().isLink()) { return false; } diff --git a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/session/SftpSession.java b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/session/SftpSession.java index c94b38bd4a..0de2e1ebff 100644 --- a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/session/SftpSession.java +++ b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/session/SftpSession.java @@ -17,8 +17,7 @@ package org.springframework.integration.sftp.session; import java.io.InputStream; -import java.util.Collection; -import java.util.Collections; +import java.util.Vector; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -28,6 +27,7 @@ import org.springframework.util.Assert; import org.springframework.util.StringUtils; import com.jcraft.jsch.ChannelSftp; +import com.jcraft.jsch.ChannelSftp.LsEntry; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.SftpException; @@ -155,17 +155,26 @@ public class SftpSession implements Session { } @SuppressWarnings("unchecked") - public Collection ls(String path) { + public LsEntry[] ls(String path) { Assert.state(channel != null, "session is not connected"); try { - return channel.ls(path); + Vector lsEntries = channel.ls(path); + if (lsEntries != null) { + LsEntry[] entries = new LsEntry[lsEntries.size()]; + for (int i = 0; i < lsEntries.size(); i++) { + Object next = lsEntries.get(i); + Assert.state(next instanceof LsEntry, "expected only LsEntry instances from channel.ls()"); + entries[i] = (LsEntry) next; + } + return entries; + } } catch (SftpException e) { if (logger.isWarnEnabled()) { logger.warn("ls failed", e); } - return Collections.EMPTY_LIST; } + return new LsEntry[0]; } public InputStream get(String source) {