package org.fandev.utils;
import static com.intellij.openapi.util.io.FileUtil.toSystemIndependentName;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.openapi.vfs.VfsUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.io.File;
/**
* Created by IntelliJ IDEA.
*
* @author: Roman Chernyatchik
* @date: 05.03.2007
*/
public class VirtualFileUtil {
@NonNls
public static final char VFS_PATH_SEPARATOR = '/';
/**
* @param dir directory
* @param name file name
* @return url for file with name in directory dir
*/
public static String constructUrl(@NotNull final VirtualFile dir, final String name) {
return dir.getUrl() + VFS_PATH_SEPARATOR + name;
}
/**
* Searches files for list of urls
* @param urls Urls
* @return found files or empty array
*/
@NotNull
public static VirtualFile[] getFiles(@NotNull final List<String> urls) {
final VirtualFileManager virtualFileManager = VirtualFileManager.getInstance();
final List<VirtualFile> files = new ArrayList<VirtualFile>();
for (final String url : urls) {
if (TextUtil.isEmpty(url)) {
continue;
}
final VirtualFile file = virtualFileManager.findFileByUrl(url);
if (file != null) {
files.add(file);
}
}
return files.toArray(new VirtualFile[0]);
}
/**
* @param url Url for virtual file
* @return file name with extension
*/
@NotNull
public static String getFileName(@NotNull final String url) {
final int index = url.lastIndexOf(VFS_PATH_SEPARATOR);
return index < 0 ? url : url.substring(index + 1);
}
/**
* @param url Url for virtual file
* @return url for parent directory of virtual file
*/
@Nullable
public static String getParentDir(@Nullable final String url) {
if (url == null) {
return null;
}
final int index = url.lastIndexOf(VFS_PATH_SEPARATOR);
return index < 0 ? null : url.substring(0, index);
}
/**
* @param fileName Virtual file name
* @return file extension
*/
@Nullable
public static String getExtension(@NotNull final String fileName) {
int index = fileName.lastIndexOf('.');
return index < 0 ? null : fileName.substring(index + 1);
}
/**
* @param fileName virtual file name
* @return name without extension
*/
@NotNull
public static String removeExtension(@NotNull final String fileName) {
int i = fileName.length() - 1;
for (; i >= 0; i--) {
if (fileName.charAt(i) == '.') {
return fileName.substring(0, i);
}
}
return fileName;
}
/**
* Converts OS depended path to VirtualFile url
* @param path Path
* @return url
*/
@NotNull
public static String constructLocalUrl(@NotNull final String path) {
String myPath = toSystemIndependentName(path);
if (!myPath.startsWith(String.valueOf(VFS_PATH_SEPARATOR))) myPath = VFS_PATH_SEPARATOR + myPath;
return VirtualFileManager.constructUrl(LocalFileSystem.PROTOCOL, myPath);
}
@NotNull
public static String getNameWithoutExtension(@NotNull final String fileName) {
int index = fileName.lastIndexOf('.');
return index < 0 ? fileName : fileName.substring(0, index);
}
/**
* For comparators. Compares files pathes.
* @param file1 file1
* @param file2 file2
* @return compare result
*/
public static int compareVirtualFiles(@NotNull final VirtualFile file1,
@NotNull final VirtualFile file2) {
final String path1 = file1.getPath();
final String path2 = file2.getPath();
return path1.compareToIgnoreCase(path2);
}
public static boolean isValid(@Nullable final VirtualFile file) {
return file != null && file.isValid();
}
public static String buildUrl(@NotNull final String rootUrl,
@NotNull final String relativePath) {
return rootUrl +
//#TODO normalize
(rootUrl.endsWith(String.valueOf(VFS_PATH_SEPARATOR))
? ""
: VFS_PATH_SEPARATOR)
+ toSystemIndependentName(relativePath);
}
public static String buildSystemIndependentPath(@NotNull final String rootPath,
@NotNull final String relativePath) {
final String rootPathIN = toSystemIndependentName(rootPath);
return rootPathIN + (rootPathIN.endsWith(String.valueOf(VFS_PATH_SEPARATOR))
? ""
: VFS_PATH_SEPARATOR)
+ toSystemIndependentName(relativePath);
}
/**
* Converst OS depended path to VirtualFile url.
* @param path Path
* @return If path is null or empty string returns null, otherwise url
*/
@Nullable
public static String pathToURL(@Nullable final String path) {
if (TextUtil.isEmpty(path)) {
return null;
}
assert path != null;
return constructLocalUrl(path);
}
public static VirtualFile findFileByLocalPath(@NotNull final String generateScriptPath) {
return VirtualFileManager.getInstance().findFileByUrl(constructLocalUrl(generateScriptPath));
}
public static VirtualFile refreshAndFindFileByLocalPath(@NotNull final String generateScriptPath) {
return VirtualFileManager.getInstance().refreshAndFindFileByUrl(constructLocalUrl(generateScriptPath));
}
public static boolean fileExists(@Nullable final VirtualFile file) {
return file != null && file.exists();
}
@Nullable
public static String getRelativePath(@NotNull final String filePathOrUrl,
@NotNull final String rootPathOrUrl) {
if (filePathOrUrl.length() < rootPathOrUrl.length()) {
return null;
}
String path = filePathOrUrl.substring(rootPathOrUrl.length());
if (path.length() > 0 && path.charAt(0) == VFS_PATH_SEPARATOR) {
path = path.substring(1);
}
return path;
}
public static class VirtualFilesComparator implements Comparator<VirtualFile> {
public int compare(final VirtualFile file1, final VirtualFile file2) {
return compareVirtualFiles(file1, file2);
}
}
@NotNull
public static String convertToVFSPathAndNormalizeSlashes(@NotNull final String path) {
final String newPath = toSystemIndependentName(path);
if (newPath.length() != 0 && newPath.charAt(newPath.length() - 1) == VFS_PATH_SEPARATOR) {
return newPath.substring(0, newPath.length() -1);
}
return newPath;
}
}