Optimize MavenDomUtil.isFilteredResourceFile()

This commit is contained in:
Sergey Evdokimov
2012-12-12 15:30:46 +04:00
parent ed058a92e1
commit db864d1ce0
@@ -23,12 +23,13 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
@@ -49,8 +50,9 @@ import org.jetbrains.idea.maven.model.MavenResource;
import org.jetbrains.idea.maven.project.MavenProject;
import org.jetbrains.idea.maven.project.MavenProjectsManager;
import org.jetbrains.idea.maven.utils.MavenLog;
import org.jetbrains.idea.maven.vfs.MavenPropertiesVirtualFileSystem;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
@@ -58,6 +60,8 @@ import java.util.regex.Pattern;
public class MavenDomUtil {
private static final Key<Pair<Long, Set<VirtualFile>>> FILTERED_RESOURCES_ROOTS_KEY = Key.create("MavenDomUtil.FILTERED_RESOURCES_ROOTS");
// see http://maven.apache.org/settings.html
private static final Set<String> SUBTAGS_IN_SETTINGS_FILE = ContainerUtil.newHashSet("localRepository", "interactiveMode",
"usePluginRegistry", "offline", "pluginGroups",
@@ -317,21 +321,56 @@ public class MavenDomUtil {
return prop == null ? null : prop.getPsiElement().getFirstChild().getNextSibling().getNextSibling();
}
public static boolean isFilteredResourceFile(PsiElement element) {
MavenProject project = findContainingProject(element);
if (project == null) return false;
private static Set<VirtualFile> getFilteredResourcesRoots(@NotNull MavenProject mavenProject) {
Pair<Long, Set<VirtualFile>> cachedValue = mavenProject.getCachedValue(FILTERED_RESOURCES_ROOTS_KEY);
VirtualFile file = MavenDomUtil.getVirtualFile(element);
if (cachedValue == null || cachedValue.first != VirtualFileManager.getInstance().getModificationCount()) {
Set<VirtualFile> set = null;
for (MavenResource resource : mavenProject.getResources()) {
if (!resource.isFiltered()) continue;
VirtualFile resourceDir = LocalFileSystem.getInstance().findFileByPath(resource.getDirectory());
if (resourceDir == null) continue;
if (set == null) {
set = new HashSet<VirtualFile>();
}
set.add(resourceDir);
}
if (set == null) {
set = Collections.emptySet();
}
cachedValue = Pair.create(VirtualFileManager.getInstance().getModificationCount(), set);
mavenProject.putCachedValue(FILTERED_RESOURCES_ROOTS_KEY, cachedValue);
}
return cachedValue.second;
}
public static boolean isFilteredResourceFile(PsiElement element) {
VirtualFile file = getVirtualFile(element);
if (file == null) return false;
for (MavenResource each : project.getResources()) {
if (!each.isFiltered()) continue;
MavenProjectsManager manager = MavenProjectsManager.getInstance(element.getProject());
MavenProject mavenProject = manager.findContainingProject(file);
if (mavenProject == null) return false;
VirtualFile resourceDir = LocalFileSystem.getInstance().findFileByPath(each.getDirectory());
if (resourceDir == null) continue;
if (!VfsUtil.isAncestor(resourceDir, file, true)) continue;
return true;
System.out.println(VirtualFileManager.getInstance().getModificationCount());
Set<VirtualFile> filteredRoots = getFilteredResourcesRoots(mavenProject);
if (!filteredRoots.isEmpty()) {
for (VirtualFile f = file.getParent(); f != null; f = f.getParent()) {
if (filteredRoots.contains(f)) {
return true;
}
}
}
return false;
}