[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