package com.thoughtworks.gauge.annotator;
import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiJavaFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.search.FileTypeIndex;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.indexing.FileBasedIndex;
import com.thoughtworks.gauge.Constants;
import com.thoughtworks.gauge.language.ConceptFileType;
import com.thoughtworks.gauge.language.SpecFileType;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import static com.intellij.psi.search.GlobalSearchScope.moduleScope;
public class FileManager {
public static List<PsiFile> getAllJavaFiles(Module module) {
Collection<VirtualFile> javaVirtualFiles = FileBasedIndex.getInstance().getContainingFiles(FileTypeIndex.NAME, JavaFileType.INSTANCE, moduleScope(module));
List<PsiFile> javaFiles = new ArrayList<>();
for (VirtualFile javaVFile : javaVirtualFiles) {
PsiFile file = PsiManager.getInstance(module.getProject()).findFile(javaVFile);
if (file != null) {
javaFiles.add(file);
}
}
Collections.sort(javaFiles, (o1, o2) -> FileManager.getJavaFileName(o1).compareToIgnoreCase(FileManager.getJavaFileName(o2)));
return javaFiles;
}
public static List<PsiFile> getAllConceptFiles(Project project) {
Collection<VirtualFile> virtualFiles = FileBasedIndex.getInstance().getContainingFiles(FileTypeIndex.NAME, ConceptFileType.INSTANCE, GlobalSearchScope.projectScope(project));
List<PsiFile> files = new ArrayList<>();
for (VirtualFile ConceptVFile : virtualFiles) {
PsiFile file = PsiManager.getInstance(project).findFile(ConceptVFile);
if (file != null) {
files.add(file);
}
}
Collections.sort(files, (o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName()));
return files;
}
public static String getJavaFileName(PsiFile value) {
PsiJavaFile javaFile = (PsiJavaFile) value;
if (!javaFile.getPackageName().equals("")) {
return javaFile.getPackageName() + "." + javaFile.getName();
}
return javaFile.getName();
}
public static List<String> getDirNamesUnderSpecs(Project project) {
File dir = new File(project.getBasePath() + File.separator + Constants.SPECS_DIR);
File[] files = dir.listFiles();
List<String> dirs = new ArrayList<>();
dirs.add(String.format("%s%s", Constants.SPECS_DIR, File.separator));
if (files != null) getDirectories(files, dirs, project.getBasePath() + File.separator);
return dirs;
}
private static void getDirectories(File[] files, List<String> dirs, String basePath) {
for (File file : files)
if (file.isDirectory()) {
dirs.add(file.getPath().replace(basePath, "") + File.separator);
getDirectories(file.listFiles(), dirs, basePath);
}
}
public static List<VirtualFile> getAllSpecFiles(Project project) {
Collection<VirtualFile> virtualFiles = FileBasedIndex.getInstance().getContainingFiles(FileTypeIndex.NAME, SpecFileType.INSTANCE, GlobalSearchScope.projectScope(project));
return new ArrayList<>(virtualFiles);
}
public static List<VirtualFile> getConceptFiles(Project project) {
Collection<VirtualFile> virtualFiles = FileBasedIndex.getInstance().getContainingFiles(FileTypeIndex.NAME, ConceptFileType.INSTANCE, GlobalSearchScope.projectScope(project));
return new ArrayList<>(virtualFiles);
}
}