Beware all, our indices does not allow to read index values when processing another...
authorMaxim.Mossienko <Maxim.Mossienko@jetbrains.com>
Wed, 18 Nov 2009 18:59:08 +0000 (21:59 +0300)
committerMaxim.Mossienko <Maxim.Mossienko@jetbrains.com>
Wed, 18 Nov 2009 18:59:08 +0000 (21:59 +0300)
platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndex.java
platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexProjectHandler.java
platform/lang-impl/src/com/intellij/util/indexing/UnindexedFilesUpdater.java

index 1cca34d6b08043e9b880ceaf8c03ee654e9880d4..f2f1d6db7fe59054cf4f8a351f5583d2a1d960d3 100644 (file)
@@ -30,13 +30,12 @@ import com.intellij.openapi.editor.impl.DocumentImpl;
 import com.intellij.openapi.extensions.Extensions;
 import com.intellij.openapi.fileEditor.FileDocumentManager;
 import com.intellij.openapi.fileTypes.*;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.ModuleManager;
 import com.intellij.openapi.progress.*;
 import com.intellij.openapi.progress.impl.BackgroundableProcessIndicator;
 import com.intellij.openapi.project.*;
-import com.intellij.openapi.roots.CollectingContentIterator;
-import com.intellij.openapi.roots.ContentIterator;
-import com.intellij.openapi.roots.ProjectFileIndex;
-import com.intellij.openapi.roots.ProjectRootManager;
+import com.intellij.openapi.roots.*;
 import com.intellij.openapi.util.*;
 import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.util.registry.Registry;
@@ -62,8 +61,7 @@ import com.intellij.util.concurrency.JBLock;
 import com.intellij.util.concurrency.JBReentrantReadWriteLock;
 import com.intellij.util.concurrency.LockFactory;
 import com.intellij.util.concurrency.Semaphore;
-import com.intellij.util.containers.ConcurrentHashSet;
-import com.intellij.util.containers.ContainerUtil;
+import com.intellij.util.containers.*;
 import com.intellij.util.io.*;
 import com.intellij.util.messages.MessageBus;
 import com.intellij.util.messages.MessageBusConnection;
@@ -78,6 +76,9 @@ import org.jetbrains.annotations.TestOnly;
 import javax.swing.*;
 import java.io.*;
 import java.util.*;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Queue;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.Lock;
@@ -897,7 +898,7 @@ public class FileBasedIndex implements ApplicationComponent {
             if (!cleanupOnly) {
               for (Project project : ProjectManager.getInstance().getOpenProjects()) {
                 UnindexedFilesUpdater updater =
-                  new UnindexedFilesUpdater(project, ProjectRootManager.getInstance(project), FileBasedIndex.this);
+                  new UnindexedFilesUpdater(project, FileBasedIndex.this);
                 DumbServiceImpl.getInstance(project).queueCacheUpdate(Collections.<CacheUpdater>singleton(updater));
               }
             }
@@ -1833,6 +1834,66 @@ private boolean indexUnsavedDocument(final Document document, final ID<?, ?> req
     }
   }
 
+  public static void iterateIndexableFiles(final ContentIterator processor, Project project) {
+    final ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(project).getFileIndex();
+    // iterate associated libraries
+    final Module[] modules = ModuleManager.getInstance(project).getModules();
+    // iterate project content
+    projectFileIndex.iterateContent(processor);
+
+    ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator();
+
+    Set<VirtualFile> visitedRoots = new com.intellij.util.containers.HashSet<VirtualFile>();
+    for (IndexedRootsProvider provider : Extensions.getExtensions(IndexedRootsProvider.EP_NAME)) {
+      //important not to depend on project here, to support per-project background reindex
+      // each client gives a project to FileBasedIndex
+      final Set<String> rootsToIndex = provider.getRootsToIndex();
+      for (String url : rootsToIndex) {
+        final VirtualFile root = VirtualFileManager.getInstance().findFileByUrl(url);
+        if (visitedRoots.add(root)) {
+          iterateRecursively(root, processor, indicator);
+        }
+      }
+    }
+    for (Module module : modules) {
+      OrderEntry[] orderEntries = ModuleRootManager.getInstance(module).getOrderEntries();
+      for (OrderEntry orderEntry : orderEntries) {
+        if (orderEntry instanceof LibraryOrderEntry || orderEntry instanceof JdkOrderEntry) {
+          final VirtualFile[] libSources = orderEntry.getFiles(OrderRootType.SOURCES);
+          final VirtualFile[] libClasses = orderEntry.getFiles(OrderRootType.CLASSES);
+          for (VirtualFile[] roots : new VirtualFile[][]{libSources, libClasses}) {
+            for (VirtualFile root : roots) {
+              if (visitedRoots.add(root)) {
+                iterateRecursively(root, processor, indicator);
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  private static void iterateRecursively(@Nullable final VirtualFile root, final ContentIterator processor, ProgressIndicator indicator) {
+    if (root != null) {
+      if (indicator != null) {
+        indicator.setText2(root.getPresentableUrl());
+      }
+
+      if (root.isDirectory()) {
+        for (VirtualFile file : root.getChildren()) {
+          if (file.isDirectory()) {
+            iterateRecursively(file, processor, indicator);
+          }
+          else {
+            processor.processFile(file);
+          }
+        }
+      } else {
+        processor.processFile(root);
+      }
+    }
+  }
+
   private static class StorageGuard {
     private int myHolds = 0;
 
index c377c472dd5a5b954508017569c0f999112c2b3b..ef34fb6b0ce65a1970aed3a5ee4225cb410ec087 100644 (file)
@@ -52,7 +52,7 @@ public class FileBasedIndexProjectHandler extends AbstractProjectComponent imple
       startupManager.registerPreStartupActivity(new Runnable() {
         public void run() {
           final RefreshCacheUpdater refreshUpdater = new RefreshCacheUpdater();
-          final UnindexedFilesUpdater rootsChangeUpdater = new UnindexedFilesUpdater(project, rootManager, index);
+          final UnindexedFilesUpdater rootsChangeUpdater = new UnindexedFilesUpdater(project, index);
 
           startupManager.registerCacheUpdater(rootsChangeUpdater);
           rootManager.registerRootsChangeUpdater(rootsChangeUpdater);
index 262eb0336a3c4189f220be0474945db0e2df7d8b..27077909ab544c40a94fa459b0a10b921efc4719 100644 (file)
@@ -18,21 +18,12 @@ package com.intellij.util.indexing;
 
 import com.intellij.ide.caches.CacheUpdater;
 import com.intellij.ide.caches.FileContent;
-import com.intellij.openapi.extensions.Extensions;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.module.ModuleManager;
-import com.intellij.openapi.progress.ProgressIndicator;
-import com.intellij.openapi.progress.ProgressManager;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.roots.*;
 import com.intellij.openapi.vfs.VfsUtil;
 import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.openapi.vfs.VirtualFileManager;
-import com.intellij.util.containers.HashSet;
-import org.jetbrains.annotations.Nullable;
 
 import java.util.List;
-import java.util.Set;
 
 /**
  * @author Eugene Zhuravlev
@@ -41,17 +32,15 @@ import java.util.Set;
 public class UnindexedFilesUpdater implements CacheUpdater {
   private final FileBasedIndex myIndex;
   private final Project myProject;
-  private final ProjectRootManager myRootManager;
 
-  public UnindexedFilesUpdater(final Project project, final ProjectRootManager rootManager, FileBasedIndex index) {
+  public UnindexedFilesUpdater(final Project project, FileBasedIndex index) {
     myIndex = index;
     myProject = project;
-    myRootManager = rootManager;
   }
 
   public VirtualFile[] queryNeededFiles() {
     CollectingContentIterator finder = myIndex.createContentIterator();
-    iterateIndexableFiles(finder);
+    FileBasedIndex.iterateIndexableFiles(finder, myProject);
     List<VirtualFile> files = finder.getFiles();
     return VfsUtil.toVirtualFileArray(files);
   }
@@ -61,66 +50,6 @@ public class UnindexedFilesUpdater implements CacheUpdater {
     IndexingStamp.flushCache();
   }
 
-  private void iterateIndexableFiles(final ContentIterator processor) {
-    final ProjectFileIndex projectFileIndex = myRootManager.getFileIndex();
-    // iterate associated libraries
-    final Module[] modules = ModuleManager.getInstance(myProject).getModules();
-    // iterate project content
-    projectFileIndex.iterateContent(processor);
-
-    ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator();
-
-    Set<VirtualFile> visitedRoots = new HashSet<VirtualFile>();
-    for (IndexedRootsProvider provider : Extensions.getExtensions(IndexedRootsProvider.EP_NAME)) {
-      //important not to depend on project here, to support per-project background reindex
-      // each client gives a project to FileBasedIndex
-      final Set<String> rootsToIndex = provider.getRootsToIndex();
-      for (String url : rootsToIndex) {
-        final VirtualFile root = VirtualFileManager.getInstance().findFileByUrl(url);
-        if (visitedRoots.add(root)) {
-          iterateRecursively(root, processor, indicator);
-        }
-      }
-    }
-    for (Module module : modules) {
-      OrderEntry[] orderEntries = ModuleRootManager.getInstance(module).getOrderEntries();
-      for (OrderEntry orderEntry : orderEntries) {
-        if (orderEntry instanceof LibraryOrderEntry || orderEntry instanceof JdkOrderEntry) {
-          final VirtualFile[] libSources = orderEntry.getFiles(OrderRootType.SOURCES);
-          final VirtualFile[] libClasses = orderEntry.getFiles(OrderRootType.CLASSES);
-          for (VirtualFile[] roots : new VirtualFile[][]{libSources, libClasses}) {
-            for (VirtualFile root : roots) {
-              if (visitedRoots.add(root)) {
-                iterateRecursively(root, processor, indicator);
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-
-  private static void iterateRecursively(@Nullable final VirtualFile root, final ContentIterator processor, ProgressIndicator indicator) {
-    if (root != null) {
-      if (indicator != null) {
-        indicator.setText2(root.getPresentableUrl());
-      }
-
-      if (root.isDirectory()) {
-        for (VirtualFile file : root.getChildren()) {
-          if (file.isDirectory()) {
-            iterateRecursively(file, processor, indicator);
-          }
-          else {
-            processor.processFile(file);
-          }
-        }
-      } else {
-        processor.processFile(root);
-      }
-    }
-  }
-
   public void updatingDone() {
     myIndex.flushCaches();
   }