| /******************************************************************************* |
| * Copyright (c) 2000, 2010 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.filebuffers; |
| |
| import java.io.File; |
| import java.net.URI; |
| |
| import org.osgi.framework.Bundle; |
| |
| import org.eclipse.core.filesystem.EFS; |
| import org.eclipse.core.filesystem.IFileStore; |
| import org.eclipse.core.internal.filebuffers.FileBuffersPlugin; |
| import org.eclipse.core.internal.filebuffers.ResourceTextFileBufferManager; |
| import org.eclipse.core.internal.filebuffers.TextFileBufferManager; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.Platform; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IWorkspaceRoot; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| |
| |
| /** |
| * Facade for the file buffers plug-in. Provides access to the text file buffer |
| * manager and helper methods for location handling. This facade is available |
| * independent from the activation status of the file buffers plug-in. |
| * <p> |
| * This class must not be used by clients that do not want to require |
| * <code>org.eclipse.core.resources</code>. Use <code>ITextFileBufferManager.DEFAULT</code> |
| * to get the default text file buffer manager. |
| * </p> |
| * |
| * @since 3.0 |
| * @noinstantiate This class is not intended to be instantiated by clients. |
| */ |
| public final class FileBuffers { |
| |
| /** |
| * The workspace root. |
| * @since 3.3 |
| */ |
| private static final IWorkspaceRoot WORKSPACE_ROOT= ResourcesPlugin.getWorkspace().getRoot(); |
| |
| /** |
| * Cannot be instantiated. |
| */ |
| private FileBuffers() { |
| } |
| |
| /** |
| * File buffer plug-in ID |
| * (value <code>"org.eclipse.core.filebuffers"</code>). |
| * |
| * @since 3.3. |
| */ |
| public static final String PLUGIN_ID= FileBuffersPlugin.PLUGIN_ID; |
| |
| /** |
| * Returns the text file buffer manager. May return <code>null</code> if |
| * the file buffers plug-in is not active. This is, for example, the |
| * case when the method is called on plug-in shutdown. |
| * <p> |
| * Use <code>ITextFileBufferManager.DEFAULT</code> to get the default text |
| * file buffer manager if you do not want to depend on |
| * <code>org.eclipse.core.resources</code>. |
| |
| * </p> |
| * |
| * @return the text file buffer manager or <code>null</code> |
| */ |
| public static ITextFileBufferManager getTextFileBufferManager() { |
| FileBuffersPlugin plugin= FileBuffersPlugin.getDefault(); |
| return plugin != null ? plugin.getFileBufferManager() : null; |
| } |
| |
| /** |
| * Creates and returns an <em>unshared</em> text file buffer manager. |
| * |
| * @return the text file buffer manager or <code>null</code> |
| * @since 3.4 |
| */ |
| public static ITextFileBufferManager createTextFileBufferManager() { |
| Bundle resourcesBundle= Platform.getBundle("org.eclipse.core.resources"); //$NON-NLS-1$ |
| if (resourcesBundle != null) |
| return new ResourceTextFileBufferManager(); |
| return new TextFileBufferManager(); |
| } |
| |
| /** |
| * Returns the workspace file at the given location if such a file exists. |
| * |
| * @param location the location |
| * @return the workspace file at the location or <code>null</code> if no such file exists or if |
| * the location is not a valid location |
| */ |
| public static IFile getWorkspaceFileAtLocation(IPath location) { |
| return getWorkspaceFileAtLocation(location, false); |
| } |
| |
| /** |
| * Returns the workspace file at the given location if such a file exists. |
| * |
| * @param location the location |
| * @param isNormalized <code>true</code> if the given location is already normalized |
| * @return the workspace file at the location or <code>null</code> if no such file exists or if |
| * the location is not a valid location |
| * @since 3.3 |
| */ |
| public static IFile getWorkspaceFileAtLocation(IPath location, boolean isNormalized) { |
| IPath normalized; |
| if (isNormalized) |
| normalized= location; |
| else |
| normalized= normalizeLocation(location); |
| |
| if (normalized.segmentCount() >= 2) { |
| // @see IContainer#getFile for the required number of segments |
| IFile file= WORKSPACE_ROOT.getFile(normalized); |
| if (file != null && file.exists()) |
| return file; |
| } |
| return null; |
| } |
| |
| /** |
| * Returns the normalized form of the given path or location. |
| * <p> |
| * The normalized form is defined as follows: |
| * </p> |
| * <ul> |
| * <li><b>Existing Workspace Files:</b> For a path or location for |
| * which there |
| * {@link org.eclipse.core.resources.IContainer#exists(org.eclipse.core.runtime.IPath) exists} |
| * a workspace file, the normalized form is that file's workspace |
| * relative, absolute path as returned by |
| * {@link IFile#getFullPath()}.</li> |
| * <li><b>Non-existing Workspace Files:</b> For a path to a |
| * non-existing workspace file, the normalized form is the |
| * {@link IPath#makeAbsolute() absolute} form of the path.</li> |
| * <li><b>External Files:</b> For a location for which there |
| * exists no workspace file, the normalized form is the |
| * {@link IPath#makeAbsolute() absolute} form of the location.</li> |
| * </ul> |
| * |
| * @param pathOrLocation the path or location to be normalized |
| * @return the normalized form of <code>pathOrLocation</code> |
| */ |
| public static IPath normalizeLocation(IPath pathOrLocation) { |
| // existing workspace resources - this is the 93% case |
| if (WORKSPACE_ROOT.exists(pathOrLocation)) |
| return pathOrLocation.makeAbsolute(); |
| |
| IFile file= WORKSPACE_ROOT.getFileForLocation(pathOrLocation); |
| // existing workspace resources referenced by their file system path |
| // files that do not exist (including non-accessible files) do not pass |
| if (file != null && file.exists()) |
| return file.getFullPath(); |
| |
| // non-existing resources and external files |
| return pathOrLocation.makeAbsolute(); |
| } |
| |
| /** |
| * Returns the file in the local file system for the given location. |
| * <p> |
| * The location is either a full path of a workspace resource or an |
| * absolute path in the local file system. |
| * </p> |
| * |
| * @param location the location |
| * @return the {@link IFileStore} in the local file system for the given location |
| * @since 3.2 |
| */ |
| public static IFileStore getFileStoreAtLocation(IPath location) { |
| if (location == null) |
| return null; |
| |
| IFile file= getWorkspaceFileAtLocation(location); |
| try { |
| if (file != null) { |
| URI uri= file.getLocationURI(); |
| if (uri == null) |
| return null; |
| return EFS.getStore(uri); |
| } |
| } catch (CoreException e) { |
| //fall through and assume it is a local file |
| } |
| return EFS.getLocalFileSystem().getStore(location); |
| } |
| |
| /** |
| * Returns the file in the local file system for the given location. |
| * <p> |
| * The location is either a full path of a workspace resource or an |
| * absolute path in the local file system. |
| * </p> |
| * |
| * @param location the location |
| * @return the {@link File} in the local file system for the given location |
| * @deprecated As of 3.2, replaced by {@link #getFileStoreAtLocation(IPath)} |
| */ |
| @Deprecated |
| public static File getSystemFileAtLocation(IPath location) { |
| IFileStore store= getFileStoreAtLocation(location); |
| if (store != null) { |
| try { |
| return store.toLocalFile(EFS.NONE, null); |
| } catch (CoreException e) { |
| return null; |
| } |
| } |
| return null; |
| } |
| |
| } |