### 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.17 diff -u -r1.17 ExternalFoldersManager.java --- model/org/eclipse/jdt/internal/core/ExternalFoldersManager.java 25 Apr 2010 20:09:25 -0000 1.17 +++ model/org/eclipse/jdt/internal/core/ExternalFoldersManager.java 10 May 2010 15:49:32 -0000 @@ -14,6 +14,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -39,9 +40,20 @@ public class ExternalFoldersManager { private static final String EXTERNAL_PROJECT_NAME = ".org.eclipse.jdt.core.external.folders"; //$NON-NLS-1$ private static final String LINKED_FOLDER_NAME = ".link"; //$NON-NLS-1$ - private HashMap folders; + private Map folders; private int counter = 0; - + /* Singleton instance */ + private static ExternalFoldersManager MANAGER = new ExternalFoldersManager(); + + private ExternalFoldersManager() { + super(); + getFolders(); + } + + public static ExternalFoldersManager getExternalFoldersManager() { + return MANAGER; + } + /* * Returns a set of external path to external folders referred to on the given classpath. * Returns null if none. @@ -92,8 +104,8 @@ return addFolder(externalFolderPath, getExternalFoldersProject()); } - private synchronized IFolder addFolder(IPath externalFolderPath, IProject externalFoldersProject) { - HashMap knownFolders = getFolders(); + private IFolder addFolder(IPath externalFolderPath, IProject externalFoldersProject) { + Map knownFolders = getFolders(); Object existing = knownFolders.get(externalFolderPath); if (existing != null) { return (IFolder) existing; @@ -129,25 +141,27 @@ project.delete(true, monitor); } - private synchronized ArrayList getFoldersToCleanUp(IProgressMonitor monitor) throws CoreException { + private ArrayList getFoldersToCleanUp(IProgressMonitor monitor) throws CoreException { DeltaProcessingState state = JavaModelManager.getDeltaState(); HashMap roots = state.roots; HashMap sourceAttachments = state.sourceAttachments; if (roots == null && sourceAttachments == null) return null; - HashMap knownFolders = getFolders(); - Iterator iterator = knownFolders.entrySet().iterator(); + Map knownFolders = getFolders(); ArrayList result = null; - while (iterator.hasNext()) { - Map.Entry entry = (Map.Entry) iterator.next(); - IPath path = (IPath) entry.getKey(); - if ((roots != null && !roots.containsKey(path)) - && (sourceAttachments != null && !sourceAttachments.containsKey(path))) { - IFolder folder = (IFolder) entry.getValue(); - if (folder != null) { - if (result == null) - result = new ArrayList(); - result.add(folder); + synchronized (knownFolders) { + Iterator iterator = knownFolders.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry entry = (Map.Entry) iterator.next(); + IPath path = (IPath) entry.getKey(); + if ((roots != null && !roots.containsKey(path)) + && (sourceAttachments != null && !sourceAttachments.containsKey(path))) { + IFolder folder = (IFolder) entry.getValue(); + if (folder != null) { + if (result == null) + result = new ArrayList(); + result.add(folder); + } } } } @@ -222,13 +236,13 @@ project.create(desc, IResource.HIDDEN, monitor); } - public synchronized IFolder getFolder(IPath externalFolderPath) { + public IFolder getFolder(IPath externalFolderPath) { return (IFolder) getFolders().get(externalFolderPath); } - private HashMap getFolders() { + private Map getFolders() { if (this.folders == null) { - this.folders = new HashMap(); + this.folders = Collections.synchronizedMap(new HashMap()); IProject project = getExternalFoldersProject(); try { if (!project.isAccessible()) { @@ -308,7 +322,7 @@ return; } - public synchronized IFolder removeFolder(IPath externalFolderPath) { + public IFolder removeFolder(IPath externalFolderPath) { return (IFolder) getFolders().remove(externalFolderPath); } 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.449 diff -u -r1.449 JavaModelManager.java --- model/org/eclipse/jdt/internal/core/JavaModelManager.java 12 Apr 2010 10:04:31 -0000 1.449 +++ model/org/eclipse/jdt/internal/core/JavaModelManager.java 10 May 2010 15:49:36 -0000 @@ -451,7 +451,7 @@ /* whether an AbortCompilationUnit should be thrown when the source of a compilation unit cannot be retrieved */ public ThreadLocal abortOnMissingSource = new ThreadLocal(); - private ExternalFoldersManager externalFoldersManager = new ExternalFoldersManager(); + private ExternalFoldersManager externalFoldersManager = ExternalFoldersManager.getExternalFoldersManager(); /** * Returns whether the given full path (for a package) conflicts with the output location