From 9761f44cd467921690c1f86acb7d76d72a5e5b9a Mon Sep 17 00:00:00 2001 From: Cyril Ledru Date: Wed, 16 Mar 2011 21:17:06 +0800 Subject: [PATCH] LocalFile abstraction in SFTPFileTransfer Upload method using LocalFile in FileTransfer. Use only LocalFile in SFTPFileTransfer Upload. --- .../schmizz/sshj/sftp/SFTPFileTransfer.java | 40 +++++++++++-------- .../net/schmizz/sshj/xfer/FileSystemFile.java | 6 +++ .../net/schmizz/sshj/xfer/FileTransfer.java | 3 ++ .../net/schmizz/sshj/xfer/InMemoryFile.java | 7 ++++ .../java/net/schmizz/sshj/xfer/LocalFile.java | 2 + .../sshj/xfer/scp/SCPFileTransfer.java | 1 + 6 files changed, 43 insertions(+), 16 deletions(-) diff --git a/src/main/java/net/schmizz/sshj/sftp/SFTPFileTransfer.java b/src/main/java/net/schmizz/sshj/sftp/SFTPFileTransfer.java index b535317f..681cf0f8 100644 --- a/src/main/java/net/schmizz/sshj/sftp/SFTPFileTransfer.java +++ b/src/main/java/net/schmizz/sshj/sftp/SFTPFileTransfer.java @@ -15,20 +15,22 @@ */ package net.schmizz.sshj.sftp; +import java.io.File; +import java.io.FileFilter; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.EnumSet; + import net.schmizz.sshj.common.StreamCopier; import net.schmizz.sshj.sftp.Response.StatusCode; import net.schmizz.sshj.xfer.AbstractFileTransfer; +import net.schmizz.sshj.xfer.FileSystemFile; import net.schmizz.sshj.xfer.FileTransfer; import net.schmizz.sshj.xfer.FileTransferUtil; +import net.schmizz.sshj.xfer.LocalFile; import net.schmizz.sshj.xfer.TransferListener; -import java.io.File; -import java.io.FileFilter; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.EnumSet; - public class SFTPFileTransfer extends AbstractFileTransfer implements FileTransfer { @@ -61,8 +63,14 @@ public class SFTPFileTransfer @Override public void upload(String source, String dest) throws IOException { - new Uploader().upload(new File(source), dest); + new Uploader().upload(new FileSystemFile(source), dest); } + + @Override + public void upload(LocalFile localFile, String remotePath) + throws IOException { + new Uploader().upload(localFile, remotePath); + } @Override public void download(String source, String dest) @@ -163,7 +171,7 @@ public class SFTPFileTransfer private final TransferListener listener = getTransferListener(); - private void upload(File local, String remote) + private void upload(LocalFile local, String remote) throws IOException { final String adjustedPath; if (local.isDirectory()) { @@ -179,22 +187,22 @@ public class SFTPFileTransfer engine.setAttributes(adjustedPath, getAttributes(local)); } - private String uploadDir(File local, String remote) + private String uploadDir(LocalFile local, String remote) throws IOException { final String adjusted = prepareDir(local, remote); - for (File f : local.listFiles(getUploadFilter())) + for (LocalFile f : local.getChildren(getUploadFilter())) upload(f, adjusted); return adjusted; } - private String uploadFile(File local, String remote) + private String uploadFile(LocalFile local, String remote) throws IOException { final String adjusted = prepareFile(local, remote); final RemoteFile rf = engine.open(adjusted, EnumSet.of(OpenMode.WRITE, OpenMode.CREAT, OpenMode.TRUNC)); try { - final FileInputStream fis = new FileInputStream(local); + final InputStream fis = local.stream(); try { final int bufSize = engine.getSubsystem().getRemoteMaxPacketSize() - rf.getOutgoingPacketOverhead(); StreamCopier.copy(fis, rf.getOutputStream(), bufSize, false, listener); @@ -207,7 +215,7 @@ public class SFTPFileTransfer return adjusted; } - private String prepareDir(File local, String remote) + private String prepareDir(LocalFile local, String remote) throws IOException { final FileAttributes attrs; try { @@ -233,7 +241,7 @@ public class SFTPFileTransfer throw new IOException(attrs.getMode().getType() + " file already exists at " + remote); } - private String prepareFile(File local, String remote) + private String prepareFile(LocalFile local, String remote) throws IOException { final FileAttributes attrs; try { @@ -255,7 +263,7 @@ public class SFTPFileTransfer } } - private FileAttributes getAttributes(File local) + private FileAttributes getAttributes(LocalFile local) throws IOException { final FileAttributes.Builder builder = new FileAttributes.Builder() .withPermissions(getModeGetter().getPermissions(local)); diff --git a/src/main/java/net/schmizz/sshj/xfer/FileSystemFile.java b/src/main/java/net/schmizz/sshj/xfer/FileSystemFile.java index 83049869..c433a534 100644 --- a/src/main/java/net/schmizz/sshj/xfer/FileSystemFile.java +++ b/src/main/java/net/schmizz/sshj/xfer/FileSystemFile.java @@ -57,6 +57,12 @@ public class FileSystemFile implements LocalFile { return getChildren(file); } + @Override + public Iterable getChildren(FileFilter filter) throws IOException { + setFileFilter(filter); + return getChildren(file); + } + private Iterable getChildren(File f) throws IOException { Collection files = new ArrayList(); File[] childFiles = fileFilter == null ? f.listFiles() : f.listFiles(fileFilter); diff --git a/src/main/java/net/schmizz/sshj/xfer/FileTransfer.java b/src/main/java/net/schmizz/sshj/xfer/FileTransfer.java index 43656fcd..a254a0f9 100644 --- a/src/main/java/net/schmizz/sshj/xfer/FileTransfer.java +++ b/src/main/java/net/schmizz/sshj/xfer/FileTransfer.java @@ -22,6 +22,9 @@ public interface FileTransfer { void upload(String localPath, String remotePath) throws IOException; + void upload(LocalFile localFile, String remotePath) + throws IOException; + void download(String remotePath, String localPath) throws IOException; diff --git a/src/main/java/net/schmizz/sshj/xfer/InMemoryFile.java b/src/main/java/net/schmizz/sshj/xfer/InMemoryFile.java index 49ff53e8..1d406022 100644 --- a/src/main/java/net/schmizz/sshj/xfer/InMemoryFile.java +++ b/src/main/java/net/schmizz/sshj/xfer/InMemoryFile.java @@ -1,6 +1,7 @@ package net.schmizz.sshj.xfer; import java.io.ByteArrayInputStream; +import java.io.FileFilter; import java.io.IOException; import java.io.InputStream; import java.util.Collections; @@ -72,4 +73,10 @@ public class InMemoryFile implements LocalFile { public Iterable getChildren() { return Collections.emptyList(); } + + @Override + public Iterable getChildren(FileFilter filter) + throws IOException { + return Collections.emptyList(); + } } diff --git a/src/main/java/net/schmizz/sshj/xfer/LocalFile.java b/src/main/java/net/schmizz/sshj/xfer/LocalFile.java index 0c8ad7cd..55a0598d 100644 --- a/src/main/java/net/schmizz/sshj/xfer/LocalFile.java +++ b/src/main/java/net/schmizz/sshj/xfer/LocalFile.java @@ -1,5 +1,6 @@ package net.schmizz.sshj.xfer; +import java.io.FileFilter; import java.io.IOException; import java.io.InputStream; @@ -16,4 +17,5 @@ public interface LocalFile { InputStream stream() throws IOException; Iterable getChildren() throws IOException; + Iterable getChildren(FileFilter filter) throws IOException; } diff --git a/src/main/java/net/schmizz/sshj/xfer/scp/SCPFileTransfer.java b/src/main/java/net/schmizz/sshj/xfer/scp/SCPFileTransfer.java index 00144eea..75ee35fd 100644 --- a/src/main/java/net/schmizz/sshj/xfer/scp/SCPFileTransfer.java +++ b/src/main/java/net/schmizz/sshj/xfer/scp/SCPFileTransfer.java @@ -57,6 +57,7 @@ public class SCPFileTransfer newSCPUploadClient().copy(new FileSystemFile(localPath), remotePath); } + @Override public void upload(LocalFile localFile, String remotePath) throws IOException { newSCPUploadClient().copy(localFile, remotePath);