Merge "A deadlock warning on ide startup" into idea13-1.0-dev
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/GradleBuildClasspathManager.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/GradleBuildClasspathManager.java
index 512bd70..f66d6d8 100644
--- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/GradleBuildClasspathManager.java
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/GradleBuildClasspathManager.java
@@ -20,6 +20,7 @@
 import com.intellij.openapi.externalSystem.model.project.ExternalModuleBuildClasspathPojo;
 import com.intellij.openapi.externalSystem.model.project.ExternalProjectBuildClasspathPojo;
 import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemLocalSettings;
+import com.intellij.openapi.externalSystem.util.DisposeAwareProjectChange;
 import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vfs.JarFileSystem;
@@ -27,6 +28,7 @@
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.util.containers.ContainerUtil;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.jetbrains.plugins.gradle.util.GradleConstants;
 
 import java.util.*;
@@ -49,7 +51,7 @@
 
   public GradleBuildClasspathManager(@NotNull Project project) {
     myProject = project;
-    reload();
+    allFilesCache = ContainerUtil.newArrayList();
   }
 
   @NotNull
@@ -66,24 +68,34 @@
 
     final LocalFileSystem localFileSystem = LocalFileSystem.getInstance();
     final JarFileSystem jarFileSystem = JarFileSystem.getInstance();
-    for (ExternalProjectBuildClasspathPojo projectBuildClasspathPojo : localSettings.getProjectBuildClasspath().values()) {
-      List<VirtualFile> projectBuildClasspath = ContainerUtil.newArrayList();
-      for (String path : projectBuildClasspathPojo.getProjectBuildClasspath()) {
-        final VirtualFile virtualFile = localFileSystem.refreshAndFindFileByPath(path);
-        if (virtualFile != null) {
-          ContainerUtil.addIfNotNull(
-            projectBuildClasspath, virtualFile.isDirectory() ? virtualFile : jarFileSystem.getJarRootForLocalFile(virtualFile));
-        }
-      }
-
-      for (ExternalModuleBuildClasspathPojo moduleBuildClasspathPojo : projectBuildClasspathPojo.getModulesBuildClasspath().values()) {
-        List<VirtualFile> moduleBuildClasspath = ContainerUtil.newArrayList(projectBuildClasspath);
-        for (String path : moduleBuildClasspathPojo.getEntries()) {
-          final VirtualFile virtualFile = localFileSystem.refreshAndFindFileByPath(path);
-          if (virtualFile != null) {
-            ContainerUtil.addIfNotNull(moduleBuildClasspath, jarFileSystem.getJarRootForLocalFile(virtualFile));
+    for (final ExternalProjectBuildClasspathPojo projectBuildClasspathPojo : localSettings.getProjectBuildClasspath().values()) {
+      final List<VirtualFile> projectBuildClasspath = ContainerUtil.newArrayList();
+      ExternalSystemApiUtil.executeProjectChangeAction(true, new DisposeAwareProjectChange(myProject) {
+        @Override
+        public void execute() {
+          for (String path : projectBuildClasspathPojo.getProjectBuildClasspath()) {
+            final VirtualFile virtualFile = localFileSystem.refreshAndFindFileByPath(path);
+            if (virtualFile != null) {
+              ContainerUtil.addIfNotNull(
+                projectBuildClasspath, virtualFile.isDirectory() ? virtualFile : jarFileSystem.getJarRootForLocalFile(virtualFile));
+            }
           }
         }
+      });
+
+      for (final ExternalModuleBuildClasspathPojo moduleBuildClasspathPojo : projectBuildClasspathPojo.getModulesBuildClasspath().values()) {
+        final List<VirtualFile> moduleBuildClasspath = ContainerUtil.newArrayList(projectBuildClasspath);
+        ExternalSystemApiUtil.executeProjectChangeAction(true, new DisposeAwareProjectChange(myProject) {
+          @Override
+          public void execute() {
+            for (String path : moduleBuildClasspathPojo.getEntries()) {
+              final VirtualFile virtualFile = localFileSystem.refreshAndFindFileByPath(path);
+              if (virtualFile != null) {
+                ContainerUtil.addIfNotNull(moduleBuildClasspath, jarFileSystem.getJarRootForLocalFile(virtualFile));
+              }
+            }
+          }
+        });
 
         map.put(moduleBuildClasspathPojo.getPath(), moduleBuildClasspath);
       }
@@ -100,12 +112,27 @@
 
   @NotNull
   public List<VirtualFile> getAllClasspathEntries() {
+    checkRootsValidity(allFilesCache);
     return allFilesCache;
   }
 
   @NotNull
   public List<VirtualFile> getModuleClasspathEntries(@NotNull String externalModulePath) {
+    checkRootsValidity(myClasspathMap.get().get(externalModulePath));
     List<VirtualFile> virtualFiles = myClasspathMap.get().get(externalModulePath);
     return virtualFiles == null ? Collections.<VirtualFile>emptyList() : virtualFiles;
   }
+
+  private void checkRootsValidity(@Nullable List<VirtualFile> virtualFiles) {
+    if (virtualFiles == null) return;
+
+    if (!virtualFiles.isEmpty()) {
+      for (VirtualFile file : virtualFiles) {
+        if (!file.isValid()) {
+          reload();
+          break;
+        }
+      }
+    }
+  }
 }