[81641] NPE in TaglibIndex$ResourceChangeListener when closing/opening projects
diff --git a/bundles/org.eclipse.jst.jsp.core/.options b/bundles/org.eclipse.jst.jsp.core/.options
index 13f52be..6c77113 100644
--- a/bundles/org.eclipse.jst.jsp.core/.options
+++ b/bundles/org.eclipse.jst.jsp.core/.options
@@ -12,7 +12,7 @@
org.eclipse.jst.jsp.core/debug/tldcmdocument/factory=false
#org.eclipse.jst.jsp.core.internal.contentmodel/index.ProjectDescription._debugIndexCreation
-org.eclipse.jst.jsp.core/taglib/indexcreation=true
+org.eclipse.jst.jsp.core/taglib/indexcreation=false
#org.eclipse.jst.jsp.core.internal.contentmodel/index.ProjectDescription._debugIndexTime
org.eclipse.jst.jsp.core/taglib/indextime=false
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/contentmodel/ProjectDescription.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/contentmodel/ProjectDescription.java
index a534e76..af62c05 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/contentmodel/ProjectDescription.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/contentmodel/ProjectDescription.java
@@ -438,6 +438,8 @@
}
void removeJAR(IResource jar) {
+ if (_debugIndexCreation)
+ System.out.println("removing records for JAR " + jar.getFullPath());
JarRecord record = (JarRecord) fJARReferences.remove(jar.getFullPath());
if (record != null) {
URLRecord[] records = (URLRecord[]) record.getURLRecords().toArray(new URLRecord[0]);
@@ -448,10 +450,14 @@
}
void removeServlets(IResource webxml) {
+ if (_debugIndexCreation)
+ System.out.println("removing records for " + webxml.getFullPath());
ServletRecord record = (ServletRecord) fServletReferences.remove(webxml.getFullPath());
if (record != null) {
URLRecord[] records = (URLRecord[]) record.getURLRecords().toArray(new URLRecord[0]);
for (int i = 0; i < records.length; i++) {
+ if (_debugIndexCreation)
+ System.out.println("removed record for " + records[i].uri + "@" + records[i].baseLocation);
getImplicitReferences(webxml.getLocation().toString()).remove(records[i].getURI());
}
}
@@ -464,6 +470,8 @@
}
void removeTLD(IResource tld) {
+ if (_debugIndexCreation)
+ System.out.println("removing record for " + tld.getFullPath());
TLDRecord record = (TLDRecord) fTLDReferences.remove(tld.getFullPath());
if (record != null && record.uri != null) {
getImplicitReferences(tld.getLocation().toString()).remove(record.uri);
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/contentmodel/TaglibIndex.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/contentmodel/TaglibIndex.java
index 8ef1eff..d1fcb6f 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/contentmodel/TaglibIndex.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/contentmodel/TaglibIndex.java
@@ -25,6 +25,7 @@
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.jsp.core.internal.Logger;
/**
* @author nsd
@@ -36,41 +37,56 @@
class ResourceChangeListener implements IResourceChangeListener {
public void resourceChanged(IResourceChangeEvent event) {
- // pair deltas with projects
- IResourceDelta[] deltas = new IResourceDelta[]{event.getDelta()};
- IProject[] projects = null;
+ try {
+ // pair deltas with projects
+ IResourceDelta[] deltas = new IResourceDelta[]{event.getDelta()};
+ IProject[] projects = null;
- if (deltas != null && deltas.length > 0) {
- IResource resource = deltas[0].getResource();
+ if (deltas != null && deltas.length > 0) {
+ IResource resource = null;
+ if (deltas[0] != null) {
+ resource = deltas[0].getResource();
+ }
+ else {
+ resource = event.getResource();
+ }
- if (resource.getType() == IResource.ROOT) {
- deltas = deltas[0].getAffectedChildren();
- projects = new IProject[deltas.length];
- for (int i = 0; i < deltas.length; i++) {
- if (deltas[i].getResource().getType() == IResource.PROJECT) {
- projects[i] = (IProject) deltas[i].getResource();
+ if (resource != null) {
+ if (resource.getType() == IResource.ROOT) {
+ deltas = deltas[0].getAffectedChildren();
+ projects = new IProject[deltas.length];
+ for (int i = 0; i < deltas.length; i++) {
+ if (deltas[i].getResource().getType() == IResource.PROJECT) {
+ projects[i] = (IProject) deltas[i].getResource();
+ }
+ }
+ }
+ else {
+ projects = new IProject[1];
+ if (resource.getType() != IResource.PROJECT) {
+ projects[0] = resource.getProject();
+ }
+ else {
+ projects[0] = (IProject) resource;
+ }
+ }
+ }
+ for (int i = 0; i < projects.length; i++) {
+ ProjectDescription description = createDescription(projects[i]);
+ try {
+ // TODO: handle the lack of a delta
+ if (deltas[i] != null) {
+ deltas[i].accept(description.getVisitor());
+ }
+ }
+ catch (CoreException e) {
+ Logger.logException(e);
}
}
}
- else {
- projects = new IProject[1];
- if (resource.getType() != IResource.PROJECT) {
- projects[0] = resource.getProject();
- }
- else {
- projects[0] = (IProject) resource;
- }
- }
- for (int i = 0; i < projects.length; i++) {
- ProjectDescription description = createDescription(projects[i]);
- try {
- deltas[i].accept(description.getVisitor());
- }
- catch (CoreException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
+ }
+ catch (Exception e) {
+ Logger.logException("Exception while processing resource change", e); //$NON-NLS-1$
}
}