Bug 576425 - Support mapping of resources to remote URIs

Support mapping of resources to remote URIs, inverse of the mapping
provided by I0362aecc8d5b905b481fa5a4f27d2c5f4f862112

Change-Id: Ida41f97f25929523381ee7b2077cdf358bd1f9f7
diff --git a/org.eclipse.lsp4e.test/fragment.xml b/org.eclipse.lsp4e.test/fragment.xml
index b4d226c..dc26039 100644
--- a/org.eclipse.lsp4e.test/fragment.xml
+++ b/org.eclipse.lsp4e.test/fragment.xml
@@ -184,7 +184,7 @@
             class="org.eclipse.lsp4e.test.CreateAndRegisterContentTypeLSPLaunchConfigMapping">
       </startup>
    </extension>
-   
+
   <extension
          point="org.eclipse.core.expressions.propertyTesters">
       <propertyTester
@@ -195,7 +195,7 @@
             type="java.lang.Object">
       </propertyTester>
       </extension>
-  <extension 
+  <extension
          point="org.eclipse.core.filesystem.filesystems">
 	<filesystem scheme="other">
 	   <run class="org.eclipse.lsp4e.test.OtherFileSystem" />
@@ -221,4 +221,14 @@
          </adapter>
       </factory>
   </extension>
+  <extension
+         point="org.eclipse.core.runtime.adapters">
+      <factory
+            adaptableType="org.eclipse.core.resources.IFile"
+            class="org.eclipse.lsp4e.test.UriToResourceAdapterFactory">
+         <adapter
+               type="java.net.URI">
+         </adapter>
+      </factory>
+  </extension>
 </fragment>
diff --git a/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/UriToResourceAdapterFactory.java b/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/UriToResourceAdapterFactory.java
index c050154..74a4a65 100644
--- a/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/UriToResourceAdapterFactory.java
+++ b/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/UriToResourceAdapterFactory.java
@@ -26,15 +26,15 @@
  *

  */

 public class UriToResourceAdapterFactory implements IAdapterFactory{

-	

-	

+

+

 	private static final String A_SEGMENT = "/a/";

 

 	@SuppressWarnings("unchecked")

 	  @Override

 	  public <T> T getAdapter(final Object adaptableObject, final Class<T> adapterType) {

 	    if (adaptableObject instanceof String) {

-	        URI uri = URI.create(((String) adaptableObject).replace(A_SEGMENT, ""));	        

+	        URI uri = URI.create(((String) adaptableObject).replace(A_SEGMENT, ""));

 	        String path = uri.getPath();

 	        IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(LSPEclipseUtilsTest.class.getSimpleName() + uri.getScheme());

 	        if (path != null) {

@@ -44,12 +44,18 @@
 	            return (T) project.getFile(path);

 	          }

 	        }

+	    } else if (adaptableObject instanceof IFile) {

+	    	URI uri = ((IResource)adaptableObject).getLocationURI();

+	        IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(LSPEclipseUtilsTest.class.getSimpleName() + uri.getScheme());

+	        if (project != null && uri.getScheme().equals("other")) {

+	        	return (T) URI.create(uri.toString().replaceAll("//", "/" + A_SEGMENT));

+	        }

 	    }

 	    return null;

 	  }

 

 	  @Override

 	  public Class<?>[] getAdapterList() {

-	    return new Class<?>[] {IResource.class, IFile.class};

+	    return new Class<?>[] {IResource.class, IFile.class, URI.class};

 	  }

 }

diff --git a/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/edit/LSPEclipseUtilsTest.java b/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/edit/LSPEclipseUtilsTest.java
index d7ce489..86f83d7 100644
--- a/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/edit/LSPEclipseUtilsTest.java
+++ b/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/edit/LSPEclipseUtilsTest.java
@@ -156,7 +156,7 @@
 			IFile file = project1.getFile("res");
 			file.create(new ByteArrayInputStream(new byte[0]), true, new NullProgressMonitor());
 			Assert.assertEquals(file, LSPEclipseUtils.findResourceFor(file.getLocationURI().toString()));
-			
+
 			project1.getFile("suffix").create(new ByteArrayInputStream(new byte[0]), true, new NullProgressMonitor());
 			project2 = TestUtils.createProject(project1.getName() + "suffix");
 			Assert.assertEquals(project2, LSPEclipseUtils.findResourceFor(project2.getLocationURI().toString()));
@@ -167,7 +167,7 @@
 	}
 
 	@Test
-	public void testURIToLinkedResourceMapping() throws CoreException { // bug 576425
+	public void testCustomURIToResourceMapping() throws CoreException { // bug 576425
 	   IProject project = null;
 	   try {
 		    URI uri = URI.create("other://a/res.txt");
@@ -180,7 +180,21 @@
 			if (project != null) { project.delete(true, new NullProgressMonitor()); }
 		}
 	}
-	
+
+	@Test
+	public void testCustomResourceToURIMapping() throws CoreException { // bug 576425
+	   IProject project = null;
+	   try {
+		    URI uri = URI.create("other://res.txt");
+			project = TestUtils.createProject(getClass().getSimpleName() + uri.getScheme());
+			IFile file = project.getFile("res.txt");
+			file.createLink(uri, IResource.REPLACE | IResource.ALLOW_MISSING_LOCAL, new NullProgressMonitor());
+			Assert.assertEquals(LSPEclipseUtils.toUri(file).toString(), "other://a/res.txt");
+		} finally {
+			if (project != null) { project.delete(true, new NullProgressMonitor()); }
+		}
+	}
+
 	@Test
 	public void testApplyTextEditLongerThanOrigin() throws Exception {
 		IProject project = null;
@@ -199,7 +213,7 @@
 			if (project != null) { project.delete(true, new NullProgressMonitor()); }
 		}
 	}
-	
+
 	@Test
 	public void testApplyTextEditShorterThanOrigin() throws Exception {
 		IProject project = null;
diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LSPEclipseUtils.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LSPEclipseUtils.java
index f75a06e..e6f2d32 100644
--- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LSPEclipseUtils.java
+++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LSPEclipseUtils.java
@@ -769,6 +769,10 @@
 	}
 
 	public static URI toUri(IResource resource) {
+		URI adaptedURI = Adapters.adapt(resource, URI.class, true);
+		if (adaptedURI != null) {
+			return adaptedURI;
+		}
 		IPath location = resource.getLocation();
 		if (location != null) {
 			return toUri(location);