### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core 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.335 diff -u -r1.335 DeltaProcessor.java --- model/org/eclipse/jdt/internal/core/DeltaProcessor.java 23 Apr 2009 15:32:17 -0000 1.335 +++ model/org/eclipse/jdt/internal/core/DeltaProcessor.java 25 Apr 2010 20:06:57 -0000 @@ -1886,9 +1886,9 @@ // notification we see, implies that all projects are about to be refreshed. projects = ((IWorkspace) o).getRoot().getProjects(IContainer.INCLUDE_HIDDEN); } - for (int i = 0; projects != null && i < projects.length; i++) { - JavaModelManager.getExternalManager().refreshReferences(projects[i], null); - } + //https://bugs.eclipse.org/bugs/show_bug.cgi?id=302295 + // Refresh all project references together in a single job + JavaModelManager.getExternalManager().refreshReferences(projects, null); return; case IResourceChangeEvent.POST_CHANGE : 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.16 diff -u -r1.16 ExternalFoldersManager.java --- model/org/eclipse/jdt/internal/core/ExternalFoldersManager.java 7 Mar 2009 00:58:57 -0000 1.16 +++ model/org/eclipse/jdt/internal/core/ExternalFoldersManager.java 25 Apr 2010 20:06:57 -0000 @@ -46,7 +46,7 @@ * Returns a set of external path to external folders referred to on the given classpath. * Returns null if none. */ - public static HashSet getExternalFolders(IClasspathEntry[] classpath) { + public static HashSet getExternalFolders(IClasspathEntry[] classpath) { if (classpath == null) return null; HashSet folders = null; @@ -258,6 +258,36 @@ /* * Refreshes the external folders referenced on the classpath of the given source project */ + public void refreshReferences(final IProject[] sourceProjects, IProgressMonitor monitor) { + IProject externalProject = getExternalFoldersProject(); + try { + HashSet externalFolders = null; + for (int index = 0; index < sourceProjects.length; index++) { + if (sourceProjects[index].equals(externalProject)) + continue; + if (!JavaProject.hasJavaNature(sourceProjects[index])) + continue; + + HashSet foldersInProject = getExternalFolders(((JavaProject) JavaCore.create(sourceProjects[index])).getResolvedClasspath()); + + if (foldersInProject == null || foldersInProject.size() == 0) + continue; + if (externalFolders == null) + externalFolders = new HashSet(); + + externalFolders.addAll(foldersInProject); + } + if (externalFolders == null) + return; + + Iterator iterator = externalFolders.iterator(); + Job refreshJob = new RefreshJob(iterator); + refreshJob.schedule(); + } catch (CoreException e) { + Util.log(e, "Exception while refreshing external project"); //$NON-NLS-1$ + } + return; + } public void refreshReferences(IProject source, IProgressMonitor monitor) { IProject externalProject = getExternalFoldersProject(); if (source.equals(externalProject)) @@ -268,25 +298,9 @@ HashSet externalFolders = getExternalFolders(((JavaProject) JavaCore.create(source)).getResolvedClasspath()); if (externalFolders == null) return; - 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; - } - }; + Iterator iterator = externalFolders.iterator(); + + Job refreshJob = new RefreshJob(iterator); refreshJob.schedule(); } catch (CoreException e) { Util.log(e, "Exception while refreshing external project"); //$NON-NLS-1$ @@ -298,5 +312,31 @@ return (IFolder) getFolders().remove(externalFolderPath); } - + class RefreshJob extends Job { + Iterator externalFolders = null; + RefreshJob(Iterator externalFolders){ + super(Messages.refreshing_external_folders); + this.externalFolders = externalFolders; + } + + public boolean belongsTo(Object family) { + return family == ResourcesPlugin.FAMILY_MANUAL_REFRESH; + } + + protected IStatus run(IProgressMonitor pm) { + try { + while (this.externalFolders.hasNext()) { + IPath externalPath = (IPath) this.externalFolders.next(); + IFolder folder = getFolder(externalPath); + if (folder != null) { + folder.refreshLocal(IResource.DEPTH_INFINITE, pm); + } + } + } catch (CoreException e) { + return e.getStatus(); + } + return Status.OK_STATUS; + } + } + } 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.78 diff -u -r1.78 messages.properties --- model/org/eclipse/jdt/internal/core/util/messages.properties 11 Nov 2009 14:35:55 -0000 1.78 +++ model/org/eclipse/jdt/internal/core/util/messages.properties 25 Apr 2010 20:06:57 -0000 @@ -184,7 +184,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" +refreshing_external_folders = Refreshing external folders ## java model initialization javamodel_initialization = Initializing Java tooling