[469037] RuntimeClasspathProviderDelegate does not update the classpath
container in certain cases
diff --git a/plugins/org.eclipse.jst.server.core/src/org/eclipse/jst/server/core/RuntimeClasspathProviderDelegate.java b/plugins/org.eclipse.jst.server.core/src/org/eclipse/jst/server/core/RuntimeClasspathProviderDelegate.java
index bdae750..9639ec8 100644
--- a/plugins/org.eclipse.jst.server.core/src/org/eclipse/jst/server/core/RuntimeClasspathProviderDelegate.java
+++ b/plugins/org.eclipse.jst.server.core/src/org/eclipse/jst/server/core/RuntimeClasspathProviderDelegate.java
@@ -60,7 +60,7 @@
private Map<String, IPath> runtimePathMap = Collections.synchronizedMap(new HashMap<String, IPath>());
- private Map<String, Integer> previousClasspath = Collections.synchronizedMap(new HashMap<String, Integer>());
+ private Map<String, IClasspathEntry[]> previousClasspath = Collections.synchronizedMap(new HashMap<String, IClasspathEntry[]>());
public RuntimeClasspathProviderDelegate() {
// default constructor
@@ -160,15 +160,17 @@
String key = project.getName() + "/" + runtime.getId();
if (!previousClasspath.containsKey(key))
- previousClasspath.put(key, new Integer(entries.length));
+ previousClasspath.put(key, entries);
else {
- Integer previousEntries = previousClasspath.get(key);
+ IClasspathEntry[] previousClasspathEntries = previousClasspath.get(key);
- if ((previousEntries == null) || (previousEntries.intValue() != entries.length)) {
+ if (previousClasspathEntries == null
+ || previousClasspathEntries.length != entries.length
+ || entriesChanged(previousClasspathEntries,entries)) {
if (Trace.FINEST) {
Trace.trace(Trace.STRING_FINEST, "Classpath update: " + key + " " + entries);
}
- previousClasspath.put(key, new Integer(entries.length));
+ previousClasspath.put(key, entries);
IPath path = new Path(RuntimeClasspathContainer.SERVER_CONTAINER);
path = path.append(extensionId).append(runtime.getId());
@@ -187,6 +189,20 @@
return entries;
}
+ private boolean entriesChanged(IClasspathEntry[] previousEntries, IClasspathEntry[] entries) {
+ if (previousEntries.length != entries.length) {
+ return true;
+ }
+ for (int i=0; i<previousEntries.length; i++) {
+ if ((previousEntries[i] == null && entries[i] != null)
+ || (previousEntries[i].getPath() == null && entries[i].getPath() != null)
+ || !previousEntries[i].getPath().equals(entries[i].getPath())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
/*
* Returns true if there are any changes in the runtime since the last time that the
* classpath was resolved which may affect the classpath, and false otherwise. This