blob: e9bcb9da86f20ae2c30a03206f6e159afaea5aa2 [file] [log] [blame]
/*
* 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() {
}
}