cleanup
[idea/community.git] / platform / lang-impl / src / com / intellij / util / indexing / FileBasedIndexSwitcher.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.util.indexing;
3
4 import com.intellij.ide.impl.ProjectUtil;
5 import com.intellij.openapi.application.Application;
6 import com.intellij.openapi.application.ApplicationManager;
7 import com.intellij.openapi.diagnostic.Logger;
8 import com.intellij.openapi.progress.ProgressIndicator;
9 import com.intellij.openapi.project.DumbModeTask;
10 import com.intellij.openapi.project.DumbService;
11 import com.intellij.openapi.project.Project;
12 import com.intellij.util.concurrency.Semaphore;
13 import org.jetbrains.annotations.NotNull;
14 import org.jetbrains.annotations.TestOnly;
15
16 public final class FileBasedIndexSwitcher {
17   private static final Logger LOG = Logger.getInstance(FileBasedIndexSwitcher.class);
18
19   @NotNull
20   private final FileBasedIndexImpl myFileBasedIndex;
21
22   // accessed only in EDT
23   private Semaphore myDumbModeSemaphore;
24
25   @TestOnly
26   public FileBasedIndexSwitcher() {
27     this(((FileBasedIndexImpl)FileBasedIndex.getInstance()));
28   }
29
30   public FileBasedIndexSwitcher(@NotNull FileBasedIndexImpl index) {
31     myFileBasedIndex = index;
32   }
33
34   public void turnOff() {
35     Application app = ApplicationManager.getApplication();
36     LOG.assertTrue(app.isDispatchThread());
37     LOG.assertTrue(!app.isWriteAccessAllowed());
38     boolean unitTestMode = app.isUnitTestMode();
39     if (!unitTestMode) {
40       myDumbModeSemaphore = new Semaphore(1);
41       for (Project project : ProjectUtil.getOpenProjects()) {
42         DumbService dumbService = DumbService.getInstance(project);
43         dumbService.cancelAllTasksAndWait();
44         dumbService.queueTask(new DumbModeTask() {
45           @Override
46           public void performInDumbMode(@NotNull ProgressIndicator indicator) {
47             indicator.setText(IndexingBundle.message("indexes.reloading"));
48             myDumbModeSemaphore.waitFor();
49           }
50         });
51       }
52     }
53     myFileBasedIndex.performShutdown(true);
54     myFileBasedIndex.dropRegisteredIndexes();
55     IndexingStamp.flushCaches();
56   }
57
58   public void turnOn() {
59     LOG.assertTrue(ApplicationManager.getApplication().isWriteThread());
60     RebuildStatus.reset();
61     myFileBasedIndex.initComponent();
62     boolean unitTestMode = ApplicationManager.getApplication().isUnitTestMode();
63
64     if (unitTestMode) {
65       myFileBasedIndex.waitUntilIndicesAreInitialized();
66     }
67
68     if (!unitTestMode) {
69       myDumbModeSemaphore.up();
70     }
71
72     FileBasedIndexImpl.cleanupProcessedFlag();
73     for (Project project : ProjectUtil.getOpenProjects()) {
74       DumbService.getInstance(project).queueTask(new UnindexedFilesUpdater(project));
75     }
76   }
77 }