### Eclipse Workspace Patch 1.0 #P org.eclipse.wst.common.emfworkbench.integration Index: src/org/eclipse/wst/common/internal/emfworkbench/edit/EMFWorkbenchEditContextFactory.java =================================================================== RCS file: /cvsroot/webtools/common/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EMFWorkbenchEditContextFactory.java,v retrieving revision 1.10.4.1 diff -u -r1.10.4.1 EMFWorkbenchEditContextFactory.java --- src/org/eclipse/wst/common/internal/emfworkbench/edit/EMFWorkbenchEditContextFactory.java 19 Jun 2008 01:13:57 -0000 1.10.4.1 +++ src/org/eclipse/wst/common/internal/emfworkbench/edit/EMFWorkbenchEditContextFactory.java 7 Aug 2008 04:00:55 -0000 @@ -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; #P org.eclipse.wst.common.emf Index: wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResourceImpl.java =================================================================== RCS file: /cvsroot/webtools/common/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResourceImpl.java,v retrieving revision 1.7 diff -u -r1.7 CompatibilityXMIResourceImpl.java --- wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResourceImpl.java 29 Apr 2008 03:59:12 -0000 1.7 +++ wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResourceImpl.java 7 Aug 2008 04:00:57 -0000 @@ -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()); + } } /** Index: wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIResourceImpl.java =================================================================== RCS file: /cvsroot/webtools/common/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIResourceImpl.java,v retrieving revision 1.12 diff -u -r1.12 ReferencedXMIResourceImpl.java --- wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIResourceImpl.java 29 Apr 2008 03:59:12 -0000 1.12 +++ wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIResourceImpl.java 7 Aug 2008 04:00:57 -0000 @@ -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); } Index: wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceImpl.java =================================================================== RCS file: /cvsroot/webtools/common/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceImpl.java,v retrieving revision 1.8 diff -u -r1.8 TranslatorResourceImpl.java --- wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceImpl.java 7 Jun 2007 19:29:35 -0000 1.8 +++ wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceImpl.java 7 Aug 2008 04:00:57 -0000 @@ -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); } - } - } } Index: wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceIsLoadingAdapter.java =================================================================== RCS file: /cvsroot/webtools/common/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceIsLoadingAdapter.java,v retrieving revision 1.2 diff -u -r1.2 ResourceIsLoadingAdapter.java --- wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceIsLoadingAdapter.java 7 Jun 2007 19:29:37 -0000 1.2 +++ wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceIsLoadingAdapter.java 7 Aug 2008 04:00:57 -0000 @@ -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); } } #P org.eclipse.wst.common.modulecore Index: modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java =================================================================== RCS file: /cvsroot/webtools/common/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java,v retrieving revision 1.46.4.1 diff -u -r1.46.4.1 ModuleStructuralModel.java --- modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java 19 Jun 2008 02:00:18 -0000 1.46.4.1 +++ modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java 7 Aug 2008 04:00:58 -0000 @@ -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); #P org.eclipse.wst.xml.core Index: src-emfModelSynch/org/eclipse/wst/xml/core/internal/emf2xml/EMF2DOMSSERenderer.java =================================================================== RCS file: /cvsroot/webtools/sourceediting/plugins/org.eclipse.wst.xml.core/src-emfModelSynch/org/eclipse/wst/xml/core/internal/emf2xml/EMF2DOMSSERenderer.java,v retrieving revision 1.16.2.3 diff -u -r1.16.2.3 EMF2DOMSSERenderer.java --- src-emfModelSynch/org/eclipse/wst/xml/core/internal/emf2xml/EMF2DOMSSERenderer.java 24 Jul 2008 00:44:34 -0000 1.16.2.3 +++ src-emfModelSynch/org/eclipse/wst/xml/core/internal/emf2xml/EMF2DOMSSERenderer.java 7 Aug 2008 04:00:59 -0000 @@ -393,7 +393,12 @@ } public boolean isShared() { - if (getResourceSet() == null || xmlModel == null) + + if( xmlModel == null) { //resource could be in process of being unloaded - check with model manager + String id = getModelManagerId(); + return getModelManager().isShared(id); + } + if (getResourceSet() == null) return false; return xmlModel.isShared(); }