--- FTP.java.orig Tue Sep 17 14:40:21 2002 +++ FTP.java.orig Wed Sep 18 12:45:22 2002 @@ -89,6 +89,9 @@ *
  • chmod - change unix file permissions.
  • *
  • rmdir - remove directories, if empty, from a * remote server.
  • + *
  • deltree - pseudo action that removes an entire file + * tree, and is equivalent to executing del action then rmdir action with + * the same fileset.
  • * * Note: Some FTP servers - notably the Solaris server - seem * to hold data ports open after a "retr" operation, allowing them to timeout @@ -113,6 +116,7 @@ protected static final int MK_DIR = 4; protected static final int CHMOD = 5; protected static final int RM_DIR = 6; + protected static final int DEL_TREE = 20; private String remotedir; private String server; @@ -166,6 +170,10 @@ "directories" }; + protected static final int[] PSEUDO_DEL_TREE_ACTIONS_LIST = { + DEL_FILES, + RM_DIR + }; protected class FTPDirectoryScanner extends DirectoryScanner { protected FTPClient ftp = null; @@ -478,20 +486,13 @@ /** - * For each file in the fileset, do the appropriate action: send, get, - * delete, or list. + * For each file in the scanned files, do the appropriate action: send, get, + * delete, rmdir or list. */ - protected int transferFiles(FTPClient ftp, FileSet fs) + protected int transferFiles(FTPClient ftp, FileScanner ds) throws IOException, BuildException { - FileScanner ds; - if (action == SEND_FILES) { - ds = fs.getDirectoryScanner(project); - } else { - ds = new FTPDirectoryScanner(ftp); - fs.setupDirectoryScanner(ds, project); - ds.scan(); - } + log(ACTION_STRS[action] + " " + ACTION_TARGET_STRS[action]); String[] dsfiles = null; if (action == RM_DIR) { @@ -575,6 +576,14 @@ } } + log(transferred + " " + ACTION_TARGET_STRS[action] + " " + + COMPLETED_ACTION_STRS[action]); + if (skipped != 0) { + log(skipped + " " + ACTION_TARGET_STRS[action] + + " were not successfully " + + COMPLETED_ACTION_STRS[action]); + } + return dsfiles.length; } @@ -587,6 +596,16 @@ throws IOException, BuildException { transferred = 0; skipped = 0; + FileScanner ds; + int[] totTransferred; + int[] totSkipped; + + totTransferred = new int[ACTION_TARGET_STRS.length]; + totSkipped = new int[totTransferred.length]; + for (int j = 0; j < totTransferred.length; j++) { + totTransferred[j] = 0; + totSkipped[j] = 0; + } if (filesets.size() == 0) { throw new BuildException("at least one fileset must be specified."); @@ -596,17 +615,60 @@ FileSet fs = (FileSet) filesets.elementAt(i); if (fs != null) { - transferFiles(ftp, fs); + + if (action == SEND_FILES) { + ds = fs.getDirectoryScanner(project); + } else { + ds = new FTPDirectoryScanner(ftp); + fs.setupDirectoryScanner(ds, project); + ds.scan(); + } + + if (action == DEL_TREE) { + /* + * DEL_TREE is a pseudo action that is exploded + * into DEL_FILES and RM_DIR real actions. + * DEL_FILES will use getIncludedFiles() and + * and RM_DIR will use getIncludedDirectories() + * from the same FileScanner without rescanning + * remotedir. + */ + for (int a = 0; + a < PSEUDO_DEL_TREE_ACTIONS_LIST.length; + a++) { + action = PSEUDO_DEL_TREE_ACTIONS_LIST[a]; + + transferFiles(ftp, ds); + + totTransferred[action] += transferred; + transferred = 0; + totSkipped[action] += skipped; + skipped = 0; + + } + action = DEL_TREE; + } else { + transferFiles(ftp, ds); + } } } } - - log(transferred + " " + ACTION_TARGET_STRS[action] + " " + - COMPLETED_ACTION_STRS[action]); - if (skipped != 0) { - log(skipped + " " + ACTION_TARGET_STRS[action] + - " were not successfully " - + COMPLETED_ACTION_STRS[action]); + if (action == DEL_TREE) { + for (int a = 0; + a < PSEUDO_DEL_TREE_ACTIONS_LIST.length; + a++) { + action = PSEUDO_DEL_TREE_ACTIONS_LIST[a]; + log("Total " + totTransferred[action] + + " " + ACTION_TARGET_STRS[action] + " " + + COMPLETED_ACTION_STRS[action]); + if (totSkipped[action] != 0) { + log("Total " + totSkipped[action] + + " " + ACTION_TARGET_STRS[action] + + " were not successfully " + + COMPLETED_ACTION_STRS[action]); + } + } + action = DEL_TREE; } } @@ -1024,7 +1086,6 @@ ftp.getReplyString()); } } - log(ACTION_STRS[action] + " " + ACTION_TARGET_STRS[action]); transferFiles(ftp); } @@ -1047,13 +1108,13 @@ /** * an action to perform, one of * "send", "put", "recv", "get", "del", "delete", "list", "mkdir", "chmod", - * "rmdir" + * "rmdir", "deltree" */ public static class Action extends EnumeratedAttribute { private static final String[] validActions = { "send", "put", "recv", "get", "del", "delete", "list", "mkdir", - "chmod", "rmdir" + "chmod", "rmdir", "deltree" }; @@ -1082,6 +1143,8 @@ return MK_DIR; } else if (actionL.equals("rmdir")) { return RM_DIR; + } else if (actionL.equals("deltree")) { + return DEL_TREE; } return SEND_FILES; }