[417032] Deadlock due to Resource Listener waiting for workspace lock
diff --git a/plugins/org.eclipse.jst.j2ee/META-INF/MANIFEST.MF b/plugins/org.eclipse.jst.j2ee/META-INF/MANIFEST.MF index 75d57d9..0a074b7 100644 --- a/plugins/org.eclipse.jst.j2ee/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.jst.j2ee/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name.0 Bundle-SymbolicName: org.eclipse.jst.j2ee; singleton:=true -Bundle-Version: 1.1.605.qualifier +Bundle-Version: 1.1.606.qualifier Bundle-Activator: org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin Bundle-Vendor: %Bundle-Vendor.0 Bundle-Localization: plugin
diff --git a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/classpath/J2EEComponentClasspathUpdater.java b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/classpath/J2EEComponentClasspathUpdater.java index b7f141a..a4d3277 100644 --- a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/classpath/J2EEComponentClasspathUpdater.java +++ b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/classpath/J2EEComponentClasspathUpdater.java
@@ -201,8 +201,78 @@ private static final int MODULE_UPDATE_DELAY = 30; public static final String MODULE_UPDATE_JOB_NAME = Messages.J2EEComponentClasspathUpdater_EAR_Libraries_Update_Jo_; + public static final String FIND_NODE_JOB_NAME = Messages.J2EEComponentClasspathUpdater_Find_Node; private final ModuleUpdateJob moduleUpdateJob = new ModuleUpdateJob(); + + public class FindNodeJob extends Job { + + IResourceDelta[] delta; + + @Override + public boolean belongsTo(Object family) { + if(family == FIND_NODE_JOB_NAME){ + return true; + } + return super.belongsTo(family); + } + + /* + * Needs to notice changes to MANIFEST.MF in any J2EE projects, changes to + * .component in any J2EE Projects, and any archive changes in EAR projects + */ + + private boolean findNode(IResourceDelta[] delta) { + + for (int i = 0; i < delta.length; i++) { + if (delta[i].toString().indexOf(IJ2EEModuleConstants.COMPONENT_FILE_NAME) != -1) { + StructureEdit core = StructureEdit + .getStructureEditForRead(delta[i].getResource() + .getProject()); + if(null != core){ + WorkbenchComponent component = core.getComponent(); + if(component != null){ + clearResourceTreeRootCache(component); + } + } + } else { + findNode(delta[i].getAffectedChildren()); + } + } + + return true; + } + + + public FindNodeJob(IResourceDelta[] d) { + super(FIND_NODE_JOB_NAME); + setRule(ResourcesPlugin.getWorkspace().getRoot()); + setSystem(true); + setDelta(d); + } + + @Override + protected IStatus run(IProgressMonitor monitor) { + + SafeRunner.run(new ISafeRunnable() { + public void handleException(Throwable e) { + J2EEPlugin.logError(e); + } + + public void run() throws Exception { + + findNode(delta); + + } + }); + + return Status.OK_STATUS; + } + + public void setDelta(IResourceDelta[] delta) { + this.delta = delta; + } + } public class ModuleUpdateJob extends Job { @@ -431,7 +501,8 @@ scheduleJob = true; event.getDelta().accept(this); IResourceDelta[] d = event.getDelta().getAffectedChildren(); - findNode(d); + FindNodeJob newJob = createFindNodeJob(d); + newJob.schedule(); } break; } @@ -444,6 +515,11 @@ } + private FindNodeJob createFindNodeJob(IResourceDelta[] d) { + + return new FindNodeJob(d); + } + public static void clearResourceTreeRootCache(WorkbenchComponent aModule) { ResourceTreeRootAdapter resourceTreeAdapter = (ResourceTreeRootAdapter) ExtendedEcoreUtil @@ -459,33 +535,6 @@ resourceTreeAdapter.setResourceTreeRoot(null); } } - - - /* - * Needs to notice changes to MANIFEST.MF in any J2EE projects, changes to - * .component in any J2EE Projects, and any archive changes in EAR projects - */ - - public boolean findNode(IResourceDelta[] delta) { - - for (int i = 0; i < delta.length; i++) { - if (delta[i].toString().indexOf(IJ2EEModuleConstants.COMPONENT_FILE_NAME) != -1) { - StructureEdit core = StructureEdit - .getStructureEditForRead(delta[i].getResource() - .getProject()); - if(null != core){ - WorkbenchComponent component = core.getComponent(); - if(component != null){ - clearResourceTreeRootCache(component); - } - } - } else { - findNode(delta[i].getAffectedChildren()); - } - } - - return true; - } public boolean visit(IResourceDelta delta) { // If it is only a marker change, ignore the change
diff --git a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/classpath/Messages.java b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/classpath/Messages.java index b324510..2a97062 100644 --- a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/classpath/Messages.java +++ b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/classpath/Messages.java
@@ -16,6 +16,7 @@ public class Messages extends NLS { public static final String BUNDLE_NAME = "org.eclipse.jst.j2ee.internal.common.classpath.messages"; //$NON-NLS-1$ + public static String J2EEComponentClasspathUpdater_Find_Node; public static String J2EEComponentClasspathUpdater_EAR_Libraries_Update_Jo_; public static String J2EEComponentClasspathUpdater_Verify_EAR_Libraries;
diff --git a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/classpath/messages.properties b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/classpath/messages.properties index 9dd79ad..09c4325 100644 --- a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/classpath/messages.properties +++ b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/classpath/messages.properties
@@ -1,2 +1,3 @@ J2EEComponentClasspathUpdater_EAR_Libraries_Update_Jo_=EAR Libraries Update Job J2EEComponentClasspathUpdater_Verify_EAR_Libraries=Verify EAR Libraries +J2EEComponentClasspathUpdater_Find_Node=Find Node Job \ No newline at end of file