bodewig 02/04/15 02:33:33
Modified: src/main/org/apache/tools/ant/taskdefs/optional/net FTP.java
Log:
Make sure <ftp> closes the output stream when listing files.
Cosmetics.
Revision Changes Path
1.18 +109 -83
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java
Index: FTP.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- FTP.java 21 Mar 2002 09:47:35 -0000 1.17
+++ FTP.java 15 Apr 2002 09:33:33 -0000 1.18
@@ -64,6 +64,7 @@
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.EnumeratedAttribute;
import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.util.FileUtils;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
@@ -100,6 +101,8 @@
* @author Roger Vaughn <a href="mailto:[EMAIL PROTECTED]">[EMAIL
PROTECTED]</a>
* @author Glenn McAllister <a href="mailto:[EMAIL PROTECTED]">[EMAIL
PROTECTED]</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Magesh Umasankar</a>
+ *
+ * @since Ant 1.3
*/
public class FTP
extends Task
@@ -131,6 +134,7 @@
private boolean ignoreNoncriticalErrors=false;
private String chmod = null;
private String umask = null;
+ private FileUtils fileUtils = FileUtils.newFileUtils();
protected final static String[] ACTION_STRS = {
"sending",
@@ -177,7 +181,8 @@
try {
String cwd = ftp.printWorkingDirectory();
- scandir(".", "", true); // always start from the current ftp
working dir
+ // always start from the current ftp working dir
+ scandir(".", "", true);
ftp.changeWorkingDirectory(cwd);
} catch (IOException e) {
throw new BuildException("Unable to scan FTP server: ", e);
@@ -198,14 +203,17 @@
for (int i = 0; i < newfiles.length; i++) {
FTPFile file = newfiles[i];
- if (!file.getName().equals(".") &&
!file.getName().equals("..")) {
+ if (!file.getName().equals(".")
+ && !file.getName().equals("..")) {
if (file.isDirectory()) {
String name = file.getName();
if (isIncluded(name)) {
if (!isExcluded(name)) {
dirsIncluded.addElement(name);
if (fast) {
- scandir(name, vpath + name +
File.separator, fast);
+ scandir(name,
+ vpath + name +
File.separator,
+ fast);
}
} else {
dirsExcluded.addElement(name);
@@ -213,11 +221,14 @@
} else {
dirsNotIncluded.addElement(name);
if (fast && couldHoldIncluded(name)) {
- scandir(name, vpath + name +
File.separator, fast);
+ scandir(name,
+ vpath + name + File.separator,
+ fast);
}
}
if (!fast) {
- scandir(name, vpath + name + File.separator,
fast);
+ scandir(name, vpath + name + File.separator,
+ fast);
}
} else {
if (file.isFile()) {
@@ -237,7 +248,8 @@
}
ftp.changeToParentDirectory();
} catch (IOException e) {
- throw new BuildException("Error while communicating with FTP
server: ", e);
+ throw new BuildException("Error while communicating with FTP
"
+ + "server: ", e);
}
}
}
@@ -434,21 +446,24 @@
if ((action == LIST_FILES) && (listing == null))
{
- throw new BuildException("listing attribute must be set for list
action!");
+ throw new BuildException("listing attribute must be set for list
"
+ + "action!");
}
if (action == MK_DIR && remotedir == null) {
- throw new BuildException("remotedir attribute must be set for
mkdir action!");
+ throw new BuildException("remotedir attribute must be set for "
+ + "mkdir action!");
}
if (action == CHMOD && chmod == null) {
- throw new BuildException("chmod attribute must be set for chmod
action!");
+ throw new BuildException("chmod attribute must be set for chmod "
+ + "action!");
}
}
/**
- * For each file in the fileset, do the appropriate action: send, get,
delete,
- * or list.
+ * For each file in the fileset, do the appropriate action: send,
+ * get, delete, or list.
*/
protected int transferFiles(FTPClient ftp, FileSet fs)
throws IOException, BuildException
@@ -465,8 +480,10 @@
String[] dsfiles = ds.getIncludedFiles();
String dir = null;
- if ((ds.getBasedir() == null) && ((action == SEND_FILES) || (action
== GET_FILES))) {
- throw new BuildException( "the dir attribute must be set for
send and get actions" );
+ if ((ds.getBasedir() == null)
+ && ((action == SEND_FILES) || (action == GET_FILES))) {
+ throw new BuildException("the dir attribute must be set for send
"
+ + "and get actions" );
} else {
if ((action == SEND_FILES) || (action == GET_FILES)) {
dir = ds.getBasedir().getAbsolutePath();
@@ -475,53 +492,54 @@
// If we are doing a listing, we need the output stream created now.
BufferedWriter bw = null;
- if (action == LIST_FILES) {
- File pd = new File(listing.getParent());
- if (!pd.exists()) {
- pd.mkdirs();
- }
- bw = new BufferedWriter(new FileWriter(listing));
- }
-
- for (int i = 0; i < dsfiles.length; i++)
- {
- switch (action) {
- case SEND_FILES: {
- sendFile(ftp, dir, dsfiles[i]);
- break;
- }
-
- case GET_FILES: {
- getFile(ftp, dir, dsfiles[i]);
- break;
+ try {
+ if (action == LIST_FILES) {
+ File pd = fileUtils.getParentFile(listing);
+ if (!pd.exists()) {
+ pd.mkdirs();
+ }
+ bw = new BufferedWriter(new FileWriter(listing));
}
- case DEL_FILES: {
- delFile(ftp, dsfiles[i]);
- break;
- }
+ for (int i = 0; i < dsfiles.length; i++) {
+ switch (action) {
+ case SEND_FILES: {
+ sendFile(ftp, dir, dsfiles[i]);
+ break;
+ }
- case LIST_FILES: {
- listFile(ftp, bw, dsfiles[i]);
- break;
- }
+ case GET_FILES: {
+ getFile(ftp, dir, dsfiles[i]);
+ break;
+ }
- case CHMOD: {
- doSiteCommand(ftp,"chmod " + chmod + " " + dsfiles[i]);
- transferred++;
- break;
- }
+ case DEL_FILES: {
+ delFile(ftp, dsfiles[i]);
+ break;
+ }
+
+ case LIST_FILES: {
+ listFile(ftp, bw, dsfiles[i]);
+ break;
+ }
+
+ case CHMOD: {
+ doSiteCommand(ftp, "chmod " + chmod + " " + dsfiles[i]);
+ transferred++;
+ break;
+ }
- default: {
- throw new BuildException("unknown ftp action " + action );
+ default: {
+ throw new BuildException("unknown ftp action " + action
);
+ }
+ }
}
+ } finally {
+ if (bw != null) {
+ bw.close();
}
}
- if (action == LIST_FILES) {
- bw.close();
- }
-
return dsfiles.length;
}
@@ -554,7 +572,8 @@
log(transferred + " files " + COMPLETED_ACTION_STRS[action]);
if(skipped!=0) {
- log(skipped + " files were not successfully "+
COMPLETED_ACTION_STRS[action]);
+ log(skipped + " files were not successfully "
+ + COMPLETED_ACTION_STRS[action]);
}
}
@@ -619,7 +638,8 @@
* Checks to see if the remote file is current as compared with the
* local file. Returns true if the remote file is up to date.
*/
- protected boolean isUpToDate(FTPClient ftp, File localFile, String
remoteFile)
+ protected boolean isUpToDate(FTPClient ftp, File localFile,
+ String remoteFile)
throws IOException, BuildException
{
log("checking date for " + remoteFile, Project.MSG_VERBOSE);
@@ -694,6 +714,7 @@
InputStream instream = null;
try
{
+ // XXX - why not simply new File(dir, filename)?
File file = project.resolveFile(new File(dir,
filename).getPath());
if (newerOnly && isUpToDate(ftp, file, resolveFile(filename))) {
@@ -725,10 +746,9 @@
}
else {
if (chmod != null) { // see if we should issue a chmod
command
- doSiteCommand(ftp,"chmod " + chmod + " " + filename);
+ doSiteCommand(ftp,"chmod " + chmod + " " + filename);
}
- log("File " + file.getAbsolutePath() +
- " copied to " + server,
+ log("File " + file.getAbsolutePath() + " copied to " +
server,
Project.MSG_VERBOSE);
transferred++;
}
@@ -769,7 +789,8 @@
}
}
else {
- log("File " + filename + " deleted from " + server,
Project.MSG_VERBOSE);
+ log("File " + filename + " deleted from " + server,
+ Project.MSG_VERBOSE);
transferred++;
}
}
@@ -777,10 +798,11 @@
/**
* Retrieve a single file to the remote host.
* <code>filename</code> may contain a relative path specification.
- * The file will then be retreived using the entire relative path spec -
- * no attempt is made to change directories. It is anticipated that
this may
- * eventually cause problems with some FTP servers, but it simplifies
- * the coding.
+ *
+ * <p>The file will then be retreived using the entire relative
+ * path spec - no attempt is made to change directories. It is
+ * anticipated that this may eventually cause problems with some
+ * FTP servers, but it simplifies the coding.</p>
*/
protected void getFile(FTPClient ftp, String dir, String filename)
throws IOException, BuildException
@@ -796,11 +818,12 @@
if (verbose)
{
- log("transferring " + filename + " to " +
file.getAbsolutePath());
+ log("transferring " + filename + " to "
+ + file.getAbsolutePath());
}
- File pdir = new File(file.getParent()); // stay 1.1
compatible
+ File pdir = fileUtils.getParentFile(file);
if (!pdir.exists()) {
pdir.mkdirs();
}
@@ -820,8 +843,8 @@
}
else {
- log("File " + file.getAbsolutePath() + " copied from " +
server,
- Project.MSG_VERBOSE);
+ log("File " + file.getAbsolutePath() + " copied from "
+ + server, Project.MSG_VERBOSE);
transferred++;
}
}
@@ -844,10 +867,11 @@
/**
* List information about a single file from the remote host.
* <code>filename</code> may contain a relative path specification.
- * The file listing will then be retrieved using the entire relative
path spec
- * - no attempt is made to change directories. It is anticipated that
this may
- * eventually cause problems with some FTP servers, but it simplifies
- * the coding.
+ *
+ * <p>The file listing will then be retrieved using the entire
+ * relative path spec - no attempt is made to change directories.
+ * It is anticipated that this may eventually cause problems with
+ * some FTP servers, but it simplifies the coding.</p>
*/
protected void listFile(FTPClient ftp, BufferedWriter bw, String
filename)
throws IOException, BuildException
@@ -866,7 +890,8 @@
/**
* Create the specified directory on the remote host.
* @param ftp The FTP client connection
- * @param dir The directory to create (format must be correct for host
type)
+ * @param dir The directory to create (format must be correct for
+ * host type)
*/
protected void makeRemoteDir( FTPClient ftp, String dir )
throws IOException, BuildException
@@ -881,7 +906,8 @@
// failed because the directory already exists.
int rc = ftp.getReplyCode();
- if( !(ignoreNoncriticalErrors && (rc == 550 || rc == 553 ||
rc==521))) {
+ if( !(ignoreNoncriticalErrors
+ && (rc == 550 || rc == 553 || rc==521))) {
throw new BuildException( "could not create directory: " +
ftp.getReplyString() );
}
@@ -915,7 +941,8 @@
ftp.connect(server, port);
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode()))
{
- throw new BuildException("FTP connection failed: " +
ftp.getReplyString());
+ throw new BuildException("FTP connection failed: "
+ + ftp.getReplyString());
}
log("connected", Project.MSG_VERBOSE);
@@ -933,8 +960,7 @@
ftp.setFileType(com.oroinc.net.ftp.FTP.IMAGE_FILE_TYPE);
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode()))
{
- throw new BuildException(
- "could not set transfer type: "
+
+ throw new BuildException("could not set transfer type: "
+
ftp.getReplyString());
}
}
@@ -945,8 +971,8 @@
ftp.enterLocalPassiveMode();
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode()))
{
- throw new BuildException(
- "could not enter into passive
mode: " +
+ throw new BuildException("could not enter into passive "
+ + "mode: " +
ftp.getReplyString());
}
}
@@ -955,11 +981,11 @@
// created.
if (umask != null) {
- doSiteCommand(ftp,"umask " + umask);
+ doSiteCommand(ftp, "umask " + umask);
}
- // If the action is MK_DIR, then the specified remote directory
is the
- // directory to create.
+ // If the action is MK_DIR, then the specified remote
+ // directory is the directory to create.
if( action == MK_DIR ) {
@@ -972,8 +998,8 @@
ftp.changeWorkingDirectory(remotedir);
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode()))
{
- throw new BuildException(
- "could not change remote
directory: " +
+ throw new BuildException("could not change remote "
+ + "directory: " +
ftp.getReplyString());
}
}
@@ -1021,10 +1047,10 @@
actionL.equals("put")) {
return SEND_FILES;
} else if (actionL.equals("recv") ||
- actionL.equals("get")) {
+ actionL.equals("get")) {
return GET_FILES;
} else if (actionL.equals("del") ||
- actionL.equals("delete" )) {
+ actionL.equals("delete" )) {
return DEL_FILES;
} else if (actionL.equals("list")) {
return LIST_FILES;
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>