[209103] EMF2DOM fixes
diff --git a/bundles/org.eclipse.wst.xml.core/src-emfModelSynch/org/eclipse/wst/xml/core/internal/emf2xml/EMF2DOMSSEAdapter.java b/bundles/org.eclipse.wst.xml.core/src-emfModelSynch/org/eclipse/wst/xml/core/internal/emf2xml/EMF2DOMSSEAdapter.java index f327036..145fd1e 100644 --- a/bundles/org.eclipse.wst.xml.core/src-emfModelSynch/org/eclipse/wst/xml/core/internal/emf2xml/EMF2DOMSSEAdapter.java +++ b/bundles/org.eclipse.wst.xml.core/src-emfModelSynch/org/eclipse/wst/xml/core/internal/emf2xml/EMF2DOMSSEAdapter.java
@@ -11,6 +11,9 @@ package org.eclipse.wst.xml.core.internal.emf2xml; +import java.util.Collection; +import java.util.Iterator; + import org.eclipse.emf.common.notify.Notifier; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.text.BadLocationException; @@ -267,7 +270,24 @@ } protected EMF2DOMAdapter primGetExistingAdapter(Node aNode) { - return (EMF2DOMAdapter) ((IDOMNode) aNode).getExistingAdapter(EMF2DOMAdapter.ADAPTER_CLASS); + + INodeNotifier sseNode = (INodeNotifier)aNode; + Collection adapters = sseNode.getAdapters(); + INodeAdapter result = null; + for (Iterator iterator = adapters.iterator(); iterator.hasNext();) { + INodeAdapter a = (INodeAdapter) iterator.next(); + if (a != null && a.isAdapterForType(EMF2DOMAdapter.ADAPTER_CLASS)) { //First Check if its an EMF2DOMAdapter + //Cast to EMF2DOMAdapter + EMF2DOMAdapter e2DAdapter = (EMF2DOMAdapter)a; + if (e2DAdapter.getTarget() == getTarget()) {//Now check if its the right one (Multiple resources could be attached) + result = a; + break; + } + } + } + // if we didn't find one in our list, + // return the null result + return (EMF2DOMAdapter)result; }
diff --git a/bundles/org.eclipse.wst.xml.core/src-emfModelSynch/org/eclipse/wst/xml/core/internal/emf2xml/EMF2DOMSSERenderer.java b/bundles/org.eclipse.wst.xml.core/src-emfModelSynch/org/eclipse/wst/xml/core/internal/emf2xml/EMF2DOMSSERenderer.java index d9a55fc..b49c254 100644 --- a/bundles/org.eclipse.wst.xml.core/src-emfModelSynch/org/eclipse/wst/xml/core/internal/emf2xml/EMF2DOMSSERenderer.java +++ b/bundles/org.eclipse.wst.xml.core/src-emfModelSynch/org/eclipse/wst/xml/core/internal/emf2xml/EMF2DOMSSERenderer.java
@@ -18,19 +18,19 @@ import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.WeakHashMap; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; +import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.jem.util.emf.workbench.ProjectResourceSet; +import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase; import org.eclipse.wst.common.internal.emf.resource.EMF2DOMAdapter; import org.eclipse.wst.common.internal.emf.resource.EMF2DOMRenderer; import org.eclipse.wst.common.internal.emf.resource.TranslatorResource; @@ -43,7 +43,6 @@ import org.eclipse.wst.sse.core.internal.provisional.IModelManager; import org.eclipse.wst.sse.core.internal.provisional.IModelStateListener; import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel; -import org.eclipse.wst.sse.core.internal.provisional.exceptions.ResourceInUse; import org.eclipse.wst.xml.core.internal.Logger; import org.eclipse.wst.xml.core.internal.document.DocumentTypeImpl; import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; @@ -201,10 +200,7 @@ } private void deregisterFromXMLModel() { - if (getXMLModel() != null) { - String id = getXMLModel().getId(); - decrementCacheCount(id); - } + deRegisterAsModelStateListener(); deRegisterAsModelLifecycleListener(); // This try/catch block is a hack to fix defect 204114. This occurs @@ -301,78 +297,20 @@ public String getXMLModelId() { return xmlModelId; - } + } - private static int uniqueCount = 0; - - private static synchronized String getUniqueID(String id){ - return id+uniqueCount++; - } - - private static WeakHashMap resourceMap = new WeakHashMap(); - private static HashMap resourceCount = new HashMap(); - - private static synchronized Object getCachedResource(String id){ - Object obj = resourceMap.get(id); - return obj; - } - - private static synchronized void incrementCacheCount(String id, Object resource){ - resourceMap.put(id, resource); - if(resourceCount.containsKey(id)){ - Integer integer = (Integer)resourceCount.get(id); - Integer newInteger = new Integer(integer.intValue() + 1); - resourceCount.put(id, newInteger); - } else { - resourceCount.put(id, new Integer(1)); - } - } - - private static void decrementCacheCount(String id){ - if(resourceCount.containsKey(id)){ - Integer integer = (Integer)resourceCount.get(id); - if(integer.intValue() > 1){ - Integer newInteger = new Integer(integer.intValue() - 1); - resourceCount.put(id, newInteger); - } else { - resourceCount.remove(id); - resourceMap.remove(id); - } - } else { - resourceMap.remove(id); - } - } - - private IDOMModel initializeXMLModel(IFile file, boolean forWrite) throws UnsupportedEncodingException, IOException { if (file == null || !file.exists()) throw new FileNotFoundException((file == null) ? "null" : file.getFullPath().toOSString()); //$NON-NLS-1$ try { IModelManager manager = getModelManager(); - String id = manager.calculateId(file); - Object cachedResource = getCachedResource(id); - boolean needCopy = false; - if(null != cachedResource && cachedResource != resource){ - needCopy = true; - } else { - incrementCacheCount(id, resource); - } - + String id = manager.calculateId(file); if (forWrite) { IDOMModel mod = (IDOMModel)manager.getExistingModelForEdit(id); if (mod == null) setXMLModel((IDOMModel) manager.getModelForEdit(file)); else { - if(needCopy) - try { - String uniqueID = getUniqueID(id); - incrementCacheCount(id, resource); - setXMLModel((IDOMModel) manager.copyModelForEdit(id, uniqueID)); - } catch (ResourceInUse e) { - Logger.logException(e); - } - else - setXMLModel(mod); + setXMLModel(mod); } } else { @@ -380,16 +318,7 @@ if (mod == null) setXMLModel((IDOMModel) manager.getModelForRead(file)); else { - if(needCopy) - try { - String uniqueID = getUniqueID(id); - incrementCacheCount(id, resource); - setXMLModel((IDOMModel) manager.copyModelForEdit(id, uniqueID)); - } catch (ResourceInUse e) { - Logger.logException(e); - } - else - setXMLModel(mod); + setXMLModel(mod); } } setXMLModelId(getXMLModel().getId()); @@ -458,14 +387,17 @@ return; try { if (aboutToChangeNode != null && model.getStructuredDocument() != null && model.getStructuredDocument().getFirstStructuredDocumentRegion() != aboutToChangeNode) { - modelAccessForWrite(); + String id = getModelManagerId(); + IStructuredModel tempModel = null; try { + tempModel = getModelManager().getExistingModelForEdit(id); xmlModelReverted = true; resource.unload(); } finally { - if (getXMLModel() != null) - getXMLModel().releaseFromEdit(); + if (tempModel != null) { + tempModel.releaseFromEdit(); + } } } } @@ -479,7 +411,8 @@ resource.setModified(false); long stamp = WorkbenchResourceHelper.computeModificationStamp(resource); WorkbenchResourceHelper.setSynhronizationStamp(resource, stamp); - ResourceSetWorkbenchEditSynchronizer synchronizer = (ResourceSetWorkbenchEditSynchronizer) ((ProjectResourceSet) resource.getResourceSet()).getSynchronizer(); + IProject proj = WorkbenchResourceHelper.getProject(resource); + ResourceSetWorkbenchEditSynchronizer synchronizer = (ResourceSetWorkbenchEditSynchronizer) ((ProjectResourceSet) WorkbenchResourceHelperBase.getResourceSet(proj)).getSynchronizer(); IFile aFile = WorkbenchResourceHelper.getFile(resource); synchronizer.preSave(aFile); }