All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.mule.tck.util.ftp.Server Maven / Gradle / Ivy

/*
 * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
 * The software in this package is published under the terms of the CPAL v1.0
 * license, a copy of which has been included with this distribution in the
 * LICENSE.txt file.
 */
package org.mule.tck.util.ftp;

import org.mule.util.IOUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Map;

import org.apache.ftpserver.FtpServer;
import org.apache.ftpserver.FtpServerFactory;
import org.apache.ftpserver.ftplet.Ftplet;
import org.apache.ftpserver.ftplet.UserManager;
import org.apache.ftpserver.listener.ListenerFactory;
import org.apache.ftpserver.usermanager.PropertiesUserManagerFactory;

/**
 * A wrapper for the Apache ftpServer.  This will progress into a provider of its own,
 * but for now is necessary to avoid duplicating code in FTP tests using FTPClient.
 */
public class Server
{
    public static final int DEFAULT_PORT = 60196; //default for most/all tests

    private FtpServer server;

    /**
     * Initialize the ftp server on a given port
     * 
     * @param port The port to start the server on. Note, you need special
     *            permissions on *nux to open port 22, so we usually choose a very
     *            high port number.
     * @throws Exception
     */
    public Server(int port) throws Exception
    {
        this(port, null);
    }

    public Server(int port, Ftplet ftplet) throws Exception
    {
        FtpServerFactory serverFactory = new FtpServerFactory();

        setupListenerFactory( serverFactory, port);
        setupUserManagerFactory(serverFactory);
        setupFtplet(serverFactory, ftplet);
        server = serverFactory.createServer();
        server.start();
    }

    private void setupListenerFactory(FtpServerFactory serverFactory, int port)
    {
        ListenerFactory listenerFactory = new ListenerFactory();
        // set the port of the listener
        listenerFactory.setPort(port);
        listenerFactory.setIdleTimeout(60000);
        // replace the default listener
        serverFactory.addListener("default", listenerFactory.createListener());
    }

    private void setupUserManagerFactory(FtpServerFactory serverFactory) throws IOException
    {
        UserManager userManager = createUserManager();
        serverFactory.setUserManager(userManager);
    }

    protected UserManager createUserManager() throws IOException
    {
        PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory();
        URL usersFile = IOUtils.getResourceAsUrl("users.properties", getClass());
        if (usersFile == null)
        {
            throw new IOException("users.properties file not found in the classpath");
        }
        userManagerFactory.setFile(new File(usersFile.getFile()));

        return userManagerFactory.createUserManager();
    }

    private void setupFtplet(FtpServerFactory serverFactory, Ftplet ftplet)
    {
        if (ftplet == null)
        {
            return;
        }
        
        Map ftplets = serverFactory.getFtplets();
        ftplets.put("MuleFtplet", ftplet);
        serverFactory.setFtplets(ftplets);
    }

    /**
     * Stop the ftp server TODO DZ: we may want to put a port check + wait time in
     * here to make sure that the port is released before we continue. Windows tends
     * to hold on to ports longer than it should.
     */
    public void stop()
    {        
        server.stop();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy