### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: model/org/eclipse/jdt/internal/core/ChangeClasspathOperation.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ChangeClasspathOperation.java,v retrieving revision 1.2 diff -u -r1.2 ChangeClasspathOperation.java --- model/org/eclipse/jdt/internal/core/ChangeClasspathOperation.java 10 Jul 2006 20:50:44 -0000 1.2 +++ model/org/eclipse/jdt/internal/core/ChangeClasspathOperation.java 15 May 2007 08:54:21 -0000 @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.jdt.internal.core; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.JavaModelException; @@ -43,6 +44,11 @@ DeltaProcessor deltaProcessor = state.getDeltaProcessor(); ClasspathChange change = (ClasspathChange) deltaProcessor.classpathChanges.get(project.getProject()); if (this.canChangeResources) { + // workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=177922 + if (isTopLevelOperation() && !ResourcesPlugin.getWorkspace().isTreeLocked()) { + new ClasspathValidation(project).validate(); + } + // delta, indexing and classpath markers are going to be created by the delta processor // while handling the .classpath file change #P org.eclipse.jdt.core.tests.model Index: src/org/eclipse/jdt/core/tests/model/ClasspathTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ClasspathTests.java,v retrieving revision 1.162 diff -u -r1.162 ClasspathTests.java --- src/org/eclipse/jdt/core/tests/model/ClasspathTests.java 9 May 2007 11:31:58 -0000 1.162 +++ src/org/eclipse/jdt/core/tests/model/ClasspathTests.java 15 May 2007 08:54:23 -0000 @@ -3715,6 +3715,37 @@ } /* + * Ensures that renaming a .jar file and updating the classpath in a PRE_BUILD event doesn't leave markers + * (regression test for bug 177922 FlexibleProjectContainer refresh logic sporadically leaves project with "missing library" error on rename/delete) + */ +public void testRenameJar() throws CoreException { + try { + final IJavaProject p = createJavaProject("P", new String[0], new String[] {"/P/lib/test1.jar"}, ""); + createFolder("/P/lib"); + createFile("/P/lib/test1.jar", ""); + // at this point no markers exist + + // register a listener that updates the classpath in a PRE_BUILD event + IResourceChangeListener listener = new IResourceChangeListener(){ + public void resourceChanged(IResourceChangeEvent event) { + try { + p.setRawClasspath(new IClasspathEntry[] {JavaCore.newLibraryEntry(new Path("/P/lib/test2.jar"), null, null)}, null); + } catch (JavaModelException e) { + e.printStackTrace(); + } + } + }; + getWorkspace().addResourceChangeListener(listener, IResourceChangeEvent.PRE_BUILD); + + // rename .jar + getFile("/P/lib/test1.jar").move(new Path("/P/lib/test2.jar"), false, null); + assertMarkers("Unexpected markers", "", p); + } finally { + deleteProject("P"); + } +} + +/* * Ensures that unknown classpath attributes in a .classpath file are not lost when read and rewritten. * (regression test for bug 101425 Classpath persistence should be resilient with unknown attributes) */