[317728] NPE in J2EEComponentClasspathContainer.getBaseEARLibRefs
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphEvent.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphEvent.java
index d6fdcf0..aa2d80d 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphEvent.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphEvent.java
@@ -61,6 +61,28 @@
if (targetProject == null) {
throw new NullPointerException("Target project must not be null.");
}
+ //update removed references accordingly
+ if(removedReferences != null){
+ Set references = removedReferences.get(targetProject);
+ if(references != null){
+ if(references.remove(sourceProject)) {
+ if(references.isEmpty()){
+ removedReferences.remove(targetProject);
+ if(removedReferences.isEmpty()){
+ removedReferences = null;
+ if((type & ADDED) == ADDED){
+ type = ADDED;
+ } else {
+ type = 0;
+ }
+ }
+ }
+ //there is no net change, so return.
+ return;
+ }
+ }
+ }
+
if (addedReferences == null) {
type = type | ADDED;
addedReferences = new HashMap<IProject, Set<IProject>>();
@@ -71,6 +93,8 @@
addedReferences.put(targetProject, references);
}
references.add(sourceProject);
+
+
}
void removeReference(IProject sourceProject, IProject targetProject) {
@@ -80,6 +104,29 @@
if (targetProject == null) {
throw new NullPointerException("Target project must not be null.");
}
+
+ //updated added references accordingly
+ if(addedReferences != null){
+ Set references = addedReferences.get(targetProject);
+ if(references != null){
+ if(references.remove(sourceProject)){
+ if(references.isEmpty()){
+ addedReferences.remove(targetProject);
+ if(addedReferences.isEmpty()){
+ addedReferences = null;
+ if((type & REMOVED) == REMOVED){
+ type = REMOVED;
+ } else {
+ type = 0;
+ }
+ }
+ }
+ //there is no net change, so return.
+ return;
+ }
+ }
+ }
+
if (removedReferences == null) {
type = type | REMOVED;
removedReferences = new HashMap<IProject, Set<IProject>>();
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphImpl.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphImpl.java
index 595ba16..187bb48 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphImpl.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphImpl.java
@@ -196,6 +196,16 @@
}
}
+
+ private void removeAllReferences(DependencyGraphEvent event){
+ synchronized (graphLock) {
+ IProject [] allReferenceKeys = new IProject [graph.keySet().size()];
+ graph.keySet().toArray(allReferenceKeys);
+ for(IProject project : allReferenceKeys){
+ removeAllReferences(project, event);
+ }
+ }
+ }
private void removeAllReferences(IProject targetProject, DependencyGraphEvent event) {
synchronized (graphLock) {
@@ -352,17 +362,21 @@
}
public void run() throws Exception {
- // this is the simple case; just remove them all
- synchronized (graphLock) {
- for (Object o : removed) {
- IProject project = (IProject) o;
- removeAllReferences(project, event);
+ //all references will be rebuilt during an add
+ if(added.length == 0){
+ // this is the simple case; just remove them all
+ synchronized (graphLock) {
+ for (Object o : removed) {
+ IProject project = (IProject) o;
+ removeAllReferences(project, event);
+ }
}
}
// get the updated queue in case there are any adds
// if there are any added projects, then unfortunately the
// entire workspace needs to be processed
if (added.length > 0) {
+ removeAllReferences(event);
IProject[] allProjects = null;
int state = ResourcesPlugin.getPlugin().getBundle().getState();
if (state == Bundle.ACTIVE) {