platform: handling of file-based index initialization errors caused by extensions
authorRoman Shevchenko <roman.shevchenko@jetbrains.com>
Tue, 27 Jan 2015 10:22:29 +0000 (13:22 +0300)
committerRoman Shevchenko <roman.shevchenko@jetbrains.com>
Tue, 27 Jan 2015 11:43:30 +0000 (14:43 +0300)
platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexImpl.java

index 875eac0e47aab3ffc739de2c4b6e95c7db71d5ba..b24502ceab12ea7943b1bd9a920c9e793d02b1be 100644 (file)
@@ -18,6 +18,7 @@ package com.intellij.util.indexing;
 
 import com.intellij.AppTopics;
 import com.intellij.history.LocalHistory;
+import com.intellij.ide.plugins.PluginManager;
 import com.intellij.ide.util.DelegatingProgressIndicator;
 import com.intellij.lang.ASTNode;
 import com.intellij.notification.NotificationDisplayType;
@@ -78,7 +79,6 @@ import com.intellij.util.messages.MessageBus;
 import com.intellij.util.messages.MessageBusConnection;
 import gnu.trove.*;
 import jsr166e.extra.SequenceLock;
-import org.jetbrains.annotations.NonNls;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -99,8 +99,9 @@ import java.util.concurrent.locks.Lock;
  */
 public class FileBasedIndexImpl extends FileBasedIndex {
   private static final Logger LOG = Logger.getInstance("#com.intellij.util.indexing.FileBasedIndexImpl");
-  @NonNls
   private static final String CORRUPTION_MARKER_NAME = "corruption.marker";
+  private static final NotificationGroup NOTIFICATIONS = new NotificationGroup("Indexing", NotificationDisplayType.BALLOON, false);
+
   private final Map<ID<?, ?>, Pair<UpdatableIndex<?, ?, FileContent>, InputFilter>> myIndices =
     new THashMap<ID<?, ?>, Pair<UpdatableIndex<?, ?, FileContent>, InputFilter>>();
   private final List<ID<?, ?>> myIndicesWithoutFileTypeInfo = new ArrayList<ID<?, ?>>();
@@ -265,9 +266,20 @@ public class FileBasedIndexImpl extends FileBasedIndex {
 
   private void initExtensions() {
     try {
-      final FileBasedIndexExtension[] extensions = Extensions.getExtensions(FileBasedIndexExtension.EXTENSION_POINT_NAME);
+      FileBasedIndexExtension[] extensions = Extensions.getExtensions(FileBasedIndexExtension.EXTENSION_POINT_NAME);
+
+      boolean versionChanged = false;
       for (FileBasedIndexExtension<?, ?> extension : extensions) {
-        ourRebuildStatus.put(extension.getName(), new AtomicInteger(OK));
+        try {
+          ourRebuildStatus.put(extension.getName(), new AtomicInteger(OK));
+          versionChanged |= registerIndexer(extension);
+        }
+        catch (IOException e) {
+          throw e;
+        }
+        catch (Throwable t) {
+          PluginManager.handleComponentError(t, extension.getClass().getName(), null);
+        }
       }
 
       File indexRoot = PathManager.getIndexRoot();
@@ -277,12 +289,8 @@ public class FileBasedIndexImpl extends FileBasedIndex {
         FileUtil.deleteWithRenaming(indexRoot);
         indexRoot.mkdirs();
       }
-      boolean versionChanged = false;
-      for (FileBasedIndexExtension<?, ?> extension : extensions) {
-        versionChanged |= registerIndexer(extension);
-      }
 
-      for(List<ID<?, ?>> value: myFileType2IndicesWithFileTypeInfoMap.values()) {
+      for (List<ID<?, ?>> value : myFileType2IndicesWithFileTypeInfoMap.values()) {
         value.addAll(myIndicesWithoutFileTypeInfo);
       }
       FileUtil.delete(corruptionMarker);
@@ -297,8 +305,7 @@ public class FileBasedIndexImpl extends FileBasedIndex {
       if (rebuildNotification != null
           && !ApplicationManager.getApplication().isHeadlessEnvironment()
           && Registry.is("ide.showIndexRebuildMessage")) {
-        new NotificationGroup("Indexing", NotificationDisplayType.BALLOON, false)
-          .createNotification("Index Rebuild", rebuildNotification, NotificationType.INFORMATION, null).notify(null);
+        NOTIFICATIONS.createNotification("Index Rebuild", rebuildNotification, NotificationType.INFORMATION, null).notify(null);
       }
 
       dropUnregisteredIndices();