Blob Blame History Raw
### Eclipse Workspace Patch 1.0
#P org.eclipse.jdt.core
Index: model/org/eclipse/jdt/internal/core/SetClasspathOperation.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SetClasspathOperation.java,v
retrieving revision 1.153
diff -u -r1.153 SetClasspathOperation.java
--- model/org/eclipse/jdt/internal/core/SetClasspathOperation.java	27 May 2008 23:40:18 -0000	1.153
+++ model/org/eclipse/jdt/internal/core/SetClasspathOperation.java	6 Feb 2009 11:35:03 -0000
@@ -10,7 +10,11 @@
  *******************************************************************************/
 package org.eclipse.jdt.internal.core;
 
+import org.eclipse.core.resources.IResourceRuleFactory;
+import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.core.runtime.jobs.MultiRule;
 import org.eclipse.jdt.core.IClasspathEntry;
 import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jdt.core.IJavaModelStatus;
@@ -64,6 +68,20 @@
 			done();
 		}
 	}
+	
+	protected ISchedulingRule getSchedulingRule() {
+		if (this.canChangeResources) {
+			IResourceRuleFactory ruleFactory = ResourcesPlugin.getWorkspace().getRuleFactory();
+			return new MultiRule(new ISchedulingRule[] {
+				// use project modification rule as this is needed to create the .classpath file if it doesn't exist yet, or to update project references
+				ruleFactory.modifyRule(this.project.getProject()),
+				
+				// and external project modification rule in case the external folders are modified
+				ruleFactory.modifyRule(JavaModelManager.getExternalManager().getExternalFoldersProject())
+			});
+		}
+		return super.getSchedulingRule();
+	}
 
 	public String toString(){
 		StringBuffer buffer = new StringBuffer(20);
Index: model/org/eclipse/jdt/internal/core/JavaModelManager.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelManager.java,v
retrieving revision 1.397.2.4
diff -u -r1.397.2.4 JavaModelManager.java
--- model/org/eclipse/jdt/internal/core/JavaModelManager.java	8 Dec 2008 14:41:23 -0000	1.397.2.4
+++ model/org/eclipse/jdt/internal/core/JavaModelManager.java	6 Feb 2009 11:35:03 -0000
@@ -1188,41 +1188,19 @@
 			return buffer.toString();
 		}
 		
-		public boolean writeAndCacheClasspath(final JavaProject javaProject, final IClasspathEntry[] newRawClasspath, final IPath newOutputLocation) throws JavaModelException {
-			final boolean[] result = new boolean[1];
+		public boolean writeAndCacheClasspath(JavaProject javaProject, final IClasspathEntry[] newRawClasspath, final IPath newOutputLocation) throws JavaModelException {
 			try {
-				// use a workspace runnable so that the notification of .classpath file change is done outside the synchronized block (to avoid deadlocks)
-				IWorkspace workspace = 	ResourcesPlugin.getWorkspace();
-				workspace.run(new IWorkspaceRunnable() {
-					public void run(IProgressMonitor monitor) throws CoreException {
-						// ensure that the writing of the .classpath file and the caching in memory are synchronized (see also readAnCacheClasspath which is synchronized)
-						try {
-							PerProjectInfo.this.writtingRawClasspath = true;
-							synchronized (PerProjectInfo.this) {
-								if (!javaProject.writeFileEntries(newRawClasspath, newOutputLocation)) {
-									result[0] = false;
-									return;
-								}
-								// store new raw classpath, new output and new status, and null out resolved info
-								setClasspath(newRawClasspath, newOutputLocation, JavaModelStatus.VERIFIED_OK, null, null, null, null);
-								result[0] = true;
-							}
-						} finally {
-							PerProjectInfo.this.writtingRawClasspath = false;
-						}
-					}
-				}, 
-				workspace.getRuleFactory().modifyRule(this.project), // use project modification rule as this is needed to create the .classpath file if it doesn't exist yet
-				IWorkspace.AVOID_UPDATE,
-				null);
-			} catch (JavaModelException e) {
-			    // rethrow exception (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=245576 )
-				throw e;
-			} catch (CoreException e) {
-			    // rethrow exception (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=245576 )
-				throw new JavaModelException(e);
+				this.writtingRawClasspath = true;
+				// write .classpath
+				if (!javaProject.writeFileEntries(newRawClasspath, newOutputLocation)) {
+					return false;
+				}
+				// store new raw classpath, new output and new status, and null out resolved info
+				setClasspath(newRawClasspath, newOutputLocation, JavaModelStatus.VERIFIED_OK, null, null, null, null);
+			} finally {
+				this.writtingRawClasspath = false;
 			}
-			return result[0];
+			return true;
 		}
 	}