/* * Copyright (c) 2012, the Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.dart.tools.core.internal.util; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import java.io.File; /** * Utilities for dealing with resources. * * @coverage dart.tools.core */ public class ResourceUtil { /** * The root of the workspace, cached for efficiency. */ public static IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); /** * Return the file resource associated with the given file, or <code>null</code> if the file does * not correspond to an existing file resource. * * @param file the file representing the file resource to be returned * @return the file resource associated with the given file */ public static IFile getFile(File file) { if (file == null) { return null; } if (!file.isFile()) { return null; } IResource resource = getResource(file); if (resource == null) { return null; } if (!resource.exists()) { return null; } return (IFile) resource; } /** * Return the file resource associated with the given file path, or {@code null} if the file does * not correspond to an existing file resource. * * @param path the path of the file representing the file resource to be returned * @return the {@link IFile} resource associated with the given file path */ public static IFile getFile(String path) { if (path == null) { return null; } File file = new File(path); return getFile(file); } public static IPath getProjectLocation(IProject project) { if (project.getRawLocation() == null) { return project.getLocation(); } else { return project.getRawLocation(); } } /** * Return the {@link IResource} associated with the given Java {@link File}. * <p> * If the {@link File} is an existing directory, then {@link IContainer} is returned. * <p> * If the {@link File} is an existing file or does not exist in the file system, then * {@link IFile} is returned. * <p> * If the {@link File} does not represent a valid part in the workspace, then {@code null} is * returned. */ public static IResource getResource(File file) { if (file == null) { return null; } if (file.isDirectory()) { IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); IContainer[] containers = workspaceRoot.findContainersForLocationURI(file.toURI()); if (containers.length == 0) { return null; } return containers[0]; } // probably IFile IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); IFile[] files = workspaceRoot.findFilesForLocationURI(file.toURI()); if (files.length == 0) { return null; } return files[0]; } /** * Returns the string that corresponds to the given {@link IPath} and is shortened to be not * longer than the given number of characters. */ public static String getShortedPath(IPath path, int maxChars) { String result; String[] segments = path.segments(); boolean ellipsisInserted = false; while (true) { result = StringUtils.join(segments, '/'); // stop if the only one segment - project name if (segments.length == 1) { break; } // stop if already short enough if (result.length() < maxChars) { break; } // remove the least interesting segment if (segments.length <= 2) { break; } if (!ellipsisInserted) { segments[1] = "..."; ellipsisInserted = true; } else { segments = ArrayUtils.remove(segments, 2); } } if (result.length() > maxChars) { result = result.substring(result.length() - maxChars); } return result; } public static boolean isExistingProject(IProject project) { if (!project.isOpen()) { return false; } IPath location = getProjectLocation(project); if (location == null) { return false; } File file = location.toFile(); if (file == null) { return false; } return file.exists(); } // No instances private ResourceUtil() { } }