Switch to using a single Job wih queuing
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPIndexManager.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPIndexManager.java
index a464473..9322061 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPIndexManager.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPIndexManager.java
@@ -11,7 +11,9 @@
 package org.eclipse.jst.jsp.core.internal.java.search;
 
 import java.io.File;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IResource;
@@ -179,14 +181,35 @@
 	 * schedules JSP files for indexing by Java core
 	 */
 	private class ProcessFilesJob extends Job { 
-		IFile[] jspFiles =  null;
-		ProcessFilesJob(String taskName, IFile[] files) {
+		List fileList =  null;
+		private final int maximumToRemember = 50;
+		ProcessFilesJob(String taskName) {
 			super(taskName);
-			this.jspFiles = files;
+			fileList = new ArrayList();
+		}
+		
+		synchronized void process(IFile[] files) {
+			for (int i = 0; i < files.length; i++) {
+				fileList.add(files[i]);
+			}
+			if(DEBUG) {
+				System.out.println("JSPIndexManager queuing " + files.length + " files"); //$NON-NLS-2$ //$NON-NLS-1$
+			}
+			schedule(20);
+		}
+		
+		synchronized IFile[] getFiles() {
+			IFile[] files = (IFile[]) fileList.toArray(new IFile[fileList.size()]);
+			if (fileList.size() > maximumToRemember) {
+				fileList = new ArrayList();
+			}
+			else {
+				fileList.clear();
+			}
+			return files;
 		}
 		
 		protected IStatus run(IProgressMonitor monitor) {
-			
 			if(isCanceled(monitor) || frameworkIsShuttingDown()) {
 				setCanceledState();
 				return Status.CANCEL_STATUS;
@@ -195,27 +218,31 @@
 			long start = System.currentTimeMillis();
 			
 			try {
+				IFile[] filesToBeProcessed = getFiles();
+				if(DEBUG) {
+					System.out.println("JSPIndexManager indexing " + filesToBeProcessed.length + " files"); //$NON-NLS-2$ //$NON-NLS-1$
+				}
 				// API indicates that monitor is never null
-				monitor.beginTask("", this.jspFiles .length); //$NON-NLS-1$
+				monitor.beginTask("", filesToBeProcessed.length); //$NON-NLS-1$
 				JSPSearchSupport ss = JSPSearchSupport.getInstance();
 				String processingNFiles = ""; //$NON-NLS-1$
 
 				
-				for(int i = 0; i<this.jspFiles.length; i++) {
+				for(int i = 0; i < filesToBeProcessed.length; i++) {
 
 					if(isCanceled(monitor) || frameworkIsShuttingDown()) {
 						setCanceledState();
 						return Status.CANCEL_STATUS;
 					}
 					try {
-						ss.addJspFile(this.jspFiles [i]);
+						ss.addJspFile(filesToBeProcessed [i]);
 						// JSP Indexer processing n files
-						processingNFiles = NLS.bind(JSPCoreMessages.JSPIndexManager_2, new String[]{Integer.toString((this.jspFiles .length -i))});
-						monitor.subTask(processingNFiles + " - " + this.jspFiles [i].getName()); //$NON-NLS-1$
+						processingNFiles = NLS.bind(JSPCoreMessages.JSPIndexManager_2, new String[]{Integer.toString((filesToBeProcessed .length -i))});
+						monitor.subTask(processingNFiles + " - " + filesToBeProcessed [i].getName()); //$NON-NLS-1$
 						monitor.worked(1);
 						
 						if(DEBUG) {
-							System.out.println("JSPIndexManager Job added file: " + this.jspFiles [i].getName()); //$NON-NLS-1$
+							System.out.println("JSPIndexManager Job added file: " + filesToBeProcessed [i].getName()); //$NON-NLS-1$
 						}
 					}
 					catch (Exception e){
@@ -228,7 +255,7 @@
 					    // a possible solution is to keep track of the exceptions logged
 					    // and only log a certain amt of the same one, otherwise skip it.
 						if(!frameworkIsShuttingDown()) {
-						    String filename = this.jspFiles[i] != null ? this.jspFiles[i].getFullPath().toString() : ""; //$NON-NLS-1$
+						    String filename = filesToBeProcessed[i] != null ? filesToBeProcessed[i].getFullPath().toString() : ""; //$NON-NLS-1$
 						    Logger.logException("JSPIndexer problem indexing:" + filename,  e); //$NON-NLS-1$
 						}
 					}
@@ -271,8 +298,20 @@
 		
 	static long fTotalTime = 0;
 	
+	// Job for processing resource delta
+	ProcessFilesJob processFilesJob = null;
+	
 	private JSPIndexManager(){
-		// only one instance
+		processFilesJob = new ProcessFilesJob(JSPCoreMessages.JSPIndexManager_0);
+		// only show in verbose mode
+		processFilesJob.setSystem(true);
+		processFilesJob.setPriority(Job.LONG);
+		processFilesJob.addJobChangeListener(new JobChangeAdapter() {
+			public void done(IJobChangeEvent event) {
+				super.done(event);
+				setStableState();
+			}
+		});
 	}
 	
 	public synchronized static JSPIndexManager getInstance() {
@@ -429,27 +468,10 @@
 	 * @param files
 	 */
 	public final void indexFiles(IFile[] files) {
-		// updating JSP Index
-		String taskName = JSPCoreMessages.JSPIndexManager_0;
-		
-		// Processing resource delta
-		final Job processFiles = new ProcessFilesJob(taskName, files);
-
-		// only show in verbose mode
-		processFiles.setSystem(true);
-		
-		// don't use this rule
+				// don't use this rule
 		// https://w3.opensource.ibm.com/bugzilla/show_bug.cgi?id=4931
 		//processFiles.setRule(new IndexFileRule());
-		
-		processFiles.setPriority(Job.LONG);
-		processFiles.addJobChangeListener(new JobChangeAdapter() {
-			public void done(IJobChangeEvent event) {
-				super.done(event);
-				setStableState();
-			}
-		});
-		processFiles.schedule();
+		processFilesJob.process(files);
 	}