/*
* 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.test.infrastructure.server.ftp;
import org.mule.runtime.core.util.IOUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import org.apache.ftpserver.FtpServerFactory;
import org.apache.ftpserver.listener.Listener;
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 EmbeddedFtpServer {
private org.apache.ftpserver.FtpServer server;
private final int port;
/**
* 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 EmbeddedFtpServer(int port) throws Exception {
this.port = port;
}
private Listener createListener(int port) {
ListenerFactory listenerFactory = createListenerFactory(port);
return listenerFactory.createListener();
}
protected ListenerFactory createListenerFactory(int port) {
ListenerFactory listenerFactory = new ListenerFactory();
listenerFactory.setPort(port);
listenerFactory.setIdleTimeout(60000);
return listenerFactory;
}
private void setupUserManagerFactory(FtpServerFactory serverFactory) 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()));
serverFactory.setUserManager(userManagerFactory.createUserManager());
}
public void start() {
FtpServerFactory serverFactory = new FtpServerFactory();
serverFactory.addListener("default", createListener(port));
try {
setupUserManagerFactory(serverFactory);
server = serverFactory.createServer();
server.start();
} catch (Exception e) {
throw new RuntimeException("Could not start server", e);
}
}
/**
* 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() {
if (server != null) {
server.stop();
}
}
}