package com.netifera.platform.net.ssh.filesystem;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import com.netifera.platform.host.filesystem.File;
import com.netifera.platform.host.filesystem.IFileSystem;
import com.netifera.platform.host.filesystem.IFileSystemListener;
import com.netifera.platform.net.services.credentials.Credential;
import com.netifera.platform.net.services.credentials.UsernameAndPassword;
import com.netifera.platform.net.services.ssh.SSH;
import com.trilead.ssh2.SFTPv3Client;
import com.trilead.ssh2.SFTPv3DirectoryEntry;
public class SFTPFileSystem implements IFileSystem {
private SSH ssh;
private Credential credential;
private List<IFileSystemListener> listeners = new ArrayList<IFileSystemListener>();
public SFTPFileSystem(SSH ssh, UsernameAndPassword credential) {
this.ssh = ssh;
this.credential = credential;
}
public File createDirectory(String directoryName) throws IOException {
SFTPv3Client client = new SFTPv3Client(ssh.createConnection(credential));
try {
client.mkdir(directoryName, 0775);
File file = new File(this, directoryName, File.DIRECTORY, 0, 0);
for (IFileSystemListener listener: listeners)
listener.added(file);
return file;
} finally {
client.close();
}
}
public boolean delete(String fileName) throws IOException {
SFTPv3Client client = new SFTPv3Client(ssh.createConnection(credential));
try {
client.rm(fileName);
File file = new File(this, fileName, File.FILE, 0, 0);
for (IFileSystemListener listener: listeners)
listener.removed(file);
return true;
} finally {
client.close();
}
// return false;
}
public boolean deleteDirectory(String directoryName) throws IOException {
SFTPv3Client client = new SFTPv3Client(ssh.createConnection(credential));
try {
client.rmdir(directoryName);
File file = new File(this, directoryName, File.DIRECTORY, 0, 0);
for (IFileSystemListener listener: listeners)
listener.removed(file);
return true;
} finally {
client.close();
}
// return false;
}
public boolean rename(String oldName, String newName) throws IOException {
SFTPv3Client client = new SFTPv3Client(ssh.createConnection(credential));
try {
client.mv(oldName, newName);
File oldFile = new File(this, oldName, File.FILE, 0, 0);
File newFile = new File(this, newName, File.FILE, 0, 0);
for (IFileSystemListener listener: listeners) {
listener.removed(oldFile);
listener.added(newFile);
}
return true;
} finally {
client.close();
}
// return false;
}
private File convert(String directoryPath, SFTPv3DirectoryEntry sftpFile) {
int attributes = 0;
if (sftpFile.attributes.isDirectory())
attributes |= File.DIRECTORY;
if (sftpFile.attributes.isRegularFile())
attributes |= File.FILE;
if (!directoryPath.endsWith("/"))
directoryPath += "/";
String fullPath = directoryPath+sftpFile.filename;
if (fullPath.endsWith("/"))
fullPath = fullPath.substring(0, fullPath.length()-1);
return new File(this, fullPath, attributes, sftpFile.attributes.size, sftpFile.attributes.mtime);
}
private File[] convert(String directoryPath, Vector<SFTPv3DirectoryEntry> sftpFiles) {
List<File> files = new ArrayList<File>();
for (SFTPv3DirectoryEntry sftpFile: sftpFiles)
if (!sftpFile.filename.equals("..") && !sftpFile.filename.equals("."))
files.add(convert(directoryPath, sftpFile));
return files.toArray(new File[files.size()]);
}
public File[] getDirectoryList(String directoryName) throws IOException {
SFTPv3Client client = new SFTPv3Client(ssh.createConnection(credential));
try {
return convert(directoryName, client.ls(directoryName));
} finally {
client.close();
}
}
public String getNameSeparator() {
return "/";
}
public InputStream getInputStream(String fileName) throws IOException {
// TODO Auto-generated method stub
return null;
}
public OutputStream getOutputStream(String fileName) throws IOException {
// TODO Auto-generated method stub
return null;
}
public File[] getRoots() {
return new File[] {new File(this, "/", File.DIRECTORY, 0, 0)};
}
public void addListener(IFileSystemListener listener) {
listeners.add(listener);
}
public void removeListener(IFileSystemListener listener) {
listeners.remove(listener);
}
@Override
public String toString() {
return ssh.toString();
}
}