support for resource directories: enable java-specific actions only for directories...
[idea/community.git] / platform / projectModel-impl / src / com / intellij / openapi / roots / impl / ModuleFileIndexImpl.java
1 /*
2  * Copyright 2000-2012 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.intellij.openapi.roots.impl;
18
19 import com.intellij.openapi.fileTypes.FileTypeRegistry;
20 import com.intellij.openapi.module.Module;
21 import com.intellij.openapi.roots.ContentIterator;
22 import com.intellij.openapi.roots.ModuleFileIndex;
23 import com.intellij.openapi.roots.ModuleRootManager;
24 import com.intellij.openapi.roots.OrderEntry;
25 import com.intellij.openapi.vfs.VfsUtilCore;
26 import com.intellij.openapi.vfs.VirtualFile;
27 import com.intellij.openapi.vfs.VirtualFileFilter;
28 import org.jetbrains.annotations.NotNull;
29 import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
30 import org.jetbrains.jps.model.module.JpsModuleSourceRootType;
31
32 import java.util.Collections;
33 import java.util.List;
34 import java.util.Set;
35
36 public class ModuleFileIndexImpl extends FileIndexBase implements ModuleFileIndex {
37   private final Module myModule;
38   private final ContentFilter myContentFilter;
39
40   public ModuleFileIndexImpl(Module module, DirectoryIndex directoryIndex) {
41     super(directoryIndex, FileTypeRegistry.getInstance(), module.getProject());
42     myModule = module;
43     myContentFilter = new ContentFilter();
44   }
45
46   @Override
47   public boolean iterateContent(@NotNull ContentIterator iterator) {
48     VirtualFile[] contentRoots = ModuleRootManager.getInstance(myModule).getContentRoots();
49     for (VirtualFile contentRoot : contentRoots) {
50       VirtualFile parent = contentRoot.getParent();
51       if (parent != null) {
52         DirectoryInfo parentInfo = myDirectoryIndex.getInfoForDirectory(parent);
53         if (parentInfo != null && myModule.equals(parentInfo.getModule())) continue; // inner content - skip it
54       }
55
56       boolean finished = VfsUtilCore.iterateChildrenRecursively(contentRoot, myContentFilter, iterator);
57       if (!finished) return false;
58     }
59
60     return true;
61   }
62
63   @Override
64   public boolean iterateContentUnderDirectory(@NotNull VirtualFile dir, @NotNull ContentIterator iterator) {
65     return VfsUtilCore.iterateChildrenRecursively(dir, myContentFilter, iterator);
66   }
67
68   @Override
69   public boolean isInContent(@NotNull VirtualFile fileOrDir) {
70     DirectoryInfo info = getInfoForFileOrDirectory(fileOrDir);
71     return info != null && myModule.equals(info.getModule());
72   }
73
74   @Override
75   public boolean isInSourceContent(@NotNull VirtualFile fileOrDir) {
76     DirectoryInfo info = getInfoForFileOrDirectory(fileOrDir);
77     return info != null && info.isInModuleSource() && myModule.equals(info.getModule());
78   }
79
80   @Override
81   @NotNull
82   public List<OrderEntry> getOrderEntriesForFile(@NotNull VirtualFile fileOrDir) {
83     DirectoryInfo info = getInfoForFileOrDirectory(fileOrDir);
84     if (info == null) return Collections.emptyList();
85     return info.findAllOrderEntriesWithOwnerModule(myModule);
86   }
87
88   @Override
89   public OrderEntry getOrderEntryForFile(@NotNull VirtualFile fileOrDir) {
90     DirectoryInfo info = getInfoForFileOrDirectory(fileOrDir);
91     if (info == null) return null;
92     return info.findOrderEntryWithOwnerModule(myModule);
93   }
94
95   @Override
96   public boolean isInTestSourceContent(@NotNull VirtualFile fileOrDir) {
97     DirectoryInfo info = getInfoForFileOrDirectory(fileOrDir);
98     return info != null && info.isInModuleSource() && myModule.equals(info.getModule())
99            && JavaModuleSourceRootTypes.isTestSourceOrResource(myDirectoryIndex.getSourceRootType(info));
100   }
101
102   @Override
103   public boolean isUnderSourceRootOfType(@NotNull VirtualFile fileOrDir, @NotNull Set<? extends JpsModuleSourceRootType<?>> rootTypes) {
104     DirectoryInfo info = getInfoForFileOrDirectory(fileOrDir);
105     return info != null && info.isInModuleSource() && myModule.equals(info.getModule())
106            && rootTypes.contains(myDirectoryIndex.getSourceRootType(info));
107   }
108
109   private class ContentFilter implements VirtualFileFilter {
110     @Override
111     public boolean accept(@NotNull VirtualFile file) {
112       if (file.isDirectory()) {
113         DirectoryInfo info = myDirectoryIndex.getInfoForDirectory(file);
114         return info != null && myModule.equals(info.getModule());
115       }
116       else {
117         if(myExclusionManager != null && myExclusionManager.isExcluded(file)) return false;
118         return !myFileTypeRegistry.isFileIgnored(file);
119       }
120     }
121   }
122 }