WorkspaceFactory should use canonical URis as keys for the workspaces map
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspaceFactory.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspaceFactory.java
index 55dc575..fa3184b 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspaceFactory.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspaceFactory.java
@@ -14,6 +14,7 @@
 import java.util.HashMap;
 import java.util.Map;
 import org.eclipse.core.filesystem.URIUtil;
+import org.eclipse.core.internal.utils.FileUtil;
 import org.eclipse.core.resources.IWorkspace;
 import org.eclipse.core.resources.IWorkspaceFactory;
 import org.eclipse.core.runtime.CoreException;
@@ -31,6 +32,8 @@
 	 * @see org.eclipse.core.resources.IWorkspaceFactory#getWorkspace(java.net.URI)
 	 */
 	public synchronized IWorkspace constructWorkspace(URI location) throws CoreException {
+		// use a canonical form
+		location = FileUtil.canonicalURI(location);
 		Workspace result = (Workspace) workspaces.get(location);
 		if (result == null) {
 			result = new Workspace(URIUtil.toPath(location));
@@ -40,5 +43,4 @@
 		}
 		return result;
 	}
-
 }
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MultipleWorkspacesTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MultipleWorkspacesTest.java
index e008237..c834d30 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MultipleWorkspacesTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MultipleWorkspacesTest.java
@@ -10,6 +10,8 @@
  *******************************************************************************/
 package org.eclipse.core.tests.resources;
 
+import java.net.URI;
+import java.net.URISyntaxException;
 import junit.framework.Test;
 import junit.framework.TestSuite;
 import org.eclipse.core.filesystem.IFileStore;
@@ -42,7 +44,6 @@
 	}
 
 	public void testCreateAndListProjects() {
-
 		// create and open a non-default workspace
 		IFileStore workspace1Location = getTempStore().getChild(getUniqueString());
 		IWorkspace newWorkspace1 = null;
@@ -74,4 +75,35 @@
 			fail("5.99", e);
 		}
 	}
+
+	public void testConstructWorkspace_similarURIs() {
+		// create and open a non-default workspace
+		IFileStore workspace1Location = getTempStore().getChild(getUniqueString());
+		IWorkspace newWorkspace = null;
+		try {
+			newWorkspace = getWorkspaceFactory().constructWorkspace(workspace1Location.toURI());
+		} catch (CoreException e) {
+			fail("1.0", e);
+		}
+
+		// create a non-canonical workspace location URI
+		URI workspace1LocationURI = workspace1Location.toURI();
+		URI workspaceLocationURI_nonCanonical = null;
+		try {
+			workspaceLocationURI_nonCanonical = new URI(workspace1LocationURI.toString() + "/");
+		} catch (URISyntaxException e1) {
+			fail("2.0", e1);
+		}
+
+		// get the workspace using the non-canonical location URI
+		IWorkspace newWorkspace2 = null;
+		try {
+			newWorkspace2 = getWorkspaceFactory().constructWorkspace(workspaceLocationURI_nonCanonical);
+		} catch (CoreException e) {
+			fail("3.0", e);
+		}
+
+		// we should get the same workspace instance
+		assertTrue("4.0", newWorkspace == newWorkspace2);
+	}
 }