From 54ea3867b6f0328e49fb732157f71daa1229a437 Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Sun, 21 Nov 2010 15:16:37 -0500 Subject: [PATCH] INT-1614 refactoring as much as possible into base class --- .../inbound/FtpInboundFileSynchronizer.java | 14 ++++++------- .../inbound/SftpInboundFileSynchronizer.java | 21 ++++++++++++------- ...oundRemoteFileSystemSynchronizerTests.java | 11 +++++++--- 3 files changed, 28 insertions(+), 18 deletions(-) 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 4abf62258f..2fc106a79a 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 @@ -17,7 +17,6 @@ package org.springframework.integration.ftp.inbound; import java.io.File; -import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -54,17 +53,18 @@ public class FtpInboundFileSynchronizer extends AbstractInboundFileSynchronizer< Collection files = session.ls(remoteDirectoryPath); if (!CollectionUtils.isEmpty(files)) { Collection filteredFiles = this.filterFiles(files.toArray(new FTPFile[]{})); - for (FTPFile ftpFile : filteredFiles) { - if ((ftpFile != null) && ftpFile.isFile()) { - copyFileToLocalDirectory(session, ftpFile, localDirectory); + for (FTPFile file : filteredFiles) { + if (file != null) { + copyFileToLocalDirectory(remoteDirectoryPath, file, localDirectory, session); } } } } - private boolean copyFileToLocalDirectory(Session session, FTPFile ftpFile, File localDirectory) - throws IOException, FileNotFoundException { - + private boolean copyFileToLocalDirectory(String remoteDirectoryPath, FTPFile ftpFile, File localDirectory, Session session) throws IOException { + if (!ftpFile.isFile()) { + return false; + } String remoteFileName = ftpFile.getName(); String localFileName = localDirectory.getPath() + "/" + remoteFileName; File localFile = new File(localFileName); 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 8869109c4c..2bdb555299 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 @@ -27,9 +27,11 @@ 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. @@ -47,18 +49,21 @@ public class SftpInboundFileSynchronizer extends AbstractInboundFileSynchronizer @Override protected void synchronizeToLocalDirectory(String remoteDirectoryPath, File localDirectory, Session session) throws IOException { - Collection beforeFilter = session.ls(remoteDirectoryPath); - ChannelSftp.LsEntry[] entries = (beforeFilter == null) ? new ChannelSftp.LsEntry[0] : - beforeFilter.toArray(new ChannelSftp.LsEntry[beforeFilter.size()]); - Collection files = this.filterFiles(entries); - for (ChannelSftp.LsEntry lsEntry : files) { - if ((lsEntry != null) && !lsEntry.getAttrs().isDir() && !lsEntry.getAttrs().isLink()) { - copyFromRemoteToLocalDirectory(remoteDirectoryPath, lsEntry, localDirectory, session); + 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 copyFromRemoteToLocalDirectory(String remoteDirectoryPath, ChannelSftp.LsEntry entry, File localDirectory, Session session) throws IOException { + private 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; + } File localFile = new File(localDirectory, entry.getFilename()); if (!localFile.exists()) { InputStream in = null; 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 22df941459..dc7c54fcfe 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 @@ -34,6 +34,7 @@ import org.springframework.util.ReflectionUtils; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.ChannelSftp.LsEntry; +import com.jcraft.jsch.SftpATTRS; /** * @author Oleg Zhurakousky @@ -65,14 +66,18 @@ public class SftpInboundRemoteFileSystemSynchronizerTests { @Test public void testCopyAndRenameWhenLocalFileExists() throws Exception { SftpInboundFileSynchronizer synchronizer = new SftpInboundFileSynchronizer(mock(SessionFactory.class)); - Method method = - ReflectionUtils.findMethod(synchronizer.getClass(), "copyFromRemoteToLocalDirectory", String.class, LsEntry.class, File.class, Session.class); + Method method = ReflectionUtils.findMethod(synchronizer.getClass(), + "copyFileToLocalDirectory", String.class, LsEntry.class, File.class, Session.class); method.setAccessible(true); Session session = mock(Session.class); LsEntry entry = mock(LsEntry.class); + SftpATTRS attrs = mock(SftpATTRS.class); + when(attrs.isDir()).thenReturn(false); + when(attrs.isLink()).thenReturn(false); + when(entry.getAttrs()).thenReturn(attrs); when(entry.getFilename()).thenReturn("foo.txt"); File localDir = new File("target"); - boolean success = (Boolean) method.invoke(synchronizer, "remoteDir", entry, localDir, session); + Boolean success = (Boolean) method.invoke(synchronizer, "remoteDir", entry, localDir, session); assertTrue(success); } /**