/**
* 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.
*/
package com.aptana.filesystem.ftp.internal;
import java.net.URI;
import java.util.regex.Pattern;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import com.aptana.core.io.vfs.BaseConnectionFileManager;
import com.aptana.core.io.vfs.ExtendedFileInfo;
import com.aptana.core.util.URLEncoder;
import com.aptana.filesystem.ftp.FTPPlugin;
import com.aptana.filesystem.ftp.Policy;
import com.aptana.ide.core.io.ConnectionContext;
import com.aptana.ide.core.io.CoreIOPlugin;
/**
* @author Max Stepanov
*/
public abstract class BaseFTPConnectionFileManager extends BaseConnectionFileManager {
protected static final int TIMEOUT = 20000;
protected static final int RETRY = 3;
protected static final int RETRY_DELAY = 5000;
protected static final int KEEPALIVE_INTERVAL = 15000;
protected static final int TRANSFER_BUFFER_SIZE = 32768;
protected static final int CHECK_CONNECTION_TIMEOUT = 30000;
protected static final String TMP_UPLOAD_SUFFIX = "._tmp_upload"; //$NON-NLS-1$
protected static final Pattern PASS_COMMAND_PATTERN = Pattern.compile("^(.*PASS ).+$"); //$NON-NLS-1$
protected String host;
protected int port;
private long lastOperationTime;
protected String defaultOwner;
protected String defaultGroup;
/*
* (non-Javadoc)
* @see com.aptana.core.io.vfs.BaseConnectionFileManager#canUseTemporaryFile(org.eclipse.core.runtime.IPath,
* com.aptana.core.io.vfs.ExtendedFileInfo, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
protected boolean canUseTemporaryFile(IPath path, ExtendedFileInfo fileInfo, IProgressMonitor monitor) {
ConnectionContext context = CoreIOPlugin.getConnectionContext(this);
if (context != null && context.containsKey(ConnectionContext.USE_TEMPORARY_ON_UPLOAD)) {
return context.getBoolean(ConnectionContext.USE_TEMPORARY_ON_UPLOAD);
}
if (fileInfo.exists()) {
// test if using temporary file for existing file may cause any differences on remote side
if (defaultOwner == null || defaultGroup == null) {
IPath tempFile = basePath.append(path).removeLastSegments(1)
.append(System.currentTimeMillis() + TMP_UPLOAD_SUFFIX + ".txt"); //$NON-NLS-1$
ExtendedFileInfo tempFileInfo = null;
monitor.beginTask(Messages.BaseFTPConnectionFileManager_GetheringServerDetails, 3);
try {
try {
createFile(tempFile, Policy.subMonitorFor(monitor, 1));
tempFileInfo = fetchFileInternal(tempFile, EFS.NONE, Policy.subMonitorFor(monitor, 1));
} finally {
deleteFile(tempFile, Policy.subMonitorFor(monitor, 1));
}
} catch (Exception e) {
FTPPlugin.log(new Status(IStatus.WARNING, FTPPlugin.PLUGIN_ID,
Messages.BaseFTPConnectionFileManager_ErrorDetectOwnerGroup, e));
}
if (tempFileInfo != null) {
defaultOwner = tempFileInfo.getOwner();
defaultGroup = tempFileInfo.getGroup();
}
}
if (defaultOwner == null) {
defaultOwner = Long.toHexString(System.currentTimeMillis());
}
if (defaultGroup == null) {
defaultGroup = Long.toHexString(System.currentTimeMillis());
}
if (!defaultOwner.equals(fileInfo.getOwner()) || !defaultGroup.equals(fileInfo.getGroup())) {
return false;
}
}
return true;
}
/*
* (non-Javadoc)
* @see com.aptana.core.io.vfs.IConnectionFileManager#getCanonicalURI(org.eclipse.core.runtime.IPath)
*/
public URI getCanonicalURI(IPath path) {
// TODO:max - trace links here
return getRootCanonicalURI().resolve(URLEncoder.encode(basePath.append(path).toPortableString(), null, null));
}
protected abstract void checkConnected() throws Exception; // $codepro.audit.disable declaredExceptions
protected abstract URI getRootCanonicalURI();
/*
* (non-Javadoc)
* @see com.aptana.core.io.vfs.BaseConnectionFileManager#testConnection(boolean)
*/
@Override
protected void testConnection(boolean force) {
if (!isConnected()) {
return;
}
if (force || (System.currentTimeMillis() - lastOperationTime > CHECK_CONNECTION_TIMEOUT)) {
try {
checkConnected();
if (isConnected()) {
setLastOperationTime();
}
} catch (Exception e) {
FTPPlugin.log(new Status(IStatus.WARNING, FTPPlugin.PLUGIN_ID,
Messages.BaseFTPConnectionFileManager_connection_check_failed, e));
}
}
}
/*
* (non-Javadoc)
* @see com.aptana.core.io.vfs.BaseConnectionFileManager#setLastOperationTime()
*/
@Override
protected void setLastOperationTime() {
lastOperationTime = System.currentTimeMillis();
}
}