246275 Deadlock with taglib index and IJavaProject.getResolvedClasspath(boolean)
246795 Regression from 246275 (Deadlock with taglib index and IJavaProject.getResolvedClasspath(boolean))
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ProjectDescription.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ProjectDescription.java
index 306829a..ae17759 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ProjectDescription.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ProjectDescription.java
@@ -92,6 +92,14 @@
 import com.ibm.icu.text.Collator;
 import com.ibm.icu.util.StringTokenizer;
 
+/**
+ * Contains the tag library information for a single project.
+ * 
+ *  * <p>
+ * This class is neither intended to be instantiated nor accessed by clients.
+ * </p>
+ *
+ */
 class ProjectDescription {
 
 	class DeltaVisitor implements IResourceDeltaVisitor {
@@ -929,34 +937,39 @@
 	}
 
 	private void ensureUpTodate() {
-		try {
-			LOCK.acquire();
-
-			if (!fBuildPathIsDirty) {
+		IClasspathEntry[] entries = null;
+			try {
+				/*
+				 * If the Java nature isn't present (or something else is
+				 * wrong), don't check the build path.
+				 */
+				IJavaProject jproject = JavaCore.create(fProject);
+				if (jproject != null && jproject.exists()) {
+					entries = jproject.getResolvedClasspath(true);
+				}
+			}
+			catch (JavaModelException e) {
+				Logger.logException(e);
+			}
+		if (entries != null) {
+			try {
+				LOCK.acquire();
 				/*
 				 * Double-check that the number of build path entries has not
 				 * changed. This should cover most cases such as when a
 				 * library is added into or removed from a container.
 				 */
-				try {
-					IJavaProject jproject = JavaCore.create(fProject);
-					if (jproject != null && jproject.exists()) {
-						IClasspathEntry[] entries = jproject.getResolvedClasspath(true);
-						fBuildPathIsDirty = (fBuildPathEntryCount != entries.length);
-					}
-				}
-				catch (JavaModelException e) {
-					Logger.logException(e);
+				fBuildPathIsDirty = fBuildPathIsDirty || (fBuildPathEntryCount != entries.length);
+
+				if (fBuildPathIsDirty) {
+					indexClasspath(entries);
+					fBuildPathIsDirty = false;
 				}
 			}
-			if (fBuildPathIsDirty) {
-				indexClasspath();
-				fBuildPathIsDirty = false;
+			finally {
+				LOCK.release();
 			}
 		}
-		finally {
-			LOCK.release();
-		}
 	}
 
 	private TaglibInfo extractInfo(String basePath, InputStream tldContents) {
@@ -1312,6 +1325,9 @@
 			Logger.log(Logger.INFO, "indexed " + fProject.getName() + " contents in " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 	}
 
+	/**
+	 * @deprecated
+	 */
 	void indexClasspath() {
 		if (_debugIndexTime)
 			time0 = System.currentTimeMillis();
@@ -1337,6 +1353,22 @@
 			Logger.log(Logger.INFO, "indexed " + fProject.getName() + " classpath in " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 	}
 
+	void indexClasspath(IClasspathEntry[] entries) {
+		if (_debugIndexTime)
+			time0 = System.currentTimeMillis();
+		fClasspathProjects.clear();
+		fClasspathReferences.clear();
+		fClasspathJars.clear();
+
+		fBuildPathEntryCount = entries.length;
+		for (int i = 0; i < entries.length; i++) {
+			indexClasspath(entries[i]);
+		}
+
+		if (_debugIndexTime)
+			Logger.log(Logger.INFO, "indexed " + fProject.getName() + " classpath in " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+	}
+
 	/**
 	 * @param entry
 	 */
@@ -1422,7 +1454,7 @@
 	 */
 
 	/**
-	 * @param javaProject
+	 * @deprecated
 	 */
 	private void indexClasspath(IJavaProject javaProject) {
 		if (javaProject == null)