package io.fathom.cloud.sftp; import io.fathom.cloud.ssh.SftpChannel; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import com.google.common.io.ByteSource; import com.google.common.io.ByteStreams; import com.google.common.io.Files; public class Sftp extends SftpChannelDelegate { private final RemoteFile tmpdir; public Sftp(SftpChannel inner, RemoteFile tmpdir) { super(inner); this.tmpdir = tmpdir; } public void writeAtomic(RemoteFile remoteFile, File src) throws IOException { writeAtomic(remoteFile, Files.asByteSource(src)); } public void writeAtomic(RemoteFile remoteFile, byte[] src) throws IOException { writeAtomic(remoteFile, ByteStreams.asByteSource(src)); } public void writeAtomic(RemoteFile remoteFile, ByteSource src) throws IOException { writeAtomic(remoteFile, src, null); } public void writeAtomic(RemoteFile remoteFile, ByteSource src, Integer chmod) throws IOException { try (RemoteTempFile remoteTemp = buildRemoteTemp()) { try (OutputStream os = writeFile(remoteTemp.getSshPath(), WriteMode.Overwrite)) { src.copyTo(os); } if (chmod != null) { this.chmod(remoteTemp.getSshPath(), chmod); } remoteTemp.renameTo(remoteFile); } } public RemoteTempFile buildRemoteTemp() { return RemoteTempFile.create(inner, tmpdir); } public void copy(RemoteFile src, File dest) throws IOException { try (InputStream is = open(src.getSshPath())) { ByteStreams.copy(is, Files.newOutputStreamSupplier(dest)); } } // public void writeAtomic(RemoteFile remoteFile, InputSupplier<? extends // InputStream> from) throws IOException { // try (RemoteTempFile remoteTemp = buildRemoteTemp()) { // try (OutputStream os = writeFile(remoteTemp.getSshPath(), // WriteMode.Overwrite)) { // ByteStreams.copy(from, os); // } // // remoteTemp.renameTo(remoteFile); // } // } }