### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core.tests.builder Index: src/org/eclipse/jdt/core/tests/builder/TestingEnvironment.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/TestingEnvironment.java,v retrieving revision 1.59 diff -u -r1.59 TestingEnvironment.java --- src/org/eclipse/jdt/core/tests/builder/TestingEnvironment.java 26 Feb 2008 10:11:36 -0000 1.59 +++ src/org/eclipse/jdt/core/tests/builder/TestingEnvironment.java 19 Mar 2008 12:26:29 -0000 @@ -1093,4 +1093,20 @@ } } while (wasInterrupted); } + + public void waitForManualRefresh() { + checkAssertion("a workspace must be open", fIsOpen); //$NON-NLS-1$ + boolean wasInterrupted = false; + do { + try { + Job.getJobManager().join(ResourcesPlugin.FAMILY_MANUAL_REFRESH, null); + wasInterrupted = false; + } catch (OperationCanceledException e) { + handle(e); + } catch (InterruptedException e) { + wasInterrupted = true; + } + } while (wasInterrupted); + } + } Index: src/org/eclipse/jdt/core/tests/builder/BuildpathTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/BuildpathTests.java,v retrieving revision 1.45 diff -u -r1.45 BuildpathTests.java --- src/org/eclipse/jdt/core/tests/builder/BuildpathTests.java 10 Mar 2008 10:41:24 -0000 1.45 +++ src/org/eclipse/jdt/core/tests/builder/BuildpathTests.java 19 Mar 2008 12:26:29 -0000 @@ -13,6 +13,7 @@ import junit.framework.*; import org.eclipse.core.resources.IMarker; +import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.*; import org.eclipse.core.runtime.preferences.IEclipsePreferences; @@ -314,8 +315,8 @@ ); new java.io.File(externalClassFile).setLastModified(lastModified + 1000); // to be sure its different - // work around for https://bugs.eclipse.org/bugs/show_bug.cgi?id=219566 - JavaModelManager.getExternalManager().refreshReferences(env.getProject(projectPath), null); + env.getProject(projectPath).refreshLocal(IResource.DEPTH_INFINITE, null); + env.waitForManualRefresh(); incrementalBuild(projectPath); expectingProblemsFor( #P org.eclipse.jdt.core.tests.model Index: src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java,v retrieving revision 1.205 diff -u -r1.205 AbstractJavaModelTests.java --- src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java 17 Mar 2008 07:56:59 -0000 1.205 +++ src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java 19 Mar 2008 12:26:30 -0000 @@ -2023,14 +2023,8 @@ } public void refresh(final IJavaProject javaProject) throws CoreException { - ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() { - public void run(IProgressMonitor pm) throws CoreException { - // work around for https://bugs.eclipse.org/bugs/show_bug.cgi?id=219566 - JavaModelManager.getExternalManager().refreshReferences(javaProject.getProject(), null); - - javaProject.getProject().refreshLocal(IResource.DEPTH_INFINITE, pm); - } - }, null); + javaProject.getProject().refreshLocal(IResource.DEPTH_INFINITE, null); + waitForManualRefresh(); } protected void removeJavaNature(String projectName) throws CoreException { @@ -2361,6 +2355,7 @@ try { javaProject.setRawClasspath(classpath, null); } catch (JavaModelException e) { + e.printStackTrace(); assertTrue("failed to set classpath", false); } } @@ -2686,6 +2681,20 @@ } while (wasInterrupted); } + public static void waitForManualRefresh() { + boolean wasInterrupted = false; + do { + try { + Job.getJobManager().join(ResourcesPlugin.FAMILY_MANUAL_REFRESH, null); + wasInterrupted = false; + } catch (OperationCanceledException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + wasInterrupted = true; + } + } while (wasInterrupted); + } + public static void waitUntilIndexesReady() { // dummy query for waiting until the indexes are ready SearchEngine engine = new SearchEngine(); #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.5 diff -u -r1.5 ExternalFoldersManager.java --- model/org/eclipse/jdt/internal/core/ExternalFoldersManager.java 10 Mar 2008 10:41:25 -0000 1.5 +++ model/org/eclipse/jdt/internal/core/ExternalFoldersManager.java 19 Mar 2008 12:26:32 -0000 @@ -25,8 +25,12 @@ 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.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jdt.internal.core.util.Messages; import org.eclipse.jdt.internal.core.util.Util; public class ExternalFoldersManager { @@ -221,13 +225,26 @@ HashSet externalFolders = getExternalFolders(JavaCore.create(source).getResolvedClasspath(true)); if (externalFolders == null) return; - Iterator iterator = externalFolders.iterator(); - while (iterator.hasNext()) { - IPath externalPath = (IPath) iterator.next(); - IFolder folder = getFolder(externalPath); - if (folder != null) - folder.refreshLocal(IResource.DEPTH_INFINITE, monitor); - } + final Iterator iterator = externalFolders.iterator(); + Job refreshJob = new Job(Messages.refreshing_external_folders) { + public boolean belongsTo(Object family) { + return family == ResourcesPlugin.FAMILY_MANUAL_REFRESH; + } + protected IStatus run(IProgressMonitor pm) { + try { + while (iterator.hasNext()) { + IPath externalPath = (IPath) iterator.next(); + IFolder folder = getFolder(externalPath); + if (folder != null) + folder.refreshLocal(IResource.DEPTH_INFINITE, pm); + } + } catch (CoreException e) { + return e.getStatus(); + } + return Status.OK_STATUS; + } + }; + refreshJob.schedule(); } catch (CoreException e) { Util.log(e, "Exception while refreshing external project"); //$NON-NLS-1$ } 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.387 diff -u -r1.387 JavaModelManager.java --- model/org/eclipse/jdt/internal/core/JavaModelManager.java 17 Mar 2008 07:57:16 -0000 1.387 +++ model/org/eclipse/jdt/internal/core/JavaModelManager.java 19 Mar 2008 12:26:33 -0000 @@ -4269,13 +4269,13 @@ // initialize Java model cache this.cache = new JavaModelCache(); - + // request state folder creation (workaround 19885) JavaCore.getPlugin().getStateLocation(); - + // Initialize eclipse preferences initializePreferences(); - + // Listen to preference changes this.propertyListener = new Preferences.IPropertyChangeListener() { public void propertyChange(Preferences.PropertyChangeEvent event) { @@ -4286,15 +4286,15 @@ // Listen to content-type changes Platform.getContentTypeManager().addContentTypeChangeListener(this); - + // retrieve variable values long start = -1; if (VERBOSE) start = System.currentTimeMillis(); - loadVariablesAndContainers(); - if (VERBOSE) + loadVariablesAndContainers(); + if (VERBOSE) traceVariableAndContainers("Loaded", start); //$NON-NLS-1$ - + final IWorkspace workspace = ResourcesPlugin.getWorkspace(); workspace.addResourceChangeListener( this.deltaState, @@ -4303,8 +4303,9 @@ | IResourceChangeEvent.POST_BUILD | IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.PRE_DELETE - | IResourceChangeEvent.PRE_CLOSE); - + | IResourceChangeEvent.PRE_CLOSE + | IResourceChangeEvent.PRE_REFRESH); + startIndexing(); // process deltas since last activated in indexer thread so that indexes are up-to-date. Index: model/org/eclipse/jdt/internal/core/DeltaProcessor.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessor.java,v retrieving revision 1.317 diff -u -r1.317 DeltaProcessor.java --- model/org/eclipse/jdt/internal/core/DeltaProcessor.java 17 Mar 2008 07:57:16 -0000 1.317 +++ model/org/eclipse/jdt/internal/core/DeltaProcessor.java 19 Mar 2008 12:26:32 -0000 @@ -1844,9 +1844,9 @@ * @see IResource */ public void resourceChanged(IResourceChangeEvent event) { - + int eventType = this.overridenEventType == -1 ? event.getType() : this.overridenEventType; - IResource resource = event.getResource(); + final IResource resource = event.getResource(); IResourceDelta delta = event.getDelta(); switch(eventType){ @@ -1862,6 +1862,10 @@ } return; + case IResourceChangeEvent.PRE_REFRESH: + JavaModelManager.getExternalManager().refreshReferences((IProject) resource, null); + return; + case IResourceChangeEvent.POST_CHANGE : HashSet elementsToRefresh = this.state.removeExternalElementsToRefresh(); if (isAffectedBy(delta) // avoid populating for SYNC or MARKER deltas @@ -1938,7 +1942,7 @@ case IResourceChangeEvent.PRE_BUILD : boolean isAffected = isAffectedBy(delta); boolean needCycleValidation = isAffected && validateClasspaths(delta); - + // update external folders if necessary ExternalFolderChange[] folderChanges = this.state.removeExternalFolderChanges(); if (folderChanges != null) { @@ -1991,7 +1995,7 @@ // does not fire any deltas return; - + case IResourceChangeEvent.POST_BUILD : JavaBuilder.buildFinished(); return; Index: model/org/eclipse/jdt/internal/core/util/messages.properties =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/messages.properties,v retrieving revision 1.70 diff -u -r1.70 messages.properties --- model/org/eclipse/jdt/internal/core/util/messages.properties 16 Jan 2008 11:52:53 -0000 1.70 +++ model/org/eclipse/jdt/internal/core/util/messages.properties 19 Mar 2008 12:26:33 -0000 @@ -177,6 +177,7 @@ path_mustBeAbsolute = Path must be absolute cache_invalidLoadFactor = Incorrect load factor savedState_jobName = Processing Java changes since last activation +refreshing_external_folders = "Refreshing external folders" ## java model initialization javamodel_initialization = Initializing Java tooling Index: model/org/eclipse/jdt/internal/core/util/Messages.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/Messages.java,v retrieving revision 1.20 diff -u -r1.20 Messages.java --- model/org/eclipse/jdt/internal/core/util/Messages.java 16 Jan 2008 11:52:53 -0000 1.20 +++ model/org/eclipse/jdt/internal/core/util/Messages.java 19 Mar 2008 12:26:33 -0000 @@ -178,6 +178,7 @@ public static String path_mustBeAbsolute; public static String cache_invalidLoadFactor; public static String savedState_jobName; + public static String refreshing_external_folders; public static String convention_unit_nullName; public static String convention_unit_notJavaName; public static String convention_classFile_nullName;