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; } }