ubic.basecode.util.NetUtils.java Source code

Java tutorial

Introduction

Here is the source code for ubic.basecode.util.NetUtils.java

Source

/*
 * The baseCode project
 * 
 * Copyright (c) 2006 University of British Columbia
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
package ubic.basecode.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.SocketException;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author pavlidis
 * 
 */
public class NetUtils {

    private static Logger log = LoggerFactory.getLogger(NetUtils.class);

    /**
     * determine if a file exists on the remote server.
     * 
     * @param f
     * @param seekFile
     * @return the size of the file
     * @throws FileNotFoundException if the file does not exist.
     * @throws IOException on other IO errors.
     */
    public static long checkForFile(FTPClient f, String seekFile) throws IOException {
        f.enterLocalPassiveMode();
        FTPFile[] allfilesInGroup = f.listFiles(seekFile);
        if (allfilesInGroup == null || allfilesInGroup.length == 0) {
            throw new FileNotFoundException("File " + seekFile + " does not seem to exist on the remote host");
        }
        return allfilesInGroup[0].getSize();
    }

    /**
     * Convenient method to get a FTP connection.
     * 
     * @param host
     * @param login
     * @param password
     * @param mode
     * @return
     * @throws SocketException
     * @throws IOException
     */
    public static FTPClient connect(int mode, String host, String loginName, String password)
            throws SocketException, IOException {
        FTPClient f = new FTPClient();
        f.enterLocalPassiveMode();
        f.setBufferSize(32 * 2 ^ 20);
        boolean success = false;
        f.connect(host);
        int reply = f.getReplyCode();
        if (FTPReply.isPositiveCompletion(reply))
            success = f.login(loginName, password);
        if (!success) {
            f.disconnect();
            throw new IOException("Couldn't connect to " + host);
        }
        f.setFileType(mode);
        log.debug("Connected to " + host);
        return f;
    }

    /**
     * @param f
     * @param seekFile
     * @param outputFile
     * @param force
     * @return boolean indicating success or failure.
     * @throws IOException
     */
    public static boolean ftpDownloadFile(FTPClient f, String seekFile, File outputFile, boolean force)
            throws IOException {
        boolean success = false;

        assert f != null && f.isConnected() : "No FTP connection is available";
        f.enterLocalPassiveMode();

        long expectedSize = checkForFile(f, seekFile);

        if (outputFile.exists() && outputFile.length() == expectedSize && !force) {
            log.info("Output file " + outputFile + " already exists with correct size. Will not re-download");
            return true;
        }

        OutputStream os = new FileOutputStream(outputFile);

        log.debug("Seeking file " + seekFile + " with size " + expectedSize + " bytes");
        success = f.retrieveFile(seekFile, os);
        os.close();
        if (!success) {
            throw new IOException("Failed to complete download of " + seekFile);
        }
        return success;
    }

    /**
     * @param f
     * @param seekFile
     * @param outputFileName
     * @param force
     * @return boolean indicating success or failure.
     * @throws IOException
     * @throws FileNotFoundException
     */
    public static boolean ftpDownloadFile(FTPClient f, String seekFile, String outputFileName, boolean force)
            throws IOException, FileNotFoundException {
        f.enterLocalPassiveMode();
        return ftpDownloadFile(f, seekFile, new File(outputFileName), force);
    }

    /**
     * Get the size of a remote file.
     * 
     * @param f FTPClient
     * @param seekFile
     * @return
     * @throws IOException
     */
    public static long ftpFileSize(FTPClient f, String seekFile) throws IOException {

        if (f == null || !f.isConnected()) {
            throw new IOException("No FTP connection");
        }

        f.enterLocalPassiveMode();

        int maxTries = 3;

        for (int i = 0; i < maxTries; i++) {

            FTPFile[] files = f.listFiles(seekFile);

            if (files.length == 1) {
                return files[0].getSize();
            } else if (files.length > 1) {
                throw new IOException(files.length + " files found when expecting one");
            } // otherwise keep trying.
        }

        throw new FileNotFoundException(
                "Didn't get expected file information for " + seekFile + " (" + maxTries + " attempts)");

    }

}