Bug 440470: debugger source lookup is much slower than 4.3
Fixes performance regression from bug 410207.
Like every IJavaElement, JarPackageFragmentRoot is supposed to be a *handle*, i.e. it should be very lightweight and its creation should be cheap and should not depend on availability of the referenced element.
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.java
index 1127e5c..e180c84 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.java
@@ -40,11 +40,6 @@
private final static ArrayList EMPTY_LIST = new ArrayList();
/**
- * Compiler compliance level that was used to produce the jar.
- */
- protected final String complianceLevel;
-
- /**
* The path to the jar file
* (a workspace relative path if the jar is internal,
* or an OS path if the jar is external)
@@ -59,9 +54,6 @@
protected JarPackageFragmentRoot(IPath externalJarPath, JavaProject project) {
super(null, project);
this.jarPath = externalJarPath;
- Object file = JavaModel.getTarget(getPath(), true);
- long level = Util.getJdkLevel(file);
- this.complianceLevel = CompilerOptions.versionFromJdkLevel(level);
}
/**
* Constructs a package fragment root which is the root of the Java package directory hierarchy
@@ -70,9 +62,6 @@
protected JarPackageFragmentRoot(IResource resource, JavaProject project) {
super(resource, project);
this.jarPath = resource.getFullPath();
- Object file = JavaModel.getTarget(getPath(), true);
- long level = Util.getJdkLevel(file);
- this.complianceLevel = CompilerOptions.versionFromJdkLevel(level);
}
/**
@@ -85,6 +74,9 @@
IJavaElement[] children;
ZipFile jar = null;
try {
+ Object file = JavaModel.getTarget(getPath(), true);
+ long level = Util.getJdkLevel(file);
+ String compliance = CompilerOptions.versionFromJdkLevel(level);
jar = getJar();
// always create the default package
@@ -92,7 +84,7 @@
for (Enumeration e= jar.entries(); e.hasMoreElements();) {
ZipEntry member= (ZipEntry) e.nextElement();
- initRawPackageInfo(rawPackageInfo, member.getName(), member.isDirectory());
+ initRawPackageInfo(rawPackageInfo, member.getName(), member.isDirectory(), compliance);
}
// loop through all of referenced packages, creating package fragments if necessary
@@ -219,7 +211,7 @@
public int hashCode() {
return this.jarPath.hashCode();
}
- private void initRawPackageInfo(HashtableOfArrayToObject rawPackageInfo, String entryName, boolean isDirectory) {
+ private void initRawPackageInfo(HashtableOfArrayToObject rawPackageInfo, String entryName, boolean isDirectory, String compliance) {
int lastSeparator = isDirectory ? entryName.length()-1 : entryName.lastIndexOf('/');
String[] pkgName = Util.splitOn('/', entryName, 0, lastSeparator);
String[] existing = null;
@@ -233,8 +225,7 @@
JavaModelManager manager = JavaModelManager.getJavaModelManager();
for (int i = existingLength; i < length; i++) {
// sourceLevel must be null because we know nothing about it based on a jar file
- // complianceLevel can be retrieved from a jar file
- if (Util.isValidFolderNameForPackage(pkgName[i], null, this.complianceLevel)) {
+ if (Util.isValidFolderNameForPackage(pkgName[i], null, compliance)) {
System.arraycopy(existing, 0, existing = new String[i+1], 0, i);
existing[i] = manager.intern(pkgName[i]);
rawPackageInfo.put(existing, new ArrayList[] { EMPTY_LIST, EMPTY_LIST });