1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-08 01:25:23 +02:00

[170916] [efs] Implementation for SSH should work. FTP and Dstore will not work for EFS. Those implementations will be ready in next milestone.

This commit is contained in:
Kushal Munir 2007-02-23 20:15:23 +00:00
parent 01c041cbb7
commit f90bc1961a
5 changed files with 258 additions and 25 deletions

View file

@ -33,6 +33,25 @@ Contributors:
</filesystemContributor> </filesystemContributor>
</extension> </extension>
<!--
<extension
id="org.eclipse.rse.eclipse.filesystem"
point="org.eclipse.core.filesystem.filesystems">
<filesystem scheme="rse">
<run class="org.eclipse.rse.eclipse.filesystem.SSHFileSystem"/>
</filesystem>
</extension>
<extension
id="org.eclipse.rse.eclipse.filesystemSupport"
point="org.eclipse.ui.ide.filesystemSupport">
<filesystemContributor
scheme="rse"
class="org.eclipse.rse.eclipse.filesystem.SSHFileSystemContributor"
label="RSE">
</filesystemContributor>
</extension>
-->
<!-- remote eclipse filesystem not properly supported yet--> <!-- remote eclipse filesystem not properly supported yet-->
<!-- <!--
<extension <extension

View file

@ -0,0 +1,144 @@
package org.eclipse.rse.eclipse.filesystem;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Platform;
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile;
public class RSEFileCache {
private static RSEFileCache instance;
/**
* Constructor.
*/
private RSEFileCache() {
}
/**
* Gets the singleton instance.
* @return the singleton instance.
*/
public static RSEFileCache getInstance() {
if (instance == null) {
instance = new RSEFileCache();
}
return instance;
}
/**
* Returns whether the remote file exists in the cache. Returns <code>true</code> if the file exists in the cache, <code>false</code> otherwise.
* @param remoteFile the remote file.
* @return <code>true</code> if the file exists in the cache, <code>false</code> otherwise.
*/
public boolean isExistsInCache(IRemoteFile remoteFile) {
File file = getFromCache(remoteFile);
if (file != null) {
return true;
}
else {
return false;
}
}
/**
* Writes to the cache. If this is a directory, it simply creates the folder.
* @param remoteFile the remote file.
* @param inputStream the input stream with the contents of the remote file, or <code>null</code> if this is a directory.
* @return the file in the cache.
*/
public File writeToCache(IRemoteFile remoteFile, InputStream inputStream) {
String path = getCachePath(remoteFile.getParentRemoteFileSubSystem().getHost().getHostName(), remoteFile.getAbsolutePath());
File file = new File(path);
if (remoteFile.isDirectory()) {
if (!file.exists()) {
boolean success = file.mkdirs();
if (success) {
return file;
}
else {
return null;
}
}
else {
return file;
}
}
else {
File parent = file.getParentFile();
if (!parent.exists()) {
parent.mkdirs();
}
}
FileOutputStream outputStream = null;
BufferedOutputStream bufOutputStream = null;
try {
outputStream = new FileOutputStream(file);
bufOutputStream = new BufferedOutputStream(outputStream);
byte[] buffer = new byte[4096];
int readCount;
while((readCount = inputStream.read(buffer)) > 0) {
bufOutputStream.write(buffer, 0, readCount);
}
bufOutputStream.flush();
inputStream.close();
bufOutputStream.close();
}
catch (Exception e) {
return null;
}
return file;
}
/**
* Gets the cached file for the remote file from the cache if any.
* @param remoteFile the remote file.
* @return the cached file, or <code>null</code> if none.
*/
public File getFromCache(IRemoteFile remoteFile) {
String path = getCachePath(remoteFile.getParentRemoteFileSubSystem().getHost().getHostName(), remoteFile.getAbsolutePath());
File file = new File(path);
if (file.exists()) {
return file;
}
else {
return null;
}
}
/**
* Gets the cache path.
* @param hostname the hostname.
* @param remotePath the remote path.
* @return the cache path.
*/
private String getCachePath(String hostname, String remotePath) {
IPath path = Platform.getStateLocation(Activator.getDefault().getBundle());
path = path.makeAbsolute();
path = path.addTrailingSeparator();
path = path.append(hostname);
path = path.addTrailingSeparator();
path = path.append(remotePath);
return path.toOSString();
}
}

View file

@ -53,6 +53,8 @@ import org.eclipse.rse.files.ui.resources.SystemEditableRemoteFile;
import org.eclipse.rse.files.ui.resources.UniversalFileTransferUtility; import org.eclipse.rse.files.ui.resources.UniversalFileTransferUtility;
import org.eclipse.rse.internal.subsystems.files.core.ISystemFilePreferencesConstants; import org.eclipse.rse.internal.subsystems.files.core.ISystemFilePreferencesConstants;
import org.eclipse.rse.services.clientserver.messages.SystemMessageException; import org.eclipse.rse.services.clientserver.messages.SystemMessageException;
import org.eclipse.rse.subsystems.files.core.servicesubsystem.FileServiceSubSystem;
import org.eclipse.rse.subsystems.files.core.servicesubsystem.IFileServiceSubSystem;
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile; import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile;
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem; import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem;
import org.eclipse.rse.subsystems.files.core.subsystems.RemoteFileEmpty; import org.eclipse.rse.subsystems.files.core.subsystems.RemoteFileEmpty;
@ -188,12 +190,24 @@ public class RSEFileStoreRemoteFileWrapper extends FileStore implements IFileSto
{ {
if (_remoteFile.exists()) if (_remoteFile.exists())
{ {
IFile file = null; // IFile file = null;
if (_remoteFile.isFile() && _subSystem.isConnected()) if (_remoteFile.isFile() && _subSystem.isConnected() && _subSystem instanceof IFileServiceSubSystem)
{ {
IFileServiceSubSystem fileSubSystem = (IFileServiceSubSystem)_subSystem;
try {
return fileSubSystem.getFileService().getInputStream(monitor, _remoteFile.getParentPath(), _remoteFile.getName(), true);
}
catch (SystemMessageException e) {
return null;
}
}
if (_remoteFile.isDirectory()) {
throw new CoreException(new Status(IStatus.ERROR, Activator.getDefault().getBundle().getSymbolicName(), "This is a directory")); //$NON-NLS-1$
}
if (_remoteFile.getName().equals(".project") && _remoteFile.getLength() == 0) //$NON-NLS-1$ /* if (_remoteFile.getName().equals(".project") && _remoteFile.getLength() == 0) //$NON-NLS-1$
{ {
System.out.println("reading empty .project"); //$NON-NLS-1$ System.out.println("reading empty .project"); //$NON-NLS-1$
InputStream stream = getDummyProjectFileStream(); InputStream stream = getDummyProjectFileStream();
@ -208,7 +222,7 @@ public class RSEFileStoreRemoteFileWrapper extends FileStore implements IFileSto
{ {
} }
//return stream; //return stream;
/*
try try
{ {
// only temp file has contents // only temp file has contents
@ -222,7 +236,7 @@ public class RSEFileStoreRemoteFileWrapper extends FileStore implements IFileSto
{ {
e.printStackTrace(); e.printStackTrace();
} }
*/
} }
{ {
@ -281,7 +295,7 @@ public class RSEFileStoreRemoteFileWrapper extends FileStore implements IFileSto
} }
} }
} }*/
} }
return null; return null;
} }
@ -365,15 +379,42 @@ public class RSEFileStoreRemoteFileWrapper extends FileStore implements IFileSto
public OutputStream openOutputStream(int options, IProgressMonitor monitor) throws CoreException { public OutputStream openOutputStream(int options, IProgressMonitor monitor) throws CoreException {
monitor = Policy.monitorFor(monitor); monitor = Policy.monitorFor(monitor);
File file = null; // File file = null;
try { // try {
// create temp file first // create temp file first
try {
if (!_remoteFile.exists()) if (!_remoteFile.exists())
{ {
_subSystem.createFile(_remoteFile); _subSystem.createFile(_remoteFile);
_remoteFile = _subSystem.getRemoteFileObject(_remoteFile.getAbsolutePath()); _remoteFile = _subSystem.getRemoteFileObject(_remoteFile.getAbsolutePath());
} }
SystemEditableRemoteFile editable = new SystemEditableRemoteFile(_remoteFile); }
catch (Exception e) {
return null;
}
if (_remoteFile.isFile() && _subSystem instanceof FileServiceSubSystem) {
IFileServiceSubSystem fileSubSystem = (IFileServiceSubSystem)_subSystem;
try {
return fileSubSystem.getFileService().getOutputStream(monitor, _remoteFile.getParentPath(), _remoteFile.getName(), true);
}
catch (SystemMessageException e) {
return null;
}
}
else {
if (_remoteFile.isDirectory()) {
throw new CoreException(new Status(IStatus.ERROR, Activator.getDefault().getBundle().getSymbolicName(), "This is a directory")); //$NON-NLS-1$
}
else {
return null;
}
}
/* SystemEditableRemoteFile editable = new SystemEditableRemoteFile(_remoteFile);
editable.download(monitor); editable.download(monitor);
IFile localFile = editable.getLocalResource(); IFile localFile = editable.getLocalResource();
file = localFile.getLocation().toFile(); file = localFile.getLocation().toFile();
@ -401,7 +442,7 @@ public class RSEFileStoreRemoteFileWrapper extends FileStore implements IFileSto
finally { finally {
monitor.done(); monitor.done();
} }
return null; return null;*/
} }
public IFileStore getChild(IPath path) public IFileStore getChild(IPath path)
@ -457,11 +498,35 @@ public class RSEFileStoreRemoteFileWrapper extends FileStore implements IFileSto
public File toLocalFile(int options, IProgressMonitor monitor) throws CoreException public File toLocalFile(int options, IProgressMonitor monitor) throws CoreException
{ {
IResource file = null; if (options == EFS.CACHE) {
if (_remoteFile.exists()) return super.toLocalFile(options, monitor);
{ }
else {
if (_remoteFile.isFile() && _subSystem.isConnected()) if (_remoteFile.exists() && _subSystem instanceof IFileServiceSubSystem)
{
RSEFileCache cache = RSEFileCache.getInstance();
IFileServiceSubSystem fileServiceSubSystem = (IFileServiceSubSystem)_subSystem;
InputStream inputStream = null;
try {
if (_remoteFile.isFile()) {
inputStream = fileServiceSubSystem.getFileService().getInputStream(monitor, _remoteFile.getParentRemoteFileSubSystem().getHost().getHostName(), _remoteFile.getName(), true);
}
return cache.writeToCache(_remoteFile, inputStream);
}
catch (SystemMessageException e) {
return null;
}
}
else {
return null;
}
}
/*if (_remoteFile.isFile() && _subSystem.isConnected())
{ {
file = (IResource)UniversalFileTransferUtility.copyRemoteResourceToWorkspace(_remoteFile, monitor); file = (IResource)UniversalFileTransferUtility.copyRemoteResourceToWorkspace(_remoteFile, monitor);
} }
@ -491,8 +556,7 @@ public class RSEFileStoreRemoteFileWrapper extends FileStore implements IFileSto
} }
} }
} }*/
return null;
} }
public void delete(int options, IProgressMonitor monitor) throws CoreException public void delete(int options, IProgressMonitor monitor) throws CoreException

View file

@ -819,10 +819,9 @@ public class SftpFileService extends AbstractFileService implements IFileService
String remotePath = remoteParent + '/' + remoteFile; String remotePath = remoteParent + '/' + remoteFile;
int mode = ChannelSftp.OVERWRITE; int mode = ChannelSftp.OVERWRITE;
MyProgressMonitor sftpMonitor = new MyProgressMonitor(monitor); MyProgressMonitor sftpMonitor = new MyProgressMonitor(monitor);
getChannel("SftpFileService.getInputStream " + remoteFile); //check the session is healthy //$NON-NLS-1$ ChannelSftp channel = getChannel("SftpFileService.getInputStream " + remoteFile); //check the session is healthy //$NON-NLS-1$
ChannelSftp channel = (ChannelSftp)fSessionProvider.getSession().openChannel("sftp"); //$NON-NLS-1$
channel.connect(); stream = channel.get(remotePath);
stream = channel.get(remotePath, sftpMonitor, mode);
Activator.trace("SftpFileService.getInputStream " + remoteFile + " ok"); //$NON-NLS-1$ //$NON-NLS-2$ Activator.trace("SftpFileService.getInputStream " + remoteFile + " ok"); //$NON-NLS-1$ //$NON-NLS-2$
} }
catch (Exception e) { catch (Exception e) {
@ -860,9 +859,8 @@ public class SftpFileService extends AbstractFileService implements IFileService
dst += remoteFile; dst += remoteFile;
} }
getChannel("SftpFileService.getOutputStream " + remoteFile); //check the session is healthy //$NON-NLS-1$ ChannelSftp channel = getChannel("SftpFileService.getOutputStream " + remoteFile); //check the session is healthy //$NON-NLS-1$
ChannelSftp channel = (ChannelSftp)fSessionProvider.getSession().openChannel("sftp"); //$NON-NLS-1$
channel.connect();
stream = channel.put(dst, sftpMonitor, mode); stream = channel.put(dst, sftpMonitor, mode);
Activator.trace("SftpFileService.getOutputStream " + remoteFile + " ok"); //$NON-NLS-1$ //$NON-NLS-2$ Activator.trace("SftpFileService.getOutputStream " + remoteFile + " ok"); //$NON-NLS-1$ //$NON-NLS-2$
} }

View file

@ -110,7 +110,15 @@ public class SystemFileTransferModeRegistry
// editor registry. We can be out of sync because we may not have // editor registry. We can be out of sync because we may not have
// been listening for editor registry changes (e.g. if our plugin wasn't // been listening for editor registry changes (e.g. if our plugin wasn't
// started while those changes were made). // started while those changes were made).
IWorkbench wb = PlatformUI.getWorkbench(); IWorkbench wb = null;
try {
wb = PlatformUI.getWorkbench();
}
catch (Exception e) {
wb = null;
}
if (wb != null) if (wb != null)
{ {
IEditorRegistry registry = wb.getEditorRegistry(); IEditorRegistry registry = wb.getEditorRegistry();