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 });