/**
* 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 declareAsInterface
package com.aptana.filesystem.secureftp;
import java.util.UUID;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import com.aptana.core.epl.IMemento;
import com.aptana.core.io.vfs.IConnectionFileManager;
import com.aptana.filesystem.secureftp.internal.SFTPConnectionFileManager;
import com.aptana.ide.core.io.ConnectionContext;
import com.aptana.ide.core.io.ConnectionPoint;
import com.aptana.ide.core.io.CoreIOPlugin;
import com.aptana.ide.core.io.IConnectionPoint15Constants;
/**
* @author Max Stepanov
*
*/
public class SFTPConnectionPoint extends ConnectionPoint implements ISFTPConnectionPoint {
public static final String TYPE = TYPE_SFTP;
private static final String ELEMENT_HOST = "host"; //$NON-NLS-1$
private static final String ELEMENT_PORT = "port"; //$NON-NLS-1$
private static final String ELEMENT_PATH = "path"; //$NON-NLS-1$
private static final String ELEMENT_LOGIN = "login"; //$NON-NLS-1$
private static final String ELEMENT_PRIVATE_KEY_FILE = "privateKeyFile"; //$NON-NLS-1$
private static final String ELEMENT_TRANSFER_TYPE = "transferType"; //$NON-NLS-1$
private static final String ELEMENT_ENCODING = "encoding"; //$NON-NLS-1$
private static final String ELEMENT_COMPRESSION = "compression"; //$NON-NLS-1$
private String host;
private int port = ISFTPConstants.SFTP_PORT_DEFAULT;
private IPath path = Path.ROOT;
private String login = ""; //$NON-NLS-1$
private IPath privateKeyFile;
private char[] password;
private String transferType = ISFTPConstants.TRANSFER_TYPE_AUTO;
private String encoding = ISFTPConstants.ENCODING_DEFAULT;
private String compression = ISFTPConstants.COMPRESSION_AUTO;
private ISFTPConnectionFileManager connectionFileManager;
/**
* Default constructor
*/
public SFTPConnectionPoint() {
super(TYPE);
}
/* (non-Javadoc)
* @see com.aptana.ide.core.io.ConnectionPoint#loadState(com.aptana.ide.core.io.epl.IMemento)
*/
@Override
protected void loadState(IMemento memento) {
super.loadState(memento);
IMemento child = memento.getChild(ELEMENT_HOST);
if (child != null) {
host = child.getTextData();
}
child = memento.getChild(ELEMENT_PORT);
if (child != null) {
try {
port = Integer.parseInt(child.getTextData());
} catch (NumberFormatException ignore) {
ignore.getCause();
}
}
child = memento.getChild(ELEMENT_PATH);
if (child != null) {
String text = child.getTextData();
if (text != null) {
path = Path.fromPortableString(text);
}
}
child = memento.getChild(ELEMENT_LOGIN);
if (child != null) {
login = child.getTextData();
}
child = memento.getChild(ELEMENT_PRIVATE_KEY_FILE);
if (child != null) {
String text = child.getTextData();
if (text != null) {
privateKeyFile = Path.fromPortableString(text);
}
}
child = memento.getChild(ELEMENT_TRANSFER_TYPE);
if (child != null) {
transferType = child.getTextData();
}
child = memento.getChild(ELEMENT_ENCODING);
if (child != null) {
encoding = child.getTextData();
}
child = memento.getChild(ELEMENT_COMPRESSION);
if (child != null) {
compression = child.getTextData();
}
}
/* (non-Javadoc)
* @see com.aptana.ide.core.io.ConnectionPoint#saveState(com.aptana.ide.core.io.epl.IMemento)
*/
@Override
protected void saveState(IMemento memento) {
super.saveState(memento);
memento.createChild(ELEMENT_HOST).putTextData(host);
if (ISFTPConstants.SFTP_PORT_DEFAULT != port) {
memento.createChild(ELEMENT_PORT).putTextData(Integer.toString(port));
}
if (!Path.ROOT.equals(path)) {
memento.createChild(ELEMENT_PATH).putTextData(path.toPortableString());
}
if (login.length() != 0) {
memento.createChild(ELEMENT_LOGIN).putTextData(login);
}
if (privateKeyFile != null && !privateKeyFile.isEmpty()) {
memento.createChild(ELEMENT_PRIVATE_KEY_FILE).putTextData(privateKeyFile.toPortableString());
}
if (!ISFTPConstants.TRANSFER_TYPE_AUTO.equals(transferType)) {
memento.createChild(ELEMENT_TRANSFER_TYPE).putTextData(transferType);
}
if (!ISFTPConstants.ENCODING_DEFAULT.equals(encoding)) {
memento.createChild(ELEMENT_ENCODING).putTextData(encoding);
}
if (!ISFTPConstants.COMPRESSION_AUTO.equals(encoding)) {
memento.createChild(ELEMENT_COMPRESSION).putTextData(compression);
}
}
/* (non-Javadoc)
* @see com.aptana.ide.core.ftp.IBaseRemoteConnectionPoint#getHost()
*/
public String getHost() {
return host;
}
/* (non-Javadoc)
* @see com.aptana.ide.core.ftp.IBaseRemoteConnectionPoint#setHost(java.lang.String)
*/
public void setHost(String host) {
this.host = host;
notifyChanged();
resetConnectionFileManager();
}
/* (non-Javadoc)
* @see com.aptana.ide.core.ftp.IBaseRemoteConnectionPoint#getPort()
*/
public int getPort() {
return port;
}
/* (non-Javadoc)
* @see com.aptana.ide.core.ftp.IBaseRemoteConnectionPoint#setPort(int)
*/
public void setPort(int port) {
this.port = port;
notifyChanged();
resetConnectionFileManager();
}
/* (non-Javadoc)
* @see com.aptana.ide.core.ftp.IBaseRemoteConnectionPoint#getPath()
*/
public IPath getPath() {
return path;
}
/* (non-Javadoc)
* @see com.aptana.ide.core.ftp.IBaseRemoteConnectionPoint#setPath(org.eclipse.core.runtime.IPath)
*/
public void setPath(IPath path) {
this.path = path;
notifyChanged();
resetConnectionFileManager();
}
/* (non-Javadoc)
* @see com.aptana.ide.core.ftp.IBaseRemoteConnectionPoint#getLogin()
*/
public String getLogin() {
return login;
}
/* (non-Javadoc)
* @see com.aptana.ide.core.ftp.IBaseRemoteConnectionPoint#setLogin(java.lang.String)
*/
public void setLogin(String login) {
this.login = login;
notifyChanged();
resetConnectionFileManager();
}
/* (non-Javadoc)
* @see com.aptana.ide.core.ftp.IBaseRemoteConnectionPoint#getPassword()
*/
public char[] getPassword() {
return password;
}
/* (non-Javadoc)
* @see com.aptana.ide.core.ftp.IBaseRemoteConnectionPoint#setPassword(char[])
*/
public void setPassword(char[] password) {
this.password = password;
notifyChanged();
resetConnectionFileManager();
}
/**
* @return the transferType
*/
public String getTransferType() {
return transferType;
}
/**
* @param transferType the transferType to set
*/
public void setTransferType(String transferType) {
this.transferType = transferType;
notifyChanged();
resetConnectionFileManager();
}
/**
* @return the encoding
*/
public String getEncoding() {
return encoding;
}
/**
* @param encoding the encoding to set
*/
public void setEncoding(String encoding) {
this.encoding = encoding;
notifyChanged();
resetConnectionFileManager();
}
/**
* @return the key file path
*/
public IPath getKeyFilePath() {
return privateKeyFile;
}
/**
* @param keyFilePath the key file path to set
*/
public void setKeyFilePath(IPath keyFilePath) {
this.privateKeyFile = keyFilePath;
notifyChanged();
resetConnectionFileManager();
}
/**
* @return the compression
*/
public String getCompression() {
return compression;
}
/**
* @param compression the compression to set
*/
public void setCompression(String compression) {
this.compression = compression;
notifyChanged();
resetConnectionFileManager();
}
/* (non-Javadoc)
* @see com.aptana.ide.core.io.ConnectionPoint#connect(boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void connect(boolean force, IProgressMonitor monitor) throws CoreException {
if (!force && isConnected()) {
return;
}
ConnectionContext context = CoreIOPlugin.getConnectionContext(this);
if (context != null) {
CoreIOPlugin.setConnectionContext(connectionFileManager, context);
}
getConnectionFileManager().connect(monitor);
}
/* (non-Javadoc)
* @see com.aptana.ide.core.io.ConnectionPoint#disconnect(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void disconnect(IProgressMonitor monitor) throws CoreException {
if (isConnected()) {
getConnectionFileManager().disconnect(monitor);
}
}
/* (non-Javadoc)
* @see com.aptana.ide.core.io.ConnectionPoint#isConnected()
*/
@Override
public synchronized boolean isConnected() {
return connectionFileManager != null && connectionFileManager.isConnected();
}
/* (non-Javadoc)
* @see com.aptana.ide.core.io.ConnectionPoint#canDisconnect()
*/
@Override
public boolean canDisconnect() {
return isConnected() && true;
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.PlatformObject#getAdapter(java.lang.Class)
*/
@SuppressWarnings("rawtypes")
@Override
public Object getAdapter(Class adapter) {
if (IConnectionFileManager.class.equals(adapter)) {
return getConnectionFileManager();
}
return super.getAdapter(adapter);
}
private synchronized void resetConnectionFileManager() {
connectionFileManager = null;
}
private synchronized IConnectionFileManager getConnectionFileManager() {
if (connectionFileManager == null) {
// find contributed first
connectionFileManager = (ISFTPConnectionFileManager) super.getAdapter(ISFTPConnectionFileManager.class);
if (connectionFileManager == null
&& Platform.getAdapterManager().hasAdapter(this, ISFTPConnectionFileManager.class.getName())) {
connectionFileManager = (ISFTPConnectionFileManager) Platform.getAdapterManager().loadAdapter(this, ISFTPConnectionFileManager.class.getName());
}
if (connectionFileManager == null) {
connectionFileManager = new SFTPConnectionFileManager();
}
ConnectionContext context = CoreIOPlugin.getConnectionContext(this);
if (context != null) {
CoreIOPlugin.setConnectionContext(connectionFileManager, context);
}
IPath keyFilePath = (privateKeyFile != null && !privateKeyFile.isEmpty()) ? privateKeyFile : null;
connectionFileManager.init(host, port, path, keyFilePath, login, password, transferType, encoding, compression);
}
return connectionFileManager;
}
@Override
public boolean load15Data(String data) {
String[] items = data.split(IConnectionPoint15Constants.DELIMITER);
if (items.length < 6) {
return false;
}
setName(items[0]);
setHost(items[1]);
if (items[2] == null || "".equals(items[2])) { //$NON-NLS-1$
setPath(Path.ROOT);
} else {
setPath(new Path(items[2]));
}
setLogin(items[3]);
setPassword(items[4].toCharArray());
String id = items[5].replace(IConnectionPoint15Constants.DELIMITER.charAt(0), ' ').trim();
try {
setId(id);
} catch (NumberFormatException e) {
setId(UUID.randomUUID().toString());
}
if (items.length >= 9) {
setPort(Integer.parseInt(items[8]));
}
if (items.length >= 13) {
setKeyFilePath(new Path(items[12]));
}
return true;
}
}