NEW - bug 371754: Correct handling of fragment-less URIs and
root elements in EmfStructureBridge
https://bugs.eclipse.org/bugs/show_bug.cgi?id=371754
Change-Id: I713e138750924b7a6c10b4f454bf62bb85781552
diff --git a/org.eclipse.mylyn.mft.emf.core/src/org/eclipse/mylyn/mft/emf/core/EmfStructureBridge.java b/org.eclipse.mylyn.mft.emf.core/src/org/eclipse/mylyn/mft/emf/core/EmfStructureBridge.java
index 9e81f6d..073a537 100644
--- a/org.eclipse.mylyn.mft.emf.core/src/org/eclipse/mylyn/mft/emf/core/EmfStructureBridge.java
+++ b/org.eclipse.mylyn.mft.emf.core/src/org/eclipse/mylyn/mft/emf/core/EmfStructureBridge.java
@@ -120,17 +120,15 @@
public Object getDomainObjectForHandle(String handle) {
URI uri = URI.createURI(handle);
ResourceSet resourceSet = getDomainObjectResourceSet();
- String fragment = uri.fragment();
- if (fragment.equals("/")) { //$NON-NLS-1$
- Resource resource = resourceSet.getResource(uri, true);
- return resource;
- }
try {
+ if (!uri.hasFragment()) {
+ Resource resource = resourceSet.getResource(uri, true);
+ return resource;
+ }
EObject eObject = resourceSet.getEObject(uri, true);
if (eObject != null) {
return eObject;
}
- return resourceSet.getResource(uri, true);
} catch (WrappedException e) {
// this is a reasonable thing to happen in the case where the resource is no longer available.
}
@@ -177,9 +175,16 @@
return getHandleIdentifier(eObject.eContainer());
} else {
//must be base package
- return getHandleIdentifier(eObject.eResource());
+ Resource resource = eObject.eResource();
+ IFile file = getFile(resource);
+ if (file != null && file.exists()) {
+ AbstractContextStructureBridge parentBridge = ContextCore.getStructureBridge(parentContentType);
+ return parentBridge.getHandleIdentifier(file);
+ }
+ return getHandleIdentifier(resource);
}
- } else if (object instanceof Resource) {
+ }
+ if (object instanceof Resource) {
Resource resource = (Resource) object;
IFile file = getFile(resource);
if (file != null && file.exists()) {
diff --git a/org.eclipse.mylyn.mft.emf.tests/src/org/eclipse/mylyn/mft/emf/tests/EmfStructureBridgeTest.java b/org.eclipse.mylyn.mft.emf.tests/src/org/eclipse/mylyn/mft/emf/tests/EmfStructureBridgeTest.java
index fd08586..7770882 100644
--- a/org.eclipse.mylyn.mft.emf.tests/src/org/eclipse/mylyn/mft/emf/tests/EmfStructureBridgeTest.java
+++ b/org.eclipse.mylyn.mft.emf.tests/src/org/eclipse/mylyn/mft/emf/tests/EmfStructureBridgeTest.java
@@ -14,6 +14,7 @@
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
@@ -52,4 +53,30 @@
assertEquals(fragmentClass.getClassifierID(), obtainedClass.getClassifierID());
}
+ public void testEmptyFragment() throws Exception {
+ ResourceSet rs = new ResourceSetImpl();
+ Resource resource = rs.getResource(URI.createPlatformResourceURI(
+ "/org.eclipse.mylyn.modeling.tests.ecorediagram/model/library.ecore", false), true); //$NON-NLS-1$
+ String handleIdentifier = structureModelBridge.getHandleIdentifier(resource);
+ Object objectForHandle = structureModelBridge.getObjectForHandle(handleIdentifier);
+ assertTrue(objectForHandle instanceof Resource);
+ Resource obtainedResource = (Resource) objectForHandle;
+ assertFalse(resource.equals(obtainedResource));
+ assertEquals(resource.getURI(), obtainedResource.getURI());
+ }
+
+ public void testRootFragment() throws Exception {
+ ResourceSet rs = new ResourceSetImpl();
+ Resource resource = rs.getResource(URI.createPlatformResourceURI(
+ "/org.eclipse.mylyn.modeling.tests.ecorediagram/model/library.ecore", false), true); //$NON-NLS-1$
+ EObject eObject = resource.getEObject("/"); //$NON-NLS-1$
+ assertTrue(eObject instanceof EPackage);
+ EPackage ePackage = (EPackage) eObject;
+ String handleIdentifier = structureModelBridge.getHandleIdentifier(eObject);
+ Object objectForHandle = structureModelBridge.getObjectForHandle(handleIdentifier);
+ assertTrue(objectForHandle instanceof EPackage);
+ EPackage obtainedPackage = (EPackage) objectForHandle;
+ assertFalse(ePackage.equals(obtainedPackage));
+ assertEquals(ePackage.getNsURI(), obtainedPackage.getNsURI());
+ }
}