Bug 132863 - Launching a simple java program in a plugin project needs ages
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaRuntime.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaRuntime.java
index d6e093a..09e4d9f 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaRuntime.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaRuntime.java
@@ -18,7 +18,6 @@
 import java.io.StringReader;
 import java.net.MalformedURLException;
 import java.net.URL;
-import com.ibm.icu.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -80,6 +79,8 @@
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
+import com.ibm.icu.text.MessageFormat;
+
 /**
  * The central access point for launching support. This class manages
  * the registered VM types contributed through the 
@@ -279,8 +280,10 @@
 	/**
 	 * Cache of already resolved projects in container entries. Used to avoid
 	 * cycles in project dependencies when resolving classpath container entries.
+	 * Counters used to know when entring/exiting to clear cache
 	 */
-	private static ThreadLocal fgProjects = new ThreadLocal();
+	private static ThreadLocal fgProjects = new ThreadLocal(); // Lists
+	private static ThreadLocal fgEntryCount = new ThreadLocal(); // Integers
 	
     /**
      *  Set of ids of vms contributed via vmInstalls extension point.
@@ -1098,18 +1101,23 @@
 				break;
 		}			
 		List resolved = new ArrayList(cpes.length);
-		for (int i = 0; i < cpes.length; i++) {
-			IClasspathEntry cpe = cpes[i];
-			if (cpe.getEntryKind() == IClasspathEntry.CPE_PROJECT) {
-				IProject p = ResourcesPlugin.getWorkspace().getRoot().getProject(cpe.getPath().segment(0));
-				IJavaProject jp = JavaCore.create(p);
-				List projects = (List) fgProjects.get();
-				if (projects == null) {
-					projects = new ArrayList();
-					fgProjects.set(projects);
-				}
-				if (!projects.contains(jp)) {
-					try {
+		List projects = (List) fgProjects.get();
+		Integer count = (Integer) fgEntryCount.get();
+		if (projects == null) {
+			projects = new ArrayList();
+			fgProjects.set(projects);
+			count = new Integer(0);
+		}
+		int intCount = count.intValue();
+		intCount++;
+		fgEntryCount.set(new Integer(intCount));
+		try {
+			for (int i = 0; i < cpes.length; i++) {
+				IClasspathEntry cpe = cpes[i];
+				if (cpe.getEntryKind() == IClasspathEntry.CPE_PROJECT) {
+					IProject p = ResourcesPlugin.getWorkspace().getRoot().getProject(cpe.getPath().segment(0));
+					IJavaProject jp = JavaCore.create(p);
+					if (!projects.contains(jp)) {
 						projects.add(jp);
 						IRuntimeClasspathEntry classpath = newDefaultProjectClasspathEntry(jp);
 						IRuntimeClasspathEntry[] entries = resolveRuntimeClasspathEntry(classpath, jp);
@@ -1119,18 +1127,21 @@
 								resolved.add(entries[j]);
 							}
 						}
-					} finally {
-						projects.remove(jp);
+					}
+				} else {
+					IRuntimeClasspathEntry e = newRuntimeClasspathEntry(cpe);
+					if (!resolved.contains(e)) {
+						resolved.add(e);
 					}
 				}
-				if (projects.isEmpty()) {
-					fgProjects.set(null);
-				}
+			}
+		} finally {
+			intCount--;
+			if (intCount == 0) {
+				fgProjects.set(null);
+				fgEntryCount.set(null);
 			} else {
-				IRuntimeClasspathEntry e = newRuntimeClasspathEntry(cpe);
-				if (!resolved.contains(e)) {
-					resolved.add(e);
-				}
+				fgEntryCount.set(new Integer(intCount));
 			}
 		}
 		// set classpath property