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