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