IDEA-109465 make run configuration's unique name unique for module based run configurations

+ Run Configurations API: refactoring
This commit is contained in:
Vassiliy Kudryashov
2013-08-17 23:28:40 +04:00
parent 97d2d6a3b0
commit 897bd686e4
2 changed files with 39 additions and 27 deletions
@@ -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<Element> {
private static final Logger LOG = Logger.getInstance(ModuleRunConfigurationManager.class);
@NonNls static final String COMPONENT_NAME = "ModuleRunConfigurationManager";
@NotNull
private final Condition<RunnerAndConfigurationSettings> myModuleConfigCondition = new Condition<RunnerAndConfigurationSettings>() {
@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<? extends RunnerAndConfigurationSettings> 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<Element>(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);
}
}
}
@@ -49,6 +49,8 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable,
new HashMap<String, RunnerAndConfigurationSettings>();
private final Map<String, RunnerAndConfigurationSettings> myConfigurations =
new LinkedHashMap<String, RunnerAndConfigurationSettings>(); // template configurations are not included here
private final Map<Object, List<RunnerAndConfigurationSettings>> myExternalSettings =
new java.util.HashMap<Object, List<RunnerAndConfigurationSettings>>();
private final Map<String, Boolean> mySharedConfigurations = new TreeMap<String, Boolean>();
private final Map<RunConfiguration, List<BeforeRunTask>> myConfigurationToBeforeTasksMap = new WeakHashMap<RunConfiguration, List<BeforeRunTask>>();
@@ -221,6 +223,11 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable,
return list.toArray(new RunConfiguration[list.size()]);
}
@NotNull
public List<RunnerAndConfigurationSettings> getExternalSettings(@NotNull Object key) {
return myExternalSettings.containsKey(key) ? myExternalSettings.get(key) : Collections.<RunnerAndConfigurationSettings>emptyList();
}
@NotNull
@Override
public List<RunnerAndConfigurationSettings> 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<RunnerAndConfigurationSettings> 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<RunnerAndConfigurationSettings>());
}
myExternalSettings.get(removerKey).add(settings);
}
final Element methodsElement = element.getChild(METHOD);
final List<BeforeRunTask> tasks = readStepsBeforeRun(methodsElement, settings);
if (settings.isTemplate()) {