### Eclipse Workspace Patch 1.0
#P org.eclipse.jdt.core
Index: model/org/eclipse/jdt/internal/core/ExternalFoldersManager.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ExternalFoldersManager.java,v
retrieving revision 1.12
diff -u -r1.12 ExternalFoldersManager.java
--- model/org/eclipse/jdt/internal/core/ExternalFoldersManager.java 24 Sep 2008 16:28:14 -0000 1.12
+++ model/org/eclipse/jdt/internal/core/ExternalFoldersManager.java 25 Nov 2008 10:19:39 -0000
@@ -162,46 +162,55 @@
if (!project.exists()) {
createExternalFoldersProject(project, monitor);
}
- try {
- project.open(monitor);
- } catch (CoreException e1) {
- if (e1.getStatus().getCode() == IResourceStatus.FAILED_READ_METADATA) {
- // workspace was moved (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=241400)
- project.delete(true, monitor);
+ openExternalFoldersProject(project, monitor);
+ }
+ return project;
+ }
+
+ /*
+ * Attempt to open the given project (assuming it exists).
+ * If failing to open, make all attempts to recreate the missing pieces.
+ */
+ private void openExternalFoldersProject(IProject project, IProgressMonitor monitor) throws CoreException {
+ try {
+ project.open(monitor);
+ } catch (CoreException e1) {
+ if (e1.getStatus().getCode() == IResourceStatus.FAILED_READ_METADATA) {
+ // workspace was moved
+ // (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=241400 and https://bugs.eclipse.org/bugs/show_bug.cgi?id=252571 )
+ project.delete(false/*don't delete content*/, true/*force*/, monitor);
+ createExternalFoldersProject(project, monitor);
+ } else {
+ // .project or folder on disk have been deleted, recreate them
+ IPath stateLocation = DEBUG ? ResourcesPlugin.getWorkspace().getRoot().getLocation() : JavaCore.getPlugin().getStateLocation();
+ IPath projectPath = stateLocation.append(EXTERNAL_PROJECT_NAME);
+ projectPath.toFile().mkdirs();
+ try {
+ FileOutputStream output = new FileOutputStream(projectPath.append(".project").toOSString()); //$NON-NLS-1$
+ try {
+ output.write((
+ "\n" + //$NON-NLS-1$
+ "\n" + //$NON-NLS-1$
+ " " + EXTERNAL_PROJECT_NAME + "\n" + //$NON-NLS-1$ //$NON-NLS-2$
+ " \n" + //$NON-NLS-1$
+ " \n" + //$NON-NLS-1$
+ " \n" + //$NON-NLS-1$
+ " \n" + //$NON-NLS-1$
+ " \n" + //$NON-NLS-1$
+ " \n" + //$NON-NLS-1$
+ " \n" + //$NON-NLS-1$
+ "").getBytes()); //$NON-NLS-1$
+ } finally {
+ output.close();
+ }
+ } catch (IOException e) {
+ // fallback to re-creating the project
+ project.delete(false/*don't delete content*/, true/*force*/, monitor);
createExternalFoldersProject(project, monitor);
- } else {
- // .project or folder on disk have been deleted, recreate them
- IPath stateLocation = DEBUG ? ResourcesPlugin.getWorkspace().getRoot().getLocation() : JavaCore.getPlugin().getStateLocation();
- IPath projectPath = stateLocation.append(EXTERNAL_PROJECT_NAME);
- projectPath.toFile().mkdirs();
- try {
- FileOutputStream output = new FileOutputStream(projectPath.append(".project").toOSString()); //$NON-NLS-1$
- try {
- output.write((
- "\n" + //$NON-NLS-1$
- "\n" + //$NON-NLS-1$
- " " + EXTERNAL_PROJECT_NAME + "\n" + //$NON-NLS-1$ //$NON-NLS-2$
- " \n" + //$NON-NLS-1$
- " \n" + //$NON-NLS-1$
- " \n" + //$NON-NLS-1$
- " \n" + //$NON-NLS-1$
- " \n" + //$NON-NLS-1$
- " \n" + //$NON-NLS-1$
- " \n" + //$NON-NLS-1$
- "").getBytes()); //$NON-NLS-1$
- } finally {
- output.close();
- }
- } catch (IOException e) {
- // fallback to re-creating the project
- project.delete(true, monitor);
- createExternalFoldersProject(project, monitor);
- }
}
- project.open(monitor);
}
+ project.open(monitor);
}
- return project;
}
@@ -220,19 +229,26 @@
if (this.folders == null) {
this.folders = new HashMap();
IProject project = getExternalFoldersProject();
- if (project.isAccessible()) {
- try {
- IResource[] members = project.members();
- for (int i = 0, length = members.length; i < length; i++) {
- IResource member = members[i];
- if (member.getType() == IResource.FOLDER && member.isLinked() && member.getName().startsWith(LINKED_FOLDER_NAME)) {
- IPath externalFolderPath = member.getLocation();
- this.folders.put(externalFolderPath, member);
- }
+ try {
+ if (!project.isAccessible()) {
+ if (project.exists()) {
+ // workspace was moved (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=252571 )
+ openExternalFoldersProject(project, null/*no progress*/);
+ } else {
+ // if project doesn't exist, do not open and recreate it as it means that there are no external folders
+ return this.folders;
+ }
+ }
+ IResource[] members = project.members();
+ for (int i = 0, length = members.length; i < length; i++) {
+ IResource member = members[i];
+ if (member.getType() == IResource.FOLDER && member.isLinked() && member.getName().startsWith(LINKED_FOLDER_NAME)) {
+ IPath externalFolderPath = member.getLocation();
+ this.folders.put(externalFolderPath, member);
}
- } catch (CoreException e) {
- Util.log(e, "Exception while initializing external folders"); //$NON-NLS-1$
}
+ } catch (CoreException e) {
+ Util.log(e, "Exception while initializing external folders"); //$NON-NLS-1$
}
}
return this.folders;