Example usage for org.apache.commons.net.ftp FTPSClient FTPSClient

List of usage examples for org.apache.commons.net.ftp FTPSClient FTPSClient

Introduction

In this page you can find the example usage for org.apache.commons.net.ftp FTPSClient FTPSClient.

Prototype

public FTPSClient(SSLContext context) 

Source Link

Document

Constructor for FTPSClient, using #DEFAULT_PROTOCOL - i.e.

Usage

From source file:ca.ualberta.physics.cssdp.file.remote.protocol.FtpsConnection.java

public FtpsConnection(Host config) {
    super(config);
    ftpClient = new FTPSClient("SSL");
}

From source file:com.adaptris.ftp.CommonsNetFtpSslClient.java

@Override
protected FTPSClient createFTPClient() {
    return new FTPSClient(implicitSSL);
}

From source file:cycronix.ctlib.CTftp.java

/**
 * FTP login with secure (FTPS) connection
 * @param host host name/*from  w w  w . j a v  a  2  s  .  c om*/
 * @param user user name
 * @param pw password
 * @param secure T/F
 * @throws Exception on error
 */
public void login(String host, String user, String pw, boolean secure) throws Exception {
    if (secure)
        client = new FTPSClient(true);
    else
        client = new FTPClient();

    client.connect(host);
    boolean success = client.login(user, pw);
    if (!success) {
        throw new IOException("FTP login failed, host: " + host + ", user: " + user);
    }
    client.setFileType(FTPClient.BINARY_FILE_TYPE);

    loginDir = client.printWorkingDirectory();
    CTinfo.debugPrint("FTP login, u: " + user + ", pw: " + pw + ", loginDir: " + loginDir);
}

From source file:com.tumblr.maximopro.iface.router.FTPHandler.java

@Override
public byte[] invoke(Map<String, ?> metaData, byte[] data) throws MXException {
    byte[] encodedData = super.invoke(metaData, data);
    this.metaData = metaData;

    FTPClient ftp;/*ww  w.j a  v  a2  s  . c o  m*/
    if (enableSSL()) {
        FTPSClient ftps = new FTPSClient(isImplicit());
        ftps.setTrustManager(TrustManagerUtils.getAcceptAllTrustManager());
        ftp = ftps;
    } else {
        ftp = new FTPClient();
    }

    InputStream is = null;
    try {

        if (getTimeout() > 0) {
            ftp.setDefaultTimeout(getTimeout());
        }

        if (getBufferSize() > 0) {
            ftp.setBufferSize(getBufferSize());
        }

        if (getNoDelay()) {
            ftp.setTcpNoDelay(getNoDelay());
        }

        ftp.connect(getHostname(), getPort());

        int reply = ftp.getReplyCode();

        if (!FTPReply.isPositiveCompletion(reply)) {
            ftp.disconnect();
        }

        if (!ftp.login(getUsername(), getPassword())) {
            ftp.logout();
            ftp.disconnect();
        }

        ftp.setFileType(FTP.BINARY_FILE_TYPE);

        if (enableActive()) {
            ftp.enterLocalActiveMode();
        } else {
            ftp.enterLocalPassiveMode();
        }

        is = new ByteArrayInputStream(encodedData);

        String remoteFileName = getFileName(metaData);

        ftp.changeWorkingDirectory("/");
        if (createDirectoryStructure(ftp, getDirName().split("/"))) {
            ftp.storeFile(remoteFileName, is);
        } else {
            throw new MXApplicationException("iface", "cannotcreatedir");
        }

        ftp.logout();
    } catch (MXException e) {
        throw e;
    } catch (SocketException e) {
        throw new MXApplicationException("iface", "ftpsocketerror", e);
    } catch (IOException e) {
        throw new MXApplicationException("iface", "ftpioerror", e);
    } finally {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                throw new MXApplicationException("iface", "ftpioerror", e);
            }
        }

        if (ftp != null && ftp.isConnected()) {
            try {
                ftp.disconnect();
            } catch (IOException e) {
                throw new MXApplicationException("iface", "ftpioerror", e);
            }
        }
    }

    return null;
}

From source file:com.sos.VirtualFileSystem.FTPS.SOSVfsFtpS.java

@Override
protected FTPSClient Client() {
    if (objFTPClient == null) {
        try {/*from  www . j a  v  a  2  s . com*/
            String strProtocol = objConnection2Options.FtpS_protocol.Value();
            objFTPClient = new FTPSClient(strProtocol);
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            throw new JobSchedulerException("can not create FTPS-Client");
        }
        FTPClientConfig conf = new FTPClientConfig();
        //         conf.setServerLanguageCode("fr");
        //         objFTPClient.configure(conf);
        /**
         * This listener is to write all commands and response from commands to system.out
         *
         */
        objProtocolCommandListener = new SOSFtpClientLogger(HostID(""));
        // TODO create a hidden debug-option to activate this listener
        if (objConnection2Options != null) {
            if (objConnection2Options.ProtocolCommandListener.isTrue()) {
                objFTPClient.addProtocolCommandListener(objProtocolCommandListener);
            }
        }

        String strAddFTPProtocol = System.getenv("AddFTPProtocol");
        if (strAddFTPProtocol != null && strAddFTPProtocol.equalsIgnoreCase("true")) {
            objFTPClient.addProtocolCommandListener(objProtocolCommandListener);
        }

    }
    return objFTPClient;
}

From source file:com.github.wuic.nut.ftp.FtpNutDao.java

/**
 * <p>/*from w ww.  j a  va2  s. c om*/
 * Builds a new instance.
 * </p>
 *
 * @param ftps use FTPS or FTP protocol
 * @param host the host name
 * @param p the port
 * @param path default the path
 * @param basePathAsSysProp {@code true} if the base path is a system property
 * @param user the user name ({@code null} to skip the the authentication)
 * @param pwd the password (will be ignored if user is {@code null})
 * @param proxies proxy URIs serving the nut
 * @param pollingSeconds interleave in seconds for polling feature (-1 to disable)
 * @param regex consider path as regex or not
 */
public FtpNutDao(final Boolean ftps, final String host, final int p, final String path,
        final Boolean basePathAsSysProp, final String user, final String pwd, final String[] proxies,
        final int pollingSeconds, final Boolean regex) {
    super(path, basePathAsSysProp, proxies, pollingSeconds);
    ftpClient = ftps ? new FTPSClient(Boolean.TRUE) : new FTPClient();
    hostName = host;
    userName = user;
    password = pwd;
    port = p;
    regularExpression = regex;
}

From source file:jenkins.plugins.publish_over_ftp.BapFtpHostConfiguration.java

public FTPClient createFTPClient() throws GeneralSecurityException, FileNotFoundException, IOException {
    if (useFtpOverTls) {
        FTPSClient c = new FTPSClient(false);

        KeyStore ts = KeyStore.getInstance(KeyStore.getDefaultType());
        String trustStorePath = System.getProperty("javax.net.ssl.trustStore");
        if (trustStorePath != null) {
            String trustStorePassword = System.getProperty("javax.net.ssl.trustStorePassword");
            if (trustStorePassword != null) {
                ts.load(new FileInputStream(trustStorePath), trustStorePassword.toCharArray());
            } else {
                ts.load(new FileInputStream(trustStorePath), null);
            }//from  ww w.j a  va2s  . c  o  m
        } else {
            ts.load(null);
        }

        if (trustedCertificate != null) {
            InputStream certStream = new ByteArrayInputStream(trustedCertificate.getBytes());
            X509Certificate x509certificate = (X509Certificate) CertificateFactory.getInstance("X.509")
                    .generateCertificate(certStream);
            ts.setCertificateEntry(x509certificate.getSubjectDN().getName(), x509certificate);
        }

        c.setTrustManager(TrustManagerUtils.getDefaultTrustManager(ts));

        return c;
    }
    return new FTPClient();
}

From source file:com.o6Systems.utils.net.FTPModule.java

private int executeFtpCommand(String[] args) throws UnknownHostException {
    boolean storeFile = false, binaryTransfer = false, error = false, listFiles = false, listNames = false,
            hidden = false;/*from ww  w.j a  va 2 s .  c o m*/
    boolean localActive = false, useEpsvWithIPv4 = false, feat = false, printHash = false;
    boolean mlst = false, mlsd = false;
    boolean lenient = false;
    long keepAliveTimeout = -1;
    int controlKeepAliveReplyTimeout = -1;
    int minParams = 5; // listings require 3 params
    String protocol = null; // SSL protocol
    String doCommand = null;
    String trustmgr = null;
    String proxyHost = null;
    int proxyPort = 80;
    String proxyUser = null;
    String proxyPassword = null;
    String username = null;
    String password = null;

    int base = 0;

    // Print the command

    System.out.println("----------FTP MODULE CALL----------");

    for (int i = 0; i < args.length; i++) {
        System.out.println(args[i]);
    }

    System.out.println("--------------------");
    //

    for (base = 0; base < args.length; base++) {
        if (args[base].equals("-s")) {
            storeFile = true;
        } else if (args[base].equals("-a")) {
            localActive = true;
        } else if (args[base].equals("-A")) {
            username = "anonymous";
            password = System.getProperty("user.name") + "@" + InetAddress.getLocalHost().getHostName();
        } else if (args[base].equals("-b")) {
            binaryTransfer = true;
        } else if (args[base].equals("-c")) {
            doCommand = args[++base];
            minParams = 3;
        } else if (args[base].equals("-d")) {
            mlsd = true;
            minParams = 3;
        } else if (args[base].equals("-e")) {
            useEpsvWithIPv4 = true;
        } else if (args[base].equals("-f")) {
            feat = true;
            minParams = 3;
        } else if (args[base].equals("-h")) {
            hidden = true;
        } else if (args[base].equals("-k")) {
            keepAliveTimeout = Long.parseLong(args[++base]);
        } else if (args[base].equals("-l")) {
            listFiles = true;
            minParams = 3;
        } else if (args[base].equals("-L")) {
            lenient = true;
        } else if (args[base].equals("-n")) {
            listNames = true;
            minParams = 3;
        } else if (args[base].equals("-p")) {
            protocol = args[++base];
        } else if (args[base].equals("-t")) {
            mlst = true;
            minParams = 3;
        } else if (args[base].equals("-w")) {
            controlKeepAliveReplyTimeout = Integer.parseInt(args[++base]);
        } else if (args[base].equals("-T")) {
            trustmgr = args[++base];
        } else if (args[base].equals("-PrH")) {
            proxyHost = args[++base];
            String parts[] = proxyHost.split(":");
            if (parts.length == 2) {
                proxyHost = parts[0];
                proxyPort = Integer.parseInt(parts[1]);
            }
        } else if (args[base].equals("-PrU")) {
            proxyUser = args[++base];
        } else if (args[base].equals("-PrP")) {
            proxyPassword = args[++base];
        } else if (args[base].equals("-#")) {
            printHash = true;
        } else {
            break;
        }
    }

    int remain = args.length - base;
    if (username != null) {
        minParams -= 2;
    }

    String server = args[base++];
    int port = 0;
    String parts[] = server.split(":");
    if (parts.length == 2) {
        server = parts[0];
        port = Integer.parseInt(parts[1]);
    }
    if (username == null) {
        username = args[base++];
        password = args[base++];
    }

    String remote = null;
    if (args.length - base > 0) {
        remote = args[base++];
    }

    String local = null;
    if (args.length - base > 0) {
        local = args[base++];
    }

    final FTPClient ftp;
    if (protocol == null) {
        if (proxyHost != null) {
            System.out.println("Using HTTP proxy server: " + proxyHost);
            ftp = new FTPHTTPClient(proxyHost, proxyPort, proxyUser, proxyPassword);
        } else {
            ftp = new FTPClient();
        }
    } else {
        FTPSClient ftps;
        if (protocol.equals("true")) {
            ftps = new FTPSClient(true);
        } else if (protocol.equals("false")) {
            ftps = new FTPSClient(false);
        } else {
            String prot[] = protocol.split(",");
            if (prot.length == 1) { // Just protocol
                ftps = new FTPSClient(protocol);
            } else { // protocol,true|false
                ftps = new FTPSClient(prot[0], Boolean.parseBoolean(prot[1]));
            }
        }
        ftp = ftps;
        if ("all".equals(trustmgr)) {
            ftps.setTrustManager(TrustManagerUtils.getAcceptAllTrustManager());
        } else if ("valid".equals(trustmgr)) {
            ftps.setTrustManager(TrustManagerUtils.getValidateServerCertificateTrustManager());
        } else if ("none".equals(trustmgr)) {
            ftps.setTrustManager(null);
        }
    }

    if (printHash) {
        ftp.setCopyStreamListener(createListener());
    }
    if (keepAliveTimeout >= 0) {
        ftp.setControlKeepAliveTimeout(keepAliveTimeout);
    }
    if (controlKeepAliveReplyTimeout >= 0) {
        ftp.setControlKeepAliveReplyTimeout(controlKeepAliveReplyTimeout);
    }
    ftp.setListHiddenFiles(hidden);

    // suppress login details
    ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out), true));

    try {
        int reply;
        if (port > 0) {
            ftp.connect(server, port);
        } else {
            ftp.connect(server);
        }
        System.out.println("Connected to " + server + " on " + (port > 0 ? port : ftp.getDefaultPort()));

        // After connection attempt, you should check the reply code to verify
        // success.
        reply = ftp.getReplyCode();

        if (!FTPReply.isPositiveCompletion(reply)) {
            ftp.disconnect();
            System.err.println("FTP server refused connection.");
            return 1;
        }
    } catch (IOException e) {
        if (ftp.isConnected()) {
            try {
                ftp.disconnect();
            } catch (IOException f) {
                // do nothing
            }
        }
        System.err.println("Could not connect to server.");
        e.printStackTrace();
        return 1;
    }

    __main: try {
        if (!ftp.login(username, password)) {
            ftp.logout();
            error = true;
            break __main;
        }

        System.out.println("Remote system is " + ftp.getSystemType());

        if (binaryTransfer) {
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
        } else {
            // in theory this should not be necessary as servers should default to ASCII
            // but they don't all do so - see NET-500
            ftp.setFileType(FTP.ASCII_FILE_TYPE);
        }

        // Use passive mode as default because most of us are
        // behind firewalls these days.
        if (localActive) {
            ftp.enterLocalActiveMode();
        } else {
            ftp.enterLocalPassiveMode();
        }

        ftp.setUseEPSVwithIPv4(useEpsvWithIPv4);

        if (storeFile) {
            InputStream input;

            input = new FileInputStream(local);

            ftp.storeFile(remote, input);

            input.close();
        } else if (listFiles) {
            if (lenient) {
                FTPClientConfig config = new FTPClientConfig();
                config.setLenientFutureDates(true);
                ftp.configure(config);
            }

            for (FTPFile f : ftp.listFiles(remote)) {
                System.out.println(f.getRawListing());
                System.out.println(f.toFormattedString());
            }
        } else if (mlsd) {
            for (FTPFile f : ftp.mlistDir(remote)) {
                System.out.println(f.getRawListing());
                System.out.println(f.toFormattedString());
            }
        } else if (mlst) {
            FTPFile f = ftp.mlistFile(remote);
            if (f != null) {
                System.out.println(f.toFormattedString());
            }
        } else if (listNames) {
            for (String s : ftp.listNames(remote)) {
                System.out.println(s);
            }
        } else if (feat) {
            // boolean feature check
            if (remote != null) { // See if the command is present
                if (ftp.hasFeature(remote)) {
                    System.out.println("Has feature: " + remote);
                } else {
                    if (FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
                        System.out.println("FEAT " + remote + " was not detected");
                    } else {
                        System.out.println("Command failed: " + ftp.getReplyString());
                    }
                }

                // Strings feature check
                String[] features = ftp.featureValues(remote);
                if (features != null) {
                    for (String f : features) {
                        System.out.println("FEAT " + remote + "=" + f + ".");
                    }
                } else {
                    if (FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
                        System.out.println("FEAT " + remote + " is not present");
                    } else {
                        System.out.println("Command failed: " + ftp.getReplyString());
                    }
                }
            } else {
                if (ftp.features()) {
                    //                        Command listener has already printed the output
                } else {
                    System.out.println("Failed: " + ftp.getReplyString());
                }
            }
        } else if (doCommand != null) {
            if (ftp.doCommand(doCommand, remote)) {
                //                  Command listener has already printed the output
                //                    for(String s : ftp.getReplyStrings()) {
                //                        System.out.println(s);
                //                    }
            } else {
                System.out.println("Failed: " + ftp.getReplyString());
            }
        } else {
            OutputStream output;

            output = new FileOutputStream(local);

            ftp.retrieveFile(remote, output);

            output.close();
        }

        ftp.noop(); // check that control connection is working OK

        ftp.logout();
    } catch (FTPConnectionClosedException e) {
        error = true;
        System.err.println("Server closed connection.");
        e.printStackTrace();
    } catch (IOException e) {
        error = true;
        e.printStackTrace();
    } finally {
        if (ftp.isConnected()) {
            try {
                ftp.disconnect();
            } catch (IOException f) {
                // do nothing
            }
        }
    }

    return error ? 1 : 0;
}

From source file:ch.sdi.core.impl.ftp.FtpExecutor.java

/**
 * @throws SdiException/*from  w  w w .  ja  va 2s  . c o  m*/
 * @throws IOException
 */
public void connectAndLogin() throws SdiException, IOException {
    if (!myInitialized) {
        initBySpringContext();
    } // if !initialized

    try {
        if (myProtocol == null) {
            if (myProxyHost != null) {
                myLog.debug("Using HTTP proxy server: " + myProxyHost);
                myFtp = new FTPHTTPClient(myProxyHost, myProxyPort, myProxyUser, myProxyPassword);
            } else {
                myLog.debug("Using simple FTPClient");
                myFtp = new FTPClient();
            }
        } else {
            FTPSClient ftps;
            if (myProtocol.equals("true")) {
                myLog.debug("Using FTPSClient with implicite SSL");
                ftps = new FTPSClient(true);
            } else if (myProtocol.equals("false")) {
                myLog.debug("Using FTPSClient with no implicite SSL");
                ftps = new FTPSClient(false);
            } else {
                String prot[] = myProtocol.split(",");
                if (prot.length == 1) { // Just protocol
                    myLog.debug("Using FTPSClient with protocol " + myProtocol);
                    ftps = new FTPSClient(myProtocol);
                } else { // protocol,true|false
                    myLog.debug("Using FTPSClient with " + prot[0] + " and " + prot[1]);
                    ftps = new FTPSClient(prot[0], Boolean.parseBoolean(prot[1]));
                }
            }
            myFtp = ftps;
            if ("all".equals(myTrustmgr)) {
                myLog.debug("Using AcceptAllTrustManager");
                ftps.setTrustManager(TrustManagerUtils.getAcceptAllTrustManager());
            } else if ("valid".equals(myTrustmgr)) {
                myLog.debug("Using ValidateServerCertificateTrustManager");
                ftps.setTrustManager(TrustManagerUtils.getValidateServerCertificateTrustManager());
            } else if ("none".equals(myTrustmgr)) {
                myLog.debug("Setting TrustManager to null");
                ftps.setTrustManager(null);
            } else {
                myLog.debug("Using no TrustManager at all");
            }
        }

        if (myKeepAliveTimeout >= 0) {
            myLog.debug("Setting KeepAliveTimeout to " + myKeepAliveTimeout);
            myFtp.setControlKeepAliveTimeout(myKeepAliveTimeout);
        }
        if (myControlKeepAliveReplyTimeout >= 0) {
            myLog.debug("Setting ControlKeepAliveReplyTimeout to " + myControlKeepAliveReplyTimeout);
            myFtp.setControlKeepAliveReplyTimeout(myControlKeepAliveReplyTimeout);
        }

        // intercept commands and write it to our logger
        myPrintCommandToLoggerListener = new PrintCommandToLoggerListener(myLog);
        PrintWriter writer = myPrintCommandToLoggerListener.getPrintWriter();
        myFtp.addProtocolCommandListener(new PrintCommandListener(writer, true, '\n', true));
        //            myFtp.addProtocolCommandListener( new PrintCommandListener( new PrintWriter( System.out ), true ) );

        try {
            int reply;
            if (myPort > 0) {
                myLog.debug("Connecting to " + myServer + ":" + myPort);
                myFtp.connect(myServer, myPort);
            } else {
                myLog.debug("Connecting to " + myServer + " (default port)");
                myFtp.connect(myServer);
            }

            myLog.debug("Connected to " + myServer + " on " + (myPort > 0 ? myPort : myFtp.getDefaultPort()));

            // After connection attempt, you should check the reply code to verify success.
            reply = myFtp.getReplyCode();

            if (!FTPReply.isPositiveCompletion(reply)) {
                myFtp.disconnect();
                throw createFtpException("FTP server refused connection.");
            }
        } catch (IOException e) {
            throw createFtpException("Could not connect to server.", e);
        }

        if (!myFtp.login(myUsername, myPassword)) {
            myFtp.logout();
            throw createFtpException("Problems on login");
        }

        myLog.debug("Remote system is " + myFtp.getSystemType());
        myFtp.setFileType(FTP.BINARY_FILE_TYPE);

        // Use passive mode as default because most of us are behind firewalls these days.
        if (myLocalActive) {
            myFtp.enterLocalActiveMode();
        } else {
            myFtp.enterLocalPassiveMode();
        }

        myFtp.setUseEPSVwithIPv4(myUseEpsvWithIPv4);
    } finally {
        myPrintCommandToLoggerListener.flushRest();
    }
}

From source file:ch.sdi.core.impl.ftp.FTPClientExample.java

/**
*
*/// w w  w  . ja  v a2s.c o m
private void run() throws Throwable {
    if (myProtocol == null) {
        if (myProxyHost != null) {
            myLog.debug("Using HTTP proxy server: " + myProxyHost);
            myFtp = new FTPHTTPClient(myProxyHost, myProxyPort, myProxyUser, myProxyPassword);
        } else {
            myFtp = new FTPClient();
        }
    } else {
        FTPSClient ftps;
        if (myProtocol.equals("true")) {
            ftps = new FTPSClient(true);
        } else if (myProtocol.equals("false")) {
            ftps = new FTPSClient(false);
        } else {
            String prot[] = myProtocol.split(",");
            if (prot.length == 1) { // Just protocol
                ftps = new FTPSClient(myProtocol);
            } else { // protocol,true|false
                ftps = new FTPSClient(prot[0], Boolean.parseBoolean(prot[1]));
            }
        }
        myFtp = ftps;
        if ("all".equals(myTrustmgr)) {
            ftps.setTrustManager(TrustManagerUtils.getAcceptAllTrustManager());
        } else if ("valid".equals(myTrustmgr)) {
            ftps.setTrustManager(TrustManagerUtils.getValidateServerCertificateTrustManager());
        } else if ("none".equals(myTrustmgr)) {
            ftps.setTrustManager(null);
        }
    }

    if (myPrintHash) {
        myFtp.setCopyStreamListener(createListener());
    }
    if (myKeepAliveTimeout >= 0) {
        myFtp.setControlKeepAliveTimeout(myKeepAliveTimeout);
    }
    if (myControlKeepAliveReplyTimeout >= 0) {
        myFtp.setControlKeepAliveReplyTimeout(myControlKeepAliveReplyTimeout);
    }
    myFtp.setListHiddenFiles(myHidden);

    // intercept commands and write it to our logger
    myPrintCommandToLoggerListener = new PrintCommandToLoggerListener(myLog);
    PrintWriter writer = myPrintCommandToLoggerListener.getPrintWriter();
    myFtp.addProtocolCommandListener(new PrintCommandListener(writer, true, '\n', true));
    //        myFtp.addProtocolCommandListener( new PrintCommandListener( new PrintWriter( System.out ), true ) );

    try {
        int reply;
        if (myPort > 0) {
            myFtp.connect(myServer, myPort);
        } else {
            myFtp.connect(myServer);
        }

        myLog.debug("Connected to " + myServer + " on " + (myPort > 0 ? myPort : myFtp.getDefaultPort()));

        // After connection attempt, you should check the reply code to verify
        // success.
        reply = myFtp.getReplyCode();

        if (!FTPReply.isPositiveCompletion(reply)) {
            myFtp.disconnect();
            throw new Exception("FTP server refused connection.");
        }
    } catch (IOException e) {
        if (myFtp.isConnected()) {
            try {
                myFtp.disconnect();
            } catch (IOException f) {
                // do nothing
            }
        }
        throw new Exception("Could not connect to server.", e);
    }

    try {
        if (!myFtp.login(myUsername, myPassword)) {
            myFtp.logout();
            throw createFtpException("Problems on login");
        }

        myLog.debug("Remote system is " + myFtp.getSystemType());

        if (myBinaryTransfer) {
            myFtp.setFileType(FTP.BINARY_FILE_TYPE);
        } else {
            // in theory this should not be necessary as servers should default to ASCII
            // but they don't all do so - see NET-500
            myFtp.setFileType(FTP.ASCII_FILE_TYPE);
        }

        // Use passive mode as default because most of us are
        // behind firewalls these days.
        if (myLocalActive) {
            myFtp.enterLocalActiveMode();
        } else {
            myFtp.enterLocalPassiveMode();
        }

        myFtp.setUseEPSVwithIPv4(myUseEpsvWithIPv4);

        if (myStoreFile) {
            InputStream input;

            input = new FileInputStream(myLocal);

            myFtp.storeFile(myRemote, input);

            input.close();
        } else if (myListFiles) {
            if (myLenient) {
                FTPClientConfig config = new FTPClientConfig();
                config.setLenientFutureDates(true);
                myFtp.configure(config);
            }

            for (FTPFile f : myFtp.listFiles(myRemote)) {
                myLog.debug(f.getRawListing());
                myLog.debug(f.toFormattedString());
            }
        } else if (myMlsd) {
            for (FTPFile f : myFtp.mlistDir(myRemote)) {
                myLog.debug(f.getRawListing());
                myLog.debug(f.toFormattedString());
            }
        } else if (myMlst) {
            FTPFile f = myFtp.mlistFile(myRemote);
            if (f != null) {
                myLog.debug(f.toFormattedString());
            }
        } else if (myListNames) {
            for (String s : myFtp.listNames(myRemote)) {
                myLog.debug(s);
            }
        } else if (myFeat) {
            // boolean feature check
            if (myRemote != null) { // See if the command is present
                if (myFtp.hasFeature(myRemote)) {
                    myLog.debug("Has feature: " + myRemote);
                } else {
                    if (FTPReply.isPositiveCompletion(myFtp.getReplyCode())) {
                        myLog.debug("FEAT " + myRemote + " was not detected");
                    } else {
                        throw createFtpException("Command failed");
                    }
                }

                // Strings feature check
                String[] features = myFtp.featureValues(myRemote);
                if (features != null) {
                    for (String f : features) {
                        myLog.debug("FEAT " + myRemote + "=" + f + ".");
                    }
                } else {
                    if (FTPReply.isPositiveCompletion(myFtp.getReplyCode())) {
                        myLog.warn("FEAT " + myRemote + " is not present");
                    } else {
                        throw createFtpException("Command failed");
                    }
                }
            } else {
                if (myFtp.features()) {
                    // Command listener has already printed the output
                } else {
                    throw createFtpException("Command failed");
                }
            }
        } else if (myDoCommand != null) {
            if (myFtp.doCommand(myDoCommand, myRemote)) {
                // Command listener has already printed the output
            } else {
                throw createFtpException("Command failed");
            }
        } else {
            OutputStream output;

            output = new FileOutputStream(myLocal);

            myFtp.retrieveFile(myRemote, output);

            output.close();
        }

        myFtp.noop(); // check that control connection is working OK

        myFtp.logout();
    } catch (FTPConnectionClosedException e) {
        throw createFtpException("Server closed connection.");
    } catch (IOException e) {
        throw createFtpException("IOException caught");
    } finally {
        myPrintCommandToLoggerListener.flushRest();

        if (myFtp.isConnected()) {
            try {
                myFtp.disconnect();
            } catch (IOException f) {
                // do nothing
            }
        }
    }

}