Bug 509612 - Address slowness in JarPackageFragmentRoot.computeChildren

Add indexer support for indexing the JDK version for each .jar file
in the index.

Change-Id: I10d616bf8ce8359d6e71fe2508c813006e70c3ec
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/indexer/Indexer.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/indexer/Indexer.java
index 2380780..768ce4b 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/indexer/Indexer.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/indexer/Indexer.java
@@ -762,6 +762,7 @@
 							+ resourceFile.getLocation().getString() + " " + resourceFile.address); //$NON-NLS-1$
 				}
 				converter.addType(binaryType, fieldDescriptor, subMonitor.split(45));
+				resourceFile.setJdkLevel(binaryType.getVersion());
 				indexed = true;
 			}
 		} finally {
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/java/JavaIndex.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/java/JavaIndex.java
index 19d4eeb..cbcc001 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/java/JavaIndex.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/java/JavaIndex.java
@@ -34,9 +34,9 @@
 
 public class JavaIndex {
 	// Version constants
-	static final int CURRENT_VERSION = Nd.version(1, 39);
-	static final int MAX_SUPPORTED_VERSION = Nd.version(1, 39);
-	static final int MIN_SUPPORTED_VERSION = Nd.version(1, 39);
+	static final int CURRENT_VERSION = Nd.version(1, 40);
+	static final int MAX_SUPPORTED_VERSION = Nd.version(1, 40);
+	static final int MIN_SUPPORTED_VERSION = Nd.version(1, 40);
 
 	// Fields for the search header
 	public static final FieldSearchIndex<NdResourceFile> FILES;
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/java/NdResourceFile.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/java/NdResourceFile.java
index 358fcf8..e18ae26 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/java/NdResourceFile.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/java/NdResourceFile.java
@@ -42,6 +42,7 @@
 	public static final FieldLong HASHCODE_LAST_SCANNED;
 	public static final FieldOneToMany<NdWorkspaceLocation> WORKSPACE_MAPPINGS;
 	public static final FieldString JAVA_ROOT;
+	public static final FieldLong JDK_LEVEL;
 
 	@SuppressWarnings("hiding")
 	public static final StructDef<NdResourceFile> type;
@@ -56,9 +57,12 @@
 		HASHCODE_LAST_SCANNED = type.addLong();
 		WORKSPACE_MAPPINGS = FieldOneToMany.create(type, NdWorkspaceLocation.RESOURCE);
 		JAVA_ROOT = type.addString();
+		JDK_LEVEL = type.addLong();
 		type.done();
 	}
 
+	private long jdkLevel; 
+
 	public NdResourceFile(Nd dom, long address) {
 		super(dom, address);
 	}
@@ -67,6 +71,19 @@
 		super(nd, null);
 	}
 
+	public long getJdkLevel() {
+		if (this.jdkLevel == 0) {
+			this.jdkLevel = JDK_LEVEL.get(getNd(), this.address);
+		}
+		return this.jdkLevel;
+	}
+
+	public void setJdkLevel(long jdkLevel) {
+		if (getJdkLevel() != jdkLevel) {
+			JDK_LEVEL.put(getNd(), this.address, jdkLevel);
+		}
+	}
+
 	public List<NdTreeNode> getChildren() {
 		return CHILDREN.asList(this.getNd(), this.address);
 	}