From 7e37b7c23028387657166bb453b79cea0a5e9832 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 11 Nov 2010 12:31:52 +0300 Subject: [PATCH] traverseUI test fixed --- .../intellij/openapi/components/ComponentManager.java | 8 ++++++++ .../src/com/intellij/openapi/project/Project.java | 3 --- .../openapi/application/impl/ApplicationImpl.java | 11 +++++++++-- .../application/impl/ModalityInvokatorImpl.java | 6 +++--- .../intellij/openapi/command/impl/DummyProject.java | 1 + .../openapi/components/impl/ComponentManagerImpl.java | 11 +++++++++++ .../intellij/openapi/project/impl/ProjectImpl.java | 11 ----------- .../intellij/openapi/wm/impl/CommandProcessor.java | 4 +++- .../openapi/wm/impl/ToolWindowManagerImpl.java | 2 +- .../src/com/intellij/mock/MockComponentManager.java | 7 +++++++ .../src/com/intellij/mock/MockProject.java | 1 + 11 files changed, 44 insertions(+), 21 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/components/ComponentManager.java b/platform/platform-api/src/com/intellij/openapi/components/ComponentManager.java index 45a0dff95ad6..12c201ac33f0 100644 --- a/platform/platform-api/src/com/intellij/openapi/components/ComponentManager.java +++ b/platform/platform-api/src/com/intellij/openapi/components/ComponentManager.java @@ -17,6 +17,7 @@ package com.intellij.openapi.components; import com.intellij.openapi.Disposable; import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.UserDataHolder; import com.intellij.util.messages.MessageBus; import org.jetbrains.annotations.NotNull; @@ -98,4 +99,11 @@ public interface ComponentManager extends UserDataHolder, Disposable { T[] getExtensions(ExtensionPointName extensionPointName); ComponentConfig getConfig(Class componentImplementation); + + /** + * @return condition for this component being disposed. + * see {@link com.intellij.openapi.application.Application#invokeLater(Runnable, Condition)} for the usage example. + */ + @NotNull + Condition getDisposed(); } diff --git a/platform/platform-api/src/com/intellij/openapi/project/Project.java b/platform/platform-api/src/com/intellij/openapi/project/Project.java index 0fd1fea3a314..b05098b9c086 100644 --- a/platform/platform-api/src/com/intellij/openapi/project/Project.java +++ b/platform/platform-api/src/com/intellij/openapi/project/Project.java @@ -17,7 +17,6 @@ package com.intellij.openapi.project; import com.intellij.openapi.components.ComponentManager; import com.intellij.openapi.extensions.AreaInstance; -import com.intellij.openapi.util.Condition; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -61,8 +60,6 @@ public interface Project extends ComponentManager, AreaInstance { void save(); - Condition getDisposed(); - boolean isOpen(); boolean isInitialized(); diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java index 73d6008c4535..372c3f13a8c9 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java @@ -87,7 +87,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application private final EventDispatcher myDispatcher = EventDispatcher.create(ApplicationListener.class); - private final boolean myTestModeFlag; + private boolean myTestModeFlag; private final boolean myHeadlessMode; private final boolean myCommandLineMode; @@ -357,6 +357,10 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application return myTestModeFlag; } + public void setUnitTestMode(boolean testModeFlag) { + myTestModeFlag = testModeFlag; + } + public boolean isHeadlessEnvironment() { return myHeadlessMode; } @@ -689,7 +693,10 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application if (!canExit()) return; - if (disposeSelf()) System.exit(myExitCode); + boolean success = disposeSelf(); + if (success && !isUnitTestMode()) { + System.exit(myExitCode); + } } }; diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/ModalityInvokatorImpl.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/ModalityInvokatorImpl.java index 0420f4804eb5..f557edee8075 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/ModalityInvokatorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/ModalityInvokatorImpl.java @@ -19,16 +19,16 @@ */ package com.intellij.openapi.application.impl; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityInvokator; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.Condition; -import com.intellij.openapi.util.Conditions; import org.jetbrains.annotations.NotNull; public class ModalityInvokatorImpl implements ModalityInvokator { public ActionCallback invokeLater(Runnable runnable) { - return invokeLater(runnable, Conditions.FALSE); + return invokeLater(runnable, ApplicationManager.getApplication().getDisposed()); } public ActionCallback invokeLater(final Runnable runnable, @NotNull final Condition expired) { @@ -40,6 +40,6 @@ public class ModalityInvokatorImpl implements ModalityInvokator { } public ActionCallback invokeLater(Runnable runnable, @NotNull ModalityState state) { - return invokeLater(runnable, state, Conditions.FALSE); + return invokeLater(runnable, state, ApplicationManager.getApplication().getDisposed()); } } \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/openapi/command/impl/DummyProject.java b/platform/platform-impl/src/com/intellij/openapi/command/impl/DummyProject.java index 8802c59c55ad..d4c68497096a 100644 --- a/platform/platform-impl/src/com/intellij/openapi/command/impl/DummyProject.java +++ b/platform/platform-impl/src/com/intellij/openapi/command/impl/DummyProject.java @@ -124,6 +124,7 @@ public class DummyProject extends UserDataHolderBase implements Project { return false; } + @NotNull public Condition getDisposed() { return new Condition() { public boolean value(final Object o) { diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java index 534fa9481095..8186d5401b87 100644 --- a/platform/platform-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java @@ -30,6 +30,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.UserDataHolderBase; import com.intellij.util.ArrayUtil; @@ -75,6 +76,11 @@ public abstract class ComponentManagerImpl extends UserDataHolderBase implements private Boolean myHeadless; private ComponentsRegistry myComponentsRegistry = new ComponentsRegistry(); private boolean myHaveProgressManager = false; + private final Condition myDisposedCondition = new Condition() { + public boolean value(final Object o) { + return isDisposed(); + } + }; protected ComponentManagerImpl(ComponentManager parentComponentManager) { myParentComponentManager = parentComponentManager; @@ -431,6 +437,11 @@ public abstract class ComponentManagerImpl extends UserDataHolderBase implements return myComponentsRegistry.getConfig(componentImplementation); } + @NotNull + public Condition getDisposed() { + return myDisposedCondition; + } + private class ComponentsRegistry { private final Map myInterfaceToLockMap = new HashMap(); private final Map myInterfaceToClassMap = new HashMap(); diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java index 04e882a6a1d9..baf26ab22705 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java @@ -44,7 +44,6 @@ import com.intellij.openapi.project.ex.ProjectEx; import com.intellij.openapi.project.ex.ProjectManagerEx; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.ui.ex.MessagesEx; -import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; @@ -83,12 +82,6 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx { public boolean myOptimiseTestLoadSpeed; @NonNls public static final String TEMPLATE_PROJECT_NAME = "Default (Template) Project"; - private final Condition myDisposedCondition = new Condition() { - public boolean value(final Object o) { - return isDisposed(); - } - }; - private String myName; private String myOldName; @@ -174,10 +167,6 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx { return ProjectManagerEx.getInstanceEx().isProjectOpened(this); } - public Condition getDisposed() { - return myDisposedCondition; - } - public boolean isInitialized() { return isOpen() && !isDisposed() && StartupManagerEx.getInstanceEx(this).startupActivityPassed(); } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/CommandProcessor.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/CommandProcessor.java index ecb1b78e5ea2..15996cb6c624 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/CommandProcessor.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/CommandProcessor.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.wm.impl; +import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.diagnostic.Logger; @@ -76,7 +77,8 @@ public final class CommandProcessor implements Runnable { // max. I'm not actually quite sure this should have NON_MODAL modality but it should // definitely have some since runnables in command list may (and do) request some PSI activity final boolean queueNext = myCommandCount > 0; - ApplicationManager.getApplication().getInvokator().invokeLater(command, ModalityState.NON_MODAL, expire == null ? Condition.FALSE : expire).doWhenDone(new Runnable() { + Application application = ApplicationManager.getApplication(); + application.getInvokator().invokeLater(command, ModalityState.NON_MODAL, expire == null ? application.getDisposed() : expire).doWhenDone(new Runnable() { public void run() { if (queueNext) { CommandProcessor.this.run(); diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java index 45a2f7b137da..77e00f6ae0ee 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java @@ -1823,7 +1823,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements @Nullable public Condition getExpireCondition() { - return Condition.FALSE; + return ApplicationManager.getApplication().getDisposed(); } } diff --git a/platform/testFramework/src/com/intellij/mock/MockComponentManager.java b/platform/testFramework/src/com/intellij/mock/MockComponentManager.java index 921772e3baee..4382b8d79bb7 100644 --- a/platform/testFramework/src/com/intellij/mock/MockComponentManager.java +++ b/platform/testFramework/src/com/intellij/mock/MockComponentManager.java @@ -20,6 +20,7 @@ import com.intellij.openapi.components.BaseComponent; import com.intellij.openapi.components.ComponentConfig; import com.intellij.openapi.components.ComponentManager; import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.UserDataHolderBase; import com.intellij.util.ArrayUtil; @@ -149,4 +150,10 @@ public class MockComponentManager extends UserDataHolderBase implements Componen public ComponentConfig getConfig(Class componentImplementation) { throw new UnsupportedOperationException("Method getConfig not implemented in " + getClass()); } + + @NotNull + @Override + public Condition getDisposed() { + return Condition.FALSE; + } } diff --git a/platform/testFramework/src/com/intellij/mock/MockProject.java b/platform/testFramework/src/com/intellij/mock/MockProject.java index 3bc0fb8c32df..51edbd17e8f0 100644 --- a/platform/testFramework/src/com/intellij/mock/MockProject.java +++ b/platform/testFramework/src/com/intellij/mock/MockProject.java @@ -50,6 +50,7 @@ public class MockProject extends MockComponentManager implements ProjectEx { return ServiceManager.getService(this, PomModel.class); } + @NotNull @Override public Condition getDisposed() { return new Condition() {