### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core.tests.performance Index: src/org/eclipse/jdt/core/tests/performance/FullSourceWorkspaceTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.performance/src/org/eclipse/jdt/core/tests/performance/FullSourceWorkspaceTests.java,v retrieving revision 1.45 diff -u -r1.45 FullSourceWorkspaceTests.java --- src/org/eclipse/jdt/core/tests/performance/FullSourceWorkspaceTests.java 29 May 2007 15:43:10 -0000 1.45 +++ src/org/eclipse/jdt/core/tests/performance/FullSourceWorkspaceTests.java 28 Aug 2007 08:59:20 -0000 @@ -128,7 +128,7 @@ // Index variables - protected static IndexManager INDEX_MANAGER = JavaModelManager.getJavaModelManager().getIndexManager(); + protected static IndexManager INDEX_MANAGER = JavaModelManager.getIndexManager(); // Tests infos protected static int ALL_TESTS_COUNT = 0; #P org.eclipse.jdt.core.tests.model Index: src/org/eclipse/jdt/core/tests/model/SearchTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/SearchTests.java,v retrieving revision 1.42 diff -u -r1.42 SearchTests.java --- src/org/eclipse/jdt/core/tests/model/SearchTests.java 24 Aug 2007 05:58:27 -0000 1.42 +++ src/org/eclipse/jdt/core/tests/model/SearchTests.java 28 Aug 2007 08:59:26 -0000 @@ -233,7 +233,7 @@ * a project causes another request to reindex. */ public void testChangeClasspath() throws CoreException, TimeOutException { - IndexManager indexManager = JavaModelManager.getJavaModelManager().getIndexManager(); + IndexManager indexManager = JavaModelManager.getIndexManager(); WaitingJob job = new WaitingJob(); try { // setup: suspend indexing and create a project (prj=src) with one cu @@ -335,7 +335,7 @@ * (regression test for bug 35306 Index update request can be incorrectly handled) */ public void testConcurrentJob() throws CoreException, InterruptedException, IOException, TimeOutException { - IndexManager indexManager = JavaModelManager.getJavaModelManager().getIndexManager(); + IndexManager indexManager = JavaModelManager.getIndexManager(); WaitingJob job = new WaitingJob(); try { // setup: suspend indexing and create a project with one empty jar on its classpath @@ -413,7 +413,7 @@ * (regression test for bug 33571 SearchEngine.searchAllTypeNames: NPE when passing null as progress monitor) */ public void testNullProgressMonitor() throws CoreException, TimeOutException { - IndexManager indexManager = JavaModelManager.getJavaModelManager().getIndexManager(); + IndexManager indexManager = JavaModelManager.getIndexManager(); WaitingJob job = new WaitingJob(); try { // add waiting job and wait for it to be executed Index: src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java,v retrieving revision 1.120 diff -u -r1.120 JavaSearchBugsTests.java --- src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java 24 Aug 2007 13:52:11 -0000 1.120 +++ src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java 28 Aug 2007 08:59:25 -0000 @@ -8404,7 +8404,7 @@ */ public void testBug181488a() throws CoreException { waitUntilIndexesReady(); - IndexManager manager = JavaModelManager.getJavaModelManager().getIndexManager(); + IndexManager manager = JavaModelManager.getIndexManager(); Index index = manager.getIndex(JAVA_PROJECT.getPath(), true, false); long lastModified = index.getIndexFile().lastModified(); simulateExitRestart(); @@ -8416,7 +8416,7 @@ IJavaProject project = createJavaProject("Bug181488"); try { waitUntilIndexesReady(); - IndexManager manager = JavaModelManager.getJavaModelManager().getIndexManager(); + IndexManager manager = JavaModelManager.getIndexManager(); Index index = manager.getIndex(project.getPath(), true, false); assertEquals("Index file should at least contains the signature!!!", DiskIndex.SIGNATURE.length()+6, index.getIndexFile().length()); } Index: src/org/eclipse/jdt/core/tests/model/JavaSearchScopeTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchScopeTests.java,v retrieving revision 1.10 diff -u -r1.10 JavaSearchScopeTests.java --- src/org/eclipse/jdt/core/tests/model/JavaSearchScopeTests.java 8 Aug 2007 15:28:12 -0000 1.10 +++ src/org/eclipse/jdt/core/tests/model/JavaSearchScopeTests.java 28 Aug 2007 08:59:25 -0000 @@ -997,7 +997,7 @@ deleteFile("/P1/src/Test.java"); // Index the output location as it is a library for the project - IndexManager indexManager = JavaModelManager.getJavaModelManager().getIndexManager(); + IndexManager indexManager = JavaModelManager.getIndexManager(); indexManager.indexLibrary(new Path("/P1/bin"), project.getProject()); waitUntilIndexesReady(); Index: src/org/eclipse/jdt/core/tests/model/ClasspathInitializerTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ClasspathInitializerTests.java,v retrieving revision 1.52 diff -u -r1.52 ClasspathInitializerTests.java --- src/org/eclipse/jdt/core/tests/model/ClasspathInitializerTests.java 18 Aug 2007 18:03:17 -0000 1.52 +++ src/org/eclipse/jdt/core/tests/model/ClasspathInitializerTests.java 28 Aug 2007 08:59:23 -0000 @@ -20,7 +20,6 @@ import org.eclipse.jdt.internal.core.JavaModelManager; import org.eclipse.jdt.internal.core.JavaModelStatus; import org.eclipse.jdt.internal.core.UserLibraryClasspathContainer; -import org.eclipse.jdt.internal.core.UserLibraryManager; import junit.framework.Test; @@ -1379,7 +1378,7 @@ // Modify user library Preferences preferences = JavaCore.getPlugin().getPluginPreferences(); - String propertyName = UserLibraryManager.CP_USERLIBRARY_PREFERENCES_PREFIX+"SWT"; + String propertyName = JavaModelManager.CP_USERLIBRARY_PREFERENCES_PREFIX+"SWT"; StringBuffer propertyValue = new StringBuffer("\r\n\r\n 0) { // If errors then wait for indexes to finish while (indexManager.awaitingJobsCount() > 0) { Index: src/org/eclipse/jdt/core/tests/model/ReconcilerStatementsRecoveryTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ReconcilerStatementsRecoveryTests.java,v retrieving revision 1.6 diff -u -r1.6 ReconcilerStatementsRecoveryTests.java --- src/org/eclipse/jdt/core/tests/model/ReconcilerStatementsRecoveryTests.java 16 Mar 2007 18:35:31 -0000 1.6 +++ src/org/eclipse/jdt/core/tests/model/ReconcilerStatementsRecoveryTests.java 28 Aug 2007 08:59:25 -0000 @@ -74,7 +74,7 @@ } // Expect no error as soon as indexing is finished protected void assertNoProblem(char[] source, ICompilationUnit unit) throws InterruptedException, JavaModelException { - IndexManager indexManager = JavaModelManager.getJavaModelManager().getIndexManager(); + IndexManager indexManager = JavaModelManager.getIndexManager(); if (this.problemRequestor.problemCount > 0) { // If errors then wait for indexes to finish while (indexManager.awaitingJobsCount() > 0) { Index: src/org/eclipse/jdt/core/tests/model/JavaProjectTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaProjectTests.java,v retrieving revision 1.87 diff -u -r1.87 JavaProjectTests.java --- src/org/eclipse/jdt/core/tests/model/JavaProjectTests.java 24 Aug 2007 13:02:27 -0000 1.87 +++ src/org/eclipse/jdt/core/tests/model/JavaProjectTests.java 28 Aug 2007 08:59:23 -0000 @@ -26,7 +26,6 @@ import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.core.JavaModelManager; import org.eclipse.jdt.internal.core.PackageFragmentRoot; -import org.eclipse.jdt.internal.core.UserLibraryManager; import org.eclipse.jdt.internal.core.util.Util; public class JavaProjectTests extends ModifyingResourceTests { @@ -1526,7 +1525,7 @@ // Verify it has been written in preferences IEclipsePreferences instancePreferences = JavaModelManager.getJavaModelManager().getInstancePreferences(); - String containerKey = UserLibraryManager.CP_USERLIBRARY_PREFERENCES_PREFIX+"TEST"; + String containerKey = JavaModelManager.CP_USERLIBRARY_PREFERENCES_PREFIX+"TEST"; String libraryPreference = instancePreferences.get(containerKey, null); assertNotNull("Should get a preference for TEST user library", libraryPreference); #P org.eclipse.jdt.core.tests Index: Eclipse Java Tests Model/src/org/eclipse/jdt/tests/core/OldSearchTests.java =================================================================== RCS file: /home/cvs/numbat/org.eclipse.jdt.core.tests/Eclipse Java Tests Model/src/org/eclipse/jdt/tests/core/OldSearchTests.java,v retrieving revision 1.29 diff -u -r1.29 OldSearchTests.java --- Eclipse Java Tests Model/src/org/eclipse/jdt/tests/core/OldSearchTests.java 6 Mar 2007 04:29:56 -0000 1.29 +++ Eclipse Java Tests Model/src/org/eclipse/jdt/tests/core/OldSearchTests.java 28 Aug 2007 08:57:00 -0000 @@ -4790,7 +4790,7 @@ }; IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] {project}); - IndexManager indexManager = JavaModelManager.getJavaModelManager().getIndexManager(); + IndexManager indexManager = JavaModelManager.getIndexManager(); IProgressMonitor progressMonitor = new SearchProgress("", new StringBuffer(100)); indexManager.performConcurrentJob( @@ -4833,7 +4833,7 @@ }; IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] {project}); - IndexManager indexManager = JavaModelManager.getJavaModelManager().getIndexManager(); + IndexManager indexManager = JavaModelManager.getIndexManager(); IProgressMonitor progressMonitor = new SearchProgress("", new StringBuffer(100)); indexManager.performConcurrentJob( @@ -4881,7 +4881,7 @@ }; IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] {project}); - IndexManager indexManager = JavaModelManager.getJavaModelManager().getIndexManager(); + IndexManager indexManager = JavaModelManager.getIndexManager(); IProgressMonitor progressMonitor = new SearchProgress("", new StringBuffer(100)); indexManager.performConcurrentJob( @@ -5365,7 +5365,7 @@ }; IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] {project}); - IndexManager indexManager = JavaModelManager.getJavaModelManager().getIndexManager(); + IndexManager indexManager = JavaModelManager.getIndexManager(); IProgressMonitor progressMonitor = new SearchProgress("", new StringBuffer(100)); indexManager.performConcurrentJob( @@ -5424,7 +5424,7 @@ }; IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] {project}); - IndexManager indexManager = JavaModelManager.getJavaModelManager().getIndexManager(); + IndexManager indexManager = JavaModelManager.getIndexManager(); IProgressMonitor progressMonitor = new SearchProgress("", new StringBuffer(100)); indexManager.performConcurrentJob( @@ -5483,7 +5483,7 @@ }; IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] {project}); - IndexManager indexManager = JavaModelManager.getJavaModelManager().getIndexManager(); + IndexManager indexManager = JavaModelManager.getIndexManager(); IProgressMonitor progressMonitor = new SearchProgress("", new StringBuffer(100)); indexManager.performConcurrentJob( #P org.eclipse.jdt.core 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.375 diff -u -r1.375 JavaModelManager.java --- model/org/eclipse/jdt/internal/core/JavaModelManager.java 24 Aug 2007 13:02:31 -0000 1.375 +++ model/org/eclipse/jdt/internal/core/JavaModelManager.java 28 Aug 2007 08:59:34 -0000 @@ -133,6 +133,7 @@ public final static String CP_VARIABLE_PREFERENCES_PREFIX = JavaCore.PLUGIN_ID+".classpathVariable."; //$NON-NLS-1$ public final static String CP_CONTAINER_PREFERENCES_PREFIX = JavaCore.PLUGIN_ID+".classpathContainer."; //$NON-NLS-1$ + public final static String CP_USERLIBRARY_PREFERENCES_PREFIX = JavaCore.PLUGIN_ID+".userLibrary."; //$NON-NLS-1$ public final static String CP_ENTRY_IGNORE = "####"; //$NON-NLS-1$ public final static IPath CP_ENTRY_IGNORE_PATH = new Path(CP_ENTRY_IGNORE); public final static String TRUE = "true"; //$NON-NLS-1$ @@ -1213,7 +1214,7 @@ */ private ThreadLocal zipFiles = new ThreadLocal(); - private UserLibraryManager userLibraryManager; + UserLibraryManager userLibraryManager; /** * Update the classpath variable cache @@ -1281,9 +1282,49 @@ } catch (JavaModelException e) { // skip } + } else if (propertyName.startsWith(CP_USERLIBRARY_PREFERENCES_PREFIX)) { + String libName = propertyName.substring(CP_USERLIBRARY_PREFERENCES_PREFIX.length()); + UserLibraryManager manager = JavaModelManager.getUserLibraryManager(); + manager.updateUserLibrary(libName, (String)event.getNewValue()); } } } + /** + * Listener on eclipse preferences changes. + */ + EclipsePreferencesListener instancePreferencesListener = new EclipsePreferencesListener(); + /** + * Listener on eclipse preferences default/instance node changes. + */ + IEclipsePreferences.INodeChangeListener instanceNodeListener = new IEclipsePreferences.INodeChangeListener() { + public void added(IEclipsePreferences.NodeChangeEvent event) { + // do nothing + } + public void removed(IEclipsePreferences.NodeChangeEvent event) { + if (event.getChild() == preferencesLookup[PREF_INSTANCE]) { + preferencesLookup[PREF_INSTANCE] = ((IScopeContext) new InstanceScope()).getNode(JavaCore.PLUGIN_ID); + preferencesLookup[PREF_INSTANCE].addPreferenceChangeListener(new EclipsePreferencesListener()); + } + } + }; + IEclipsePreferences.INodeChangeListener defaultNodeListener = new IEclipsePreferences.INodeChangeListener() { + public void added(IEclipsePreferences.NodeChangeEvent event) { + // do nothing + } + public void removed(IEclipsePreferences.NodeChangeEvent event) { + if (event.getChild() == preferencesLookup[PREF_DEFAULT]) { + preferencesLookup[PREF_DEFAULT] = ((IScopeContext) new DefaultScope()).getNode(JavaCore.PLUGIN_ID); + } + } + }; + /** + * Listener on properties changes. + */ + Preferences.IPropertyChangeListener propertyListener = new Preferences.IPropertyChangeListener() { + public void propertyChange(Preferences.PropertyChangeEvent event) { + JavaModelManager.this.optionsCache = null; + } + }; /** * Constructs a new JavaModelManager @@ -1552,6 +1593,10 @@ public DeltaProcessor getDeltaProcessor() { return this.deltaState.getDeltaProcessor(); } + + public static DeltaProcessingState getDeltaState() { + return MANAGER.deltaState; + } /** * Returns the set of elements which are out of synch with their buffers. @@ -1560,8 +1605,8 @@ return this.elementsOutOfSynchWithBuffers; } - public IndexManager getIndexManager() { - return this.indexManager; + public static IndexManager getIndexManager() { + return MANAGER.indexManager; } /** @@ -1579,7 +1624,7 @@ } /** - * Get workpsace eclipse preference for JavaCore plugin. + * Get workspace eclipse preference for JavaCore plug-in. */ public IEclipsePreferences getInstancePreferences() { return preferencesLookup[PREF_INSTANCE]; @@ -1954,17 +1999,15 @@ } public static UserLibraryManager getUserLibraryManager() { - JavaModelManager modelManager = getJavaModelManager(); - if (modelManager.userLibraryManager == null) { + if (MANAGER.userLibraryManager == null) { UserLibraryManager libraryManager = new UserLibraryManager(); - synchronized(modelManager) { - if (modelManager.userLibraryManager == null) { // ensure another library manager was not set while creating the instance above - modelManager.userLibraryManager = libraryManager; - modelManager.getInstancePreferences().addPreferenceChangeListener(libraryManager); + synchronized(MANAGER) { + if (MANAGER.userLibraryManager == null) { // ensure another library manager was not set while creating the instance above + MANAGER.userLibraryManager = libraryManager; } } } - return modelManager.userLibraryManager; + return MANAGER.userLibraryManager; } /* @@ -2352,16 +2395,16 @@ } /** - * Initialize preferences lookups for JavaCore plugin. + * Initialize preferences lookups for JavaCore plug-in. */ public void initializePreferences() { - + // Create lookups preferencesLookup[PREF_INSTANCE] = ((IScopeContext) new InstanceScope()).getNode(JavaCore.PLUGIN_ID); preferencesLookup[PREF_DEFAULT] = ((IScopeContext) new DefaultScope()).getNode(JavaCore.PLUGIN_ID); // Listen to instance preferences node removal from parent in order to refresh stored one - IEclipsePreferences.INodeChangeListener listener = new IEclipsePreferences.INodeChangeListener() { + this.instanceNodeListener = new IEclipsePreferences.INodeChangeListener() { public void added(IEclipsePreferences.NodeChangeEvent event) { // do nothing } @@ -2372,11 +2415,11 @@ } } }; - ((IEclipsePreferences) preferencesLookup[PREF_INSTANCE].parent()).addNodeChangeListener(listener); - preferencesLookup[PREF_INSTANCE].addPreferenceChangeListener(new EclipsePreferencesListener()); + ((IEclipsePreferences) preferencesLookup[PREF_INSTANCE].parent()).addNodeChangeListener(this.instanceNodeListener); + preferencesLookup[PREF_INSTANCE].addPreferenceChangeListener(this.instancePreferencesListener = new EclipsePreferencesListener()); // Listen to default preferences node removal from parent in order to refresh stored one - listener = new IEclipsePreferences.INodeChangeListener() { + this.defaultNodeListener = new IEclipsePreferences.INodeChangeListener() { public void added(IEclipsePreferences.NodeChangeEvent event) { // do nothing } @@ -2386,7 +2429,7 @@ } } }; - ((IEclipsePreferences) preferencesLookup[PREF_DEFAULT].parent()).addNodeChangeListener(listener); + ((IEclipsePreferences) preferencesLookup[PREF_DEFAULT].parent()).addNodeChangeListener(this.defaultNodeListener); } public synchronized char[] intern(char[] array) { @@ -3893,55 +3936,55 @@ } /** - * Remove from secondary types cache all types belonging to a given file. - * Clean secondary types cache built while indexing if requested. - * - * Project's secondary types cache is found using file location. - * - * @param file File to remove - */ - public void secondaryTypesRemoving(IFile file, boolean cleanIndexCache) { - if (VERBOSE) { - StringBuffer buffer = new StringBuffer("JavaModelManager.removeFromSecondaryTypesCache("); //$NON-NLS-1$ - buffer.append(file.getName()); - buffer.append(')'); - Util.verbose(buffer.toString()); - } - if (file != null) { - PerProjectInfo projectInfo = getPerProjectInfo(file.getProject(), false); - if (projectInfo != null && projectInfo.secondaryTypes != null) { - if (VERBOSE) { - Util.verbose("-> remove file from cache of project: "+file.getProject().getName()); //$NON-NLS-1$ - } - - // Clean current cache - secondaryTypesRemoving(projectInfo.secondaryTypes, file); - - // Clean indexing cache if necessary - if (!cleanIndexCache) return; - HashMap indexingCache = (HashMap) projectInfo.secondaryTypes.get(INDEXED_SECONDARY_TYPES); - if (indexingCache != null) { - Set keys = indexingCache.keySet(); - int filesSize = keys.size(), filesCount = 0; - IFile[] removed = null; - Iterator cachedFiles = keys.iterator(); - while (cachedFiles.hasNext()) { - IFile cachedFile = (IFile) cachedFiles.next(); - if (file.equals(cachedFile)) { - if (removed == null) removed = new IFile[filesSize]; - filesSize--; - removed[filesCount++] = cachedFile; - } - } - if (removed != null) { - for (int i=0; i remove file from cache of project: "+file.getProject().getName()); //$NON-NLS-1$ + } + + // Clean current cache + secondaryTypesRemoving(projectInfo.secondaryTypes, file); + + // Clean indexing cache if necessary + if (!cleanIndexCache) return; + HashMap indexingCache = (HashMap) projectInfo.secondaryTypes.get(INDEXED_SECONDARY_TYPES); + if (indexingCache != null) { + Set keys = indexingCache.keySet(); + int filesSize = keys.size(), filesCount = 0; + IFile[] removed = null; + Iterator cachedFiles = keys.iterator(); + while (cachedFiles.hasNext()) { + IFile cachedFile = (IFile) cachedFiles.next(); + if (file.equals(cachedFile)) { + if (removed == null) removed = new IFile[filesSize]; + filesSize--; + removed[filesCount++] = cachedFile; + } + } + if (removed != null) { + for (int i=0; i