/**
*
* @author pquiring
*/
import java.io.*;
import java.util.*;
import javax.swing.*;
import javaforce.*;
public class SiteFTP extends Site implements FTP.ProgressListener {
public FTP ftp;
@Override
public boolean connect(SiteDetails sd) {
try {
ftp = new FTP();
ftp.setLogging(true);
ftp.addProgressListener(this);
setStatus("Connecting...");
if (!ftp.connect(sd.host, Integer.valueOf(sd.port))) {
throw new Exception("Connection failed");
}
setStatus("Login...");
if (!ftp.login(sd.username, sd.password)) {
throw new Exception("Login denied");
}
if (sd.remoteDir.length() > 0) {
ftp.cd(sd.remoteDir);
}
remote_ls();
if (!ftp.setBinary()) {
throw new Exception("Binary mode not supported");
}
setStatus(null);
} catch (Exception e) {
JF.showMessage("Error", "Error:" + e);
JFLog.log(e);
closeSite();
return false;
}
return true;
}
@Override
public void disconnect() {
try {ftp.disconnect();} catch (Exception e) {}
}
public String remote_pwd() {
String wd;
try {
wd = ftp.pwd();
int i1 = wd.indexOf("\"");
if (i1 != -1) {
//the reply is ["path" is your current location]
int i2 = wd.lastIndexOf("\"");
if (i1 == i2) return "/";
wd = wd.substring(i1+1, i2);
}
} catch (Exception e) {
return "/";
}
return wd;
}
public void remote_ls() {
try {
String wd = remote_pwd();
remoteDir.setText(wd);
parseRemote(wd, ftp.ls("."));
} catch (Exception e) {
setStatus(null);
JFLog.log(e);
addLog("Error:" + e);
addLog(ftp.getLastResponse());
remoteFilesTableModel.setRowCount(0);
remoteFilesTableModel.addRow(new Object[] {"Error"});
}
}
@Override
public void remote_chdir(String path) {
path = path.replaceAll("\\\\", "/");
try {
ftp.cd(path);
remote_ls();
} catch (Exception e) {
setStatus(null);
JFLog.log(e);
addLog("Error:" + e);
addLog(ftp.getLastResponse());
}
}
@Override
public void download() {
if (JF.isWindows() && localDir.getText().equals("/")) return;
aborted = false;
localFolderStack = new ArrayList<String>();
remoteFolderStack = new ArrayList<String>();
new Thread() {
@Override
public void run() {
setStatus("Downloading");
download_files();
setStatus(null);
}
public void download_files() {
try {
int rows[] = remoteFiles.getSelectedRows();
if (rows.length == 0) return;
SiteFile sf[] = new SiteFile[rows.length];
for(int idx=0;idx<rows.length;idx++) {
sf[idx] = (SiteFile)remoteFilesTableModel.getValueAt(rows[idx], 0);
}
for(int idx=0;idx<sf.length;idx++) {
if (sf[idx].getText().equals(".")) continue;
if (sf[idx].getText().equals("..")) continue;
totalFileSize = sf[idx].filesize;
if (sf[idx].isDir) {
remoteFolderStack.add(remoteDir.getText());
remote_chdir(sf[idx].getText());
}
if (sf[idx].isLink && !sf[idx].isDir) {
//test if dir
String d1 = remoteDir.getText();
remote_chdir(sf[idx].getText());
String d2 = remoteDir.getText();
if (!d1.equals(d2)) {
remoteFolderStack.add(d1);
sf[idx].isDir = true;
}
}
if (sf[idx].isDir) {
//already remote_chdir()
localFolderStack.add(localDir.getText());
local_mkdir(localDir.getText() + "/" + sf[idx].getText());
local_chdir(sf[idx].getText());
remoteFiles.selectAll();
download_files();
remote_chdir(remoteFolderStack.remove(remoteFolderStack.size() - 1));
local_chdir(localFolderStack.remove(localFolderStack.size() - 1));
continue;
}
File remoteFile = new File(remoteDir.getText() + "/" + sf[idx].getText());
File localFile = new File(localDir.getText() + "/" + sf[idx].getText());
JFLog.log("download:" + remoteFile + "->" + localFile);
addLog("download:" + remoteFile + "->" + localFile);
setStatus("download:" + remoteFile + "->" + localFile);
setTotalFileSize(sf[idx].filesize);
download_file(remoteFile, localFile);
if (aborted) break;
}
} catch (Exception e) {
setStatus(null);
JFLog.log(e);
addLog("Error:" + e);
addLog(ftp.getLastResponse());
}
local_chdir("."); //refresh
}
}.start();
}
public void download_file(File remote, File local) {
try {
ftp.get(remote, local);
} catch (Exception e) {
setStatus(null);
JFLog.log(e);
addLog("Error:" + e);
addLog(ftp.getLastResponse());
}
}
@Override
public void upload() {
aborted = false;
localFolderStack = new ArrayList<String>();
remoteFolderStack = new ArrayList<String>();
new Thread() {
@Override
public void run() {
setStatus("Uploading");
upload_files();
setStatus(null);
}
public void upload_files() {
try {
int rows[] = localFiles.getSelectedRows();
if (rows.length == 0) return;
SiteFile sf[] = new SiteFile[rows.length];
for(int idx=0;idx<rows.length;idx++) {
sf[idx] = (SiteFile)localFilesTableModel.getValueAt(rows[idx], 0);
}
for(int idx=0;idx<sf.length;idx++) {
if (sf[idx].getText().equals(".")) continue;
if (sf[idx].getText().equals("..")) continue;
totalFileSize = sf[idx].filesize;
if (sf[idx].isDir) {
localFolderStack.add(localDir.getText());
local_chdir(sf[idx].getText());
}
if (sf[idx].isLink && !sf[idx].isDir) {
//test if dir
String d1 = localDir.getText();
local_chdir(sf[idx].getText());
String d2 = localDir.getText();
if (!d1.equals(d2)) {
localFolderStack.add(d1);
sf[idx].isDir = true;
}
}
if (sf[idx].isDir) {
//already local_chdir()
remoteFolderStack.add(remoteDir.getText());
remote_mkdir(sf[idx].getText());
remote_chdir(sf[idx].getText());
localFiles.selectAll();
upload_files();
remote_chdir(remoteFolderStack.remove(remoteFolderStack.size() - 1));
local_chdir(localFolderStack.remove(localFolderStack.size() - 1));
continue;
}
File remoteFile = new File(remoteDir.getText() + "/" + sf[idx].getText());
File localFile = new File(localDir.getText() + "/" + sf[idx].getText());
JFLog.log("upload:" + localFile + "->" + remoteFile);
addLog("upload:" + localFile + "->" + remoteFile);
setStatus("upload:" + localFile + "->" + remoteFile);
setTotalFileSize((int)localFile.length());
upload_file(localFile, remoteFile);
if (aborted) break;
}
} catch (Exception e) {
setStatus(null);
JFLog.log(e);
addLog("Error:" + e);
addLog(ftp.getLastResponse());
}
remote_chdir("."); //refresh
}
}.start();
}
public void upload_file(File local, File remote) {
try {
ftp.put(local, remote);
} catch (Exception e) {
setStatus(null);
JFLog.log(e);
addLog("Error:" + e);
addLog(ftp.getLastResponse());
}
}
public void abort() {
aborted = true;
ftp.abort();
}
@Override
public void remote_mkdir() {
String fn = JF.getString("Enter new folder name", "");
if ((fn == null) || (fn.length() == 0)) return;
if (fn.indexOf(":") != -1) return;
if (fn.indexOf("/") != -1) return;
if (fn.indexOf("?") != -1) return;
if (fn.indexOf("*") != -1) return;
String wd = remoteDir.getText();
if (!wd.endsWith("/")) wd += "/";
String file = wd + fn;
remote_mkdir(file);
remote_chdir("."); //refresh
}
public void remote_mkdir(String file) {
try {
ftp.mkdir(file);
} catch (Exception e) {
setStatus(null);
JFLog.log(e);
addLog("Error:" + e);
addLog(ftp.getLastResponse());
}
}
@Override
public void remote_delete() {
remoteFolderStack = new ArrayList<String>();
if (!JF.showConfirm("Delete", "Are you sure you want to delete file(s)?")) return;
aborted = false;
setStatus("Deleting");
new Thread() {
@Override
public void run() {
remote_delete_files();
remote_chdir("."); //refresh
setStatus(null);
}
}.start();
}
private void remote_delete_files() {
int rows[] = remoteFiles.getSelectedRows();
if (rows.length == 0) return;
SiteFile sf[] = new SiteFile[rows.length];
for(int idx=0;idx<rows.length;idx++) {
sf[idx] = (SiteFile)remoteFilesTableModel.getValueAt(rows[idx], 0);
}
for(int idx=0;idx<sf.length;idx++) {
if (sf[idx].getText().equals(".")) continue;
if (sf[idx].getText().equals("..")) continue;
totalFileSize = sf[idx].filesize;
if (sf[idx].isDir) {
remoteFolderStack.add(remoteDir.getText());
remote_chdir(sf[idx].getText());
}
if (sf[idx].isLink && !sf[idx].isDir) {
//test if dir
String d1 = remoteDir.getText();
remote_chdir(sf[idx].getText());
String d2 = remoteDir.getText();
if (!d1.equals(d2)) {
remoteFolderStack.add(d1);
sf[idx].isDir = true;
}
}
if (sf[idx].isDir) {
//already remote_chdir();
remoteFiles.selectAll();
remote_delete_files();
remote_chdir(remoteFolderStack.remove(remoteFolderStack.size() - 1));
}
String remoteFile = remoteDir.getText() + "/" + sf[idx].getText();
if (sf[idx].isDir) {
remote_delete_folder(remoteFile);
} else {
remote_delete_file(remoteFile);
}
if (aborted) break;
}
}
public void remote_delete_file(String file) {
try {
ftp.rm(file);
} catch (Exception e) {
setStatus(null);
JFLog.log(e);
addLog("Error:" + e);
addLog(ftp.getLastResponse());
}
}
public void remote_delete_folder(String file) {
try {
ftp.rmdir(file);
//update remoteTree
int idx = file.lastIndexOf("/");
if (idx != -1) file = file.substring(idx+1);
for(int a=0;a<remoteTag.getChildCount();a++) {
XML.XMLTag child = remoteTag.getChildAt(a);
if (child.getName().equals(file)) {
remoteFolders.deleteTag(child);
break;
}
}
} catch (Exception e) {
setStatus(null);
JFLog.log(e);
addLog("Error:" + e);
addLog(ftp.getLastResponse());
}
}
@Override
public void remote_rename() {
int rows[] = remoteFiles.getSelectedRows();
if ((rows == null) || (rows.length != 1)) return;
SiteFile sf = (SiteFile)remoteFilesTableModel.getValueAt(rows[0], 0);
String remoteFile = remoteDir.getText() + "/" + sf.getText();
String newName = JF.getString("Rename File", sf.getText());
if ((newName == null) || (newName.length() == 0)) return;
File newFile = new File(remoteDir.getText() + "/" + newName);
remote_rename(remoteFile, newName);
//update remoteTree
for(int a=0;a<remoteTag.getChildCount();a++) {
XML.XMLTag child = remoteTag.getChildAt(a);
if (child.getName().equals(sf.getText())) {
child.setName(newName);
break;
}
}
remote_chdir("."); //refresh
}
public void remote_rename(String from, String to) {
try {
ftp.rename(from, to);
} catch (Exception e) {
setStatus(null);
JFLog.log(e);
addLog("Error:" + e);
addLog(ftp.getLastResponse());
}
}
@Override
public void remote_props() {
int rows[] = remoteFiles.getSelectedRows();
if ((rows == null) || (rows.length != 1)) return;
SiteFile sf = (SiteFile)remoteFilesTableModel.getValueAt(rows[0], 0);
String remoteFile = remoteDir.getText() + "/" + sf.getText();
String perms = (String)remoteFilesTableModel.getValueAt(rows[0], 3);
//drwxrwxrwx
int octal = 0;
if (perms.charAt(1) == 'r') octal += 0x100;
if (perms.charAt(2) == 'w') octal += 0x80;
if (perms.charAt(3) == 'x') octal += 0x40;
if (perms.charAt(4) == 'r') octal += 0x20;
if (perms.charAt(5) == 'w') octal += 0x10;
if (perms.charAt(6) == 'x') octal += 0x08;
if (perms.charAt(7) == 'r') octal += 0x04;
if (perms.charAt(8) == 'w') octal += 0x02;
if (perms.charAt(9) == 'x') octal += 0x01;
Permissions dialog = new Permissions(null, true, remoteFile, octal);
dialog.setVisible(true);
if (dialog.value == -1) return;
try {
setPerms(dialog.value, remoteFile);
remote_chdir("."); //refresh
} catch (Exception e) {
setStatus(null);
JFLog.log(e);
addLog("Error:" + e);
addLog(ftp.getLastResponse());
}
}
public void setPerms(int value, String remoteFile) {
try {
ftp.chmod(value, remoteFile);
remote_chdir("."); //refresh
} catch (Exception e) {
setStatus(null);
JFLog.log(e);
addLog("Error:" + e);
addLog(ftp.getLastResponse());
}
}
public void closeSite() {
JPanel panel = (JPanel)this.getClientProperty("panel");
JTabbedPane tabs = (JTabbedPane)this.getClientProperty("tabs");
tabs.remove(panel);
}
}