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 9f60089..a72f0ec 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
@@ -384,6 +384,7 @@ if (delta != null) { try { delta.accept(this); + } catch (Exception e) { Logger.getLogger().logError(e); } @@ -873,12 +874,7 @@ 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)) { - if (processNewProjects != null && (processNewProjects.getState() == Job.WAITING)) - processNewProjects.addProject(p); - else { - processNewProjects = createProjectsJob(p); - processNewProjects.schedule(); - } + getQueuedJob().addProject(p); return false; } } @@ -899,12 +895,7 @@ addedWsil((IFile)resource); else if (resource.getName().equals(J2EEConstants.WEB_SERVICES_CLIENT_SHORTNAME) || resource.getName().equals(J2EEConstants.WEB_SERVICES_DD_URI)) { - if (processNewProjects != null && (processNewProjects.getState() == Job.WAITING)) - processNewProjects.addProject(resource.getProject()); - else { - processNewProjects = createProjectsJob(resource.getProject()); - processNewProjects.schedule(); - } + getQueuedJob().addProject(resource.getProject()); } } // Handle WSIL or WSDL file removals @@ -917,14 +908,25 @@ return true; } - private ProcessProjectsWithWSDL createProjectsJob(IProject p) { + private ProcessProjectsWithWSDL createProjectsJob() { Set newSet = new HashSet(); - newSet.add(p); ProcessProjectsWithWSDL job = new ProcessProjectsWithWSDL(newSet, EditModelEvent.ADDED_RESOURCE); - job.setRule(p.getWorkspace().getRoot()); + job.setRule(ResourcesPlugin.getWorkspace().getRoot()); + job.setSystem(true); return job; } + private ProcessProjectsWithWSDL getQueuedJob() { + + if (processNewProjects != null && (processNewProjects.getState() == Job.WAITING)){ + return processNewProjects; + } else { + processNewProjects = createProjectsJob(); + processNewProjects.schedule(); + } + return processNewProjects; + } + private class ProcessProjectsWithWSDL extends Job { private Set currentProjects; @@ -944,13 +946,18 @@ } protected IStatus run(IProgressMonitor monitor) { + // Null out job for processing new projects + synchronized (processNewProjects) { + if(processNewProjects == this){ + processNewProjects = null; + } + } 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; } }