[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$ } }