/******************************************************************************* * Copyright (c) 2000, 2009 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.core.internal.resources; import java.io.IOException; import java.net.*; import org.eclipse.core.internal.boot.PlatformURLConnection; import org.eclipse.core.internal.boot.PlatformURLHandler; import org.eclipse.core.internal.utils.Messages; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.osgi.util.NLS; /** * Platform URL support * platform:/resource/<path>/<resource> maps to resource in current workspace */ public class PlatformURLResourceConnection extends PlatformURLConnection { // resource/ protocol public static final String RESOURCE = "resource"; //$NON-NLS-1$ public static final String RESOURCE_URL_STRING = PlatformURLHandler.PROTOCOL + PlatformURLHandler.PROTOCOL_SEPARATOR + '/' + RESOURCE + '/'; private static URL rootURL; public PlatformURLResourceConnection(URL url) { super(url); } protected boolean allowCaching() { return false; // don't cache, workspace is local } protected URL resolve() throws IOException { String filePath = url.getFile().trim(); filePath = URLDecoder.decode(filePath, "UTF-8"); //$NON-NLS-1$ IPath spec = new Path(filePath).makeRelative(); if (!spec.segment(0).equals(RESOURCE)) throw new IOException(NLS.bind(Messages.url_badVariant, url)); int count = spec.segmentCount(); // if there is only one segment then we are talking about the workspace root. if (count == 1) return rootURL; // if there are two segments then the second is a project name. IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(spec.segment(1)); if (!project.exists()) { String message = NLS.bind(Messages.url_couldNotResolve_projectDoesNotExist, project.getName(), url.toExternalForm()); throw new IOException(message); } IResource resource = null; IPath result = null; if (count == 2) { resource = project; } else { spec = spec.removeFirstSegments(2); resource = project.getFile(spec); } result = resource.getLocation(); if (result == null) { URI uri = resource.getLocationURI(); if (uri != null) { try { URL url2 = uri.toURL(); if (url2.getProtocol().equals("file")) //$NON-NLS-1$ return url2; } catch (MalformedURLException e) { String message = NLS.bind(Messages.url_couldNotResolve_URLProtocolHandlerCanNotResolveURL, uri.toString(), url.toExternalForm()); throw new IOException(message); } } String message = NLS.bind(Messages.url_couldNotResolve_resourceLocationCanNotBeDetermined, resource.getFullPath(), url.toExternalForm()); throw new IOException(message); } return new URL("file", "", result.toString()); //$NON-NLS-1$ //$NON-NLS-2$ } /** * This method is called during resource plugin startup() initialization. * * @param root URL to the root of the current workspace. */ public static void startup(IPath root) { // register connection type for platform:/resource/ handling if (rootURL != null) return; try { rootURL = root.toFile().toURL(); } catch (MalformedURLException e) { // should never happen but if it does, the resource URL cannot be supported. return; } PlatformURLHandler.register(RESOURCE, PlatformURLResourceConnection.class); } }