org.eurocarbdb.util.FTP_Client.java Source code

Java tutorial

Introduction

Here is the source code for org.eurocarbdb.util.FTP_Client.java

Source

/*
*   EuroCarbDB, a framework for carbohydrate bioinformatics
*
*   Copyright (c) 2006-2009, Eurocarb project, or third-party contributors as
*   indicated by the @author tags or express copyright attribution
*   statements applied by the authors.  
*
*   This copyrighted material is made available to anyone wishing to use, modify,
*   copy, or redistribute it subject to the terms and conditions of the GNU
*   Lesser General Public License, as published by the Free Software Foundation.
*   A copy of this license accompanies this distribution in the file LICENSE.txt.
*
*   This program is distributed in the hope that it will be useful,
*   but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
*   or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
*   for more details.
*
*   Last commit: $Rev: 1932 $ by $Author: glycoslave $ on $Date:: 2010-08-05 #$  
*/

package org.eurocarbdb.util;

//  stdlib imports
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.UnknownHostException;

//  3rd party imports
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPConnectionClosedException;

/*  class FTP_Client  *//****************************
                        *
                        *   // some doco here...
                        *
                        *   @author   mjh <glycoslave@gmail.com>
                        *   @version  $Rev: 1932 $
                        */
public class FTP_Client extends FTPClient {

    //~~~~~~~~~~~~~~~~~~~~~~~~~ FIELDS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

    /** Logging handle. */
    static final Log log = LogFactory.getLog(FTP_Client.class);

    protected String host;

    protected String userName;

    //~~~~~~~~~~~~~~~~~~~~~~ CONSTRUCTORS ~~~~~~~~~~~~~~~~~~~~~~~~~//

    public FTP_Client() {
        super();
    }

    //~~~~~~~~~~~~~~~~~~~~~~~~ METHODS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~//    

    /*  connectAndLogin  *//*****************************************
                           *
                           *   A convenience method for connecting and logging in. 
                           */
    public void connectAndLogin(String host, String username, String password)
            throws IOException, UnknownHostException, FTPConnectionClosedException {
        this.host = host;
        this.userName = username;

        log.debug("attempting to connect to " + host);

        connect(host);

        if (FTPReply.isPositiveCompletion(getReplyCode())) {
            log.debug("connect successful, logging in as " + userName);
            login(userName, password);
        } else {
            log.warn("failed to connect to " + host + ", disconnecting...");
            disconnect();
            return;
        }

        log.info("connected to " + host + " as user " + userName);
    }

    /*  setPassiveMode  *//****************************************** 
                          *
                          *   Turn passive transfer mode on or off. If Passive mode is active, a
                          *   PASV command to be issued and interpreted before data transfers;
                          *   otherwise, a PORT command will be used for data transfers. If you're
                          *   unsure which one to use, you probably want Passive mode to be on. 
                          */
    public void setPassiveMode(boolean setPassive) {
        if (setPassive) {
            log.debug("setting PASSIVE mode for file transfers");
            enterLocalPassiveMode();
        } else {
            log.debug("setting ACTIVE mode for file transfers");
            enterLocalActiveMode();
        }
    }

    /*  setBinaryMode  *//*******************************************
                         *
                         *   Sets the use of binary mode for file transfers if passed true, 
                         *   ASCII mode if passed false.  
                         */
    public void setBinaryMode(boolean useBinaryMode) throws IOException {
        if (useBinaryMode) {
            log.debug("setting BINARY mode for file transfers");
            setFileType(FTP.BINARY_FILE_TYPE);
        } else {
            log.debug("setting ASCII mode for file transfers");
            setFileType(FTP.ASCII_FILE_TYPE);
        }
    }

    /*  downloadFile  *//******************************************** 
                        *
                        *   Convenience method to stream a file from the server to the 
                        *   given output stream.
                        */
    public void downloadFile(String server_file, OutputStream out_stream)
            throws IOException, FTPConnectionClosedException {
        log.debug("attempting to download '" + server_file + "'");
        try {
            if (!retrieveFile(server_file, out_stream))
                throw new IOException("retrieve returned false");
            log.info("successfully downloaded '" + server_file + "'");
        } finally {
            log.info("download of '" + server_file + "' failed");
        }
    }

    /*  downloadFile  *//******************************************** 
                        *
                        *   Convenience method to download a file from the server and save 
                        *   it to the specified local file. 
                        */
    public void downloadFile(String server_file, String local_file)
            throws IOException, FTPConnectionClosedException {
        FileOutputStream outstream = new FileOutputStream(local_file);
        try {
            downloadFile(server_file, outstream);
        } finally {
            outstream.close();
        }
    }

    /*  statFile  *//************************************************
                    *
                    */
    public FTPFile statFile(String server_file) throws IOException, FTPConnectionClosedException {
        FTPFile[] filelist = this.listFiles(server_file);
        FTPFile filestat;

        if (filelist == null || filelist.length < 1) {
            if (log.isDebugEnabled())
                log.debug("File '" + server_file + "' not found on server");

            return null;
        } else if (filelist.length > 1) {
            throw new RuntimeException(
                    "Multiple files returned for stat('" + server_file + "') -- expected a single result");
        } else
            filestat = filelist[0];

        return filestat;
    }

    /*  uploadFile  *//**********************************************
                      *
                      *   Convenience method to upload the output of an inputstream to a named server file. 
                      */
    public void uploadFile(InputStream instream, String server_file)
            throws IOException, FTPConnectionClosedException {
        log.debug("attempting to upload to " + host + ": " + server_file);

        assert server_file != null && server_file.length() > 0;
        assert instream != null;

        try {
            if (!storeFile(server_file, instream))
                throw new IOException("store returned false");
        } finally {
            log.info("upload of " + server_file + " to host " + host + " failed");
        }
    }

    /*  uploadFile  *//**********************************************
                      *
                      *   Convenience method to upload a local file to the server. 
                      */
    public void uploadFile(String localFile, String serverFile) throws IOException, FTPConnectionClosedException {
        log.debug("attempting to upload local file '" + localFile + "'");
        FileInputStream in = new FileInputStream(localFile);
        try {
            uploadFile(in, serverFile);
        } finally {
            in.close();
        }
    }

    /* --- not yet needed functionality ---
        
    / ** Sanity check that FTP client is connected && in existence. * /
    private final void _check_connection() throws FTPConnectionClosedException
    {  
    if ( ftpClient != null ) return;
    else throw new RuntimeException(
        "client not yet connected - you need to open a " +
        "connection with connectAndLogin first"
    );
    }
        
    / ** 
    *
    *   Get the list of files in the current directory as a Vector of Strings, 
    *   excluding subdirectories. 
    * /
    public Vector listFileNames () 
    throws IOException, FTPConnectionClosedException 
    {
    FTPFile[] files = listFiles();
    Vector v = new Vector();
    for (int i = 0; i < files.length; i++) {
        if (!files[i].isDirectory())
            v.addElement(files[i].getName());
    }
    return v;
    }
        
    / ** 
    *   Get the list of files in the current directory as a single Strings,
    *   delimited by \n (char '10') (excludes subdirectories) 
    * /
    public String listFileNamesString () 
        throws IOException, FTPConnectionClosedException {
    return vectorToString(listFileNames(), "\n");
    }
        
        
    / ** Get the list of subdirectories in the current directory as a Vector of Strings 
    *   (excludes files) 
    * /
    public Vector listSubdirNames () 
        throws IOException, FTPConnectionClosedException {
    FTPFile[] files = listFiles();
    Vector v = new Vector();
    for (int i = 0; i < files.length; i++) {
        if (files[i].isDirectory())
            v.addElement(files[i].getName());
    }
    return v;
    }
        
        
    / ** 
    *   Get the list of subdirectories in the current directory as a single Strings,
    *   delimited by \n (char '10') (excludes files) 
    * /
    public String listSubdirNamesString () 
        throws IOException, FTPConnectionClosedException {
    return vectorToString(listSubdirNames(), "\n");
    }
        
        
    / ** 
    *   Convert a Vector to a delimited String 
    * /
    private String vectorToString (Vector v, String delim) {
    StringBuffer sb = new StringBuffer();
    String s = "";
    for (int i = 0; i < v.size(); i++) {
        sb.append(s).append((String)v.elementAt(i));
        s = delim;
    }
    return sb.toString();
    }
        
    --- not yet needed functionality ---*/

} //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ end class