[231205] deadlock closing edited orm.xml file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResourceImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResourceImpl.java
index 1b34804..db9fe94 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResourceImpl.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResourceImpl.java
@@ -271,13 +271,47 @@
             }
         }
     }
+	public void loadExisting(Map options) throws IOException {
+
+		
+        ResourceIsLoadingAdapter adapter = null;
+        if (isLoaded) {
+            adapter = ResourceIsLoadingAdapter.findAdapter(this);
+            if (adapter != null) 
+                adapter.waitForResourceToLoad();
+            return;
+        }
+        synchronized (this) {            
+            adapter = ResourceIsLoadingAdapter.findAdapter(this);
+            if (adapter == null && !isLoaded) 
+                addSynchronizationLoadingAdapter();
+        }
+        if(adapter != null)
+            adapter.waitForResourceToLoad();
+        else {
+            try {
+                load((InputStream) null, options);
+            } catch(IOException ioe) {
+                removeLoadingSynchronizationAdapter();
+                throw ioe;
+            } catch(RuntimeException re) {
+                removeLoadingSynchronizationAdapter();
+                throw re;
+            } catch(Error e) {
+                removeLoadingSynchronizationAdapter();
+                throw e;
+            }
+        }
+    }
 	
 	  /**
      * 
      */
     protected void addSynchronizationLoadingAdapter() {
+    	synchronized (eAdapters()) {
         if (ResourceIsLoadingAdapter.findAdapter(this) == null)
             eAdapters().add(ResourceIsLoadingAdapterFactory.INSTANCE.createResourceIsLoadingAdapter());
+    	}
     }
 
     /**
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIResourceImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIResourceImpl.java
index 57cd396..64b9a5c 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIResourceImpl.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIResourceImpl.java
@@ -327,7 +327,7 @@
 			setForceRefresh(false);
 			setModified(false); //dcb - this is required to ensure that resources without files are
 			// marked as not modified.
-			if (readReferenceCount == 0 && editReferenceCount == 0) {
+			if (readReferenceCount == 0 && editReferenceCount == 0 && getResourceSet() != null) {
 				getResourceSet().getResources().remove(this);
 			}
 		
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceImpl.java
index d925245..5d09434 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceImpl.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceImpl.java
@@ -381,18 +381,16 @@
 	}
 
 	public void load(Map options) throws IOException {
-		synchronized (this) {
-			if (isLoaded)
+		
+			if (isLoaded())
 				return;
-			// System.out.println(Thread.currentThread() + "
-			// TranslatorResource.load(): " + this);
+			
 			if (renderer.useStreamsForIO()) {
 				super.load(options);
 			}
-			else if (!isLoaded) {
-				load((InputStream) null, options);
+			else if (!isLoaded()) {
+				isShared();
+				loadExisting(options);
 			}
-		}
-
 	}
 }
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceIsLoadingAdapter.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceIsLoadingAdapter.java
index 35f1f33..d36ea59 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceIsLoadingAdapter.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceIsLoadingAdapter.java
@@ -42,9 +42,10 @@
          * removeIsLoadingSupport() will coordinate with this 
          * synchronization.
          */
-        synchronized (aResource) {
-            adapter = (ResourceIsLoadingAdapter) EcoreUtil.getAdapter(aResource.eAdapters(), ResourceIsLoadingAdapter.class);
+        synchronized(aResource.eAdapters()) {
+        	adapter = (ResourceIsLoadingAdapter) EcoreUtil.getAdapter(aResource.eAdapters(), ResourceIsLoadingAdapter.class);
         }
+        
         return adapter;
     }
 
@@ -88,7 +89,7 @@
          */
         if (getTarget() != null) {
             //System.out.println("ResourceIsLoadingAdapter Synchronizing on " + getTarget());
-            synchronized (getTarget()) {
+            synchronized (getTarget().eAdapters()) {
                 getTarget().eAdapters().remove(this);
             }
         }
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EMFWorkbenchEditContextFactory.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EMFWorkbenchEditContextFactory.java
index 6d74981..0a8d2f8 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EMFWorkbenchEditContextFactory.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EMFWorkbenchEditContextFactory.java
@@ -19,9 +19,9 @@
 import java.util.Hashtable;
 import java.util.Map;
 
+import org.eclipse.core.internal.jobs.LockManager;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.jobs.ILock;
-import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.jem.internal.util.emf.workbench.EMFWorkbenchContextFactory;
 import org.eclipse.jem.util.emf.workbench.EMFWorkbenchContextBase;
@@ -54,6 +54,7 @@
 		return new ResourceSetWorkbenchEditSynchronizer(aResourceSet, aProject);
 	}
 	
+	protected static LockManager lockManager = new LockManager();
 	protected static Map projectLocks = new Hashtable();
 
 	public static ILock getProjectLockObject(IProject aProject){
@@ -64,7 +65,7 @@
 		synchronized (projectLocks) {
 			ILock lock = (ILock)projectLocks.get(hashCode);
 			if(lock == null){
-				lock = Job.getJobManager().newLock();
+				lock = lockManager.newLock();
 				projectLocks.put(hashCode, lock);
 			}
 			return lock;
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 b913a42..9547914 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
@@ -98,6 +98,8 @@
 	}
 	protected boolean removeResource(Resource aResource) {
 		if (aResource != null) {
+			//First checking if resource is loaded (Which will prevent removing in middle of loading by checking resource adapter lock)
+			aResource.isLoaded();
 			synchronized (aResource) {
 				aResource.eAdapters().remove(resourceAdapter);
 				return getResources().remove(aResource);