*** empty log message ***
diff --git a/bundles/org.eclipse.core.resources/file system separation issues.txt b/bundles/org.eclipse.core.resources/file system separation issues.txt new file mode 100644 index 0000000..9a44ed1 --- /dev/null +++ b/bundles/org.eclipse.core.resources/file system separation issues.txt
@@ -0,0 +1,49 @@ + +File System details exposed as API: +=================================== + +IResource.getLocation() - returns an IPath with the local location of the resource. Returns + null if it is not applicable to the given resource. + +IProjectDescription.setLocation() +IProjectDescription.getLocation() - returns an IPath with the local location of the resource. + Returns null if using the default location. + +IResource.setReadOnly() +IResource.isReadOnly() - some file systems may not support this feature. + +IWorkspaceRoot.getFileForLocation() +IWorkspaceRoot.getContainerForLocation() - + +File system separation: +======================= + +1) Metadata + The metadata will continue being local. Only the project content will be +able to be stored in different ways (local file system, webdav, etc...) + +2) History + The history mechanism is currently attached to the local file system +notion. In the proposed scenario, we have the option of continue keeping +history locally or have it in a per project basis, giving the oportunity +to the implementor of the file store to have it or not. + + +Problems raised by the file system separation: +============================================== + +1) IResource.getLocation(): + In the new scenario, the resource might not have a local location anymore. +<null> might be returned in this case. + +2) File Editors: + Some file editors are using a parallel mechanism to detect when the file +it has opened, has changed on the file system. Basicaly they rely on the +java.io.File API to do so. + In the new scenario, this API is not guaranteed to be helpful anymore. They +would only be able to rely on the file content stream. + +3) Reporting errors: + If this mechanism becomes API, we have to have a better story for reporting +errors. Classes like ResourceException, ResourceStatus and Policy.bind should +somehow be available for implementors.
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/filesystem/FileSystemFile.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/filesystem/FileSystemFile.java new file mode 100644 index 0000000..a2fb24d --- /dev/null +++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/filesystem/FileSystemFile.java
@@ -0,0 +1,44 @@ +package org.eclipse.core.internal.filesystem; + +/* + * (c) Copyright IBM Corp. 2000, 2001. + * All Rights Reserved. + */ + +import org.eclipse.core.internal.localstore.CoreFileSystemLibrary; +import org.eclipse.core.internal.localstore.FileObject; + +public class FileSystemFile extends FileObject { + +protected String location; +protected long stat; + +public FileSystemFile(String location) { + this.location = location; + stat = CoreFileSystemLibrary.getStat(location); +} + +public boolean exists() { + return CoreFileSystemLibrary.isFile(stat) || CoreFileSystemLibrary.isFolder(stat); +} + +public boolean isFile() { + return CoreFileSystemLibrary.isFile(stat); +} + +public boolean isFolder() { + return CoreFileSystemLibrary.isFolder(stat); +} + +public long getLastModified() { + return CoreFileSystemLibrary.getLastModified(stat); +} + +public String getLocation() { + return location; +} + +public void refresh() { + stat = CoreFileSystemLibrary.getStat(location); +} +} \ No newline at end of file
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/filesystem/FileSystemStore2.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/filesystem/FileSystemStore2.java new file mode 100644 index 0000000..8718bb6 --- /dev/null +++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/filesystem/FileSystemStore2.java
@@ -0,0 +1,43 @@ +package org.eclipse.core.internal.filesystem; + +/* + * (c) Copyright IBM Corp. 2000, 2001. + * All Rights Reserved. + */ + +// FIXME: no internal import should be here +import org.eclipse.core.internal.localstore.FileObject; +import org.eclipse.core.internal.localstore.FileStore; +import org.eclipse.core.internal.localstore.FileSystemStore; +import org.eclipse.core.internal.utils.Policy; + +// OK imports +import org.eclipse.core.resources.*; +import org.eclipse.core.runtime.*; +import java.io.File; + +// FIXME: should only extend FileStore +// FIXME: should be renamed to FileSystemStore +public class FileSystemStore2 extends FileSystemStore { + +public FileObject getFile(IResource target) throws CoreException { + // FIXME: use locationFor instead of getLocation() + return new FileSystemFile(target.getLocation().toOSString()); +} + +public void write(IFolder target) throws CoreException { + // FIXME: use locationFor instead of getLocation() + File folder = target.getLocation().toFile(); + if (!folder.exists()) + folder.mkdirs(); + if (!folder.isDirectory()) { + String message; + if (folder.isFile()) + message = "Resource is not a folder: " + folder.getAbsolutePath(); + else + message = Policy.bind("localstore.couldNotCreateFolder", folder.getAbsolutePath()); + IStatus status = new Status(IStatus.ERROR, ResourcesPlugin.PI_RESOURCES, IResourceStatus.FAILED_WRITE_LOCAL, message, null); + throw new CoreException(status); + } +} +} \ No newline at end of file
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/DeleteVisitor.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/DeleteVisitor.java index e8a4d6c..594b1cc 100644 --- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/DeleteVisitor.java +++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/DeleteVisitor.java
@@ -42,7 +42,7 @@ delete(target, location); return; } - HistoryStore store = target.getLocalManager().getHistoryStore(); + HistoryStore store = ((Workspace) target.getWorkspace()).getFileManager().getHistoryStore(); store.addState(target.getFullPath(), location, node.getLastModified(), true); if (target.getLocation().toFile().exists()) delete(target, location); @@ -53,7 +53,7 @@ } } protected void delete(Resource target, IPath location) { - if(!target.getLocalManager().getStore().delete(location.toFile(), status)) + if(!target.getFileManager().getStore().delete(location.toFile(), status)) return; try { target.deleteResource(convertToPhantom, status);
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileManager.java new file mode 100644 index 0000000..e565c06 --- /dev/null +++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileManager.java
@@ -0,0 +1,53 @@ +package org.eclipse.core.internal.localstore; + +/* + * (c) Copyright IBM Corp. 2000, 2001. + * All Rights Reserved. + */ + +import org.eclipse.core.internal.filesystem.FileSystemStore2; +import org.eclipse.core.internal.resources.*; +import org.eclipse.core.internal.utils.Policy; +import org.eclipse.core.resources.*; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; + +/** + * This class should only contain algorithms to execute file + * management. The "real work" will be done by a separate + * store like the FileSystemStore or DavStore. + */ + +// FIXME: should remove the superclass later +public class FileManager extends FileSystemResourceManager { + +protected FileStore fileStore; + +public FileManager(Workspace workspace) { + super(workspace); + fileStore = new FileSystemStore2(); +} + +public FileManager(Workspace workspace, FileStore fileStore) { + super(workspace); + this.fileStore = fileStore; +} + +public void write(IFolder target, boolean force, IProgressMonitor monitor) throws CoreException { + FileObject file = fileStore.getFile(target); + if (!force) + if (file.isFolder()) { + String message = Policy.bind("localstore.resourceExists", target.getFullPath().toString()); + throw new ResourceException(IResourceStatus.EXISTS_LOCAL, target.getFullPath(), message, null); + } else { + if (file.exists()) { + String message = Policy.bind("localstore.fileExists", target.getFullPath().toString()); + throw new ResourceException(IResourceStatus.OUT_OF_SYNC_LOCAL, target.getFullPath(), message, null); + } + } + fileStore.write(target); + file.refresh(); + ResourceInfo info = ((Resource) target).getResourceInfo(false, true); + updateLocalSync(info, file.getLastModified(), false); +} +} \ No newline at end of file
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileObject.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileObject.java new file mode 100644 index 0000000..b76f1a3 --- /dev/null +++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileObject.java
@@ -0,0 +1,29 @@ +package org.eclipse.core.internal.localstore; + +/* + * (c) Copyright IBM Corp. 2000, 2001. + * All Rights Reserved. + */ + +/** + * Abstract representation of a file. This is the object managed by + * the FileManager. + */ + +public abstract class FileObject { + +abstract public boolean exists(); + +abstract public boolean isFile(); + +abstract public boolean isFolder(); + +abstract public long getLastModified(); + +abstract public String getLocation(); + +/** + * Clean all the cached information about this file. + */ +abstract public void refresh(); +} \ No newline at end of file
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileStore.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileStore.java new file mode 100644 index 0000000..5c22646 --- /dev/null +++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileStore.java
@@ -0,0 +1,23 @@ +package org.eclipse.core.internal.localstore; + +/* + * (c) Copyright IBM Corp. 2000, 2001. + * All Rights Reserved. + */ + +import org.eclipse.core.resources.*; +import org.eclipse.core.runtime.CoreException; + +public abstract class FileStore { + +/** + * Creates a folder in the store. + */ +abstract public FileObject getFile(IResource target) throws CoreException; + +/** + * Creates a folder in the store. + */ +abstract public void write(IFolder target) throws CoreException; + +} \ No newline at end of file
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileSystemStore.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileSystemStore.java index 0659524..727e648 100644 --- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileSystemStore.java +++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileSystemStore.java
@@ -12,7 +12,7 @@ import org.eclipse.core.internal.utils.*; import java.io.*; -public class FileSystemStore implements ILocalStoreConstants { +public class FileSystemStore extends FileStore implements ILocalStoreConstants { public FileSystemStore() { } public void copy(File source, File destination, int depth, IProgressMonitor monitor) throws CoreException { @@ -246,4 +246,14 @@ throw new ResourceException(IResourceStatus.FAILED_WRITE_LOCAL, new Path(target.getAbsolutePath()), message, null); } } + +// HACK: +public void write(IFolder target) throws CoreException { + writeFolder(target.getLocation().toFile()); +} +// HACK: +public FileObject getFile(IResource target) throws CoreException { + return null; +} + } \ No newline at end of file
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/RefreshLocalVisitor.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/RefreshLocalVisitor.java index 2d41faf..7783edd 100644 --- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/RefreshLocalVisitor.java +++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/RefreshLocalVisitor.java
@@ -45,7 +45,7 @@ /* Use the basic file creation protocol since we don't want to create any content on disk. */ workspace.createResource(target, false); info = target.getResourceInfo(false, true); - target.getLocalManager().updateLocalSync(info, node.getLastModified(), target.getType() == IResource.FILE); + target.getFileManager().updateLocalSync(info, node.getLastModified(), target.getType() == IResource.FILE); } protected void deleteResource(UnifiedTreeNode node, Resource target) throws CoreException { ResourceInfo info = target.getResourceInfo(false, false); @@ -68,7 +68,7 @@ } node.setResource(target); info = target.getResourceInfo(false, true); - target.getLocalManager().updateLocalSync(info, node.getLastModified(), false); + target.getFileManager().updateLocalSync(info, node.getLastModified(), false); } protected void folderToFile(UnifiedTreeNode node, Resource target) throws CoreException { ResourceInfo info = target.getResourceInfo(false, false); @@ -85,13 +85,13 @@ } node.setResource(target); info = target.getResourceInfo(false, true); - target.getLocalManager().updateLocalSync(info, node.getLastModified(), true); + target.getFileManager().updateLocalSync(info, node.getLastModified(), true); } protected void resourceChanged(Resource target, long lastModified) throws CoreException { ResourceInfo info = target.getResourceInfo(false, true); if (info == null) return; - target.getLocalManager().updateLocalSync(info, lastModified, target.getType() == IResource.FILE); + target.getFileManager().updateLocalSync(info, lastModified, target.getType() == IResource.FILE); info.incrementContentId(); workspace.updateModificationStamp(info); } @@ -124,12 +124,12 @@ if (!CoreFileSystemLibrary.isCaseSensitive()) { Container parent = (Container) target.getParent(); if (!parent.exists()) { - parent.getLocalManager().refresh(parent, IResource.DEPTH_ZERO, null); + parent.getFileManager().refresh(parent, IResource.DEPTH_ZERO, null); if (!parent.exists()) return RL_NOT_IN_SYNC; } IPath location = node.getLocalLocation(); - String name = target.getLocalManager().getLocalName(location.toFile()); + String name = target.getFileManager().getLocalName(location.toFile()); if (!target.getName().equals(name)) return RL_IN_SYNC; }
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/File.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/File.java index f0b48f1..ad106f0 100644 --- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/File.java +++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/File.java
@@ -78,12 +78,12 @@ parent.checkAccessible(getFlags(info)); workspace.beginOperation(true); - IPath location = getLocalManager().locationFor(this); + IPath location = getFileManager().locationFor(this); java.io.File localFile = location.toFile(); if (force) { if (!CoreFileSystemLibrary.isCaseSensitive()) { if (localFile.exists()) { - String name = getLocalManager().getLocalName(localFile); + String name = getFileManager().getLocalName(localFile); if (localFile.getName().equals(name)) { delete(true, null); } else { @@ -140,14 +140,14 @@ int flags = getFlags(info); checkAccessible(flags); checkLocal(flags, DEPTH_ZERO); - return getLocalManager().read(this, force, null); + return getFileManager().read(this, force, null); } /** * @see IFile#getHistory */ public IFileState[] getHistory(IProgressMonitor monitor) throws CoreException { // FIXME: monitor is not used - return getLocalManager().getHistoryStore().getStates(getFullPath()); + return getFileManager().getHistoryStore().getStates(getFullPath()); } public int getType() { return FILE; @@ -155,7 +155,7 @@ protected void internalSetContents(InputStream content, boolean force, boolean keepHistory, boolean append, IProgressMonitor monitor) throws CoreException { if (content == null) content = new ByteArrayInputStream(new byte[0]); - getLocalManager().write(this, content, force, keepHistory, append, monitor); + getFileManager().write(this, content, force, keepHistory, append, monitor); ResourceInfo info = getResourceInfo(false, true); info.incrementContentId(); workspace.updateModificationStamp(info);
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Folder.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Folder.java index 3583d1f..d1705f7 100644 --- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Folder.java +++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Folder.java
@@ -48,12 +48,12 @@ parent.checkAccessible(getFlags(info)); workspace.beginOperation(true); - IPath location = getLocalManager().locationFor(this); + IPath location = getFileManager().locationFor(this); java.io.File localFile = location.toFile(); if (force) { if (!CoreFileSystemLibrary.isCaseSensitive()) { if (localFile.exists()) { - String name = getLocalManager().getLocalName(localFile); + String name = getFileManager().getLocalName(localFile); if (localFile.getName().equals(name)) { delete(true, null); } else { @@ -118,7 +118,7 @@ workspace.createResource(this, false); if (local) { try { - getLocalManager().write(this, force, Policy.subMonitorFor(monitor, Policy.totalWork * 75 / 100)); + getFileManager().write(this, force, Policy.subMonitorFor(monitor, Policy.totalWork * 75 / 100)); } catch (CoreException e) { // a problem happened creating the folder on disk, so delete from the workspace workspace.deleteResource(this);
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Project.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Project.java index 3d99eee..91f5116 100644 --- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Project.java +++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Project.java
@@ -16,8 +16,12 @@ import java.util.*; public class Project extends Container implements IProject { + +protected FileManager fileManager; + protected Project(IPath path, Workspace container) { super(path, container); + fileManager = new FileManager(workspace); } /** * Deletes everything but contents. Needed for restore where we do not find @@ -263,12 +267,12 @@ protected void copyMetaArea(IProject source, IProject destination, IProgressMonitor monitor) throws CoreException { java.io.File oldMetaArea = workspace.getMetaArea().getLocationFor(source).toFile(); java.io.File newMetaArea = workspace.getMetaArea().getLocationFor(destination).toFile(); - getLocalManager().getStore().copy(oldMetaArea, newMetaArea, IResource.DEPTH_INFINITE, monitor); + getFileManager().getStore().copy(oldMetaArea, newMetaArea, IResource.DEPTH_INFINITE, monitor); } protected void renameMetaArea(IProject source, IProject destination, IProgressMonitor monitor) throws CoreException { java.io.File oldMetaArea = workspace.getMetaArea().getLocationFor(source).toFile(); java.io.File newMetaArea = workspace.getMetaArea().getLocationFor(destination).toFile(); - getLocalManager().getStore().move(oldMetaArea, newMetaArea, false, monitor); + getFileManager().getStore().move(oldMetaArea, newMetaArea, false, monitor); } /** * @see IProject#create @@ -302,7 +306,7 @@ // updates the stamp info.setModificationStamp(IResource.NULL_STAMP); try { - getLocalManager().write(this, Policy.subMonitorFor(monitor, Policy.opWork)); + getFileManager().write(this, Policy.subMonitorFor(monitor, Policy.opWork)); } catch (CoreException e) { workspace.deleteResource(this); throw e; @@ -414,9 +418,9 @@ pseudoOpen(); try { if (force) - getLocalManager().getStore().delete(getLocation().toFile(), status); + getFileManager().getStore().delete(getLocation().toFile(), status); else - getLocalManager().delete(this, force, false, false, Policy.monitorFor(null)); + getFileManager().delete(this, force, false, false, Policy.monitorFor(null)); } catch (CoreException e) { if (info != null) { getPropertyManager().closePropertyStore(this); @@ -443,7 +447,7 @@ // close project's propertyStore getPropertyManager().closePropertyStore(project); java.io.File location = workspace.getMetaArea().getLocationFor(project).toFile(); - getLocalManager().getStore().delete(location); + getFileManager().getStore().delete(location); } /** * @see IProject @@ -453,6 +457,11 @@ checkAccessible(getFlags(info)); return (IProjectDescription) ((ProjectInfo) info).getDescription().clone(); } + +public FileManager getFileManager() { + return fileManager; +} + /** * @see IProject#getNature */ @@ -574,7 +583,7 @@ workspace.changing(this); workspace.beginOperation(true); - getLocalManager().refresh(this, DEPTH_INFINITE, Policy.subMonitorFor(monitor, Policy.opWork * 20 / 100)); + getFileManager().refresh(this, DEPTH_INFINITE, Policy.subMonitorFor(monitor, Policy.opWork * 20 / 100)); // close the property store so incorrect info is not copied to the destination getPropertyManager().closePropertyStore(this); @@ -592,7 +601,7 @@ // copied over from the source but we want to ensure the .prj file // contains the correct info try { - getLocalManager().write(destProject, Policy.subMonitorFor(monitor, Policy.opWork * 10 / 100)); + getFileManager().write(destProject, Policy.subMonitorFor(monitor, Policy.opWork * 10 / 100)); } catch (CoreException e) { try { destProject.delete(force, null); @@ -612,7 +621,7 @@ // refresh local monitor.subTask(Policy.bind("resources.updating")); - getLocalManager().refresh(destProject, DEPTH_INFINITE, Policy.subMonitorFor(monitor, Policy.opWork * 10 / 100)); + getFileManager().refresh(destProject, DEPTH_INFINITE, Policy.subMonitorFor(monitor, Policy.opWork * 10 / 100)); } catch (OperationCanceledException e) { workspace.getWorkManager().operationCanceled(); throw e; @@ -650,7 +659,7 @@ workspace.beginOperation(true); // flush the build order early in case there is a problem workspace.flushBuildOrder(); - getLocalManager().refresh(this, DEPTH_INFINITE, Policy.subMonitorFor(monitor, Policy.opWork * 20 / 100)); + getFileManager().refresh(this, DEPTH_INFINITE, Policy.subMonitorFor(monitor, Policy.opWork * 20 / 100)); // copy just the project and not its children internalCopyProjectOnly(destFolder, Policy.subMonitorFor(monitor, Policy.opWork * 10 / 100)); @@ -662,7 +671,7 @@ // refresh local monitor.subTask(Policy.bind("resources.updating")); - getLocalManager().refresh(destFolder, DEPTH_INFINITE, Policy.subMonitorFor(monitor, Policy.opWork * 20 / 100)); + getFileManager().refresh(destFolder, DEPTH_INFINITE, Policy.subMonitorFor(monitor, Policy.opWork * 20 / 100)); } catch (OperationCanceledException e) { workspace.getWorkManager().operationCanceled(); throw e; @@ -705,7 +714,7 @@ workspace.beginOperation(true); // flush the build order early in case there is a problem workspace.flushBuildOrder(); - getLocalManager().refresh(this, DEPTH_INFINITE, Policy.subMonitorFor(monitor, Policy.opWork * 20 / 100)); + getFileManager().refresh(this, DEPTH_INFINITE, Policy.subMonitorFor(monitor, Policy.opWork * 20 / 100)); // let people know that we are deleting the project workspace.deleting(this); @@ -733,7 +742,7 @@ // copied over from the source but we want to ensure the .prj file // contains the correct info try { - getLocalManager().write(destProject, Policy.subMonitorFor(monitor, Policy.opWork * 10 / 100)); + getFileManager().write(destProject, Policy.subMonitorFor(monitor, Policy.opWork * 10 / 100)); } catch (CoreException e) { try { destProject.delete(force, null); @@ -795,7 +804,7 @@ IPath destination = getLocation(); rollbackLevel++; // actually move the resources - getLocalManager().getStore().move(source.toFile(), destination.toFile(), force, Policy.subMonitorFor(monitor, Policy.opWork * 70 / 100)); + getFileManager().getStore().move(source.toFile(), destination.toFile(), force, Policy.subMonitorFor(monitor, Policy.opWork * 70 / 100)); rollbackLevel = 0; // we need to refresh local in case we moved to an existing location // that already had content @@ -832,7 +841,7 @@ workspace.beginOperation(true); // flush the build order early in case there is a problem workspace.flushBuildOrder(); - getLocalManager().refresh(this, DEPTH_INFINITE, Policy.subMonitorFor(monitor, Policy.opWork * 20 / 100)); + getFileManager().refresh(this, DEPTH_INFINITE, Policy.subMonitorFor(monitor, Policy.opWork * 20 / 100)); // copy just the project and not its children internalCopyProjectOnly(destFolder, Policy.subMonitorFor(monitor, Policy.opWork * 10 / 100)); @@ -851,7 +860,7 @@ // refresh local monitor.subTask(Policy.bind("resources.updating")); - getLocalManager().refresh(destFolder, DEPTH_INFINITE, Policy.subMonitorFor(monitor, Policy.opWork * 20 / 100)); + getFileManager().refresh(destFolder, DEPTH_INFINITE, Policy.subMonitorFor(monitor, Policy.opWork * 20 / 100)); } catch (OperationCanceledException e) { workspace.getWorkManager().operationCanceled(); throw e; @@ -1055,6 +1064,11 @@ monitor.done(); } } + +public void setFileStore(FileStore store) { + fileManager = new FileManager(workspace, store); +} + /** * Restore the non-persisted state for the project. For example, read and set * the description from the local meta area. Also, open the property store etc. @@ -1126,7 +1140,7 @@ info.clearNatures(); // write out the project info to the meta area - getLocalManager().write(destProject, Policy.subMonitorFor(monitor, Policy.opWork * 10 / 100)); + getFileManager().write(destProject, Policy.subMonitorFor(monitor, Policy.opWork * 10 / 100)); // rename meta-area renameMetaArea(this, destProject, null);
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Resource.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Resource.java index e001317..24a6792 100644 --- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Resource.java +++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Resource.java
@@ -243,7 +243,7 @@ * @see IResource */ public void clearHistory(IProgressMonitor monitor) throws CoreException { - getLocalManager().getHistoryStore().removeAll(this); + workspace.getFileManager().getHistoryStore().removeAll(this); } public void convertToPhantom() throws CoreException { ResourceInfo info = getResourceInfo(false, true); @@ -251,7 +251,7 @@ return; info.clearSessionProperties(); info.set(M_PHANTOM); - getLocalManager().updateLocalSync(info, I_NULL_SYNC_INFO, getType() == FILE); + getFileManager().updateLocalSync(info, I_NULL_SYNC_INFO, getType() == FILE); info.setModificationStamp(IResource.NULL_STAMP); // should already be done by the #deleteResource call but left in // just to be safe and for code clarity. @@ -321,7 +321,7 @@ workspace.beginOperation(true); Resource destResource = workspace.newResource(makePathAbsolute(destination), getType()); - getLocalManager().copy(this, destResource, force, Policy.subMonitorFor(monitor, Policy.opWork)); + getFileManager().copy(this, destResource, force, Policy.subMonitorFor(monitor, Policy.opWork)); } catch (OperationCanceledException e) { workspace.getWorkManager().operationCanceled(); throw e; @@ -394,7 +394,7 @@ return; workspace.beginOperation(true); - getLocalManager().delete(this, force, true, keepHistory, Policy.subMonitorFor(monitor, Policy.opWork)); + getFileManager().delete(this, force, true, keepHistory, Policy.subMonitorFor(monitor, Policy.opWork)); } catch (OperationCanceledException e) { workspace.getWorkManager().operationCanceled(); throw e; @@ -515,8 +515,8 @@ public IPath getFullPath() { return path; } -public FileSystemResourceManager getLocalManager() { - return workspace.getFileSystemManager(); +public FileManager getFileManager() { + return ((Project) getProject()).getFileManager(); } /** * @see IResource#getLocation @@ -525,7 +525,7 @@ IProject project = getProject(); if (project != null && !project.exists()) return null; - return getLocalManager().locationFor(this); + return getFileManager().locationFor(this); } /** @@ -839,7 +839,7 @@ if (!force) if (!visitor.getStatus().isOK()) throw new ResourceException(visitor.getStatus()); - getLocalManager().move(this, destination, keepHistory, Policy.subMonitorFor(monitor, 70)); + getFileManager().move(this, destination, keepHistory, Policy.subMonitorFor(monitor, 70)); } finally { monitor.done(); } @@ -858,7 +858,7 @@ if (getType() != ROOT && !getProject().isAccessible()) return; workspace.beginOperation(true); - build = getLocalManager().refresh(this, depth, Policy.subMonitorFor(monitor, Policy.opWork)); + build = getFileManager().refresh(this, depth, Policy.subMonitorFor(monitor, Policy.opWork)); } catch (OperationCanceledException e) { workspace.getWorkManager().operationCanceled(); throw e;
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/SaveManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/SaveManager.java index 3e7f4ec..0d2ac23 100644 --- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/SaveManager.java +++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/SaveManager.java
@@ -684,7 +684,7 @@ protected void saveMetaInfo(Project project, IProgressMonitor monitor) throws CoreException { ProjectDescription description = (ProjectDescription) project.internalGetDescription(); if (description.isDirty()) { - workspace.getFileSystemManager().write(project, null); + workspace.getFileManager().write(project, null); description.clean(); } } @@ -1131,7 +1131,7 @@ removeUnusedSafeTables(); removeUnusedTreeFiles(); cleanMasterTable(); - workspace.getFileSystemManager().getHistoryStore().clean(); + workspace.getFileManager().getHistoryStore().clean(); } workspace.endOperation(false, null); }
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Workspace.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Workspace.java index c01e432..7cf15af 100644 --- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Workspace.java +++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Workspace.java
@@ -8,7 +8,7 @@ import org.eclipse.core.resources.*; import org.eclipse.core.runtime.*; import org.eclipse.core.internal.events.*; -import org.eclipse.core.internal.localstore.FileSystemResourceManager; +import org.eclipse.core.internal.localstore.FileManager; import org.eclipse.core.internal.properties.PropertyManager; import org.eclipse.core.internal.utils.*; import org.eclipse.core.internal.watson.*; @@ -24,7 +24,7 @@ protected SaveManager saveManager; protected BuildManager buildManager; protected NotificationManager notificationManager; - protected FileSystemResourceManager fileSystemManager; + protected FileManager fileManager; protected PropertyManager propertyManager; protected MarkerManager markerManager; protected long nextNodeId = 0; @@ -810,8 +810,8 @@ public ElementTree getElementTree() { return tree; } -public FileSystemResourceManager getFileSystemManager() { - return fileSystemManager; +public FileManager getFileManager() { + return fileManager; } /** * Returns the marker manager for this workspace @@ -1262,7 +1262,7 @@ protected void shutdown(IProgressMonitor monitor) throws CoreException { monitor = Policy.monitorFor(monitor); try { - IManager[] managers = { buildManager, notificationManager, propertyManager, fileSystemManager, markerManager, saveManager, workManager }; + IManager[] managers = { buildManager, notificationManager, propertyManager, fileManager, markerManager, saveManager, workManager }; monitor.beginTask(null, managers.length); String message = Policy.bind("resources.shutdownProblems"); MultiStatus status = new MultiStatus(ResourcesPlugin.PI_RESOURCES, IResourceStatus.INTERNAL_ERROR, message, null); @@ -1283,7 +1283,7 @@ buildManager = null; notificationManager = null; propertyManager = null; - fileSystemManager = null; + fileManager = null; markerManager = null; synchronizer = null; saveManager = null; @@ -1298,8 +1298,8 @@ // ensure the tree is locked during the startup notification workManager = new WorkManager(this); workManager.startup(null); - fileSystemManager = new FileSystemResourceManager(this); - fileSystemManager.startup(monitor); + fileManager = new FileManager(this); + fileManager.startup(monitor); propertyManager = new PropertyManager(this); propertyManager.startup(monitor); buildManager = new BuildManager(this);
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspaceRoot.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspaceRoot.java index ba0bd08..268fcd6 100644 --- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspaceRoot.java +++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspaceRoot.java
@@ -7,6 +7,7 @@ import org.eclipse.core.resources.*; import org.eclipse.core.runtime.*; +import org.eclipse.core.internal.localstore.FileManager; import org.eclipse.core.internal.utils.Assert; import org.eclipse.core.internal.utils.Policy; @@ -19,7 +20,7 @@ * @see IResource */ public void clearHistory(IProgressMonitor monitor) throws CoreException { - getLocalManager().getHistoryStore().removeAll(); + getFileManager().getHistoryStore().removeAll(); } /** * @see IResource#delete @@ -69,14 +70,19 @@ * @see IWorkspaceRoot */ public IContainer getContainerForLocation(IPath location) { - return getLocalManager().containerFor(location); + return getFileManager().containerFor(location); } /** * @see IWorkspaceRoot */ public IFile getFileForLocation(IPath location) { - return getLocalManager().fileFor(location); + return getFileManager().fileFor(location); } + +public FileManager getFileManager() { + return workspace.getFileManager(); +} + /** * @see IResource#getLocation */