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