package railo.runtime.net.ftp; import java.io.IOException; import java.net.InetAddress; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import railo.runtime.net.proxy.Proxy; /** * Wrap a Client and a Connection */ public final class FTPWrap { private FTPConnection conn; private FTPClient client; private InetAddress address; private long lastAccess=0; /** * @return the lastAccess */ public long getLastAccess() { return lastAccess; } /** * @param lastAccess the lastAccess to set */ public void setLastAccess(long lastAccess) { this.lastAccess = lastAccess; } /** * * @param connection * @throws IOException */ public FTPWrap(FTPConnection connection) throws IOException { this.conn=connection; this.address = InetAddress.getByName(connection.getServer()); connect(); } /** * @return Returns the connection. */ public FTPConnection getConnection() { return conn; } /** * @return Returns the client. */ public FTPClient getClient() { return client; } /** * @throws IOException * */ public void reConnect() throws IOException { try { if(client!=null && client.isConnected())client.disconnect(); } catch(IOException ioe) {} connect(); } public void reConnect(short transferMode) throws IOException { if(transferMode!=conn.getTransferMode()) ((FTPConnectionImpl)conn).setTransferMode(transferMode); reConnect(); } /** * connects the client * @throws IOException */ private void connect() throws IOException { client=new FTPClient(); setConnectionSettings(client,conn); // transfer mode if(conn.getTransferMode()==FTPConstant.TRANSFER_MODE_ASCCI) getClient().setFileType(FTP.ASCII_FILE_TYPE); else if(conn.getTransferMode()==FTPConstant.TRANSFER_MODE_BINARY) getClient().setFileType(FTP.BINARY_FILE_TYPE); // Connect try { Proxy.start( conn.getProxyServer(), conn.getProxyPort(), conn.getProxyUser(), conn.getProxyPassword() ); client.connect(address,conn.getPort()); client.login(conn.getUsername(),conn.getPassword()); } finally { Proxy.end(); } } static void setConnectionSettings(FTPClient client, FTPConnection conn) { if(client==null) return; // timeout client.setDataTimeout(conn.getTimeout()*1000); try { client.setSoTimeout(conn.getTimeout()*1000); } catch (Throwable t) {} // passive/active Mode int mode = client.getDataConnectionMode(); if(conn.isPassive()) { if(FTPClient.PASSIVE_LOCAL_DATA_CONNECTION_MODE!=mode) client.enterLocalPassiveMode(); } else { if(FTPClient.ACTIVE_LOCAL_DATA_CONNECTION_MODE!=mode) client.enterLocalActiveMode(); } } }