[240606] More issues with SSEDOMAdapter
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 95e4f3c..409ffa0 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
@@ -30,7 +30,6 @@ import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument; import org.eclipse.wst.xml.core.internal.Logger; -import org.eclipse.wst.xml.core.internal.document.ElementImpl; import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement; import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode; @@ -40,6 +39,8 @@ import org.w3c.dom.Text; public class EMF2DOMSSEAdapter extends EMF2DOMAdapterImpl implements INodeAdapter { + + private Class resourceClass; public EMF2DOMSSEAdapter(Node node, EMF2DOMRenderer renderer, Translator translator) { super(node, renderer, translator); } @@ -321,9 +322,16 @@ // First Check if it's an EMF2DOMAdapter if (adapter != null && adapter.isAdapterForType(EMF2DOMAdapter.ADAPTER_CLASS)) { // Cast to EMF2DOMAdapter - EMF2DOMAdapter e2DAdapter = (EMF2DOMAdapter) adapter; - if (getTarget() == null || e2DAdapter.getTarget() == null) - return e2DAdapter; + EMF2DOMSSEAdapter e2DAdapter = (EMF2DOMSSEAdapter) adapter; + Object adapterTarget = e2DAdapter.getTarget(); + + //Handle the cases where either adapter's target is null + if ((getTarget() == null) || (adapterTarget == null)) + if(resourceClass.equals(e2DAdapter.getResourceClass())) + return e2DAdapter; + else + continue; + // Check if target is an EMF resource if (getTarget() instanceof Resource) { @@ -331,24 +339,23 @@ * Now check if it's the right one (Multiple resources * could be attached) */ - if (e2DAdapter.getTarget() == getTarget()) { + if (adapterTarget != null && adapterTarget == getTarget()) { return e2DAdapter; } } else { // Check if targets are EObjects with the same resources EObject myTarget = (EObject) getTarget(); - EObject adapterTarget = (EObject) e2DAdapter.getTarget(); /* * Now check if it's the right one (Multiple resources could * be attached) */ - if (adapterTarget.eResource() == myTarget.eResource()) { + if (adapterTarget != null && ((EObject)adapterTarget).eResource() == myTarget.eResource()) { return e2DAdapter; } } - if (e2DAdapter.getTarget() instanceof EObject) { + if (adapterTarget instanceof EObject) { if (((EObject) e2DAdapter.getTarget()).eResource() == null) { return e2DAdapter; } @@ -404,7 +411,7 @@ } protected void setEmptyTag(Element element) { - ((ElementImpl) element).setEmptyTag(true); + ((IDOMElement) element).setEmptyTag(true); } public void updateDOM() { @@ -418,4 +425,15 @@ enableUndoManagement(); } } + + public Class getResourceClass() { + return resourceClass; + } + + protected void initChildTranslators() { + if (fRenderer != null && fRenderer.getResource() != null) + resourceClass = fRenderer.getResource().getClass(); + super.initChildTranslators(); + } + }
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 ae3e5f2..7b6eb86 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
@@ -64,6 +64,8 @@ private boolean isSaving = false; private IModelManager modelManager; + + private Class resourceClass; /** The XML DOM model */ protected IDOMModel xmlModel; @@ -272,10 +274,15 @@ INodeAdapter adapter = (INodeAdapter) iterator.next(); // First Check if it's an EMF2DOMAdapter if (adapter != null && adapter.isAdapterForType(EMF2DOMAdapter.ADAPTER_CLASS)) { - // Cast to EMF2DOMAdapter - EMF2DOMAdapter e2DAdapter = (EMF2DOMAdapter) adapter; + // Cast to EMF2DOMSSEAdapter + EMF2DOMSSEAdapter e2DAdapter = (EMF2DOMSSEAdapter) adapter; + //Handle the cases where either adapter's target is null + //Use the resourceClass to make sure the resource type is identical if (getResource() == null || e2DAdapter.getTarget() == null) - return e2DAdapter; + if(resourceClass.equals(e2DAdapter.getResourceClass())) + return e2DAdapter; + else + continue; // First check if targets are resources if (e2DAdapter.getTarget() instanceof Resource) { @@ -428,17 +435,18 @@ if (isBatchChanges) return; try { - if (aboutToChangeNode != null - && model.getStructuredDocument() != null - && model.getStructuredDocument() - .getFirstStructuredDocumentRegion() != aboutToChangeNode) { - modelAccessForWrite(); + if (aboutToChangeNode != null && model.getStructuredDocument() != null + && model.getStructuredDocument().getFirstStructuredDocumentRegion() != aboutToChangeNode) { + 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.getReferenceCountForEdit() > 0)) { + tempModel.releaseFromEdit(); + } } } } finally { @@ -622,4 +630,10 @@ return xmlModelReverted; } + public void setResource(TranslatorResource resource) { + super.setResource(resource); + if (resource != null) + resourceClass = resource.getClass(); + } + }