[nobug] JS Threading issues with 2 simultaneous creations of emf contexts.
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 7131dae..33b554e 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
@@ -16,10 +16,16 @@
*/
package org.eclipse.wst.common.internal.emfworkbench.edit;
+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.emf.ecore.resource.ResourceSet;
import org.eclipse.jem.internal.util.emf.workbench.EMFWorkbenchContextFactory;
import org.eclipse.jem.util.emf.workbench.EMFWorkbenchContextBase;
+import org.eclipse.jem.util.emf.workbench.IEMFContextContributor;
import org.eclipse.jem.util.emf.workbench.ResourceSetWorkbenchSynchronizer;
import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
import org.eclipse.wst.common.internal.emfworkbench.integration.ResourceSetWorkbenchEditSynchronizer;
@@ -31,6 +37,8 @@
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class EMFWorkbenchEditContextFactory extends EMFWorkbenchContextFactory {
+
+
/**
*
*/
@@ -45,4 +53,50 @@
public ResourceSetWorkbenchSynchronizer createSynchronizer(ResourceSet aResourceSet, IProject aProject) {
return new ResourceSetWorkbenchEditSynchronizer(aResourceSet, aProject);
}
+
+ protected static LockManager lockManager = new LockManager();
+ protected static Map projectLocks = new Hashtable();
+
+ protected static ILock getProjectLockObject(IProject aProject){
+ if(null == aProject){
+ return null;
+ }
+ Integer hashCode = new Integer(aProject.hashCode());
+ synchronized (projectLocks) {
+ ILock lock = (ILock)projectLocks.get(hashCode);
+ if(lock == null){
+ lock = lockManager.newLock();
+ projectLocks.put(hashCode, lock);
+ }
+ return lock;
+ }
+ }
+
+ public EMFWorkbenchContextBase createEMFContext(IProject aProject, IEMFContextContributor contributor) {
+ ILock lock = getProjectLockObject(aProject);
+ try{
+ if(null != lock){
+ lock.acquire();
+ }
+ return super.createEMFContext(aProject, contributor);
+ } finally{
+ if(null != lock){
+ lock.release();
+ }
+ }
+ }
+
+ protected EMFWorkbenchContextBase getCachedEMFContext(IProject aProject) {
+ ILock lock = getProjectLockObject(aProject);
+ try{
+ if(null != lock){
+ lock.acquire();
+ }
+ return super.getCachedEMFContext(aProject);
+ } finally{
+ if(null != lock){
+ lock.release();
+ }
+ }
+ }
}