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());
+	}
 }