[251809] deadlock during project modification
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPResourceFactoryRegistry.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPResourceFactoryRegistry.java
index b341d20..8c1136d 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPResourceFactoryRegistry.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPResourceFactoryRegistry.java
@@ -28,6 +28,7 @@
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.core.runtime.content.IContentDescription;
import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.jobs.ILock;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jem.util.RegistryReader;
@@ -42,6 +43,7 @@
import org.eclipse.wst.common.internal.emf.resource.ResourceFactoryDescriptor;
import org.eclipse.wst.common.internal.emf.utilities.DefaultOverridableResourceFactoryRegistry;
import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
+import org.eclipse.wst.common.internal.emfworkbench.edit.EMFWorkbenchEditContextFactory;
/**
* <p>
@@ -65,26 +67,44 @@
return WTPResourceFactoryRegistry.INSTANCE.getFactory(uri);
}
- public synchronized Resource.Factory getFactory(URI uri, IContentDescription description) {
- Resource.Factory resourceFactory = null;
- if(uri != null && uri.lastSegment() != null) {
- ResourceFactoryDescriptor descriptor = null;
- if(null == description){
- descriptor = getDescriptor(uri);
- } else {
- descriptor = getDescriptor(uri, description);
- }
-
- if(descriptor != null) {
- resourceFactory = getFactory(descriptor);
- }
+ public Resource.Factory getFactory(URI uri, IContentDescription description) {
+ IProject componentProject = null;
+ try {
+ componentProject = StructureEdit.getContainingProject(uri);
+ } catch (UnresolveableURIException e) {
+ // don't do anything
}
- if(resourceFactory == null)
- resourceFactory = super.getFactory(uri);
- return resourceFactory;
+ ILock lock = EMFWorkbenchEditContextFactory.getProjectLockObject(componentProject);
+ try{
+ if(null != lock){
+ lock.acquire();
+ }
+ synchronized(this){
+ Resource.Factory resourceFactory = null;
+ if(uri != null && uri.lastSegment() != null) {
+ ResourceFactoryDescriptor descriptor = null;
+ if(null == description){
+ descriptor = getDescriptor(uri);
+ } else {
+ descriptor = getDescriptor(uri, description);
+ }
+
+ if(descriptor != null) {
+ resourceFactory = getFactory(descriptor);
+ }
+ }
+ if(resourceFactory == null)
+ resourceFactory = super.getFactory(uri);
+ return resourceFactory;
+ }
+ } finally{
+ if(null != lock){
+ lock.release();
+ }
+ }
}
- public synchronized Resource.Factory getFactory(URI uri) {
+ public Resource.Factory getFactory(URI uri) {
return getFactory(uri, (IContentDescription)null);
}