package org.rascalmpl.uri; import java.io.IOException; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.Platform; import org.rascalmpl.eclipse.Activator; import io.usethesource.vallang.ISourceLocation; public class URIResourceResolver { /** * Compute a handle to an Eclipse resource, given a URI, in the context of a project. This uses extensions that implement * the @link {@link IURIResourceResolver} interface to map URI to IResources. * * @param uri * @param projectName the context of the URI, can be null * @return null if no IURIResourceResolved could resolve the URI to a resource, or an IResource handle. */ public static IResource getResource(ISourceLocation uri) { IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint("rascal_eclipse", "uriResolver"); for (IExtension element : extensionPoint.getExtensions()) { for (IConfigurationElement cfg : element.getConfigurationElements()) { try { if (cfg.getAttribute("scheme").equals(uri.getScheme())) { IURIResourceResolver resolver = (IURIResourceResolver) cfg.createExecutableExtension("class"); IResource res = resolver.getResource(uri); if (res != null) { return res; } } } catch (IOException | ClassCastException | CoreException e) { Activator.log("exception while resolving " + uri, e); continue; } } } return null; } }