206463 Threading issues with WebServicesNode Job
diff --git a/plugins/org.eclipse.jst.j2ee.webservice/webservice/org/eclipse/jst/j2ee/internal/webservice/helper/WebServicesManager.java b/plugins/org.eclipse.jst.j2ee.webservice/webservice/org/eclipse/jst/j2ee/internal/webservice/helper/WebServicesManager.java
index 0f0bc5d..9f60089 100644
--- a/plugins/org.eclipse.jst.j2ee.webservice/webservice/org/eclipse/jst/j2ee/internal/webservice/helper/WebServicesManager.java
+++ b/plugins/org.eclipse.jst.j2ee.webservice/webservice/org/eclipse/jst/j2ee/internal/webservice/helper/WebServicesManager.java
@@ -23,9 +23,11 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
@@ -100,6 +102,7 @@
 	private boolean isNotifying = false;
 	private boolean wsClientElementsChanged = true;
 	private boolean wsElementsChanged = true;
+	private ProcessProjectsWithWSDL processNewProjects;
 
 	public static final String WSDL_EXT = "wsdl"; //$NON-NLS-1$
 	public static final String WSIL_EXT = "wsil"; //$NON-NLS-1$
@@ -870,9 +873,12 @@
 			if ((delta.getKind()==IResourceDelta.ADDED || (((delta.getFlags() & IResourceDelta.OPEN) != 0) && p.isAccessible()))) {
 				IVirtualComponent component = ComponentCore.createComponent(p);
 				if (component!=null && !J2EEProjectUtilities.isEARProject(p) && !J2EEProjectUtilities.isStaticWebProject(p)) {
-					Job job = new ProcessProjectsWithWSDL(p, EditModelEvent.ADDED_RESOURCE);
-					job.setRule(p);
-					job.schedule();
+					if (processNewProjects != null && (processNewProjects.getState() == Job.WAITING))
+						processNewProjects.addProject(p);
+					else {
+						processNewProjects = createProjectsJob(p);					
+						processNewProjects.schedule();
+					}
 					return false;
 				}
 			}
@@ -893,9 +899,12 @@
 				    addedWsil((IFile)resource);
 				else if (resource.getName().equals(J2EEConstants.WEB_SERVICES_CLIENT_SHORTNAME) ||
 						resource.getName().equals(J2EEConstants.WEB_SERVICES_DD_URI)) {
-					Job job = new ProcessProjectsWithWSDL(resource.getProject(), EditModelEvent.LOADED_RESOURCE);
-					job.setRule(resource.getProject());
-					job.schedule();
+					if (processNewProjects != null && (processNewProjects.getState() == Job.WAITING))
+						processNewProjects.addProject(resource.getProject());
+					else {
+						processNewProjects = createProjectsJob(resource.getProject());					
+						processNewProjects.schedule();
+					}
 				}	
 			} 
 			// Handle WSIL or WSDL file removals
@@ -908,21 +917,40 @@
 		return true;
 	}
 
+	private ProcessProjectsWithWSDL createProjectsJob(IProject p) {
+		Set newSet = new HashSet();
+		newSet.add(p);
+		ProcessProjectsWithWSDL job = new ProcessProjectsWithWSDL(newSet, EditModelEvent.ADDED_RESOURCE);
+		job.setRule(p.getWorkspace().getRoot());
+		return job;
+	}
+
 	private class ProcessProjectsWithWSDL extends Job
 	{
-		private IProject currentProject;
+		private Set currentProjects;
 		private int eventType;
 		
-		public ProcessProjectsWithWSDL(IProject p, int newEventType)
+		public ProcessProjectsWithWSDL(Set p, int newEventType)
 		{
 			super("Loading artifact edit for project");
-			currentProject = p;
+			currentProjects = p;
 			eventType = newEventType;
 		}
 		
+		public void addProject(IProject p) {
+			synchronized(currentProjects) {
+				currentProjects.add(p);
+			}
+		}
+
 		protected IStatus run(IProgressMonitor monitor) {
-			addArtifactEdit(currentProject);
+			for (Iterator iterator = currentProjects.iterator(); iterator.hasNext();) {
+				IProject currentProject = (IProject) iterator.next();
+				addArtifactEdit(currentProject);
+			}
 			notifyListeners(eventType);
+			// Null out job for processing new projects
+			processNewProjects = null;
 			return Status.OK_STATUS;
 		}
 	}