package com.after_sunrise.oss.otdb.lib.load.impl.source; import static com.google.common.base.MoreObjects.firstNonNull; import static org.apache.commons.lang.ArrayUtils.EMPTY_STRING_ARRAY; import static org.apache.commons.net.ftp.FTP.BINARY_FILE_TYPE; import java.io.IOException; import java.io.InputStream; import java.net.InetAddress; import java.util.Arrays; import java.util.List; import org.apache.commons.io.input.ProxyInputStream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.net.ftp.FTPClient; import com.after_sunrise.commons.log.object.Logs; import com.after_sunrise.oss.otdb.lib.load.TickSourceFactory; /** * @author takanori.takase */ public class FtpTickSourceFactory implements TickSourceFactory { private static final String[] EMPTY = EMPTY_STRING_ARRAY; private final Log log = LogFactory.getLog(getClass()); private InetAddress address; private String username; private String password; private String pathname; public void setAddress(InetAddress address) { this.address = address; } public void setUsername(String username) { this.username = username; } public void setPassword(String password) { this.password = password; } public void setPathname(String pathname) { this.pathname = pathname; } @Override public List<String> list() throws IOException { Logs.logDebug(log, "Listing ftp files : %s", address); FTPClient client = new FTPClient(); try { client.connect(address); client.login(username, password); client.changeWorkingDirectory(pathname); String[] files = firstNonNull(client.listNames(), EMPTY); Logs.logDebug(log, "Listed ftp files : %s", files.length); client.logout(); return Arrays.asList(files); } finally { client.disconnect(); } } @Override public InputStream openInputStream(String source) throws IOException { Logs.logDebug(log, "Opening ftp file stream : %s", source); final FTPClient client = new FTPClient(); InputStream in; try { client.connect(address); client.login(username, password); client.changeWorkingDirectory(pathname); client.setFileTransferMode(BINARY_FILE_TYPE); in = client.retrieveFileStream(source); } catch (IOException e) { client.disconnect(); throw e; } return new ProxyInputStream(in) { @Override public void close() throws IOException { try { super.close(); } finally { client.disconnect(); } } }; } }