1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-03 07:05:24 +02:00

[180091] EFS project fails to open on workbench startup. Now only return a handle on workbench startup instead of trying to connect. This means that an EFS project will be closed on workbench startup. The user will have to right click on the project and select Open Project.

This commit is contained in:
Kushal Munir 2007-04-05 20:47:43 +00:00
parent a20092ebdf
commit 1c629b9a94
3 changed files with 129 additions and 385 deletions

View file

@ -30,12 +30,12 @@ import org.eclipse.core.filesystem.IFileInfo;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.filesystem.provider.FileInfo;
import org.eclipse.core.filesystem.provider.FileStore;
import org.eclipse.core.internal.filesystem.Policy;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.rse.core.subsystems.RemoteChildrenContentsType;
@ -57,10 +57,33 @@ public class RSEFileStore extends FileStore implements IFileStore
private IRemoteFileSubSystem _subSystem;
private IFileStore _parent;
private boolean _isHandle;
private String _path;
/**
* Constructor to use if the file store is a handle.
* @param subSystem the subsystem.
* @param absolutePath the absolutePath;
*/
public RSEFileStore(IRemoteFileSubSystem subSystem, String absolutePath) {
_subSystem = subSystem;
_path = absolutePath;
_isHandle = true;
}
public RSEFileStore(IFileStore parent, IRemoteFile remoteFile) {
_remoteFile = remoteFile;
_parent = parent;
_subSystem = _remoteFile.getParentRemoteFileSubSystem();
_isHandle = false;
}
/**
* Returns whether the file store is just a handle.
* @return <code>true</code> to indicate that the file store is just a handle, <code>false</code> otherwise.
*/
public boolean isHandle() {
return _isHandle;
}
// an input stream that wraps another input stream and closes the wrappered input stream in a runnable that is always run with the user interface thread
@ -132,10 +155,20 @@ public class RSEFileStore extends FileStore implements IFileStore
return _subSystem;
}
public String[] childNames(int options, IProgressMonitor monitor) {
public String[] childNames(int options, IProgressMonitor monitor) throws CoreException {
String[] names;
if (isHandle() && !_subSystem.isConnected()) {
try {
_subSystem.connect(monitor);
}
catch (Exception e) {
throw new CoreException(new Status(IStatus.ERROR, Activator.getDefault().getBundle().getSymbolicName(), "", e)); //$NON-NLS-1$
}
}
if (!_remoteFile.isStale() && _remoteFile.hasContents(RemoteChildrenContentsType.getInstance()) && !(_subSystem instanceof IFileServiceSubSystem))
{
Object[] children = _remoteFile.getContents(RemoteChildrenContentsType.getInstance());
@ -169,7 +202,7 @@ public class RSEFileStore extends FileStore implements IFileStore
names = new String[children.length];
for (int i = 0; i < children.length; i++) {
names[i] = children[i].getName();
names[i] = (children[i]).getName();
}
}
catch (SystemMessageException e) {
@ -182,6 +215,13 @@ public class RSEFileStore extends FileStore implements IFileStore
public IFileInfo fetchInfo(int options, IProgressMonitor monitor) throws CoreException
{
if (isHandle() && !_subSystem.isConnected()) {
FileInfo info = new FileInfo(getName());
info.setExists(false);
return info;
}
if (_remoteFile.isStale())
{
try
@ -220,7 +260,13 @@ public class RSEFileStore extends FileStore implements IFileStore
public String getName()
{
return _remoteFile.getName();
if (isHandle()) {
IPath path = new Path(_path);
return path.lastSegment();
}
else {
return _remoteFile.getName();
}
}
public IFileStore getParent()
@ -248,6 +294,16 @@ public class RSEFileStore extends FileStore implements IFileStore
public synchronized InputStream openInputStream(int options, IProgressMonitor monitor) throws CoreException
{
if (isHandle() && !_subSystem.isConnected()) {
try {
_subSystem.connect(monitor);
}
catch (Exception e) {
throw new CoreException(new Status(IStatus.ERROR, Activator.getDefault().getBundle().getSymbolicName(), "", e)); //$NON-NLS-1$
}
}
if (_remoteFile.exists())
{
if (_remoteFile.isFile() && _subSystem.isConnected() && _subSystem instanceof IFileServiceSubSystem)
@ -298,11 +354,20 @@ public class RSEFileStore extends FileStore implements IFileStore
{
try
{
String path = _remoteFile.getAbsolutePath();
String path = null;
if (isHandle()) {
path = _path;
}
else {
path = _remoteFile.getAbsolutePath();
}
if (path.charAt(0) != '/')
{
path = "/" + path.replace('\\', '/'); //$NON-NLS-1$
}
return new URI("rse", _subSystem.getHost().getHostName(), path, null); //$NON-NLS-1$
}
catch (URISyntaxException e)
@ -313,6 +378,16 @@ public class RSEFileStore extends FileStore implements IFileStore
public IFileStore mkdir(int options, IProgressMonitor monitor) throws CoreException
{
if (isHandle() && !_subSystem.isConnected()) {
try {
_subSystem.connect(monitor);
}
catch (Exception e) {
throw new CoreException(new Status(IStatus.ERROR, Activator.getDefault().getBundle().getSymbolicName(), "", e)); //$NON-NLS-1$
}
}
if (!_remoteFile.exists())
{
try
@ -328,7 +403,16 @@ public class RSEFileStore extends FileStore implements IFileStore
}
public OutputStream openOutputStream(int options, IProgressMonitor monitor) throws CoreException {
monitor = Policy.monitorFor(monitor);
if (isHandle() && !_subSystem.isConnected()) {
try {
_subSystem.connect(monitor);
}
catch (Exception e) {
throw new CoreException(new Status(IStatus.ERROR, Activator.getDefault().getBundle().getSymbolicName(), "", e)); //$NON-NLS-1$
}
}
try {
if (!_remoteFile.exists())
@ -376,6 +460,11 @@ public class RSEFileStore extends FileStore implements IFileStore
public IFileStore getChild(String name)
{
// the remote file is a handle, so its children must also be handles
if (isHandle()) {
return new RSEFileStore(_subSystem, name);
}
if (!_remoteFile.isStale() && _remoteFile.hasContents(RemoteChildrenContentsType.getInstance(), name))
{
Object[] children = _remoteFile.getContents(RemoteChildrenContentsType.getInstance(), name);
@ -419,6 +508,17 @@ public class RSEFileStore extends FileStore implements IFileStore
return super.toLocalFile(options, monitor);
}
else {
if (isHandle() && !_subSystem.isConnected()) {
try {
_subSystem.connect(monitor);
}
catch (Exception e) {
throw new CoreException(new Status(IStatus.ERROR, Activator.getDefault().getBundle().getSymbolicName(), "", e)); //$NON-NLS-1$
}
}
if (_remoteFile.exists() && _subSystem instanceof IFileServiceSubSystem)
{
RSEFileCache cache = RSEFileCache.getInstance();
@ -445,7 +545,18 @@ public class RSEFileStore extends FileStore implements IFileStore
public void delete(int options, IProgressMonitor monitor) throws CoreException
{
if (isHandle() && !_subSystem.isConnected()) {
try {
_subSystem.connect(monitor);
}
catch (Exception e) {
throw new CoreException(new Status(IStatus.ERROR, Activator.getDefault().getBundle().getSymbolicName(), "", e)); //$NON-NLS-1$
}
}
try {
_subSystem.delete(_remoteFile, monitor);
}
catch (Exception e) {

View file

@ -1,372 +0,0 @@
/********************************************************************************
* Copyright (c) 2006, 2007 IBM Corporation. All rights reserved.
* This program and the accompanying materials are made available under the terms
* of the Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
*
* Initial Contributors:
* The following IBM employees contributed to the Remote System Explorer
* component that contains this file: David McKnight, Kushal Munir,
* Michael Berger, David Dykstal, Phil Coulthard, Don Yantzi, Eric Simpson,
* Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley.
*
* Contributors:
* Kushal Munir (IBM) - moved to internal package
********************************************************************************/
package org.eclipse.rse.internal.eclipse.filesystem;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.net.URISyntaxException;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileInfo;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.filesystem.provider.FileInfo;
import org.eclipse.core.filesystem.provider.FileStore;
import org.eclipse.core.internal.filesystem.Policy;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
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 org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.rse.core.subsystems.RemoteChildrenContentsType;
import org.eclipse.rse.internal.subsystems.files.core.ISystemFilePreferencesConstants;
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.IRemoteFileSubSystem;
import org.eclipse.rse.ui.RSEUIPlugin;
public class RSEFileStoreRemoteFileWrapper extends FileStore implements IFileStore
{
private IRemoteFile _remoteFile;
private IRemoteFileSubSystem _subSystem;
private IFileStore _parent;
public RSEFileStoreRemoteFileWrapper(IFileStore parent, IRemoteFile remoteFile) {
_remoteFile = remoteFile;
_parent = parent;
_subSystem = _remoteFile.getParentRemoteFileSubSystem();
}
public IRemoteFileSubSystem getRemoteFileSubSystem() {
return _subSystem;
}
public String[] childNames(int options, IProgressMonitor monitor) {
IPreferenceStore prefStore = RSEUIPlugin.getDefault().getPreferenceStore();
prefStore.setValue(ISystemFilePreferencesConstants.SHOWHIDDEN, true);
String[] names;
if (!_remoteFile.isStale() && _remoteFile.hasContents(RemoteChildrenContentsType.getInstance()))
{
Object[] children = _remoteFile.getContents(RemoteChildrenContentsType.getInstance());
names = new String[children.length];
for (int i = 0; i < children.length; i++)
{
names[i] = ((IRemoteFile)children[i]).getName();
}
}
else
{
try
{
IRemoteFile[] children = _subSystem.listFoldersAndFiles(_remoteFile, monitor);
names = new String[children.length];
for (int i = 0; i < children.length; i++)
{
names[i] = children[i].getName();
}
}
catch (SystemMessageException e)
{
names = new String[0];
}
}
prefStore.setValue(ISystemFilePreferencesConstants.SHOWHIDDEN, false);
return names;
}
public IFileInfo fetchInfo(int options, IProgressMonitor monitor) throws CoreException
{
if (_remoteFile.isStale())
{
try
{
_remoteFile = _subSystem.getRemoteFileObject(_remoteFile.getAbsolutePath());
}
catch (Exception e)
{
}
}
FileInfo info = new FileInfo(getName());
boolean exists = _remoteFile.exists();
info.setExists(exists);
if (exists)
{
info.setLastModified(_remoteFile.getLastModified());
boolean isDir = _remoteFile.isDirectory();
info.setDirectory(isDir);
info.setAttribute(EFS.ATTRIBUTE_READ_ONLY, !_remoteFile.canWrite());
info.setAttribute(EFS.ATTRIBUTE_EXECUTABLE, _remoteFile.isExecutable());
info.setAttribute(EFS.ATTRIBUTE_ARCHIVE, _remoteFile.isArchive());
info.setAttribute(EFS.ATTRIBUTE_HIDDEN, _remoteFile.isHidden());
if (!isDir)
{
info.setLength(_remoteFile.getLength());
}
}
info.setName(getName());
return info;
}
public String getName()
{
return _remoteFile.getName();
}
public IFileStore getParent()
{
if (_parent == null)
{
_parent = new RSEFileStoreRemoteFileWrapper(null, _remoteFile.getParentRemoteFile());
}
return _parent;
}
public boolean isParentOf(IFileStore other)
{
if (other instanceof RSEFileStoreRemoteFileWrapper)
{
RSEFileStoreRemoteFileWrapper otherWrapper = (RSEFileStoreRemoteFileWrapper)other;
RSEFileStoreRemoteFileWrapper parent = (RSEFileStoreRemoteFileWrapper)otherWrapper.getParent();
return _remoteFile == parent._remoteFile;
}
else
{
return false;
}
}
public synchronized InputStream openInputStream(int options, IProgressMonitor monitor) throws CoreException
{
if (_remoteFile.exists())
{
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$
}
}
return null;
}
public class RefreshJob extends Job
{
private IResource _resource;
private int _depth;
public RefreshJob(IResource resource, int depth)
{
super("Refresh"); //$NON-NLS-1$
_resource = resource;
_depth = depth;
}
public IStatus run(IProgressMonitor monitor)
{
try
{
_resource.refreshLocal(_depth, monitor);
}
catch (Exception e)
{
e.printStackTrace();
}
return Status.OK_STATUS;
}
}
public URI toURI()
{
try
{
String path = _remoteFile.getAbsolutePath();
if (path.charAt(0) != '/')
{
path = "/" + path.replace('\\', '/'); //$NON-NLS-1$
}
return new URI("rse", _subSystem.getHost().getHostName(), path, null); //$NON-NLS-1$
}
catch (URISyntaxException e)
{
throw new RuntimeException(e);
}
}
public IFileStore mkdir(int options, IProgressMonitor monitor) throws CoreException
{
if (!_remoteFile.exists())
{
try
{
_subSystem.createFolder(_remoteFile);
_remoteFile = _subSystem.getRemoteFileObject(_remoteFile.getAbsolutePath());
}
catch (Exception e)
{
}
}
return this;
}
public OutputStream openOutputStream(int options, IProgressMonitor monitor) throws CoreException {
monitor = Policy.monitorFor(monitor);
try {
if (!_remoteFile.exists())
{
_subSystem.createFile(_remoteFile);
_remoteFile = _subSystem.getRemoteFileObject(_remoteFile.getAbsolutePath());
}
}
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;
}
}
}
public IFileStore getChild(IPath path)
{
IFileStore result = this;
for (int i = 0, imax = path.segmentCount(); i < imax; i++)
{
String segment = path.segment(i);
result = result.getChild(segment);
}
return result;
}
public IFileStore getChild(String name)
{
if (!_remoteFile.isStale() && _remoteFile.hasContents(RemoteChildrenContentsType.getInstance(), name))
{
Object[] children = _remoteFile.getContents(RemoteChildrenContentsType.getInstance(), name);
if (children != null && children.length > 0)
{
return FileStoreConversionUtility.convert(_parent, (IRemoteFile)children[0]);
}
else
{
// need empty one
try
{
IRemoteFile child = _subSystem.getRemoteFileObject(_remoteFile, name);
return FileStoreConversionUtility.convert(_parent, child);
}
catch (Exception e)
{
}
}
}
else if (_remoteFile.isDirectory())
{
try
{
IRemoteFile child = _subSystem.getRemoteFileObject(_remoteFile, name);
return FileStoreConversionUtility.convert(_parent, child);
}
catch (Exception e)
{
}
}
return null;
}
public File toLocalFile(int options, IProgressMonitor monitor) throws CoreException
{
if (options == EFS.CACHE) {
return super.toLocalFile(options, monitor);
}
else {
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;
}
}
}
public void delete(int options, IProgressMonitor monitor) throws CoreException
{
try {
_subSystem.delete(_remoteFile, monitor);
}
catch (Exception e) {
e.printStackTrace();
}
}
}

View file

@ -23,7 +23,6 @@ import java.util.HashMap;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.filesystem.provider.FileSystem;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.rse.core.model.IHost;
import org.eclipse.rse.core.model.ISystemRegistry;
import org.eclipse.rse.core.subsystems.IConnectorService;
@ -103,20 +102,19 @@ public class RSEFileSystem extends FileSystem
if (obj != null) {
// RSEFileStoreRemoteFileWrapper store = (RSEFileStoreRemoteFileWrapper)obj;
RSEFileStore store = (RSEFileStore)obj;
IRemoteFileSubSystem ss = store.getRemoteFileSubSystem();
/*IRemoteFileSubSystem ss = store.getRemoteFileSubSystem();
if (!ss.isConnected()) {
try {
ss.connect();
ss.connect(new NullProgressMonitor());
}
catch (Exception e) {
return null;
}
}
}*/
return store;
}
@ -132,16 +130,23 @@ public class RSEFileSystem extends FileSystem
if (fs != null) {
if (!fs.isConnected()) {
/* if (!fs.isConnected()) {
fs.getConnectorService().acquireCredentials(false);
fs.getConnectorService().connect(new NullProgressMonitor());
}
}*/
if (fs.isConnected()) {
IFileStore fstore = FileStoreConversionUtility.convert(null, fs.getRemoteFileObject(path));
_fileStoreMap.put(uri, fstore);
return fstore;
}
else {
// return a handle if we're not yet connected
// we're not connected on workbench startup, and we are not supposed to connect
// if we did, we would get an exception from the credentials provider of connector service
// because it needs the workbench to connect
return new RSEFileStore(fs, path);
}
}
}
}