Browse Source

Made sure ftp compiled, made inner classes top-level classes, cleaned up files a little.

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@270697 13f79535-47bb-0310-9956-ffa450edef68
master
Peter Donald 24 years ago
parent
commit
400ba5d198
6 changed files with 634 additions and 614 deletions
  1. +54
    -0
      proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/Action.java
  2. +117
    -307
      proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java
  3. +146
    -0
      proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/FTPDirectoryScanner.java
  4. +54
    -0
      proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/Action.java
  5. +117
    -307
      proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/FTP.java
  6. +146
    -0
      proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/FTPDirectoryScanner.java

+ 54
- 0
proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/Action.java View File

@@ -0,0 +1,54 @@
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.tools.ant.taskdefs.optional.net;

import java.util.Locale;
import org.apache.tools.ant.types.EnumeratedAttribute;

public class Action
extends EnumeratedAttribute
{
private final static String[] validActions = new String[]
{
"send", "put", "recv", "get", "del", "delete", "list", "mkdir"
};

public int getAction()
{
String actionL = getValue().toLowerCase( Locale.US );
if( actionL.equals( "send" ) ||
actionL.equals( "put" ) )
{
return FTP.SEND_FILES;
}
else if( actionL.equals( "recv" ) ||
actionL.equals( "get" ) )
{
return FTP.GET_FILES;
}
else if( actionL.equals( "del" ) ||
actionL.equals( "delete" ) )
{
return FTP.DEL_FILES;
}
else if( actionL.equals( "list" ) )
{
return FTP.LIST_FILES;
}
else if( actionL.equals( "mkdir" ) )
{
return FTP.MK_DIR;
}
return FTP.SEND_FILES;
}

public String[] getValues()
{
return validActions;
}
}

+ 117
- 307
proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java View File

@@ -21,12 +21,10 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Locale;
import org.apache.avalon.excalibur.io.FileUtil;
import org.apache.myrmidon.api.TaskException; import org.apache.myrmidon.api.TaskException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.FileScanner;
import org.apache.tools.ant.Task; import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.EnumeratedAttribute;
import org.apache.tools.ant.types.FileScanner;
import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.types.FileSet;


/** /**
@@ -60,7 +58,8 @@ public class FTP
protected final static int LIST_FILES = 3; protected final static int LIST_FILES = 3;
protected final static int MK_DIR = 4; protected final static int MK_DIR = 4;


protected final static String[] ACTION_STRS = {
protected final static String[] ACTION_STRS = new String[]
{
"sending", "sending",
"getting", "getting",
"deleting", "deleting",
@@ -68,32 +67,33 @@ public class FTP
"making directory" "making directory"
}; };


protected final static String[] COMPLETED_ACTION_STRS = {
protected final static String[] COMPLETED_ACTION_STRS = new String[]
{
"sent", "sent",
"retrieved", "retrieved",
"deleted", "deleted",
"listed", "listed",
"created directory" "created directory"
}; };
private boolean binary = true;
private boolean passive = false;
private boolean verbose = false;
private boolean newerOnly = false;
private int action = SEND_FILES;
private ArrayList filesets = new ArrayList();
private ArrayList dirCache = new ArrayList();
private int transferred = 0;
private String remoteFileSep = "/";
private int port = 21;
private boolean skipFailedTransfers = false;
private int skipped = 0;
private boolean ignoreNoncriticalErrors = false;
private File listing;
private String password;
private String remotedir;
private String server;
private String userid;
private boolean m_binary = true;
private boolean m_passive;
private boolean m_verbose;
private boolean m_newerOnly;
private int m_action = SEND_FILES;
private ArrayList m_filesets = new ArrayList();
private ArrayList m_dirCache = new ArrayList();
private int m_transferred;
private String m_remoteFileSep = "/";
private int m_port = 21;
private boolean m_skipFailedTransfers;
private int m_skipped;
private boolean m_ignoreNoncriticalErrors;
private File m_listing;
private String m_password;
private String m_remotedir;
private String m_server;
private String m_userid;


/** /**
* Sets the FTP action to be taken. Currently accepts "put", "get", "del", * Sets the FTP action to be taken. Currently accepts "put", "get", "del",
@@ -105,7 +105,7 @@ public class FTP
public void setAction( Action action ) public void setAction( Action action )
throws TaskException throws TaskException
{ {
this.action = action.getAction();
m_action = action.getAction();
} }


/** /**
@@ -116,7 +116,7 @@ public class FTP
*/ */
public void setBinary( boolean binary ) public void setBinary( boolean binary )
{ {
this.binary = binary;
m_binary = binary;
} }


/** /**
@@ -127,7 +127,7 @@ public class FTP
*/ */
public void setDepends( boolean depends ) public void setDepends( boolean depends )
{ {
this.newerOnly = depends;
m_newerOnly = depends;
} }


/** /**
@@ -138,7 +138,7 @@ public class FTP
*/ */
public void setIgnoreNoncriticalErrors( boolean ignoreNoncriticalErrors ) public void setIgnoreNoncriticalErrors( boolean ignoreNoncriticalErrors )
{ {
this.ignoreNoncriticalErrors = ignoreNoncriticalErrors;
m_ignoreNoncriticalErrors = ignoreNoncriticalErrors;
} }


/** /**
@@ -151,7 +151,7 @@ public class FTP
public void setListing( File listing ) public void setListing( File listing )
throws TaskException throws TaskException
{ {
this.listing = listing;
m_listing = listing;
} }


/** /**
@@ -162,7 +162,7 @@ public class FTP
*/ */
public void setNewer( boolean newer ) public void setNewer( boolean newer )
{ {
this.newerOnly = newer;
m_newerOnly = newer;
} }


/** /**
@@ -174,7 +174,7 @@ public class FTP
*/ */
public void setPassive( boolean passive ) public void setPassive( boolean passive )
{ {
this.passive = passive;
m_passive = passive;
} }


/** /**
@@ -184,7 +184,7 @@ public class FTP
*/ */
public void setPassword( String password ) public void setPassword( String password )
{ {
this.password = password;
m_password = password;
} }


/** /**
@@ -194,7 +194,7 @@ public class FTP
*/ */
public void setPort( int port ) public void setPort( int port )
{ {
this.port = port;
m_port = port;
} }


/** /**
@@ -206,7 +206,7 @@ public class FTP
*/ */
public void setRemotedir( String dir ) public void setRemotedir( String dir )
{ {
this.remotedir = dir;
m_remotedir = dir;
} }


/** /**
@@ -219,7 +219,7 @@ public class FTP
*/ */
public void setSeparator( String separator ) public void setSeparator( String separator )
{ {
remoteFileSep = separator;
m_remoteFileSep = separator;
} }


/** /**
@@ -229,7 +229,7 @@ public class FTP
*/ */
public void setServer( String server ) public void setServer( String server )
{ {
this.server = server;
m_server = server;
} }


/** /**
@@ -239,7 +239,7 @@ public class FTP
*/ */
public void setSkipFailedTransfers( boolean skipFailedTransfers ) public void setSkipFailedTransfers( boolean skipFailedTransfers )
{ {
this.skipFailedTransfers = skipFailedTransfers;
m_skipFailedTransfers = skipFailedTransfers;
} }


/** /**
@@ -249,7 +249,7 @@ public class FTP
*/ */
public void setUserid( String userid ) public void setUserid( String userid )
{ {
this.userid = userid;
m_userid = userid;
} }


/** /**
@@ -259,7 +259,7 @@ public class FTP
*/ */
public void setVerbose( boolean verbose ) public void setVerbose( boolean verbose )
{ {
this.verbose = verbose;
m_verbose = verbose;
} }


/** /**
@@ -269,7 +269,7 @@ public class FTP
*/ */
public void addFileset( FileSet set ) public void addFileset( FileSet set )
{ {
filesets.add( set );
m_filesets.add( set );
} }


/** /**
@@ -280,17 +280,17 @@ public class FTP
public void execute() public void execute()
throws TaskException throws TaskException
{ {
checkConfiguration();
validate();


FTPClient ftp = null; FTPClient ftp = null;


try try
{ {
getLogger().debug( "Opening FTP connection to " + server );
getLogger().debug( "Opening FTP connection to " + m_server );


ftp = new FTPClient(); ftp = new FTPClient();


ftp.connect( server, port );
ftp.connect( m_server, m_port );
if( !FTPReply.isPositiveCompletion( ftp.getReplyCode() ) ) if( !FTPReply.isPositiveCompletion( ftp.getReplyCode() ) )
{ {
throw new TaskException( "FTP connection failed: " + ftp.getReplyString() ); throw new TaskException( "FTP connection failed: " + ftp.getReplyString() );
@@ -299,14 +299,14 @@ public class FTP
getLogger().debug( "connected" ); getLogger().debug( "connected" );
getLogger().debug( "logging in to FTP server" ); getLogger().debug( "logging in to FTP server" );


if( !ftp.login( userid, password ) )
if( !ftp.login( m_userid, m_password ) )
{ {
throw new TaskException( "Could not login to FTP server" ); throw new TaskException( "Could not login to FTP server" );
} }


getLogger().debug( "login succeeded" ); getLogger().debug( "login succeeded" );


if( binary )
if( m_binary )
{ {
ftp.setFileType( com.oroinc.net.ftp.FTP.IMAGE_FILE_TYPE ); ftp.setFileType( com.oroinc.net.ftp.FTP.IMAGE_FILE_TYPE );
if( !FTPReply.isPositiveCompletion( ftp.getReplyCode() ) ) if( !FTPReply.isPositiveCompletion( ftp.getReplyCode() ) )
@@ -317,7 +317,7 @@ public class FTP
} }
} }


if( passive )
if( m_passive )
{ {
getLogger().debug( "entering passive mode" ); getLogger().debug( "entering passive mode" );
ftp.enterLocalPassiveMode(); ftp.enterLocalPassiveMode();
@@ -332,18 +332,18 @@ public class FTP
// If the action is MK_DIR, then the specified remote directory is the // If the action is MK_DIR, then the specified remote directory is the
// directory to create. // directory to create.


if( action == MK_DIR )
if( m_action == MK_DIR )
{ {


makeRemoteDir( ftp, remotedir );
makeRemoteDir( ftp, m_remotedir );


} }
else else
{ {
if( remotedir != null )
if( m_remotedir != null )
{ {
getLogger().debug( "changing the remote directory" ); getLogger().debug( "changing the remote directory" );
ftp.changeWorkingDirectory( remotedir );
ftp.changeWorkingDirectory( m_remotedir );
if( !FTPReply.isPositiveCompletion( ftp.getReplyCode() ) ) if( !FTPReply.isPositiveCompletion( ftp.getReplyCode() ) )
{ {
throw new TaskException( throw new TaskException(
@@ -351,7 +351,7 @@ public class FTP
ftp.getReplyString() ); ftp.getReplyString() );
} }
} }
getLogger().info( ACTION_STRS[ action ] + " files" );
getLogger().info( ACTION_STRS[ m_action ] + " files" );
transferFiles( ftp ); transferFiles( ftp );
} }


@@ -397,31 +397,33 @@ public class FTP
OutputStream outstream = null; OutputStream outstream = null;
try try
{ {
File file = resolveFile( new File( dir, filename ).getPath() );
final File file = FileUtil.resolveFile( resolveFile( dir ), filename );


if( newerOnly && isUpToDate( ftp, file, resolveFile( filename ) ) )
if( m_newerOnly && isUpToDate( ftp, file, remoteResolveFile( filename ) ) )
{
return; return;
}


if( verbose )
if( m_verbose )
{ {
getLogger().info( "transferring " + filename + " to " + file.getAbsolutePath() ); getLogger().info( "transferring " + filename + " to " + file.getAbsolutePath() );
} }


File pdir = new File( file.getParent() );// stay 1.1 compatible
if( !pdir.exists() )
final File parent = file.getParentFile();
if( !parent.exists() )
{ {
pdir.mkdirs();
parent.mkdirs();
} }
outstream = new BufferedOutputStream( new FileOutputStream( file ) ); outstream = new BufferedOutputStream( new FileOutputStream( file ) );
ftp.retrieveFile( resolveFile( filename ), outstream );
ftp.retrieveFile( remoteResolveFile( filename ), outstream );


if( !FTPReply.isPositiveCompletion( ftp.getReplyCode() ) ) if( !FTPReply.isPositiveCompletion( ftp.getReplyCode() ) )
{ {
String s = "could not get file: " + ftp.getReplyString(); String s = "could not get file: " + ftp.getReplyString();
if( skipFailedTransfers == true )
if( m_skipFailedTransfers == true )
{ {
getLogger().warn( s ); getLogger().warn( s );
skipped++;
m_skipped++;
} }
else else
{ {
@@ -431,8 +433,8 @@ public class FTP
} }
else else
{ {
getLogger().debug( "File " + file.getAbsolutePath() + " copied from " + server );
transferred++;
getLogger().debug( "File " + file.getAbsolutePath() + " copied from " + m_server );
m_transferred++;
} }
} }
finally finally
@@ -454,13 +456,6 @@ public class FTP
/** /**
* Checks to see if the remote file is current as compared with the local * 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. * file. Returns true if the remote file is up to date.
*
* @param ftp Description of Parameter
* @param localFile Description of Parameter
* @param remoteFile Description of Parameter
* @return The UpToDate value
* @exception IOException Description of Exception
* @exception TaskException Description of Exception
*/ */
protected boolean isUpToDate( FTPClient ftp, File localFile, String remoteFile ) protected boolean isUpToDate( FTPClient ftp, File localFile, String remoteFile )
throws IOException, TaskException throws IOException, TaskException
@@ -476,7 +471,7 @@ public class FTP
// If we are sending files, then assume out of date. // If we are sending files, then assume out of date.
// If we are getting files, then throw an error // If we are getting files, then throw an error


if( action == SEND_FILES )
if( m_action == SEND_FILES )
{ {
getLogger().debug( "Could not date test remote file: " + remoteFile + "assuming out of date." ); getLogger().debug( "Could not date test remote file: " + remoteFile + "assuming out of date." );
return false; return false;
@@ -490,7 +485,7 @@ public class FTP


long remoteTimestamp = files[ 0 ].getTimestamp().getTime().getTime(); long remoteTimestamp = files[ 0 ].getTimestamp().getTime().getTime();
long localTimestamp = localFile.lastModified(); long localTimestamp = localFile.lastModified();
if( this.action == SEND_FILES )
if( m_action == SEND_FILES )
{ {
return remoteTimestamp > localTimestamp; return remoteTimestamp > localTimestamp;
} }
@@ -505,28 +500,28 @@ public class FTP
* *
* @exception TaskException Description of Exception * @exception TaskException Description of Exception
*/ */
protected void checkConfiguration()
private void validate()
throws TaskException throws TaskException
{ {
if( server == null )
if( m_server == null )
{ {
throw new TaskException( "server attribute must be set!" ); throw new TaskException( "server attribute must be set!" );
} }
if( userid == null )
if( m_userid == null )
{ {
throw new TaskException( "userid attribute must be set!" ); throw new TaskException( "userid attribute must be set!" );
} }
if( password == null )
if( m_password == null )
{ {
throw new TaskException( "password attribute must be set!" ); throw new TaskException( "password attribute must be set!" );
} }


if( ( action == LIST_FILES ) && ( listing == null ) )
if( ( m_action == LIST_FILES ) && ( m_listing == null ) )
{ {
throw new TaskException( "listing attribute must be set for list action!" ); throw new TaskException( "listing attribute must be set for list action!" );
} }


if( action == MK_DIR && remotedir == null )
if( m_action == MK_DIR && m_remotedir == null )
{ {
throw new TaskException( "remotedir attribute must be set for mkdir action!" ); throw new TaskException( "remotedir attribute must be set for mkdir action!" );
} }
@@ -535,11 +530,6 @@ public class FTP
/** /**
* Creates all parent directories specified in a complete relative pathname. * Creates all parent directories specified in a complete relative pathname.
* Attempts to create existing directories will not cause errors. * Attempts to create existing directories will not cause errors.
*
* @param ftp Description of Parameter
* @param filename Description of Parameter
* @exception IOException Description of Exception
* @exception TaskException Description of Exception
*/ */
protected void createParents( FTPClient ftp, String filename ) protected void createParents( FTPClient ftp, String filename )
throws IOException, TaskException throws IOException, TaskException
@@ -557,50 +547,45 @@ public class FTP
for( int i = parents.size() - 1; i >= 0; i-- ) for( int i = parents.size() - 1; i >= 0; i-- )
{ {
dir = (File)parents.get( i ); dir = (File)parents.get( i );
if( !dirCache.contains( dir ) )
if( !m_dirCache.contains( dir ) )
{ {
getLogger().debug( "creating remote directory " + resolveFile( dir.getPath() ) );
ftp.makeDirectory( resolveFile( dir.getPath() ) );
getLogger().debug( "creating remote directory " + remoteResolveFile( dir.getPath() ) );
ftp.makeDirectory( remoteResolveFile( dir.getPath() ) );
// Both codes 550 and 553 can be produced by FTP Servers // Both codes 550 and 553 can be produced by FTP Servers
// to indicate that an attempt to create a directory has // to indicate that an attempt to create a directory has
// failed because the directory already exists. // failed because the directory already exists.
int result = ftp.getReplyCode(); int result = ftp.getReplyCode();
if( !FTPReply.isPositiveCompletion( result ) && if( !FTPReply.isPositiveCompletion( result ) &&
( result != 550 ) && ( result != 553 ) && ( result != 550 ) && ( result != 553 ) &&
!ignoreNoncriticalErrors )
!m_ignoreNoncriticalErrors )
{ {
throw new TaskException( throw new TaskException(
"could not create directory: " + "could not create directory: " +
ftp.getReplyString() ); ftp.getReplyString() );
} }
dirCache.add( dir );
m_dirCache.add( dir );
} }
} }
} }


/** /**
* Delete a file from the remote host. * Delete a file from the remote host.
*
* @param ftp Description of Parameter
* @param filename Description of Parameter
* @exception IOException Description of Exception
* @exception TaskException Description of Exception
*/ */
protected void delFile( FTPClient ftp, String filename ) protected void delFile( FTPClient ftp, String filename )
throws IOException, TaskException throws IOException, TaskException
{ {
if( verbose )
if( m_verbose )
{ {
getLogger().info( "deleting " + filename ); getLogger().info( "deleting " + filename );
} }


if( !ftp.deleteFile( resolveFile( filename ) ) )
if( !ftp.deleteFile( remoteResolveFile( filename ) ) )
{ {
String s = "could not delete file: " + ftp.getReplyString(); String s = "could not delete file: " + ftp.getReplyString();
if( skipFailedTransfers == true )
if( m_skipFailedTransfers == true )
{ {
getLogger().warn( s ); getLogger().warn( s );
skipped++;
m_skipped++;
} }
else else
{ {
@@ -609,8 +594,8 @@ public class FTP
} }
else else
{ {
getLogger().debug( "File " + filename + " deleted from " + server );
transferred++;
getLogger().debug( "File " + filename + " deleted from " + m_server );
m_transferred++;
} }
} }


@@ -620,26 +605,20 @@ public class FTP
* retrieved using the entire relative path spec - no attempt is made to * retrieved using the entire relative path spec - no attempt is made to
* change directories. It is anticipated that this may eventually cause * change directories. It is anticipated that this may eventually cause
* problems with some FTP servers, but it simplifies the coding. * problems with some FTP servers, but it simplifies the coding.
*
* @param ftp Description of Parameter
* @param bw Description of Parameter
* @param filename Description of Parameter
* @exception IOException Description of Exception
* @exception TaskException Description of Exception
*/ */
protected void listFile( FTPClient ftp, BufferedWriter bw, String filename ) protected void listFile( FTPClient ftp, BufferedWriter bw, String filename )
throws IOException, TaskException throws IOException, TaskException
{ {
if( verbose )
if( m_verbose )
{ {
getLogger().info( "listing " + filename ); getLogger().info( "listing " + filename );
} }


FTPFile ftpfile = ftp.listFiles( resolveFile( filename ) )[ 0 ];
FTPFile ftpfile = ftp.listFiles( remoteResolveFile( filename ) )[ 0 ];
bw.write( ftpfile.toString() ); bw.write( ftpfile.toString() );
bw.newLine(); bw.newLine();


transferred++;
m_transferred++;
} }


/** /**
@@ -653,7 +632,7 @@ public class FTP
protected void makeRemoteDir( FTPClient ftp, String dir ) protected void makeRemoteDir( FTPClient ftp, String dir )
throws IOException, TaskException throws IOException, TaskException
{ {
if( verbose )
if( m_verbose )
{ {
getLogger().info( "creating directory: " + dir ); getLogger().info( "creating directory: " + dir );
} }
@@ -665,20 +644,20 @@ public class FTP
// failed because the directory already exists. // failed because the directory already exists.


int rc = ftp.getReplyCode(); int rc = ftp.getReplyCode();
if( !( ignoreNoncriticalErrors && ( rc == 550 || rc == 553 || rc == 521 ) ) )
if( !( m_ignoreNoncriticalErrors && ( rc == 550 || rc == 553 || rc == 521 ) ) )
{ {
throw new TaskException( "could not create directory: " + throw new TaskException( "could not create directory: " +
ftp.getReplyString() ); ftp.getReplyString() );
} }


if( verbose )
if( m_verbose )
{ {
getLogger().info( "directory already exists" ); getLogger().info( "directory already exists" );
} }
} }
else else
{ {
if( verbose )
if( m_verbose )
{ {
getLogger().info( "directory created OK" ); getLogger().info( "directory created OK" );
} }
@@ -695,10 +674,10 @@ public class FTP
* @param file Description of Parameter * @param file Description of Parameter
* @return Description of the Returned Value * @return Description of the Returned Value
*/ */
protected String resolveFile( String file )
protected String remoteResolveFile( final String file )
{ {
return file.replace( System.getProperty( "file.separator" ).charAt( 0 ), return file.replace( System.getProperty( "file.separator" ).charAt( 0 ),
remoteFileSep.charAt( 0 ) );
m_remoteFileSep.charAt( 0 ) );
} }


/** /**
@@ -724,10 +703,10 @@ public class FTP
{ {
File file = resolveFile( new File( dir, filename ).getPath() ); File file = resolveFile( new File( dir, filename ).getPath() );


if( newerOnly && isUpToDate( ftp, file, resolveFile( filename ) ) )
if( m_newerOnly && isUpToDate( ftp, file, remoteResolveFile( filename ) ) )
return; return;


if( verbose )
if( m_verbose )
{ {
getLogger().info( "transferring " + file.getAbsolutePath() ); getLogger().info( "transferring " + file.getAbsolutePath() );
} }
@@ -736,15 +715,15 @@ public class FTP


createParents( ftp, filename ); createParents( ftp, filename );


ftp.storeFile( resolveFile( filename ), instream );
ftp.storeFile( remoteResolveFile( filename ), instream );
boolean success = FTPReply.isPositiveCompletion( ftp.getReplyCode() ); boolean success = FTPReply.isPositiveCompletion( ftp.getReplyCode() );
if( !success ) if( !success )
{ {
String s = "could not put file: " + ftp.getReplyString(); String s = "could not put file: " + ftp.getReplyString();
if( skipFailedTransfers == true )
if( m_skipFailedTransfers == true )
{ {
getLogger().warn( s ); getLogger().warn( s );
skipped++;
m_skipped++;
} }
else else
{ {
@@ -755,8 +734,8 @@ public class FTP
else else
{ {


getLogger().debug( "File " + file.getAbsolutePath() + " copied to " + server );
transferred++;
getLogger().debug( "File " + file.getAbsolutePath() + " copied to " + m_server );
m_transferred++;
} }
} }
finally finally
@@ -790,7 +769,7 @@ public class FTP
{ {
FileScanner ds; FileScanner ds;


if( action == SEND_FILES )
if( m_action == SEND_FILES )
{ {
ds = fs.getDirectoryScanner(); ds = fs.getDirectoryScanner();
} }
@@ -803,13 +782,13 @@ public class FTP


String[] dsfiles = ds.getIncludedFiles(); String[] dsfiles = ds.getIncludedFiles();
String dir = null; String dir = null;
if( ( ds.getBasedir() == null ) && ( ( action == SEND_FILES ) || ( action == GET_FILES ) ) )
if( ( ds.getBasedir() == null ) && ( ( m_action == SEND_FILES ) || ( m_action == GET_FILES ) ) )
{ {
throw new TaskException( "the dir attribute must be set for send and get actions" ); throw new TaskException( "the dir attribute must be set for send and get actions" );
} }
else else
{ {
if( ( action == SEND_FILES ) || ( action == GET_FILES ) )
if( ( m_action == SEND_FILES ) || ( m_action == GET_FILES ) )
{ {
dir = ds.getBasedir().getAbsolutePath(); dir = ds.getBasedir().getAbsolutePath();
} }
@@ -817,19 +796,19 @@ public class FTP


// If we are doing a listing, we need the output stream created now. // If we are doing a listing, we need the output stream created now.
BufferedWriter bw = null; BufferedWriter bw = null;
if( action == LIST_FILES )
if( m_action == LIST_FILES )
{ {
File pd = new File( listing.getParent() );
File pd = new File( m_listing.getParent() );
if( !pd.exists() ) if( !pd.exists() )
{ {
pd.mkdirs(); pd.mkdirs();
} }
bw = new BufferedWriter( new FileWriter( listing ) );
bw = new BufferedWriter( new FileWriter( m_listing ) );
} }


for( int i = 0; i < dsfiles.length; i++ ) for( int i = 0; i < dsfiles.length; i++ )
{ {
switch( action )
switch( m_action )
{ {
case SEND_FILES: case SEND_FILES:
{ {
@@ -857,12 +836,12 @@ public class FTP


default: default:
{ {
throw new TaskException( "unknown ftp action " + action );
throw new TaskException( "unknown ftp action " + m_action );
} }
} }
} }


if( action == LIST_FILES )
if( m_action == LIST_FILES )
{ {
bw.close(); bw.close();
} }
@@ -881,19 +860,19 @@ public class FTP
protected void transferFiles( FTPClient ftp ) protected void transferFiles( FTPClient ftp )
throws IOException, TaskException throws IOException, TaskException
{ {
transferred = 0;
skipped = 0;
m_transferred = 0;
m_skipped = 0;


if( filesets.size() == 0 )
if( m_filesets.size() == 0 )
{ {
throw new TaskException( "at least one fileset must be specified." ); throw new TaskException( "at least one fileset must be specified." );
} }
else else
{ {
// get files from filesets // get files from filesets
for( int i = 0; i < filesets.size(); i++ )
for( int i = 0; i < m_filesets.size(); i++ )
{ {
FileSet fs = (FileSet)filesets.get( i );
FileSet fs = (FileSet)m_filesets.get( i );
if( fs != null ) if( fs != null )
{ {
transferFiles( ftp, fs ); transferFiles( ftp, fs );
@@ -901,179 +880,10 @@ public class FTP
} }
} }


getLogger().info( transferred + " files " + COMPLETED_ACTION_STRS[ action ] );
if( skipped != 0 )
{
getLogger().info( skipped + " files were not successfully " + COMPLETED_ACTION_STRS[ action ] );
}
}

public static class Action extends EnumeratedAttribute
{

private final static String[] validActions = {
"send", "put", "recv", "get", "del", "delete", "list", "mkdir"
};

public int getAction()
getLogger().info( m_transferred + " files " + COMPLETED_ACTION_STRS[ m_action ] );
if( m_skipped != 0 )
{ {
String actionL = getValue().toLowerCase( Locale.US );
if( actionL.equals( "send" ) ||
actionL.equals( "put" ) )
{
return SEND_FILES;
}
else if( actionL.equals( "recv" ) ||
actionL.equals( "get" ) )
{
return GET_FILES;
}
else if( actionL.equals( "del" ) ||
actionL.equals( "delete" ) )
{
return DEL_FILES;
}
else if( actionL.equals( "list" ) )
{
return LIST_FILES;
}
else if( actionL.equals( "mkdir" ) )
{
return MK_DIR;
}
return SEND_FILES;
}

public String[] getValues()
{
return validActions;
}
}

protected class FTPDirectoryScanner extends DirectoryScanner
{
protected FTPClient ftp = null;

public FTPDirectoryScanner( FTPClient ftp )
{
super();
this.ftp = ftp;
}

public void scan()
{
if( getIncludes() == null )
{
// No includes supplied, so set it to 'matches all'
setIncludes( new String[ 1 ] );
getIncludes()[ 0 ] = "**";
}
if( getExcludes() == null )
{
setExcludes( new String[ 0 ] );
}

setFilesIncluded( new ArrayList() );
setFilesNotIncluded( new ArrayList() );
setFilesExcluded( new ArrayList() );
setDirsIncluded( new ArrayList() );
setDirsNotIncluded( new ArrayList() );
setDirsExcluded( new ArrayList() );

try
{
String cwd = ftp.printWorkingDirectory();
scandir( ".", "", true );// always start from the current ftp working dir
ftp.changeWorkingDirectory( cwd );
}
catch( IOException e )
{
throw new TaskException( "Unable to scan FTP server: ", e );
}
}

protected void scandir( String dir, String vpath, boolean fast )
{
try
{
if( !ftp.changeWorkingDirectory( dir ) )
{
return;
}

FTPFile[] newfiles = ftp.listFiles();
if( newfiles == null )
{
ftp.changeToParentDirectory();
return;
}

for( int i = 0; i < newfiles.length; i++ )
{
FTPFile file = newfiles[ i ];
if( !file.getName().equals( "." ) && !file.getName().equals( ".." ) )
{
if( file.isDirectory() )
{
String name = file.getName();
if( isIncluded( name ) )
{
if( !isExcluded( name ) )
{
getDirsIncluded().add( name );
if( fast )
{
scandir( name, vpath + name + File.separator, fast );
}
}
else
{
getDirsExcluded().add( name );
}
}
else
{
getDirsNotIncluded().add( name );
if( fast && couldHoldIncluded( name ) )
{
scandir( name, vpath + name + File.separator, fast );
}
}
if( !fast )
{
scandir( name, vpath + name + File.separator, fast );
}
}
else
{
if( file.isFile() )
{
String name = vpath + file.getName();
if( isIncluded( name ) )
{
if( !isExcluded( name ) )
{
getFilesIncluded().add( name );
}
else
{
getFilesExcluded().add( name );
}
}
else
{
getFilesNotIncluded().add( name );
}
}
}
}
}
ftp.changeToParentDirectory();
}
catch( IOException e )
{
throw new TaskException( "Error while communicating with FTP server: ", e );
}
getLogger().info( m_skipped + " files were not successfully " + COMPLETED_ACTION_STRS[ m_action ] );
} }
} }
} }

+ 146
- 0
proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/net/FTPDirectoryScanner.java View File

@@ -0,0 +1,146 @@
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.tools.ant.taskdefs.optional.net;

import com.oroinc.net.ftp.FTPClient;
import com.oroinc.net.ftp.FTPFile;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.myrmidon.api.TaskException;
import org.apache.tools.ant.types.DirectoryScanner;

class FTPDirectoryScanner
extends DirectoryScanner
{
protected final FTPClient m_ftp;

public FTPDirectoryScanner( final FTPClient ftp )
{
super();
m_ftp = ftp;
}

public void scan()
throws TaskException
{
if( getIncludes() == null )
{
// No includes supplied, so set it to 'matches all'
setIncludes( new String[ 1 ] );
getIncludes()[ 0 ] = "**";
}
if( getExcludes() == null )
{
setExcludes( new String[ 0 ] );
}

setFilesIncluded( new ArrayList() );
setFilesNotIncluded( new ArrayList() );
setFilesExcluded( new ArrayList() );
setDirsIncluded( new ArrayList() );
setDirsNotIncluded( new ArrayList() );
setDirsExcluded( new ArrayList() );

try
{
String cwd = m_ftp.printWorkingDirectory();
scandir( ".", "", true );// always start from the current ftp working dir
m_ftp.changeWorkingDirectory( cwd );
}
catch( IOException e )
{
throw new TaskException( "Unable to scan FTP server: ", e );
}
}

protected void scandir( String dir, String vpath, boolean fast )
throws TaskException
{
try
{
if( !m_ftp.changeWorkingDirectory( dir ) )
{
return;
}

FTPFile[] newfiles = m_ftp.listFiles();
if( newfiles == null )
{
m_ftp.changeToParentDirectory();
return;
}

for( int i = 0; i < newfiles.length; i++ )
{
FTPFile file = newfiles[ i ];
if( !file.getName().equals( "." ) && !file.getName().equals( ".." ) )
{
if( file.isDirectory() )
{
String name = file.getName();
if( isIncluded( name ) )
{
if( !isExcluded( name ) )
{
getDirsIncluded().add( name );
if( fast )
{
scandir( name, vpath + name + File.separator, fast );
}
}
else
{
getDirsExcluded().add( name );
}
}
else
{
getDirsNotIncluded().add( name );
if( fast && couldHoldIncluded( name ) )
{
scandir( name, vpath + name + File.separator, fast );
}
}
if( !fast )
{
scandir( name, vpath + name + File.separator, fast );
}
}
else
{
if( file.isFile() )
{
String name = vpath + file.getName();
if( isIncluded( name ) )
{
if( !isExcluded( name ) )
{
getFilesIncluded().add( name );
}
else
{
getFilesExcluded().add( name );
}
}
else
{
getFilesNotIncluded().add( name );
}
}
}
}
}
m_ftp.changeToParentDirectory();
}
catch( IOException e )
{
throw new TaskException( "Error while communicating with FTP server: ", e );
}
}
}

+ 54
- 0
proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/Action.java View File

@@ -0,0 +1,54 @@
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.tools.ant.taskdefs.optional.net;

import java.util.Locale;
import org.apache.tools.ant.types.EnumeratedAttribute;

public class Action
extends EnumeratedAttribute
{
private final static String[] validActions = new String[]
{
"send", "put", "recv", "get", "del", "delete", "list", "mkdir"
};

public int getAction()
{
String actionL = getValue().toLowerCase( Locale.US );
if( actionL.equals( "send" ) ||
actionL.equals( "put" ) )
{
return FTP.SEND_FILES;
}
else if( actionL.equals( "recv" ) ||
actionL.equals( "get" ) )
{
return FTP.GET_FILES;
}
else if( actionL.equals( "del" ) ||
actionL.equals( "delete" ) )
{
return FTP.DEL_FILES;
}
else if( actionL.equals( "list" ) )
{
return FTP.LIST_FILES;
}
else if( actionL.equals( "mkdir" ) )
{
return FTP.MK_DIR;
}
return FTP.SEND_FILES;
}

public String[] getValues()
{
return validActions;
}
}

+ 117
- 307
proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/FTP.java View File

@@ -21,12 +21,10 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Locale;
import org.apache.avalon.excalibur.io.FileUtil;
import org.apache.myrmidon.api.TaskException; import org.apache.myrmidon.api.TaskException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.FileScanner;
import org.apache.tools.ant.Task; import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.EnumeratedAttribute;
import org.apache.tools.ant.types.FileScanner;
import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.types.FileSet;


/** /**
@@ -60,7 +58,8 @@ public class FTP
protected final static int LIST_FILES = 3; protected final static int LIST_FILES = 3;
protected final static int MK_DIR = 4; protected final static int MK_DIR = 4;


protected final static String[] ACTION_STRS = {
protected final static String[] ACTION_STRS = new String[]
{
"sending", "sending",
"getting", "getting",
"deleting", "deleting",
@@ -68,32 +67,33 @@ public class FTP
"making directory" "making directory"
}; };


protected final static String[] COMPLETED_ACTION_STRS = {
protected final static String[] COMPLETED_ACTION_STRS = new String[]
{
"sent", "sent",
"retrieved", "retrieved",
"deleted", "deleted",
"listed", "listed",
"created directory" "created directory"
}; };
private boolean binary = true;
private boolean passive = false;
private boolean verbose = false;
private boolean newerOnly = false;
private int action = SEND_FILES;
private ArrayList filesets = new ArrayList();
private ArrayList dirCache = new ArrayList();
private int transferred = 0;
private String remoteFileSep = "/";
private int port = 21;
private boolean skipFailedTransfers = false;
private int skipped = 0;
private boolean ignoreNoncriticalErrors = false;
private File listing;
private String password;
private String remotedir;
private String server;
private String userid;
private boolean m_binary = true;
private boolean m_passive;
private boolean m_verbose;
private boolean m_newerOnly;
private int m_action = SEND_FILES;
private ArrayList m_filesets = new ArrayList();
private ArrayList m_dirCache = new ArrayList();
private int m_transferred;
private String m_remoteFileSep = "/";
private int m_port = 21;
private boolean m_skipFailedTransfers;
private int m_skipped;
private boolean m_ignoreNoncriticalErrors;
private File m_listing;
private String m_password;
private String m_remotedir;
private String m_server;
private String m_userid;


/** /**
* Sets the FTP action to be taken. Currently accepts "put", "get", "del", * Sets the FTP action to be taken. Currently accepts "put", "get", "del",
@@ -105,7 +105,7 @@ public class FTP
public void setAction( Action action ) public void setAction( Action action )
throws TaskException throws TaskException
{ {
this.action = action.getAction();
m_action = action.getAction();
} }


/** /**
@@ -116,7 +116,7 @@ public class FTP
*/ */
public void setBinary( boolean binary ) public void setBinary( boolean binary )
{ {
this.binary = binary;
m_binary = binary;
} }


/** /**
@@ -127,7 +127,7 @@ public class FTP
*/ */
public void setDepends( boolean depends ) public void setDepends( boolean depends )
{ {
this.newerOnly = depends;
m_newerOnly = depends;
} }


/** /**
@@ -138,7 +138,7 @@ public class FTP
*/ */
public void setIgnoreNoncriticalErrors( boolean ignoreNoncriticalErrors ) public void setIgnoreNoncriticalErrors( boolean ignoreNoncriticalErrors )
{ {
this.ignoreNoncriticalErrors = ignoreNoncriticalErrors;
m_ignoreNoncriticalErrors = ignoreNoncriticalErrors;
} }


/** /**
@@ -151,7 +151,7 @@ public class FTP
public void setListing( File listing ) public void setListing( File listing )
throws TaskException throws TaskException
{ {
this.listing = listing;
m_listing = listing;
} }


/** /**
@@ -162,7 +162,7 @@ public class FTP
*/ */
public void setNewer( boolean newer ) public void setNewer( boolean newer )
{ {
this.newerOnly = newer;
m_newerOnly = newer;
} }


/** /**
@@ -174,7 +174,7 @@ public class FTP
*/ */
public void setPassive( boolean passive ) public void setPassive( boolean passive )
{ {
this.passive = passive;
m_passive = passive;
} }


/** /**
@@ -184,7 +184,7 @@ public class FTP
*/ */
public void setPassword( String password ) public void setPassword( String password )
{ {
this.password = password;
m_password = password;
} }


/** /**
@@ -194,7 +194,7 @@ public class FTP
*/ */
public void setPort( int port ) public void setPort( int port )
{ {
this.port = port;
m_port = port;
} }


/** /**
@@ -206,7 +206,7 @@ public class FTP
*/ */
public void setRemotedir( String dir ) public void setRemotedir( String dir )
{ {
this.remotedir = dir;
m_remotedir = dir;
} }


/** /**
@@ -219,7 +219,7 @@ public class FTP
*/ */
public void setSeparator( String separator ) public void setSeparator( String separator )
{ {
remoteFileSep = separator;
m_remoteFileSep = separator;
} }


/** /**
@@ -229,7 +229,7 @@ public class FTP
*/ */
public void setServer( String server ) public void setServer( String server )
{ {
this.server = server;
m_server = server;
} }


/** /**
@@ -239,7 +239,7 @@ public class FTP
*/ */
public void setSkipFailedTransfers( boolean skipFailedTransfers ) public void setSkipFailedTransfers( boolean skipFailedTransfers )
{ {
this.skipFailedTransfers = skipFailedTransfers;
m_skipFailedTransfers = skipFailedTransfers;
} }


/** /**
@@ -249,7 +249,7 @@ public class FTP
*/ */
public void setUserid( String userid ) public void setUserid( String userid )
{ {
this.userid = userid;
m_userid = userid;
} }


/** /**
@@ -259,7 +259,7 @@ public class FTP
*/ */
public void setVerbose( boolean verbose ) public void setVerbose( boolean verbose )
{ {
this.verbose = verbose;
m_verbose = verbose;
} }


/** /**
@@ -269,7 +269,7 @@ public class FTP
*/ */
public void addFileset( FileSet set ) public void addFileset( FileSet set )
{ {
filesets.add( set );
m_filesets.add( set );
} }


/** /**
@@ -280,17 +280,17 @@ public class FTP
public void execute() public void execute()
throws TaskException throws TaskException
{ {
checkConfiguration();
validate();


FTPClient ftp = null; FTPClient ftp = null;


try try
{ {
getLogger().debug( "Opening FTP connection to " + server );
getLogger().debug( "Opening FTP connection to " + m_server );


ftp = new FTPClient(); ftp = new FTPClient();


ftp.connect( server, port );
ftp.connect( m_server, m_port );
if( !FTPReply.isPositiveCompletion( ftp.getReplyCode() ) ) if( !FTPReply.isPositiveCompletion( ftp.getReplyCode() ) )
{ {
throw new TaskException( "FTP connection failed: " + ftp.getReplyString() ); throw new TaskException( "FTP connection failed: " + ftp.getReplyString() );
@@ -299,14 +299,14 @@ public class FTP
getLogger().debug( "connected" ); getLogger().debug( "connected" );
getLogger().debug( "logging in to FTP server" ); getLogger().debug( "logging in to FTP server" );


if( !ftp.login( userid, password ) )
if( !ftp.login( m_userid, m_password ) )
{ {
throw new TaskException( "Could not login to FTP server" ); throw new TaskException( "Could not login to FTP server" );
} }


getLogger().debug( "login succeeded" ); getLogger().debug( "login succeeded" );


if( binary )
if( m_binary )
{ {
ftp.setFileType( com.oroinc.net.ftp.FTP.IMAGE_FILE_TYPE ); ftp.setFileType( com.oroinc.net.ftp.FTP.IMAGE_FILE_TYPE );
if( !FTPReply.isPositiveCompletion( ftp.getReplyCode() ) ) if( !FTPReply.isPositiveCompletion( ftp.getReplyCode() ) )
@@ -317,7 +317,7 @@ public class FTP
} }
} }


if( passive )
if( m_passive )
{ {
getLogger().debug( "entering passive mode" ); getLogger().debug( "entering passive mode" );
ftp.enterLocalPassiveMode(); ftp.enterLocalPassiveMode();
@@ -332,18 +332,18 @@ public class FTP
// If the action is MK_DIR, then the specified remote directory is the // If the action is MK_DIR, then the specified remote directory is the
// directory to create. // directory to create.


if( action == MK_DIR )
if( m_action == MK_DIR )
{ {


makeRemoteDir( ftp, remotedir );
makeRemoteDir( ftp, m_remotedir );


} }
else else
{ {
if( remotedir != null )
if( m_remotedir != null )
{ {
getLogger().debug( "changing the remote directory" ); getLogger().debug( "changing the remote directory" );
ftp.changeWorkingDirectory( remotedir );
ftp.changeWorkingDirectory( m_remotedir );
if( !FTPReply.isPositiveCompletion( ftp.getReplyCode() ) ) if( !FTPReply.isPositiveCompletion( ftp.getReplyCode() ) )
{ {
throw new TaskException( throw new TaskException(
@@ -351,7 +351,7 @@ public class FTP
ftp.getReplyString() ); ftp.getReplyString() );
} }
} }
getLogger().info( ACTION_STRS[ action ] + " files" );
getLogger().info( ACTION_STRS[ m_action ] + " files" );
transferFiles( ftp ); transferFiles( ftp );
} }


@@ -397,31 +397,33 @@ public class FTP
OutputStream outstream = null; OutputStream outstream = null;
try try
{ {
File file = resolveFile( new File( dir, filename ).getPath() );
final File file = FileUtil.resolveFile( resolveFile( dir ), filename );


if( newerOnly && isUpToDate( ftp, file, resolveFile( filename ) ) )
if( m_newerOnly && isUpToDate( ftp, file, remoteResolveFile( filename ) ) )
{
return; return;
}


if( verbose )
if( m_verbose )
{ {
getLogger().info( "transferring " + filename + " to " + file.getAbsolutePath() ); getLogger().info( "transferring " + filename + " to " + file.getAbsolutePath() );
} }


File pdir = new File( file.getParent() );// stay 1.1 compatible
if( !pdir.exists() )
final File parent = file.getParentFile();
if( !parent.exists() )
{ {
pdir.mkdirs();
parent.mkdirs();
} }
outstream = new BufferedOutputStream( new FileOutputStream( file ) ); outstream = new BufferedOutputStream( new FileOutputStream( file ) );
ftp.retrieveFile( resolveFile( filename ), outstream );
ftp.retrieveFile( remoteResolveFile( filename ), outstream );


if( !FTPReply.isPositiveCompletion( ftp.getReplyCode() ) ) if( !FTPReply.isPositiveCompletion( ftp.getReplyCode() ) )
{ {
String s = "could not get file: " + ftp.getReplyString(); String s = "could not get file: " + ftp.getReplyString();
if( skipFailedTransfers == true )
if( m_skipFailedTransfers == true )
{ {
getLogger().warn( s ); getLogger().warn( s );
skipped++;
m_skipped++;
} }
else else
{ {
@@ -431,8 +433,8 @@ public class FTP
} }
else else
{ {
getLogger().debug( "File " + file.getAbsolutePath() + " copied from " + server );
transferred++;
getLogger().debug( "File " + file.getAbsolutePath() + " copied from " + m_server );
m_transferred++;
} }
} }
finally finally
@@ -454,13 +456,6 @@ public class FTP
/** /**
* Checks to see if the remote file is current as compared with the local * 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. * file. Returns true if the remote file is up to date.
*
* @param ftp Description of Parameter
* @param localFile Description of Parameter
* @param remoteFile Description of Parameter
* @return The UpToDate value
* @exception IOException Description of Exception
* @exception TaskException Description of Exception
*/ */
protected boolean isUpToDate( FTPClient ftp, File localFile, String remoteFile ) protected boolean isUpToDate( FTPClient ftp, File localFile, String remoteFile )
throws IOException, TaskException throws IOException, TaskException
@@ -476,7 +471,7 @@ public class FTP
// If we are sending files, then assume out of date. // If we are sending files, then assume out of date.
// If we are getting files, then throw an error // If we are getting files, then throw an error


if( action == SEND_FILES )
if( m_action == SEND_FILES )
{ {
getLogger().debug( "Could not date test remote file: " + remoteFile + "assuming out of date." ); getLogger().debug( "Could not date test remote file: " + remoteFile + "assuming out of date." );
return false; return false;
@@ -490,7 +485,7 @@ public class FTP


long remoteTimestamp = files[ 0 ].getTimestamp().getTime().getTime(); long remoteTimestamp = files[ 0 ].getTimestamp().getTime().getTime();
long localTimestamp = localFile.lastModified(); long localTimestamp = localFile.lastModified();
if( this.action == SEND_FILES )
if( m_action == SEND_FILES )
{ {
return remoteTimestamp > localTimestamp; return remoteTimestamp > localTimestamp;
} }
@@ -505,28 +500,28 @@ public class FTP
* *
* @exception TaskException Description of Exception * @exception TaskException Description of Exception
*/ */
protected void checkConfiguration()
private void validate()
throws TaskException throws TaskException
{ {
if( server == null )
if( m_server == null )
{ {
throw new TaskException( "server attribute must be set!" ); throw new TaskException( "server attribute must be set!" );
} }
if( userid == null )
if( m_userid == null )
{ {
throw new TaskException( "userid attribute must be set!" ); throw new TaskException( "userid attribute must be set!" );
} }
if( password == null )
if( m_password == null )
{ {
throw new TaskException( "password attribute must be set!" ); throw new TaskException( "password attribute must be set!" );
} }


if( ( action == LIST_FILES ) && ( listing == null ) )
if( ( m_action == LIST_FILES ) && ( m_listing == null ) )
{ {
throw new TaskException( "listing attribute must be set for list action!" ); throw new TaskException( "listing attribute must be set for list action!" );
} }


if( action == MK_DIR && remotedir == null )
if( m_action == MK_DIR && m_remotedir == null )
{ {
throw new TaskException( "remotedir attribute must be set for mkdir action!" ); throw new TaskException( "remotedir attribute must be set for mkdir action!" );
} }
@@ -535,11 +530,6 @@ public class FTP
/** /**
* Creates all parent directories specified in a complete relative pathname. * Creates all parent directories specified in a complete relative pathname.
* Attempts to create existing directories will not cause errors. * Attempts to create existing directories will not cause errors.
*
* @param ftp Description of Parameter
* @param filename Description of Parameter
* @exception IOException Description of Exception
* @exception TaskException Description of Exception
*/ */
protected void createParents( FTPClient ftp, String filename ) protected void createParents( FTPClient ftp, String filename )
throws IOException, TaskException throws IOException, TaskException
@@ -557,50 +547,45 @@ public class FTP
for( int i = parents.size() - 1; i >= 0; i-- ) for( int i = parents.size() - 1; i >= 0; i-- )
{ {
dir = (File)parents.get( i ); dir = (File)parents.get( i );
if( !dirCache.contains( dir ) )
if( !m_dirCache.contains( dir ) )
{ {
getLogger().debug( "creating remote directory " + resolveFile( dir.getPath() ) );
ftp.makeDirectory( resolveFile( dir.getPath() ) );
getLogger().debug( "creating remote directory " + remoteResolveFile( dir.getPath() ) );
ftp.makeDirectory( remoteResolveFile( dir.getPath() ) );
// Both codes 550 and 553 can be produced by FTP Servers // Both codes 550 and 553 can be produced by FTP Servers
// to indicate that an attempt to create a directory has // to indicate that an attempt to create a directory has
// failed because the directory already exists. // failed because the directory already exists.
int result = ftp.getReplyCode(); int result = ftp.getReplyCode();
if( !FTPReply.isPositiveCompletion( result ) && if( !FTPReply.isPositiveCompletion( result ) &&
( result != 550 ) && ( result != 553 ) && ( result != 550 ) && ( result != 553 ) &&
!ignoreNoncriticalErrors )
!m_ignoreNoncriticalErrors )
{ {
throw new TaskException( throw new TaskException(
"could not create directory: " + "could not create directory: " +
ftp.getReplyString() ); ftp.getReplyString() );
} }
dirCache.add( dir );
m_dirCache.add( dir );
} }
} }
} }


/** /**
* Delete a file from the remote host. * Delete a file from the remote host.
*
* @param ftp Description of Parameter
* @param filename Description of Parameter
* @exception IOException Description of Exception
* @exception TaskException Description of Exception
*/ */
protected void delFile( FTPClient ftp, String filename ) protected void delFile( FTPClient ftp, String filename )
throws IOException, TaskException throws IOException, TaskException
{ {
if( verbose )
if( m_verbose )
{ {
getLogger().info( "deleting " + filename ); getLogger().info( "deleting " + filename );
} }


if( !ftp.deleteFile( resolveFile( filename ) ) )
if( !ftp.deleteFile( remoteResolveFile( filename ) ) )
{ {
String s = "could not delete file: " + ftp.getReplyString(); String s = "could not delete file: " + ftp.getReplyString();
if( skipFailedTransfers == true )
if( m_skipFailedTransfers == true )
{ {
getLogger().warn( s ); getLogger().warn( s );
skipped++;
m_skipped++;
} }
else else
{ {
@@ -609,8 +594,8 @@ public class FTP
} }
else else
{ {
getLogger().debug( "File " + filename + " deleted from " + server );
transferred++;
getLogger().debug( "File " + filename + " deleted from " + m_server );
m_transferred++;
} }
} }


@@ -620,26 +605,20 @@ public class FTP
* retrieved using the entire relative path spec - no attempt is made to * retrieved using the entire relative path spec - no attempt is made to
* change directories. It is anticipated that this may eventually cause * change directories. It is anticipated that this may eventually cause
* problems with some FTP servers, but it simplifies the coding. * problems with some FTP servers, but it simplifies the coding.
*
* @param ftp Description of Parameter
* @param bw Description of Parameter
* @param filename Description of Parameter
* @exception IOException Description of Exception
* @exception TaskException Description of Exception
*/ */
protected void listFile( FTPClient ftp, BufferedWriter bw, String filename ) protected void listFile( FTPClient ftp, BufferedWriter bw, String filename )
throws IOException, TaskException throws IOException, TaskException
{ {
if( verbose )
if( m_verbose )
{ {
getLogger().info( "listing " + filename ); getLogger().info( "listing " + filename );
} }


FTPFile ftpfile = ftp.listFiles( resolveFile( filename ) )[ 0 ];
FTPFile ftpfile = ftp.listFiles( remoteResolveFile( filename ) )[ 0 ];
bw.write( ftpfile.toString() ); bw.write( ftpfile.toString() );
bw.newLine(); bw.newLine();


transferred++;
m_transferred++;
} }


/** /**
@@ -653,7 +632,7 @@ public class FTP
protected void makeRemoteDir( FTPClient ftp, String dir ) protected void makeRemoteDir( FTPClient ftp, String dir )
throws IOException, TaskException throws IOException, TaskException
{ {
if( verbose )
if( m_verbose )
{ {
getLogger().info( "creating directory: " + dir ); getLogger().info( "creating directory: " + dir );
} }
@@ -665,20 +644,20 @@ public class FTP
// failed because the directory already exists. // failed because the directory already exists.


int rc = ftp.getReplyCode(); int rc = ftp.getReplyCode();
if( !( ignoreNoncriticalErrors && ( rc == 550 || rc == 553 || rc == 521 ) ) )
if( !( m_ignoreNoncriticalErrors && ( rc == 550 || rc == 553 || rc == 521 ) ) )
{ {
throw new TaskException( "could not create directory: " + throw new TaskException( "could not create directory: " +
ftp.getReplyString() ); ftp.getReplyString() );
} }


if( verbose )
if( m_verbose )
{ {
getLogger().info( "directory already exists" ); getLogger().info( "directory already exists" );
} }
} }
else else
{ {
if( verbose )
if( m_verbose )
{ {
getLogger().info( "directory created OK" ); getLogger().info( "directory created OK" );
} }
@@ -695,10 +674,10 @@ public class FTP
* @param file Description of Parameter * @param file Description of Parameter
* @return Description of the Returned Value * @return Description of the Returned Value
*/ */
protected String resolveFile( String file )
protected String remoteResolveFile( final String file )
{ {
return file.replace( System.getProperty( "file.separator" ).charAt( 0 ), return file.replace( System.getProperty( "file.separator" ).charAt( 0 ),
remoteFileSep.charAt( 0 ) );
m_remoteFileSep.charAt( 0 ) );
} }


/** /**
@@ -724,10 +703,10 @@ public class FTP
{ {
File file = resolveFile( new File( dir, filename ).getPath() ); File file = resolveFile( new File( dir, filename ).getPath() );


if( newerOnly && isUpToDate( ftp, file, resolveFile( filename ) ) )
if( m_newerOnly && isUpToDate( ftp, file, remoteResolveFile( filename ) ) )
return; return;


if( verbose )
if( m_verbose )
{ {
getLogger().info( "transferring " + file.getAbsolutePath() ); getLogger().info( "transferring " + file.getAbsolutePath() );
} }
@@ -736,15 +715,15 @@ public class FTP


createParents( ftp, filename ); createParents( ftp, filename );


ftp.storeFile( resolveFile( filename ), instream );
ftp.storeFile( remoteResolveFile( filename ), instream );
boolean success = FTPReply.isPositiveCompletion( ftp.getReplyCode() ); boolean success = FTPReply.isPositiveCompletion( ftp.getReplyCode() );
if( !success ) if( !success )
{ {
String s = "could not put file: " + ftp.getReplyString(); String s = "could not put file: " + ftp.getReplyString();
if( skipFailedTransfers == true )
if( m_skipFailedTransfers == true )
{ {
getLogger().warn( s ); getLogger().warn( s );
skipped++;
m_skipped++;
} }
else else
{ {
@@ -755,8 +734,8 @@ public class FTP
else else
{ {


getLogger().debug( "File " + file.getAbsolutePath() + " copied to " + server );
transferred++;
getLogger().debug( "File " + file.getAbsolutePath() + " copied to " + m_server );
m_transferred++;
} }
} }
finally finally
@@ -790,7 +769,7 @@ public class FTP
{ {
FileScanner ds; FileScanner ds;


if( action == SEND_FILES )
if( m_action == SEND_FILES )
{ {
ds = fs.getDirectoryScanner(); ds = fs.getDirectoryScanner();
} }
@@ -803,13 +782,13 @@ public class FTP


String[] dsfiles = ds.getIncludedFiles(); String[] dsfiles = ds.getIncludedFiles();
String dir = null; String dir = null;
if( ( ds.getBasedir() == null ) && ( ( action == SEND_FILES ) || ( action == GET_FILES ) ) )
if( ( ds.getBasedir() == null ) && ( ( m_action == SEND_FILES ) || ( m_action == GET_FILES ) ) )
{ {
throw new TaskException( "the dir attribute must be set for send and get actions" ); throw new TaskException( "the dir attribute must be set for send and get actions" );
} }
else else
{ {
if( ( action == SEND_FILES ) || ( action == GET_FILES ) )
if( ( m_action == SEND_FILES ) || ( m_action == GET_FILES ) )
{ {
dir = ds.getBasedir().getAbsolutePath(); dir = ds.getBasedir().getAbsolutePath();
} }
@@ -817,19 +796,19 @@ public class FTP


// If we are doing a listing, we need the output stream created now. // If we are doing a listing, we need the output stream created now.
BufferedWriter bw = null; BufferedWriter bw = null;
if( action == LIST_FILES )
if( m_action == LIST_FILES )
{ {
File pd = new File( listing.getParent() );
File pd = new File( m_listing.getParent() );
if( !pd.exists() ) if( !pd.exists() )
{ {
pd.mkdirs(); pd.mkdirs();
} }
bw = new BufferedWriter( new FileWriter( listing ) );
bw = new BufferedWriter( new FileWriter( m_listing ) );
} }


for( int i = 0; i < dsfiles.length; i++ ) for( int i = 0; i < dsfiles.length; i++ )
{ {
switch( action )
switch( m_action )
{ {
case SEND_FILES: case SEND_FILES:
{ {
@@ -857,12 +836,12 @@ public class FTP


default: default:
{ {
throw new TaskException( "unknown ftp action " + action );
throw new TaskException( "unknown ftp action " + m_action );
} }
} }
} }


if( action == LIST_FILES )
if( m_action == LIST_FILES )
{ {
bw.close(); bw.close();
} }
@@ -881,19 +860,19 @@ public class FTP
protected void transferFiles( FTPClient ftp ) protected void transferFiles( FTPClient ftp )
throws IOException, TaskException throws IOException, TaskException
{ {
transferred = 0;
skipped = 0;
m_transferred = 0;
m_skipped = 0;


if( filesets.size() == 0 )
if( m_filesets.size() == 0 )
{ {
throw new TaskException( "at least one fileset must be specified." ); throw new TaskException( "at least one fileset must be specified." );
} }
else else
{ {
// get files from filesets // get files from filesets
for( int i = 0; i < filesets.size(); i++ )
for( int i = 0; i < m_filesets.size(); i++ )
{ {
FileSet fs = (FileSet)filesets.get( i );
FileSet fs = (FileSet)m_filesets.get( i );
if( fs != null ) if( fs != null )
{ {
transferFiles( ftp, fs ); transferFiles( ftp, fs );
@@ -901,179 +880,10 @@ public class FTP
} }
} }


getLogger().info( transferred + " files " + COMPLETED_ACTION_STRS[ action ] );
if( skipped != 0 )
{
getLogger().info( skipped + " files were not successfully " + COMPLETED_ACTION_STRS[ action ] );
}
}

public static class Action extends EnumeratedAttribute
{

private final static String[] validActions = {
"send", "put", "recv", "get", "del", "delete", "list", "mkdir"
};

public int getAction()
getLogger().info( m_transferred + " files " + COMPLETED_ACTION_STRS[ m_action ] );
if( m_skipped != 0 )
{ {
String actionL = getValue().toLowerCase( Locale.US );
if( actionL.equals( "send" ) ||
actionL.equals( "put" ) )
{
return SEND_FILES;
}
else if( actionL.equals( "recv" ) ||
actionL.equals( "get" ) )
{
return GET_FILES;
}
else if( actionL.equals( "del" ) ||
actionL.equals( "delete" ) )
{
return DEL_FILES;
}
else if( actionL.equals( "list" ) )
{
return LIST_FILES;
}
else if( actionL.equals( "mkdir" ) )
{
return MK_DIR;
}
return SEND_FILES;
}

public String[] getValues()
{
return validActions;
}
}

protected class FTPDirectoryScanner extends DirectoryScanner
{
protected FTPClient ftp = null;

public FTPDirectoryScanner( FTPClient ftp )
{
super();
this.ftp = ftp;
}

public void scan()
{
if( getIncludes() == null )
{
// No includes supplied, so set it to 'matches all'
setIncludes( new String[ 1 ] );
getIncludes()[ 0 ] = "**";
}
if( getExcludes() == null )
{
setExcludes( new String[ 0 ] );
}

setFilesIncluded( new ArrayList() );
setFilesNotIncluded( new ArrayList() );
setFilesExcluded( new ArrayList() );
setDirsIncluded( new ArrayList() );
setDirsNotIncluded( new ArrayList() );
setDirsExcluded( new ArrayList() );

try
{
String cwd = ftp.printWorkingDirectory();
scandir( ".", "", true );// always start from the current ftp working dir
ftp.changeWorkingDirectory( cwd );
}
catch( IOException e )
{
throw new TaskException( "Unable to scan FTP server: ", e );
}
}

protected void scandir( String dir, String vpath, boolean fast )
{
try
{
if( !ftp.changeWorkingDirectory( dir ) )
{
return;
}

FTPFile[] newfiles = ftp.listFiles();
if( newfiles == null )
{
ftp.changeToParentDirectory();
return;
}

for( int i = 0; i < newfiles.length; i++ )
{
FTPFile file = newfiles[ i ];
if( !file.getName().equals( "." ) && !file.getName().equals( ".." ) )
{
if( file.isDirectory() )
{
String name = file.getName();
if( isIncluded( name ) )
{
if( !isExcluded( name ) )
{
getDirsIncluded().add( name );
if( fast )
{
scandir( name, vpath + name + File.separator, fast );
}
}
else
{
getDirsExcluded().add( name );
}
}
else
{
getDirsNotIncluded().add( name );
if( fast && couldHoldIncluded( name ) )
{
scandir( name, vpath + name + File.separator, fast );
}
}
if( !fast )
{
scandir( name, vpath + name + File.separator, fast );
}
}
else
{
if( file.isFile() )
{
String name = vpath + file.getName();
if( isIncluded( name ) )
{
if( !isExcluded( name ) )
{
getFilesIncluded().add( name );
}
else
{
getFilesExcluded().add( name );
}
}
else
{
getFilesNotIncluded().add( name );
}
}
}
}
}
ftp.changeToParentDirectory();
}
catch( IOException e )
{
throw new TaskException( "Error while communicating with FTP server: ", e );
}
getLogger().info( m_skipped + " files were not successfully " + COMPLETED_ACTION_STRS[ m_action ] );
} }
} }
} }

+ 146
- 0
proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/net/FTPDirectoryScanner.java View File

@@ -0,0 +1,146 @@
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.tools.ant.taskdefs.optional.net;

import com.oroinc.net.ftp.FTPClient;
import com.oroinc.net.ftp.FTPFile;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.myrmidon.api.TaskException;
import org.apache.tools.ant.types.DirectoryScanner;

class FTPDirectoryScanner
extends DirectoryScanner
{
protected final FTPClient m_ftp;

public FTPDirectoryScanner( final FTPClient ftp )
{
super();
m_ftp = ftp;
}

public void scan()
throws TaskException
{
if( getIncludes() == null )
{
// No includes supplied, so set it to 'matches all'
setIncludes( new String[ 1 ] );
getIncludes()[ 0 ] = "**";
}
if( getExcludes() == null )
{
setExcludes( new String[ 0 ] );
}

setFilesIncluded( new ArrayList() );
setFilesNotIncluded( new ArrayList() );
setFilesExcluded( new ArrayList() );
setDirsIncluded( new ArrayList() );
setDirsNotIncluded( new ArrayList() );
setDirsExcluded( new ArrayList() );

try
{
String cwd = m_ftp.printWorkingDirectory();
scandir( ".", "", true );// always start from the current ftp working dir
m_ftp.changeWorkingDirectory( cwd );
}
catch( IOException e )
{
throw new TaskException( "Unable to scan FTP server: ", e );
}
}

protected void scandir( String dir, String vpath, boolean fast )
throws TaskException
{
try
{
if( !m_ftp.changeWorkingDirectory( dir ) )
{
return;
}

FTPFile[] newfiles = m_ftp.listFiles();
if( newfiles == null )
{
m_ftp.changeToParentDirectory();
return;
}

for( int i = 0; i < newfiles.length; i++ )
{
FTPFile file = newfiles[ i ];
if( !file.getName().equals( "." ) && !file.getName().equals( ".." ) )
{
if( file.isDirectory() )
{
String name = file.getName();
if( isIncluded( name ) )
{
if( !isExcluded( name ) )
{
getDirsIncluded().add( name );
if( fast )
{
scandir( name, vpath + name + File.separator, fast );
}
}
else
{
getDirsExcluded().add( name );
}
}
else
{
getDirsNotIncluded().add( name );
if( fast && couldHoldIncluded( name ) )
{
scandir( name, vpath + name + File.separator, fast );
}
}
if( !fast )
{
scandir( name, vpath + name + File.separator, fast );
}
}
else
{
if( file.isFile() )
{
String name = vpath + file.getName();
if( isIncluded( name ) )
{
if( !isExcluded( name ) )
{
getFilesIncluded().add( name );
}
else
{
getFilesExcluded().add( name );
}
}
else
{
getFilesNotIncluded().add( name );
}
}
}
}
}
m_ftp.changeToParentDirectory();
}
catch( IOException e )
{
throw new TaskException( "Error while communicating with FTP server: ", e );
}
}
}

Loading…
Cancel
Save