diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ModuleRunConfigurationManager.java b/platform/lang-impl/src/com/intellij/execution/impl/ModuleRunConfigurationManager.java index 3fe5aafc1f52..bcd55205ed5c 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ModuleRunConfigurationManager.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ModuleRunConfigurationManager.java @@ -27,8 +27,9 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleComponent; import com.intellij.openapi.project.ModuleAdapter; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.*; -import com.intellij.util.containers.ContainerUtil; +import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.InvalidDataException; +import com.intellij.openapi.util.WriteExternalException; import com.intellij.util.containers.HashSet; import org.jdom.Element; import org.jetbrains.annotations.NonNls; @@ -36,7 +37,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Set; @@ -51,14 +51,8 @@ import java.util.Set; public final class ModuleRunConfigurationManager extends ModuleAdapter implements ModuleComponent, PersistentStateComponent { private static final Logger LOG = Logger.getInstance(ModuleRunConfigurationManager.class); @NonNls static final String COMPONENT_NAME = "ModuleRunConfigurationManager"; - @NotNull - private final Condition myModuleConfigCondition = new Condition() { - @Override - public boolean value(@Nullable RunnerAndConfigurationSettings settings) { - return settings != null && usesMyModule(settings.getConfiguration()); - } - }; + private final Object myRemoverKey; @NotNull private final Module myModule; @NotNull @@ -69,6 +63,7 @@ public final class ModuleRunConfigurationManager extends ModuleAdapter implement public ModuleRunConfigurationManager(@NotNull final Module module, @NotNull final RunManagerImpl runManager) { myModule = module; myManager = runManager; + myRemoverKey = new Object(); } @Override @@ -123,11 +118,6 @@ public final class ModuleRunConfigurationManager extends ModuleAdapter implement } } - @NotNull - private Collection getModuleRunConfigurationSettings() { - return ContainerUtil.filter(myManager.getConfigurationSettings(), myModuleConfigCondition); - } - private boolean usesMyModule(RunConfiguration config) { return config instanceof ModuleBasedConfiguration && myModule.equals(((ModuleBasedConfiguration)config).getConfigurationModule().getModule()); @@ -135,7 +125,7 @@ public final class ModuleRunConfigurationManager extends ModuleAdapter implement public void writeExternal(@NotNull final Element element) throws WriteExternalException { LOG.debug("writeExternal(" + myModule + ")"); - for (final RunnerAndConfigurationSettings settings : getModuleRunConfigurationSettings()) { + for (final RunnerAndConfigurationSettings settings : myManager.getExternalSettings(myRemoverKey)) { myManager.addConfigurationElement(element, settings); } if (myUnloadedElements != null) { @@ -152,7 +142,7 @@ public final class ModuleRunConfigurationManager extends ModuleAdapter implement final List children = element.getChildren(); for (final Object child : children) { - final RunnerAndConfigurationSettings configuration = myManager.loadConfiguration((Element)child, true); + final RunnerAndConfigurationSettings configuration = myManager.loadConfiguration(myRemoverKey, (Element)child, true); if (configuration == null && Comparing.strEqual(element.getName(), RunManagerImpl.CONFIGURATION)) { if (myUnloadedElements == null) myUnloadedElements = new ArrayList(2); myUnloadedElements.add(element); @@ -178,13 +168,9 @@ public final class ModuleRunConfigurationManager extends ModuleAdapter implement } @Override - public void beforeModuleRemoved(Project project, Module module) { - if (!myModule.equals(module)) { - return; - } - LOG.debug("time to remove something from project (" + project + ")"); - for (final RunnerAndConfigurationSettings settings : getModuleRunConfigurationSettings()) { - myManager.removeConfiguration(settings); + public void moduleRemoved(Project project, Module module) { + if (myModule.equals(module)) { + myManager.removeExternalSettings(myRemoverKey); } } } diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java index 74ff2352066a..03672453c97b 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java @@ -49,6 +49,8 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, new HashMap(); private final Map myConfigurations = new LinkedHashMap(); // template configurations are not included here + private final Map> myExternalSettings = + new java.util.HashMap>(); private final Map mySharedConfigurations = new TreeMap(); private final Map> myConfigurationToBeforeTasksMap = new WeakHashMap>(); @@ -221,6 +223,11 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, return list.toArray(new RunConfiguration[list.size()]); } + @NotNull + public List getExternalSettings(@NotNull Object key) { + return myExternalSettings.containsKey(key) ? myExternalSettings.get(key) : Collections.emptyList(); + } + @NotNull @Override public List getAllSettings() { @@ -233,7 +240,6 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, for (RunnerAndConfigurationSettings settings : getSortedConfigurations()) { if (settings.getConfiguration() == configuration) return settings; } - LOG.warn("Cannot find settings for RunConfiguration " + configuration.getName()); return null; } @@ -522,7 +528,7 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, @Override public void writeExternal(@NotNull final Element parentNode) throws WriteExternalException { - writeContext(parentNode); + writeContext(parentNode);//writes temporary configurations here for (final RunnerAndConfigurationSettings runnerAndConfigurationSettings : myTemplateConfigurationsMap.values()) { if (runnerAndConfigurationSettings.getConfiguration() instanceof UnknownRunConfiguration) { if (((UnknownRunConfiguration)runnerAndConfigurationSettings.getConfiguration()).isDoNotStore()) { @@ -777,15 +783,35 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, fireRunConfigurationsRemoved(configurations); } + public void removeExternalSettings(@NotNull Object removerKey) { + List settingsList = myExternalSettings.get(removerKey); + for (RunnerAndConfigurationSettings each : settingsList) { + removeConfiguration(each); + } + myExternalSettings.remove(removerKey); + } + @Nullable public RunnerAndConfigurationSettings loadConfiguration(final Element element, boolean isShared) throws InvalidDataException { - RunnerAndConfigurationSettingsImpl settings = new RunnerAndConfigurationSettingsImpl(this); + return loadConfiguration(null, element, isShared); + } + + @Nullable + public RunnerAndConfigurationSettings loadConfiguration(@Nullable final Object removerKey, final Element element, boolean isShared) throws InvalidDataException { + final RunnerAndConfigurationSettingsImpl settings = new RunnerAndConfigurationSettingsImpl(this); settings.readExternal(element); ConfigurationFactory factory = settings.getFactory(); if (factory == null) { return null; } + if (removerKey !=null) { + if (!myExternalSettings.containsKey(removerKey)) { + myExternalSettings.put(removerKey, new ArrayList()); + } + myExternalSettings.get(removerKey).add(settings); + } + final Element methodsElement = element.getChild(METHOD); final List tasks = readStepsBeforeRun(methodsElement, settings); if (settings.isTemplate()) {