package com.netifera.platform.net.services.basic;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
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.UsernameAndPassword;
public class FTPFileSystem implements IFileSystem {
private FTP ftp;
private UsernameAndPassword credential;
private List<IFileSystemListener> listeners = new ArrayList<IFileSystemListener>();
public FTPFileSystem(FTP ftp, UsernameAndPassword credential) {
this.ftp = ftp;
this.credential = credential;
}
public File createDirectory(String directoryName) throws IOException {
FTPClient client = ftp.createClient(credential);
try {
if (client.makeDirectory(directoryName)) {
File file = new File(this, directoryName, File.DIRECTORY, 0, 0);
for (IFileSystemListener listener: listeners)
listener.added(file);
return file;
}
} finally {
client.disconnect();
}
return null;
}
public boolean delete(String fileName) throws IOException {
FTPClient client = ftp.createClient(credential);
try {
if (client.deleteFile(fileName)) {
File file = new File(this, fileName, File.FILE, 0, 0);
for (IFileSystemListener listener: listeners)
listener.removed(file);
return true;
}
} finally {
client.disconnect();
}
return false;
}
public boolean deleteDirectory(String directoryName) throws IOException {
FTPClient client = ftp.createClient(credential);
try {
if (client.deleteFile(directoryName)) {
File file = new File(this, directoryName, File.DIRECTORY, 0, 0);
for (IFileSystemListener listener: listeners)
listener.removed(file);
return true;
}
} finally {
client.disconnect();
}
return false;
}
public boolean rename(String oldName, String newName) throws IOException {
FTPClient client = ftp.createClient(credential);
try {
if (client.rename(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.disconnect();
}
return false;
}
private File convert(String directoryPath, FTPFile ftpFile) {
int attributes = 0;
if (ftpFile.isDirectory())
attributes |= File.DIRECTORY;
if (ftpFile.isFile())
attributes |= File.FILE;
return new File(this, directoryPath+"/"+ftpFile.getName(), attributes, ftpFile.getSize(), ftpFile.getTimestamp().getTimeInMillis());
}
private File[] convert(String directoryPath, FTPFile[] ftpFiles) {
List<File> files = new ArrayList<File>();
for (FTPFile ftpFile: ftpFiles)
files.add(convert(directoryPath, ftpFile));
return files.toArray(new File[files.size()]);
}
public File[] getDirectoryList(String directoryName) throws IOException {
FTPClient client = ftp.createClient(credential);
try {
// client.pasv();
FTPFile[] files = client.listFiles(directoryName);
return convert(directoryName, files);
} finally {
client.disconnect();
}
}
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 ftp.toString();
}
}