[266705] Deadlock during J2EEComponentClasspathContainer.update()
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java
index 46e1ca8..70202a9 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java
@@ -274,6 +274,24 @@
return true;
else return componentFile.isSynchronized(IResource.DEPTH_ZERO);
}
+
+ public IFile getComponentFile() {
+ IFile compFile = getProject().getFile(StructureEdit.MODULE_META_FILE_NAME);
+ if (compFile.isAccessible())
+ return compFile;
+ else { //Need to check for legacy file locations also....
+ compFile = getProject().getFile(ModuleStructuralModel.R1_MODULE_META_FILE_NAME);
+ if (compFile.isAccessible())
+ return compFile;
+ else {
+ compFile = getProject().getFile(ModuleStructuralModel.R0_7_MODULE_META_FILE_NAME);
+ if (compFile.isAccessible())
+ return compFile;
+ }
+ }
+ return getProject().getFile(StructureEdit.MODULE_META_FILE_NAME);
+ }
+
public WTPModulesResource makeWTPModulesResource() {
return (WTPModulesResource) createResource(WTPModulesResourceFactory.WTP_MODULES_URI_OBJ);
}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/StructureEdit.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/StructureEdit.java
index 3891ce6..9b04b00 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/StructureEdit.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/StructureEdit.java
@@ -11,6 +11,7 @@
package org.eclipse.wst.common.componentcore.internal;
+import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -18,6 +19,7 @@
import java.util.List;
import java.util.Map;
+import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
@@ -435,10 +437,25 @@
* to add or remove {@see WorkbenchComponent}s. If a client needs to just read the existing
* {@see WorkbenchComponent}s, use {@see #getWorkbenchModules()}.
* </p>
+ * <p>
+ * Deadlock Warning: Calling this method requires two locks. First the component file's file lock
+ * is required and then the EMFWorkbenchEditContextFactory's projectILock is required. If another
+ * thread acquires these same two locks in the opposite order, deadlock could occur.
+ * </p>
*
* @return The root object of the underlying model
*/
public ProjectComponents getComponentModelRoot() {
+ IFile file = structuralModel.getComponentFile();
+ if (!file.isSynchronized(IResource.DEPTH_ONE)) {
+ try {
+ File iofile = file.getFullPath().toFile();
+ if (iofile.exists() || file.exists())
+ file.refreshLocal(IResource.DEPTH_ONE, null);
+ } catch (CoreException ce) {
+ //ignore
+ }
+ }
ProjectComponents comps = null;
ILock lock = EMFWorkbenchEditContextFactory.getProjectLockObject(structuralModel.getProject());
try{