### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core.tests.performance Index: src/org/eclipse/jdt/core/tests/performance/FullSourceWorkspaceModelTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.performance/src/org/eclipse/jdt/core/tests/performance/FullSourceWorkspaceModelTests.java,v retrieving revision 1.23 diff -u -r1.23 FullSourceWorkspaceModelTests.java --- src/org/eclipse/jdt/core/tests/performance/FullSourceWorkspaceModelTests.java 2 Apr 2007 07:28:54 -0000 1.23 +++ src/org/eclipse/jdt/core/tests/performance/FullSourceWorkspaceModelTests.java 18 Apr 2007 17:04:27 -0000 @@ -16,21 +16,47 @@ import java.io.PrintStream; import java.util.ArrayList; -import junit.framework.*; +import junit.framework.Test; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.*; -import org.eclipse.jdt.core.*; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; +import org.eclipse.jdt.core.IClasspathEntry; +import org.eclipse.jdt.core.ICompilationUnit; +import org.eclipse.jdt.core.IField; +import org.eclipse.jdt.core.IInitializer; +import org.eclipse.jdt.core.IJavaElement; +import org.eclipse.jdt.core.IJavaModel; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.IMethod; +import org.eclipse.jdt.core.IPackageFragment; +import org.eclipse.jdt.core.IProblemRequestor; +import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.core.WorkingCopyOwner; import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.CompilationUnit; -import org.eclipse.jdt.core.search.*; +import org.eclipse.jdt.core.search.IJavaSearchConstants; +import org.eclipse.jdt.core.search.IJavaSearchScope; +import org.eclipse.jdt.core.search.SearchEngine; +import org.eclipse.jdt.core.search.SearchMatch; +import org.eclipse.jdt.core.search.SearchPattern; +import org.eclipse.jdt.core.search.SearchRequestor; +import org.eclipse.jdt.core.search.TypeNameRequestor; import org.eclipse.jdt.core.tests.model.AbstractJavaModelTests; import org.eclipse.jdt.core.tests.model.AbstractJavaModelTests.ProblemRequestor; -import org.eclipse.jdt.internal.core.*; +import org.eclipse.jdt.internal.core.DefaultWorkingCopyOwner; +import org.eclipse.jdt.internal.core.IJavaElementRequestor; +import org.eclipse.jdt.internal.core.JavaElement; +import org.eclipse.jdt.internal.core.JavaProject; +import org.eclipse.jdt.internal.core.NameLookup; import org.eclipse.test.performance.Performance; /** @@ -854,6 +880,68 @@ } } +/* + * Creates a simple Java project with no source folder and only rt.jar on its classpath. + */ +private IJavaProject createJavaProject(String name) throws CoreException { + IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name); + if (project.exists()) + project.delete(true, null); + project.create(null); + project.open(null); + IProjectDescription description = project.getDescription(); + description.setNatureIds(new String[] {JavaCore.NATURE_ID}); + project.setDescription(description, null); + IJavaProject javaProject = JavaCore.create(project); + javaProject.setRawClasspath(new IClasspathEntry[] {JavaCore.newVariableEntry(new Path("JRE_LIB"), null, null)}, null); + return javaProject; + +} +/* + * Performance test for the first use of findType(...) + * (see bug 161175 JarPackageFragmentRoot slow to initialize) + */ +public void testFindType() throws CoreException { + + // get 20 projects + IJavaModel model = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()); + int max = 20; + IJavaProject[] projects = new IJavaProject[max]; + for (int i = 0; i < max; i++) { + projects[i] = createJavaProject("FindType" + i); + } + AbstractJavaModelTests.waitUntilIndexesReady(); + AbstractJavaModelTests.waitForAutoBuild(); + + try { + // warm up + for (int i = 0; i < 5; i++) { + model.close(); + for (int j = 0; j < max; j++) { + projects[j].findType("java.lang.Object"); + } + } + + // measure performance + for (int i = 0; i < 10; i++) { + model.close(); + runGc(); + startMeasuring(); + for (int j = 0; j < max; j++) { + projects[j].findType("java.lang.Object"); + } + stopMeasuring(); + } + + commitMeasurements(); + assertPerformance(); + } finally { + for (int i = 0; i < max; i++) { + projects[i].getProject().delete(false, null); + } + } +} + public void testStartJDTPlugin() throws JavaModelException { // store current settings long oldSnapInterval = ENV.getWorkspace().getDescription().getSnapshotInterval(); #P org.eclipse.jdt.core Index: model/org/eclipse/jdt/internal/core/JavaProjectElementInfo.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaProjectElementInfo.java,v retrieving revision 1.44 diff -u -r1.44 JavaProjectElementInfo.java --- model/org/eclipse/jdt/internal/core/JavaProjectElementInfo.java 13 Apr 2007 16:02:15 -0000 1.44 +++ model/org/eclipse/jdt/internal/core/JavaProjectElementInfo.java 18 Apr 2007 17:04:29 -0000 @@ -206,13 +206,17 @@ roots = new IPackageFragmentRoot[0]; reverseMap.clear(); } + + HashMap otherRoots = JavaModelManager.getJavaModelManager().deltaState.otherRoots; HashtableOfArrayToObject fragmentsCache = new HashtableOfArrayToObject(); HashtableOfArrayToObject isPackageCache = new HashtableOfArrayToObject(); for (int i = 0, length = roots.length; i < length; i++) { IPackageFragmentRoot root = roots[i]; IJavaElement[] frags = null; try { - if (root.isArchive() && !root.isOpen()) { + if (root.isArchive() + && !root.isOpen() + && otherRoots.get(((JarPackageFragmentRoot) root).jarPath) == null/*only if jar belongs to 1 project (https://bugs.eclipse.org/bugs/show_bug.cgi?id=161175)*/) { JarPackageFragmentRootInfo info = new JarPackageFragmentRootInfo(); ((JarPackageFragmentRoot) root).computeChildren(info, new HashMap()); frags = info.children;