/**
* Aptana Studio
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions).
* Please see the license.html included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
// $codepro.audit.disable staticFieldNamingConvention
package com.aptana.filesystem.ftp;
import java.net.URI;
import java.util.Map;
import java.util.WeakHashMap;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.filesystem.provider.FileSystem;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import com.aptana.core.io.efs.VirtualFile;
import com.aptana.core.util.StringUtil;
import com.aptana.filesystem.ftp.internal.FTPConnectionFileManager;
import com.aptana.ide.core.io.ConnectionContext;
import com.aptana.ide.core.io.CoreIOPlugin;
public class FTPFileSystem extends FileSystem
{
/**
* used to retain a cache of connection managers for the same host/username/password/port
*/
private static Map<String, IFTPConnectionFileManager> fgConnectionManagers = new WeakHashMap<String, IFTPConnectionFileManager>();
public FTPFileSystem()
{
}
@Override
public IFileStore getStore(URI uri)
{
String host = uri.getHost();
int port = uri.getPort();
String path = uri.getPath();
String userInfo = uri.getUserInfo();
String login = StringUtil.EMPTY;
char[] password = StringUtil.EMPTY.toCharArray();
if (userInfo != null && userInfo.length() > 0)
{
if (userInfo.contains(":")) //$NON-NLS-1$
{
String[] parts = userInfo.split(":"); //$NON-NLS-1$
login = parts[0];
if (parts.length > 1)
{
password = parts[1].toCharArray();
}
}
else
{
login = userInfo;
}
}
// If no username, use anonymous
if (login == null || login.length() == 0)
{
login = IFTPConstants.LOGIN_ANONYMOUS;
}
// if no port specified, use default FTP port.
if (port == -1)
{
port = IFTPConstants.FTP_PORT_DEFAULT;
}
IFTPConnectionFileManager connectionFileManager = getConnectionFileManager(host, port, path, login, password);
return new VirtualFile(connectionFileManager, uri, Path.fromPortableString(path));
}
/**
* @param host
* @param port
* @param path
* @param login
* @param password
* @return
*/
protected synchronized IFTPConnectionFileManager getConnectionFileManager(String host, int port, String path,
String login, char[] password)
{
// Re-use the same connection file manager for the same host/username. keep it in a cache somewhere...
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(login);
if (password != null && password.length > 0)
{
stringBuilder.append(':');
stringBuilder.append(password);
}
stringBuilder.append('@');
stringBuilder.append(host);
stringBuilder.append(':');
stringBuilder.append(port);
String key = stringBuilder.toString();
IFTPConnectionFileManager connectionFileManager = fgConnectionManagers.get(key);
if (connectionFileManager == null)
{
connectionFileManager = (IFTPConnectionFileManager) super.getAdapter(IFTPConnectionFileManager.class);
if (connectionFileManager == null
&& Platform.getAdapterManager().hasAdapter(this, IFTPConnectionFileManager.class.getName()))
{
connectionFileManager = (IFTPConnectionFileManager) Platform.getAdapterManager().loadAdapter(this,
IFTPConnectionFileManager.class.getName());
}
if (connectionFileManager == null)
{
connectionFileManager = new FTPConnectionFileManager();
}
ConnectionContext context = CoreIOPlugin.getConnectionContext(this);
if (context == null)
{
context = new ConnectionContext();
}
// Don't prompt for password, just quickly connect
context.put(ConnectionContext.NO_PASSWORD_PROMPT, true);
context.put(ConnectionContext.QUICK_CONNECT, true);
CoreIOPlugin.setConnectionContext(connectionFileManager, context);
connectionFileManager.init(host, port, Path.ROOT, login, password, true,
IFTPConstants.TRANSFER_TYPE_BINARY, IFTPConstants.ENCODING_DEFAULT, null);
fgConnectionManagers.put(key, connectionFileManager);
}
return connectionFileManager;
}
}