There are two things being addressed in this patch, which jedit makes look
slightly bigger than usual due to its stripping off of the odd trailing
space.
1. support for wu-ftp : the ignoreCriticalErrors flag hints that the system
should ignore non-fatal errors, such as any unexpected responses from the
MKDIR command.
2. the ability to skip file transfers that dont work and keep going.
This is to deal with big bulk deployment tasks, where for any reason it may
not be possible to write to a file at the far end. When the update is
particularly time consuming, printing out the problem and continuing is
preferable to an immediate halt; then whoever reads the log the next morning
can deal with the problem
-Steve
cvs diff -u Ftp.java (in directory
D:\Java\Apps\jakarta-ant\src\main\org\apache\tools\ant\taskdefs\optional\net)
Index: FTP.java
===================================================================
RCS file:
/home/cvspublic/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java,v
retrieving revision 1.5
diff -u -r1.5 FTP.java
--- FTP.java 2001/01/11 11:53:52 1.5
+++ FTP.java 2001/05/30 04:57:15
@@ -79,9 +79,9 @@
{
protected final static int SEND_FILES = 0;
protected final static int GET_FILES = 1;
- protected final static int DEL_FILES = 2;
+ protected final static int DEL_FILES = 2;
protected final static int LIST_FILES = 3;
-
+
private String remotedir;
private String server;
private String userid;
@@ -97,6 +97,9 @@
private int transferred = 0;
private String remoteFileSep = "/";
private int port = 21;
+ private boolean skipFailedTransfers=false;
+ private int skipped=0;
+ private boolean ignoreNoncriticalErrors=false;
protected final static String[] ACTION_STRS = {
"sending",
@@ -110,11 +113,11 @@
"retrieved",
"deleted",
"listed"
- };
-
+ };
+
protected class FTPDirectoryScanner extends DirectoryScanner {
protected FTPClient ftp = null;
-
+
public FTPDirectoryScanner(FTPClient ftp) {
super();
this.ftp = ftp;
@@ -197,7 +200,7 @@
throw new BuildException("Error while communicating with FTP
server: ", e);
}
}
- }
+ }
/**
* Sets the remote directory where files will be placed. This may
@@ -336,15 +339,30 @@
throw new BuildException("action " + action + " is not supported");
}
}
-
+
/**
* The output file for the "list" action. This attribute is ignored for
* any other actions.
*/
public void setListing(File listing) throws BuildException {
this.listing = listing;
- }
-
+ }
+
+
+ /**
+ * set the failed transfer flag
+ */
+ public void setSkipFailedTransfers(boolean skipFailedTransfers) {
+ this.skipFailedTransfers=skipFailedTransfers;
+ }
+
+ /**
+ * set the flag to skip errors on dir creation (and maybe later other
+ * server specific errors)
+ */
+ public void setIgnoreNoncriticalErrors(boolean ignoreNoncriticalErrors) {
+ this.ignoreNoncriticalErrors=ignoreNoncriticalErrors;
+ }
/**
* Checks to see that all required parameters are set.
@@ -363,7 +381,7 @@
{
throw new BuildException("password attribute must be set!");
}
-
+
if ((action == LIST_FILES) && (listing == null))
{
throw new BuildException("listing attribute must be set for list
action!");
@@ -385,8 +403,8 @@
ds = new FTPDirectoryScanner(ftp);
fs.setupDirectoryScanner(ds, project);
ds.scan();
- }
-
+ }
+
String[] dsfiles = ds.getIncludedFiles();
String dir = null;
if ((ds.getBasedir() == null) && ((action == SEND_FILES) || (action ==
GET_FILES))) {
@@ -451,7 +469,8 @@
throws IOException, BuildException
{
transferred = 0;
-
+ skipped=0;
+
if (filesets.size() == 0)
{
throw new BuildException("at least one fileset must be
specified.");
@@ -470,6 +489,9 @@
}
log(transferred + " files " + COMPLETED_ACTION_STRS[action]);
+ if(skipped!=0) {
+ log(skipped + " files were not successfully "+
COMPLETED_ACTION_STRS[action]);
+ }
}
/**
@@ -515,8 +537,10 @@
// Both codes 550 and 553 can be produced by FTP Servers
// to indicate that an attempt to create a directory has
// failed because the directory already exists.
- if (!FTPReply.isPositiveCompletion(ftp.getReplyCode()) &&
- (ftp.getReplyCode() != 550) && (ftp.getReplyCode() != 553))
+ int result=ftp.getReplyCode();
+ if (!FTPReply.isPositiveCompletion(result) &&
+ (result != 550) && (result!= 553) &&
+ !ignoreNoncriticalErrors)
{
throw new BuildException(
"could not create directory: " +
@@ -535,7 +559,7 @@
throws IOException, BuildException
{
log("checking date for " + remoteFile, Project.MSG_VERBOSE);
-
+
FTPFile[] files = ftp.listFiles(remoteFile);
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode()))
{
@@ -583,27 +607,35 @@
{
log("transferring " + file.getAbsolutePath());
}
-
+
instream = new BufferedInputStream(new FileInputStream(file));
-
+
createParents(ftp, filename);
-
+
ftp.storeFile(resolveFile(filename), instream);
-
- if (!FTPReply.isPositiveCompletion(ftp.getReplyCode()))
+ boolean success=FTPReply.isPositiveCompletion(ftp.getReplyCode());
+ if (!success)
{
- throw new BuildException(
- "could not transfer file: " +
- ftp.getReplyString());
- }
-
- log("File " + file.getAbsolutePath() + " copied to " + server,
- Project.MSG_VERBOSE);
+ String s="could not put file: " + ftp.getReplyString();
+ if(skipFailedTransfers==true) {
+ log(s,Project.MSG_WARN);
+ skipped++;
+ }
+ else {
+ throw new BuildException(s);
+ }
- transferred++;
+ }
+ else {
+
+ log("File " + file.getAbsolutePath() +
+ " copied to " + server,
+ Project.MSG_VERBOSE);
+ transferred++;
+ }
}
finally
- {
+ {
if (instream != null)
{
try
@@ -628,18 +660,25 @@
}
if (!ftp.deleteFile(resolveFile(filename))) {
- throw new BuildException("could not delete file: " +
ftp.getReplyString());
+ String s="could not delete file: " + ftp.getReplyString();
+ if(skipFailedTransfers==true) {
+ log(s,Project.MSG_WARN);
+ skipped++;
+ }
+ else {
+ throw new BuildException(s);
+ }
}
-
- log("File " + filename + " deleted from " + server,
Project.MSG_VERBOSE);
-
- transferred++;
+ else {
+ log("File " + filename + " deleted from " + server,
Project.MSG_VERBOSE);
+ transferred++;
+ }
}
/**
* 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 -
+ * 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.
@@ -659,29 +698,35 @@
{
log("transferring " + filename + " to " +
file.getAbsolutePath());
}
+
-
File pdir = new File(file.getParent()); // stay 1.1
compatible
if (!pdir.exists()) {
pdir.mkdirs();
- }
+ }
outstream = new BufferedOutputStream(new FileOutputStream(file));
ftp.retrieveFile(resolveFile(filename), outstream);
-
+
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode()))
{
- throw new BuildException(
- "could not transfer file: " +
- ftp.getReplyString());
- }
-
- log("File " + file.getAbsolutePath() + " copied from " + server,
- Project.MSG_VERBOSE);
+ String s="could not get file: " + ftp.getReplyString();
+ if(skipFailedTransfers==true) {
+ log(s,Project.MSG_WARN);
+ skipped++;
+ }
+ else {
+ throw new BuildException(s);
+ }
- transferred++;
+ }
+ else {
+ log("File " + file.getAbsolutePath() + " copied from " +
server,
+ Project.MSG_VERBOSE);
+ transferred++;
+ }
}
finally
- {
+ {
if (outstream != null)
{
try
@@ -699,13 +744,13 @@
/**
* 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
+ * 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.
*/
protected void listFile(FTPClient ftp, BufferedWriter bw, String filename)
- throws IOException, BuildException
+ throws IOException, BuildException
{
if (verbose) {
log("listing " + filename);
@@ -725,7 +770,7 @@
throws BuildException
{
checkConfiguration();
-
+
FTPClient ftp = null;
try
@@ -733,7 +778,7 @@
log("Opening FTP connection to " + server, Project.MSG_VERBOSE);
ftp = new FTPClient();
-
+
ftp.connect(server, port);
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode()))
{
@@ -749,7 +794,7 @@
}
log("login succeeded", Project.MSG_VERBOSE);
-
+
if (binary)
{
ftp.setFileType(com.oroinc.net.ftp.FTP.IMAGE_FILE_TYPE);
@@ -760,7 +805,7 @@
ftp.getReplyString());
}
}
-
+
if (passive)
{
log("entering passive mode", Project.MSG_VERBOSE);
cvs diff -u ftp.html (in directory
D:\Java\Apps\jakarta-ant\docs\manual\OptionalTasks)
Index: ftp.html
===================================================================
RCS file: /home/cvspublic/jakarta-ant/docs/manual/OptionalTasks/ftp.html,v
retrieving revision 1.2
diff -u -r1.2 ftp.html
--- ftp.html 2001/02/13 12:31:55 1.2
+++ ftp.html 2001/05/30 05:10:02
@@ -106,6 +106,20 @@
Required for the "list" action, ignored
otherwise.</td>
<td valign="top" align="center">No</td>
</tr>
+ <tr>
+ <td valign="top">ignoreNoncriticalErrors</td>
+ <td valign="top">flag which permits the task to ignore some non-fatal error
+ codes sent by some servers during directory creation: wu-ftp in
particular.
+ Default: false</td>
+ <td valign="top" align="center">No</td>
+ </tr>
+ <tr>
+ <td valign="top">skipFailedTransfers</td>
+ <td valign="top">flag which enables unsuccessful file put, delete
+ and get operations to be skipped with a warning and the
+ remainder of the files still transferred. Default: false</td>
+ <td valign="top" align="center">No</td>
+ </tr>
</table>
<h3>Sending Files</h3>
<p>The easiest way to describe how to send files is with a couple of
examples:</p>