package com.wix.utils;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.newvfs.impl.VirtualDirectoryImpl;
import com.intellij.openapi.vfs.newvfs.impl.VirtualFileImpl;
import com.intellij.psi.PsiFile;
import com.intellij.util.Function;
import com.intellij.util.SmartList;
import com.intellij.util.containers.ContainerUtil;
//import com.scss.ScssLintBundle;
import com.wix.Util;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public final class FileUtils {
private FileUtils() {
}
private static final Logger LOG = Logger.getInstance(Util.LOG_ID);
// WildcardFileNameMatcher w = new WildcardFileNameMatcher("**/.jscsrc");
public static String makeRelative(VirtualFile root, VirtualFile absolutePath) {
//FileUtil.getRelativePath(path, file.getPath().replace('/', File.separatorChar), File.separatorChar)
return VfsUtil.getRelativePath(absolutePath, root, File.separatorChar);
}
public static String makeRelative(Project project, VirtualFile absolutePath) {
//FileUtil.getRelativePath(path, file.getPath().replace('/', File.separatorChar), File.separatorChar)
return makeRelative(project.getBaseDir(), absolutePath);
}
public static String relativePath(String root, String path) {
return FileUtil.getRelativePath(new File(root), new File(path));
}
public static String relativePath(Project project, VirtualFile absolutePath) {
return FileUtil.getRelativePath(new File(project.getBasePath()), new File(absolutePath.getPath()));
}
public static String relativePath(PsiFile file) {
return FileUtil.getRelativePath(new File(file.getProject().getBasePath()), new File(file.getVirtualFile().getPath()));
}
public static String getExtensionWithDot(VirtualFile file){
String ext = StringUtil.notNullize(file.getExtension());
if (!ext.startsWith(".")) {
ext = '.' + ext;
}
return ext;
}
public static String makeRelative(File project, File absolutePath) {
return FileUtil.getRelativePath(project, absolutePath);
}
public static boolean hasExtension(String file, String extension) {
return file.endsWith(extension);
}
public static String removeExtension(String file) {
int i = file.lastIndexOf('.');
return file.substring(0, i);
}
//file.substring(0, file.length() - ".js".length())
/**
* resolve a relative or absolute path
* @param project parent path
* @param path path to file / folder
* @return path
*/
public static String resolvePath(Project project, String path) {
if (StringUtils.isEmpty(path)) {
return null;
}
File filePath = new File(path);
if (filePath.isAbsolute()) {
if (!filePath.exists()) {
return null;
}
return path;
} else {
if (project == null) {
return null;
}
VirtualFile child = project.getBaseDir().findFileByRelativePath(path);
if (child == null || !child.exists()) {
return null;
}
return child.getPath();
}
}
@NotNull
public static List<String> displayDirectoryContents(@NotNull File projectRoot, @NotNull File dir, @NotNull FilenameFilter filter) {
List<String> ret = listFiles(projectRoot, dir, filter);
File[] files = dir.listFiles();
for (final File file : files) {
if (file.isDirectory()) {
ret.addAll(displayDirectoryContents(projectRoot, file, filter));
// } else {
// listFiles(file, filter, allFiles);
}
}
return ret;
}
@NotNull
public static List<String> recursiveVisitor(@NotNull File dir, @NotNull FilenameFilter filter) {
// String[] ret = dir.list(filter);
List<String> retList = new ArrayList<String>();
// Collections.addAll(retList, ret);
File[] files = dir.listFiles();
for (final File file : files) {
if (file.isDirectory()) {
retList.addAll(recursiveVisitor(file, filter));
} else {
if (filter.accept(file.getParentFile(), file.getName())){
retList.add(file.getAbsolutePath());
}
}
}
return retList;
}
public static List<String> toAbsolutePath(List<File> newFiles) {
return ContainerUtil.map(newFiles, new Function<File, String>() {
public String fun(File file) {
return file.getAbsolutePath();
}
});
}
@NotNull
public static List<String> listFiles(@NotNull final File projectRoot, @NotNull final File dir, @NotNull FilenameFilter filter) {
String[] curFiles = dir.list(filter);
// allFiles.addAll(ret); //Arrays.asList(curFiles));
return ContainerUtil.map(curFiles, new Function<String, String>() {
public String fun(String curFile) {
// TODO replace with makeRelative
// return makeRelative();
return new File(dir, curFile).getAbsolutePath().substring(projectRoot.getAbsolutePath().length() + 1);
}
});
}
@NotNull
private static List<File> findExeFilesInPath(@Nullable String pathEnvVarValue,
@NotNull String fileBaseName,
boolean stopAfterFirstMatch,
boolean logDetails) {
if (logDetails) {
LOG.info("Finding files in PATH (base name=" + fileBaseName + ", PATH=" + StringUtil.notNullize(pathEnvVarValue) + ").");
}
if (pathEnvVarValue == null) {
return Collections.emptyList();
}
List<File> result = new SmartList<File>();
List<String> paths = StringUtil.split(pathEnvVarValue, File.pathSeparator, true, true);
for (String path : paths) {
File dir = new File(path);
if (logDetails) {
File file = new File(dir, fileBaseName);
LOG.info("path:" + path + ", path.isAbsolute:" + dir.isAbsolute() + ", path.isDirectory:" + dir.isDirectory()
+ ", file.isFile:" + file.isFile() + ", file.canExecute:" + file.canExecute());
}
if (dir.isAbsolute() && dir.isDirectory()) {
File file = new File(dir, fileBaseName);
if (file.isFile() && file.canExecute()) {
result.add(file);
if (stopAfterFirstMatch) {
return result;
}
}
}
}
return result;
}
/**
*
* @param project containing project
* @param path path to path to file / folder
* @param allowEmpty allow empty path
* @param isFile should be file or folder
* @return validation status
*/
public static ValidationStatus validateProjectPath(Project project, String path, boolean allowEmpty, boolean isFile) {
if (StringUtils.isEmpty(path)) {
return allowEmpty ? ValidationStatus.VALID : ValidationStatus.IS_EMPTY;
}
File filePath = new File(path);
if (filePath.isAbsolute()) {
if (!filePath.exists()) {
return ValidationStatus.DOES_NOT_EXIST;
}
if (isFile) {
if (!filePath.isFile()) {
return ValidationStatus.NOT_A_FILE;
}
} else {
if (!filePath.isDirectory()) {
return ValidationStatus.NOT_A_DIRECTORY;
}
}
} else {
if (project == null) {
return ValidationStatus.DOES_NOT_EXIST;
}
VirtualFile child = project.getBaseDir().findFileByRelativePath(path);
if (child == null || !child.exists()) {
return ValidationStatus.DOES_NOT_EXIST;
}
if (isFile) {
if (child.isDirectory()) {
return ValidationStatus.NOT_A_FILE;
}
} else {
if (!child.isDirectory()) {
return ValidationStatus.NOT_A_DIRECTORY;
}
}
}
return ValidationStatus.VALID;
}
// public static class ValidationError {
// public boolean a;
// }
//
public enum ValidationStatus {
VALID, IS_EMPTY, DOES_NOT_EXIST, NOT_A_DIRECTORY, NOT_A_FILE
}
public static boolean fileExists(String path) {
if (StringUtils.isEmpty(path)) {
return false;
}
File file = new File(path);
return file.isFile() && file.exists();
}
public static List<String> getAllFilesInDirectory(VirtualFile directory, String target, String replacement) {
List<String> files = new ArrayList<String>();
VirtualFile[] children = directory.getChildren();
for (VirtualFile child : children) {
if (child instanceof VirtualDirectoryImpl) {
files.addAll(getAllFilesInDirectory(child, target, replacement));
} else if (child instanceof VirtualFileImpl) {
files.add(child.getPath().replace(target, replacement));
}
}
return files;
}
public static VirtualFile findFileByPath(VirtualFile path, String valuePath) {
VirtualFile file = path.findFileByRelativePath(valuePath);
if (null == file || file.isDirectory()) {
file = path.findFileByRelativePath(valuePath + ".js");
}
return file;
}
public static String join(String file, String ext) {
return file + '/' + ext;
}
public static String removeExt(String file, String ext) {
if (file.endsWith(ext)) {
return file.replace(ext, "");
}
return file;
}
public static String relativePath(VirtualFile root, VirtualFile file) {
// get project relative path
return file.getPath().substring(root.getPath().length() + 1);
}
public static String getNormalizedPath(int doubleDotCount, String[] pathsOfPath) {
StringBuilder newValuePath = new StringBuilder();
for (int i = 0; i < pathsOfPath.length - doubleDotCount; i++) {
if (0 != i) {
newValuePath.append('/');
}
newValuePath.append(pathsOfPath[i]);
}
return newValuePath.toString();
}
public static int getDoubleDotCount(String valuePath) {
int doubleDotCount = (valuePath.length() - valuePath.replaceAll("\\.\\.", "").length()) / 2;
boolean doubleDotCountTrues = false;
while (!doubleDotCountTrues && 0 != doubleDotCount) {
if (valuePath.startsWith(StringUtil.repeat("../", doubleDotCount)) || valuePath.startsWith(StringUtil.repeat("../", doubleDotCount - 1) + "..")) {
doubleDotCountTrues = true;
} else {
doubleDotCount--;
}
}
return doubleDotCount;
}
}