diff --git a/pom.xml b/pom.xml
index 0dbe2d90..ec18ed0d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -76,6 +76,12 @@
0.9.29
test
+
+ org.mockito
+ mockito-all
+ 1.9.0-rc1
+ test
+
diff --git a/src/main/java/net/schmizz/sshj/xfer/scp/SCPUploadClient.java b/src/main/java/net/schmizz/sshj/xfer/scp/SCPUploadClient.java
index 90afe961..9a5321da 100644
--- a/src/main/java/net/schmizz/sshj/xfer/scp/SCPUploadClient.java
+++ b/src/main/java/net/schmizz/sshj/xfer/scp/SCPUploadClient.java
@@ -16,6 +16,7 @@
package net.schmizz.sshj.xfer.scp;
import net.schmizz.sshj.common.IOUtils;
+import net.schmizz.sshj.xfer.LocalFileFilter;
import net.schmizz.sshj.xfer.LocalSourceFile;
import net.schmizz.sshj.xfer.scp.SCPEngine.Arg;
@@ -28,8 +29,9 @@ import java.util.List;
public final class SCPUploadClient {
private final SCPEngine engine;
+ private LocalFileFilter uploadFilter;
- SCPUploadClient(SCPEngine engine) {
+ SCPUploadClient(SCPEngine engine) {
this.engine = engine;
}
@@ -45,7 +47,11 @@ public final class SCPUploadClient {
return engine.getExitStatus();
}
- private synchronized void startCopy(LocalSourceFile sourceFile, String targetPath)
+ public void setUploadFilter(LocalFileFilter uploadFilter) {
+ this.uploadFilter = uploadFilter;
+ }
+
+ private synchronized void startCopy(LocalSourceFile sourceFile, String targetPath)
throws IOException {
List args = new LinkedList();
args.add(Arg.SINK);
@@ -75,7 +81,7 @@ public final class SCPUploadClient {
throws IOException {
preserveTimeIfPossible(f);
engine.sendMessage("D0" + getPermString(f) + " 0 " + f.getName());
- for (LocalSourceFile child : f.getChildren(null))
+ for (LocalSourceFile child : f.getChildren(uploadFilter))
process(child);
engine.sendMessage("E");
}
diff --git a/src/test/java/net/schmizz/sshj/xfer/scp/SCPUploadClientTest.java b/src/test/java/net/schmizz/sshj/xfer/scp/SCPUploadClientTest.java
new file mode 100644
index 00000000..eb1b11b6
--- /dev/null
+++ b/src/test/java/net/schmizz/sshj/xfer/scp/SCPUploadClientTest.java
@@ -0,0 +1,54 @@
+package net.schmizz.sshj.xfer.scp;
+
+import net.schmizz.sshj.xfer.FileSystemFile;
+import net.schmizz.sshj.xfer.LocalFileFilter;
+import net.schmizz.sshj.xfer.LocalSourceFile;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.mockito.verification.VerificationMode;
+
+import java.io.File;
+import java.io.IOException;
+
+import static org.mockito.Matchers.endsWith;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Matchers.isA;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+public class SCPUploadClientTest {
+
+ private SCPEngine engine;
+ private SCPUploadClient scpUploadClient;
+
+ @Rule
+ public TemporaryFolder temp = new TemporaryFolder();
+
+ @Before
+ public void init() {
+ engine = mock(SCPEngine.class);
+ scpUploadClient = new SCPUploadClient(engine);
+ }
+
+ @Test
+ public void shouldOnlySendFilterAcceptedFilesFromDirectory() throws IOException {
+ scpUploadClient.setUploadFilter(new LocalFileFilter() {
+ @Override
+ public boolean accept(LocalSourceFile file) {
+ return !file.getName().contains("not-");
+ }
+ });
+
+ File dir = temp.newFolder("filtered-scp-upload");
+ new File(dir, "not-sent.txt").createNewFile();
+ new File(dir, "sent.txt").createNewFile();
+
+ int copy = scpUploadClient.copy(new FileSystemFile(dir), "/tmp");
+ verify(engine).startedDir("filtered-scp-upload");
+ verify(engine).startedFile(eq("sent.txt"), isA(Long.class));
+ verify(engine, times(1)).startedFile(isA(String.class), isA(Long.class));
+ }
+}