package railo.runtime.net.ftp;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.net.ftp.FTPClient;
import railo.commons.lang.StringUtil;
import railo.runtime.exp.ApplicationException;
/**
* Pool of FTP Client
*/
public final class FTPPoolImpl implements FTPPool {
Map<String,FTPWrap> wraps=new HashMap<String, FTPWrap>();
//ArrayList arr=new ArrayList();
@Override
public FTPClient get(FTPConnection conn) throws IOException, ApplicationException {
FTPClient client = _get(conn).getClient();
if(client==null)throw new ApplicationException("can't connect to server ["+conn.getServer()+"]");
FTPWrap.setConnectionSettings(client,conn);
return client;
}
/**
* returns a client from given connection
* @param conn
* @return
* @return matching wrap
* @throws IOException
* @throws ApplicationException
*/
protected FTPWrap _get(FTPConnection conn) throws IOException, ApplicationException {
FTPWrap wrap=null;
if(!conn.hasLoginData()) {
if(StringUtil.isEmpty(conn.getName())){
throw new ApplicationException("can't connect ftp server, missing connection defintion");
}
wrap=wraps.get(conn.getName());
if(wrap==null) {
throw new ApplicationException("can't connect ftp server, missing connection ["+conn.getName()+"]");
}
else if(!wrap.getClient().isConnected() || wrap.getConnection().getTransferMode()!=conn.getTransferMode()) {
wrap.reConnect(conn.getTransferMode());
}
return wrap;
}
String name=conn.hasName()?conn.getName():"__noname__";
wrap=wraps.get(name);
if(wrap!=null) {
if(conn.loginEquals(wrap.getConnection())) {
return _get(new FTPConnectionImpl(name,null,null,null,conn.getPort(),conn.getTimeout(),conn.getTransferMode(),conn.isPassive(),
conn.getProxyServer(),conn.getProxyPort(),conn.getProxyUser(),conn.getProxyPassword()));
}
disconnect(wrap.getClient());
}
wrap=new FTPWrap(conn);
wraps.put(name,wrap);
return wrap;
}
/**
* disconnect a client
* @param client
*/
private void disconnect(FTPClient client) {
try {
if(client!=null && client.isConnected()) {
client.quit();
client.disconnect();
}
}
catch(IOException ioe) {}
}
@Override
public FTPClient remove(FTPConnection conn) {
return remove(conn.getName());
}
@Override
public FTPClient remove(String name) {
FTPWrap wrap=wraps.remove(name);
if(wrap==null) return null;
FTPClient client = wrap.getClient();
disconnect(client);
return client;
}
@Override
public void clear() {
if(!wraps.isEmpty()) {
Iterator<Entry<String, FTPWrap>> it = wraps.entrySet().iterator();
while(it.hasNext()) {
try {
Entry<String, FTPWrap> entry = it.next();
FTPWrap wrap=entry.getValue();
if(wrap!=null && wrap.getClient().isConnected())wrap.getClient().disconnect();
} catch (IOException e) {}
}
wraps.clear();
}
}
}