[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