package fr.adrienbrault.idea.symfony2plugin.asset.dic;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileVisitor;
import com.intellij.psi.PsiDirectory;
import com.jetbrains.php.PhpIndex;
import fr.adrienbrault.idea.symfony2plugin.Settings;
import fr.adrienbrault.idea.symfony2plugin.util.SymfonyBundleUtil;
import fr.adrienbrault.idea.symfony2plugin.util.dict.SymfonyBundle;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class AssetDirectoryReader {
protected Project project;
protected boolean includeBundleDir = false;
protected String[] filterExtension;
public AssetDirectoryReader setProject(Project project) {
this.project = project;
return this;
}
public AssetDirectoryReader setIncludeBundleDir(boolean includeBundleDir) {
this.includeBundleDir = includeBundleDir;
return this;
}
public AssetDirectoryReader setFilterExtension(String... filterExtension) {
this.filterExtension = filterExtension;
return this;
}
public List<AssetFile> getAssetFiles() {
final List<AssetFile> files = new ArrayList<AssetFile>();
String webDirectoryName = Settings.getInstance(project).directoryToWeb;
VirtualFile projectDirectory = project.getBaseDir();
final VirtualFile webDirectory = VfsUtil.findRelativeFile(projectDirectory, webDirectoryName.split("/"));
if (null == webDirectory) {
return files;
}
VfsUtil.visitChildrenRecursively(webDirectory, new VirtualFileVisitor() {
@Override
public boolean visitFile(@NotNull VirtualFile virtualFile) {
if(isValidFile(virtualFile)) {
files.add(new AssetFile(virtualFile, AssetEnum.Position.Web, webDirectory));
}
return super.visitFile(virtualFile);
}
});
if(!this.includeBundleDir) {
return files;
}
SymfonyBundleUtil symfonyBundleUtil = new SymfonyBundleUtil(PhpIndex.getInstance(this.project));
for(final SymfonyBundle bundle : symfonyBundleUtil.getBundles()) {
PsiDirectory bundleDirectory = bundle.getDirectory();
if(null == bundleDirectory) {
continue;
}
final VirtualFile bundleDirectoryVirtual = bundleDirectory.getVirtualFile();
VirtualFile resourceDirectory = VfsUtil.findRelativeFile(bundleDirectoryVirtual, "Resources");
if (null != resourceDirectory) {
VfsUtil.visitChildrenRecursively(resourceDirectory, new VirtualFileVisitor() {
@Override
public boolean visitFile(@NotNull VirtualFile virtualFile) {
if(isValidFile(virtualFile)) {
files.add(new AssetFile(virtualFile, AssetEnum.Position.Bundle, bundleDirectoryVirtual, '@' + bundle.getName() + "/"));
}
return super.visitFile(virtualFile);
}
});
}
}
return files;
}
private boolean isValidFile(VirtualFile virtualFile) {
if (virtualFile.isDirectory()) {
return false;
}
if (this.filterExtension != null) {
String extension = virtualFile.getExtension();
// file need extension and it must be in list
return null != extension && Arrays.asList(this.filterExtension).contains(extension);
}
return true;
}
}