From d0200b2888d007608a9b2c4675a9480fafc9382e Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Thu, 11 Nov 2010 15:29:28 +0300 Subject: [PATCH] fix AlreadyDisposed assertions --- .../impl/TranslatingCompilerFilesMonitor.java | 127 +++++++++++------- .../idea/maven/MavenImportingTestCase.java | 2 +- 2 files changed, 83 insertions(+), 46 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/TranslatingCompilerFilesMonitor.java b/java/compiler/impl/src/com/intellij/compiler/impl/TranslatingCompilerFilesMonitor.java index f4abe40f4b9d..5c7be0535dca 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/TranslatingCompilerFilesMonitor.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/TranslatingCompilerFilesMonitor.java @@ -37,10 +37,7 @@ import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.project.ProjectManagerAdapter; import com.intellij.openapi.roots.*; import com.intellij.openapi.startup.StartupManager; -import com.intellij.openapi.util.Comparing; -import com.intellij.openapi.util.Disposer; -import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.Trinity; +import com.intellij.openapi.util.*; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.*; import com.intellij.openapi.vfs.newvfs.FileAttribute; @@ -389,7 +386,7 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { } public void updateOutputRootsLayout(Project project) { - final TIntObjectHashMap> map = buildOutputRootsLayout(project); + final TIntObjectHashMap> map = buildOutputRootsLayout(new ProjectRef(project)); synchronized (myProjectOutputRoots) { myProjectOutputRoots.put(getProjectId(project), map); } @@ -467,9 +464,9 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { } } - private TIntObjectHashMap> buildOutputRootsLayout(Project project) { + private TIntObjectHashMap> buildOutputRootsLayout(ProjectRef projRef) { final TIntObjectHashMap> map = new TIntObjectHashMap>(); - for (Module module : ModuleManager.getInstance(project).getModules()) { + for (Module module : ModuleManager.getInstance(projRef.get()).getModules()) { final CompilerModuleExtension manager = CompilerModuleExtension.getInstance(module); if (manager != null) { final VirtualFile output = manager.getCompilerOutputPath(); @@ -905,17 +902,18 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { } // made public for tests - public void scanSourceContent(final Project project, final Collection roots, final int totalRootCount, final boolean isNewRoots) { + public void scanSourceContent(final ProjectRef projRef, final Collection roots, final int totalRootCount, final boolean isNewRoots) { if (roots.size() == 0) { return; } - final int projectId = getProjectId(project); + final int projectId = getProjectId(projRef.get()); - final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex(); + final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(projRef.get()).getFileIndex(); final ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator(); int processed = 0; for (VirtualFile srcRoot : roots) { if (indicator != null) { + projRef.get(); indicator.setText2(srcRoot.getPresentableUrl()); indicator.setFraction(++processed / (double)totalRootCount); } @@ -930,6 +928,9 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { } } } + else { + projRef.get(); + } return true; } }); @@ -944,6 +945,7 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { final int fileId = getFileId(file); if (fileId > 0 /*file is valid*/) { if (file.isDirectory()) { + projRef.get(); for (VirtualFile child : file.getChildren()) { processFile(child); } @@ -981,8 +983,8 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { } } - private void markOldOutputRoots(final Project project, final TIntObjectHashMap> currentLayout) { - final int projectId = getProjectId(project); + private void markOldOutputRoots(final ProjectRef projRef, final TIntObjectHashMap> currentLayout) { + final int projectId = getProjectId(projRef.get()); final TIntHashSet rootsToMark = new TIntHashSet(); synchronized (myProjectOutputRoots) { @@ -1043,16 +1045,14 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { public void run() { new Task.Backgroundable(project, CompilerBundle.message("compiler.initial.scanning.progress.text"), false) { public void run(@NotNull final ProgressIndicator indicator) { + final ProjectRef projRef = new ProjectRef(project); try { - if (project.isDisposed()) { - return; - } final IntermediateOutputCompiler[] compilers = - CompilerManager.getInstance(project).getCompilers(IntermediateOutputCompiler.class); + CompilerManager.getInstance(projRef.get()).getCompilers(IntermediateOutputCompiler.class); final Set intermediateRoots = new HashSet(); if (compilers.length > 0) { - final Module[] modules = ModuleManager.getInstance(project).getModules(); + final Module[] modules = ModuleManager.getInstance(projRef.get()).getModules(); for (IntermediateOutputCompiler compiler : compilers) { for (Module module : modules) { if (module.isDisposed()) { @@ -1070,9 +1070,9 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { } } - final List projectRoots = Arrays.asList(ProjectRootManager.getInstance(project).getContentSourceRoots()); + final List projectRoots = Arrays.asList(ProjectRootManager.getInstance(projRef.get()).getContentSourceRoots()); final int totalRootsCount = projectRoots.size() + intermediateRoots.size(); - scanSourceContent(project, projectRoots, totalRootsCount, true); + scanSourceContent(projRef, projectRoots, totalRootsCount, true); if (!intermediateRoots.isEmpty()) { final FileProcessor processor = new FileProcessor() { @@ -1087,13 +1087,16 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { }; int processed = projectRoots.size(); for (VirtualFile root : intermediateRoots) { + projRef.get(); indicator.setText2(root.getPresentableUrl()); indicator.setFraction(++processed / (double)totalRootsCount); processRecursively(root, false, processor); } } - - markOldOutputRoots(project, buildOutputRootsLayout(project)); + + markOldOutputRoots(projRef, buildOutputRootsLayout(projRef)); + } + catch (ProjectRef.ProjectClosedException swallowed) { } finally { synchronized (myInitializationLock) { @@ -1108,7 +1111,6 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { }); } - private class MyProjectManagerListener extends ProjectManagerAdapter { final Map myConnections = new HashMap(); @@ -1116,39 +1118,54 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { public void projectOpened(final Project project) { final MessageBusConnection conn = project.getMessageBus().connect(); myConnections.put(project, conn); + final ProjectRef projRef = new ProjectRef(project); conn.subscribe(ProjectTopics.PROJECT_ROOTS, new ModuleRootListener() { private VirtualFile[] myRootsBefore; public void beforeRootsChange(final ModuleRootEvent event) { - myRootsBefore = ProjectRootManager.getInstance(project).getContentSourceRoots(); + try { + myRootsBefore = ProjectRootManager.getInstance(projRef.get()).getContentSourceRoots(); + } + catch (ProjectRef.ProjectClosedException e) { + myRootsBefore = null; + } } public void rootsChanged(final ModuleRootEvent event) { - final VirtualFile[] rootsAfter = ProjectRootManager.getInstance(project).getContentSourceRoots(); - - { - final Set newRoots = new HashSet(); - ContainerUtil.addAll(newRoots, rootsAfter); - if (myRootsBefore != null) { - newRoots.removeAll(Arrays.asList(myRootsBefore)); + try { + try { + final VirtualFile[] rootsAfter = ProjectRootManager.getInstance(projRef.get()).getContentSourceRoots(); + + { + final Set newRoots = new HashSet(); + ContainerUtil.addAll(newRoots, rootsAfter); + if (myRootsBefore != null) { + newRoots.removeAll(Arrays.asList(myRootsBefore)); + } + scanSourceContent(projRef, newRoots, newRoots.size(), true); + } + + { + final Set oldRoots = new HashSet(); + if (myRootsBefore != null) { + ContainerUtil.addAll(oldRoots, myRootsBefore); + } + if (!oldRoots.isEmpty()) { + oldRoots.removeAll(Arrays.asList(rootsAfter)); + } + scanSourceContent(projRef, oldRoots, oldRoots.size(), false); + } } - scanSourceContent(project, newRoots, newRoots.size(), true); + finally { + myRootsBefore = null; + } + + + markOldOutputRoots(projRef, buildOutputRootsLayout(projRef)); } - - { - final Set oldRoots = new HashSet(); - if (myRootsBefore != null) { - ContainerUtil.addAll(oldRoots, myRootsBefore); - } - if (!oldRoots.isEmpty()) { - oldRoots.removeAll(Arrays.asList(rootsAfter)); - } - scanSourceContent(project, oldRoots, oldRoots.size(), false); + catch (ProjectRef.ProjectClosedException e) { + LOG.info(e); } - - myRootsBefore = null; - - markOldOutputRoots(project, buildOutputRootsLayout(project)); } }); @@ -1465,4 +1482,24 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { } } + public static final class ProjectRef extends Ref { + static class ProjectClosedException extends RuntimeException { + } + + public ProjectRef() { + } + + public ProjectRef(Project project) { + super(project); + } + + public Project get() { + final Project project = super.get(); + if (project != null && project.isDisposed()) { + throw new ProjectClosedException(); + } + return project; + } + } + } diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenImportingTestCase.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenImportingTestCase.java index 89025123e458..60f29c6600e6 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenImportingTestCase.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenImportingTestCase.java @@ -507,7 +507,7 @@ public abstract class MavenImportingTestCase extends MavenTestCase { CompilerManagerImpl.testSetup(); List roots = Arrays.asList(ProjectRootManager.getInstance(myProject).getContentRoots()); - TranslatingCompilerFilesMonitor.getInstance().scanSourceContent(myProject, roots, roots.size(), true); + TranslatingCompilerFilesMonitor.getInstance().scanSourceContent(new TranslatingCompilerFilesMonitor.ProjectRef(myProject), roots, roots.size(), true); final CompileScope scope = new ModuleCompileScope(myProject, modules.toArray(new Module[modules.size()]), false);