1e69e388a59aba3130ce1d2844b2d1bad5e2ae16
[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
31 import java.util.Collections;
32 import java.util.List;
33
34 public class ModuleFileIndexImpl extends FileIndexBase implements ModuleFileIndex {
35   private final Module myModule;
36   private final ContentFilter myContentFilter;
37
38   public ModuleFileIndexImpl(Module module, DirectoryIndex directoryIndex) {
39     super(directoryIndex, FileTypeRegistry.getInstance(), module.getProject());
40     myModule = module;
41     myContentFilter = new ContentFilter();
42   }
43
44   @Override
45   public boolean iterateContent(@NotNull ContentIterator iterator) {
46     VirtualFile[] contentRoots = ModuleRootManager.getInstance(myModule).getContentRoots();
47     for (VirtualFile contentRoot : contentRoots) {
48       VirtualFile parent = contentRoot.getParent();
49       if (parent != null) {
50         DirectoryInfo parentInfo = myDirectoryIndex.getInfoForDirectory(parent);
51         if (parentInfo != null && myModule.equals(parentInfo.getModule())) continue; // inner content - skip it
52       }
53
54       boolean finished = VfsUtilCore.iterateChildrenRecursively(contentRoot, myContentFilter, iterator);
55       if (!finished) return false;
56     }
57
58     return true;
59   }
60
61   @Override
62   public boolean iterateContentUnderDirectory(@NotNull VirtualFile dir, @NotNull ContentIterator iterator) {
63     return VfsUtilCore.iterateChildrenRecursively(dir, myContentFilter, iterator);
64   }
65
66   @Override
67   public boolean isInContent(@NotNull VirtualFile fileOrDir) {
68     DirectoryInfo info = getInfoForFileOrDirectory(fileOrDir);
69     return info != null && myModule.equals(info.getModule());
70   }
71
72   @Override
73   public boolean isInSourceContent(@NotNull VirtualFile fileOrDir) {
74     DirectoryInfo info = getInfoForFileOrDirectory(fileOrDir);
75     return info != null && info.isInModuleSource() && myModule.equals(info.getModule());
76   }
77
78   @Override
79   @NotNull
80   public List<OrderEntry> getOrderEntriesForFile(@NotNull VirtualFile fileOrDir) {
81     DirectoryInfo info = getInfoForFileOrDirectory(fileOrDir);
82     if (info == null) return Collections.emptyList();
83     return info.findAllOrderEntriesWithOwnerModule(myModule);
84   }
85
86   @Override
87   public OrderEntry getOrderEntryForFile(@NotNull VirtualFile fileOrDir) {
88     DirectoryInfo info = getInfoForFileOrDirectory(fileOrDir);
89     if (info == null) return null;
90     return info.findOrderEntryWithOwnerModule(myModule);
91   }
92
93   @Override
94   public boolean isInTestSourceContent(@NotNull VirtualFile fileOrDir) {
95     DirectoryInfo info = getInfoForFileOrDirectory(fileOrDir);
96     return info != null && info.isInModuleSource() && myModule.equals(info.getModule())
97            && JavaModuleSourceRootTypes.isTestSourceOrResource(myDirectoryIndex.getSourceRootType(info));
98   }
99
100   private class ContentFilter implements VirtualFileFilter {
101     @Override
102     public boolean accept(@NotNull VirtualFile file) {
103       if (file.isDirectory()) {
104         DirectoryInfo info = myDirectoryIndex.getInfoForDirectory(file);
105         return info != null && myModule.equals(info.getModule());
106       }
107       else {
108         if(myExclusionManager != null && myExclusionManager.isExcluded(file)) return false;
109         return !myFileTypeRegistry.isFileIgnored(file);
110       }
111     }
112   }
113 }