RunnerAndConfigurationSettingsImpl — don't save defaults (configurationWrapper)

This commit is contained in:
Vladimir Krivosheev
2014-11-03 07:47:07 +01:00
parent cb1e99275c
commit ddddd1aa8f
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2013 JetBrains s.r.o.
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.execution.impl;
import com.intellij.execution.*;
@@ -39,10 +38,6 @@ import java.util.*;
public class RunnerAndConfigurationSettingsImpl implements JDOMExternalizable, Cloneable, RunnerAndConfigurationSettings, Comparable {
private static final Logger LOG = Logger.getInstance("#com.intellij.execution.impl.RunnerAndConfigurationSettings");
@NonNls
private static final String RUNNER_ELEMENT = "RunnerSettings";
@NonNls
private static final String CONFIGURATION_ELEMENT = "ConfigurationWrapper";
@NonNls
private static final String RUNNER_ID = "RunnerId";
@@ -86,13 +81,19 @@ public class RunnerAndConfigurationSettingsImpl implements JDOMExternalizable, C
private RunConfiguration myConfiguration;
private boolean myIsTemplate;
private final Map<ProgramRunner, RunnerSettings> myRunnerSettings = new THashMap<ProgramRunner, RunnerSettings>();
private List<Element> myUnloadedRunnerSettings;
// to avoid changed files
private final Set<String> myLoadedRunnerSettings = new THashSet<String>();
private final RunnerItem<RunnerSettings> myRunnerSettings = new RunnerItem<RunnerSettings>("RunnerSettings") {
@Override
protected RunnerSettings createSettings(@NotNull ProgramRunner runner) {
return runner.createConfigurationData(new InfoProvider(runner));
}
};
private final Map<ProgramRunner, ConfigurationPerRunnerSettings> myConfigurationPerRunnerSettings = new THashMap<ProgramRunner, ConfigurationPerRunnerSettings>();
private List<Element> myUnloadedConfigurationPerRunnerSettings;
private final RunnerItem<ConfigurationPerRunnerSettings> myConfigurationPerRunnerSettings = new RunnerItem<ConfigurationPerRunnerSettings>("ConfigurationWrapper") {
@Override
protected ConfigurationPerRunnerSettings createSettings(@NotNull ProgramRunner runner) {
return myConfiguration.createRunnerSettings(new InfoProvider(runner));
}
};
private boolean myTemporary;
private boolean myEditBeforeRun;
@@ -105,6 +106,100 @@ public class RunnerAndConfigurationSettingsImpl implements JDOMExternalizable, C
myManager = manager;
}
@SuppressWarnings("deprecation")
private abstract class RunnerItem<T> {
private final Map<ProgramRunner, T> settings = new THashMap<ProgramRunner, T>();
private List<Element> unloadedSettings;
// to avoid changed files
private final Set<String> loadedIds = new THashSet<String>();
private final String childTagName;
RunnerItem(@NotNull String childTagName) {
this.childTagName = childTagName;
}
public void loadState(@NotNull Element element) throws InvalidDataException {
settings.clear();
if (unloadedSettings != null) {
unloadedSettings.clear();
}
loadedIds.clear();
for (Iterator<Element> iterator = element.getChildren(childTagName).iterator(); iterator.hasNext(); ) {
Element state = iterator.next();
ProgramRunner runner = RunnerRegistry.getInstance().findRunnerById(state.getAttributeValue(RUNNER_ID));
if (runner == null) {
iterator.remove();
}
add(state, runner, runner == null ? null : createSettings(runner));
}
}
public void getState(@NotNull Element element) throws WriteExternalException {
List<Element> runnerSettings = new SmartList<Element>();
for (ProgramRunner runner : settings.keySet()) {
T settings = this.settings.get(runner);
boolean wasLoaded = loadedIds.contains(runner.getRunnerId());
if (settings == null && !wasLoaded) {
continue;
}
Element state = new Element(childTagName);
if (settings != null) {
((JDOMExternalizable)settings).writeExternal(state);
}
if (wasLoaded || !JDOMUtil.isEmpty(state)) {
state.setAttribute(RUNNER_ID, runner.getRunnerId());
runnerSettings.add(state);
}
}
if (unloadedSettings != null) {
for (Element unloadedSetting : unloadedSettings) {
runnerSettings.add(unloadedSetting.clone());
}
}
Collections.sort(runnerSettings, RUNNER_COMPARATOR);
for (Element runnerSetting : runnerSettings) {
element.addContent(runnerSetting);
}
}
protected abstract T createSettings(@NotNull ProgramRunner runner);
private void add(@NotNull Element state, @Nullable ProgramRunner runner, @Nullable T data) throws InvalidDataException {
if (runner == null) {
if (unloadedSettings == null) {
unloadedSettings = new SmartList<Element>();
}
unloadedSettings.add(state);
return;
}
if (data != null) {
((JDOMExternalizable)data).readExternal(state);
}
settings.put(runner, data);
loadedIds.add(runner.getRunnerId());
}
public T getOrCreateSettings(@NotNull ProgramRunner runner) {
T result = settings.get(runner);
if (result == null) {
try {
result = createSettings(runner);
settings.put(runner, result);
}
catch (AbstractMethodError ignored) {
LOG.error("Update failed for: " + myConfiguration.getType().getDisplayName() + ", runner: " + runner.getRunnerId(), new ExtensionException(runner.getClass()));
}
}
return result;
}
}
public RunnerAndConfigurationSettingsImpl(RunManagerImpl manager, @NotNull RunConfiguration configuration, boolean isTemplate) {
myManager = manager;
myConfiguration = configuration;
@@ -243,54 +338,8 @@ public class RunnerAndConfigurationSettingsImpl implements JDOMExternalizable, C
}
myConfiguration.readExternal(element);
if (myUnloadedRunnerSettings != null) {
myUnloadedRunnerSettings.clear();
}
myLoadedRunnerSettings.clear();
for (Iterator<Element> iterator = element.getChildren(RUNNER_ELEMENT).iterator(); iterator.hasNext(); ) {
Element runnerElement = iterator.next();
String id = runnerElement.getAttributeValue(RUNNER_ID);
ProgramRunner runner = RunnerRegistry.getInstance().findRunnerById(id);
if (runner != null) {
myLoadedRunnerSettings.add(id);
RunnerSettings settings = createRunnerSettings(runner);
if (settings != null) {
settings.readExternal(runnerElement);
}
myRunnerSettings.put(runner, settings);
}
else {
if (myUnloadedRunnerSettings == null) {
myUnloadedRunnerSettings = new SmartList<Element>();
}
iterator.remove();
myUnloadedRunnerSettings.add(runnerElement);
}
}
if (myUnloadedConfigurationPerRunnerSettings != null) {
myUnloadedConfigurationPerRunnerSettings.clear();
}
for (Iterator<Element> iterator = element.getChildren(CONFIGURATION_ELEMENT).iterator(); iterator.hasNext(); ) {
Element configurationElement = iterator.next();
ProgramRunner runner = RunnerRegistry.getInstance().findRunnerById(configurationElement.getAttributeValue(RUNNER_ID));
if (runner != null) {
ConfigurationPerRunnerSettings settings = myConfiguration.createRunnerSettings(new InfoProvider(runner));
if (settings != null) {
settings.readExternal(configurationElement);
}
myConfigurationPerRunnerSettings.put(runner, settings);
}
else {
if (myUnloadedConfigurationPerRunnerSettings == null) {
myUnloadedConfigurationPerRunnerSettings = new SmartList<Element>();
}
iterator.remove();
myUnloadedConfigurationPerRunnerSettings.add(configurationElement);
}
}
myRunnerSettings.loadState(element);
myConfigurationPerRunnerSettings.loadState(element);
}
@Override
@@ -322,60 +371,8 @@ public class RunnerAndConfigurationSettingsImpl implements JDOMExternalizable, C
myConfiguration.writeExternal(element);
if (!(myConfiguration instanceof UnknownRunConfiguration)) {
writeRunnerSettings(RUNNER_COMPARATOR, element);
writeConfigurationPerRunnerSettings(RUNNER_COMPARATOR, element);
}
}
private void writeConfigurationPerRunnerSettings(final Comparator<Element> runnerComparator, final Element element)
throws WriteExternalException {
final ArrayList<Element> configurationPerRunnerSettings = new ArrayList<Element>();
for (ProgramRunner runner : myConfigurationPerRunnerSettings.keySet()) {
ConfigurationPerRunnerSettings settings = myConfigurationPerRunnerSettings.get(runner);
Element runnerElement = new Element(CONFIGURATION_ELEMENT);
if (settings != null) {
settings.writeExternal(runnerElement);
}
runnerElement.setAttribute(RUNNER_ID, runner.getRunnerId());
configurationPerRunnerSettings.add(runnerElement);
}
if (myUnloadedConfigurationPerRunnerSettings != null) {
for (Element unloadedCRunnerSetting : myUnloadedConfigurationPerRunnerSettings) {
configurationPerRunnerSettings.add(unloadedCRunnerSetting.clone());
}
}
Collections.sort(configurationPerRunnerSettings, runnerComparator);
for (Element runnerConfigurationSetting : configurationPerRunnerSettings) {
element.addContent(runnerConfigurationSetting);
}
}
private void writeRunnerSettings(@NotNull Comparator<Element> runnerComparator, @NotNull Element element) throws WriteExternalException {
List<Element> runnerSettings = new SmartList<Element>();
for (ProgramRunner runner : myRunnerSettings.keySet()) {
RunnerSettings settings = myRunnerSettings.get(runner);
boolean wasLoaded = myLoadedRunnerSettings.contains(runner.getRunnerId());
if (settings == null && !wasLoaded) {
continue;
}
Element runnerElement = new Element(RUNNER_ELEMENT);
if (settings != null) {
settings.writeExternal(runnerElement);
}
if (wasLoaded || !JDOMUtil.isEmpty(runnerElement)) {
runnerElement.setAttribute(RUNNER_ID, runner.getRunnerId());
runnerSettings.add(runnerElement);
}
}
if (myUnloadedRunnerSettings != null) {
for (Element unloadedRunnerSetting : myUnloadedRunnerSettings) {
runnerSettings.add(unloadedRunnerSetting.clone());
}
}
Collections.sort(runnerSettings, runnerComparator);
for (Element runnerSetting : runnerSettings) {
element.addContent(runnerSetting);
myRunnerSettings.getState(element);
myConfigurationPerRunnerSettings.getState(element);
}
}
@@ -390,11 +387,11 @@ public class RunnerAndConfigurationSettingsImpl implements JDOMExternalizable, C
if (myConfiguration instanceof RunConfigurationBase) {
final RunConfigurationBase runConfigurationBase = (RunConfigurationBase) myConfiguration;
Set<ProgramRunner> runners = new THashSet<ProgramRunner>();
runners.addAll(myRunnerSettings.keySet());
runners.addAll(myConfigurationPerRunnerSettings.keySet());
runners.addAll(myRunnerSettings.settings.keySet());
runners.addAll(myConfigurationPerRunnerSettings.settings.keySet());
for (ProgramRunner runner : runners) {
if (executor == null || runner.canRun(executor.getId(), myConfiguration)) {
runConfigurationBase.checkRunnerSettings(runner, myRunnerSettings.get(runner), myConfigurationPerRunnerSettings.get(runner));
runConfigurationBase.checkRunnerSettings(runner, myRunnerSettings.settings.get(runner), myConfigurationPerRunnerSettings.settings.get(runner));
}
}
if (executor != null) {
@@ -413,28 +410,13 @@ public class RunnerAndConfigurationSettingsImpl implements JDOMExternalizable, C
@Override
public RunnerSettings getRunnerSettings(@NotNull ProgramRunner runner) {
if (!myRunnerSettings.containsKey(runner)) {
try {
RunnerSettings runnerSettings = createRunnerSettings(runner);
myRunnerSettings.put(runner, runnerSettings);
return runnerSettings;
}
catch (AbstractMethodError ignored) {
LOG.error("Update failed for: " + myConfiguration.getType().getDisplayName() + ", runner: " + runner.getRunnerId(), new ExtensionException(runner.getClass()));
}
}
return myRunnerSettings.get(runner);
return myRunnerSettings.getOrCreateSettings(runner);
}
@Override
@Nullable
public ConfigurationPerRunnerSettings getConfigurationSettings(@NotNull ProgramRunner runner) {
if (!myConfigurationPerRunnerSettings.containsKey(runner)) {
ConfigurationPerRunnerSettings settings = myConfiguration.createRunnerSettings(new InfoProvider(runner));
myConfigurationPerRunnerSettings.put(runner, settings);
return settings;
}
return myConfigurationPerRunnerSettings.get(runner);
return myConfigurationPerRunnerSettings.getOrCreateSettings(runner);
}
@Override
@@ -451,45 +433,35 @@ public class RunnerAndConfigurationSettingsImpl implements JDOMExternalizable, C
}
public void importRunnerAndConfigurationSettings(RunnerAndConfigurationSettingsImpl template) {
try {
for (ProgramRunner runner : template.myRunnerSettings.keySet()) {
RunnerSettings data = createRunnerSettings(runner);
myRunnerSettings.put(runner, data);
if (data != null) {
Element temp = new Element(DUMMY_ELEMENT_NAME);
RunnerSettings templateSettings = template.myRunnerSettings.get(runner);
if (templateSettings != null) {
templateSettings.writeExternal(temp);
data.readExternal(temp);
}
}
}
importFromTemplate(template.myRunnerSettings, myRunnerSettings);
importFromTemplate(template.myConfigurationPerRunnerSettings, myConfigurationPerRunnerSettings);
for (ProgramRunner runner : template.myConfigurationPerRunnerSettings.keySet()) {
ConfigurationPerRunnerSettings data = myConfiguration.createRunnerSettings(new InfoProvider(runner));
myConfigurationPerRunnerSettings.put(runner, data);
if (data != null) {
Element temp = new Element(DUMMY_ELEMENT_NAME);
ConfigurationPerRunnerSettings templateSettings = template.myConfigurationPerRunnerSettings.get(runner);
if (templateSettings != null) {
templateSettings.writeExternal(temp);
data.readExternal(temp);
}
}
}
setSingleton(template.isSingleton());
setEditBeforeRun(template.isEditBeforeRun());
}
catch (WriteExternalException e) {
LOG.error(e);
}
catch (InvalidDataException e) {
LOG.error(e);
}
setSingleton(template.isSingleton());
setEditBeforeRun(template.isEditBeforeRun());
}
private RunnerSettings createRunnerSettings(final ProgramRunner runner) {
return runner.createConfigurationData(new InfoProvider(runner));
@SuppressWarnings("deprecation")
private <T> void importFromTemplate(@NotNull RunnerItem<T> templateItem, @NotNull RunnerItem<T> item) {
for (ProgramRunner runner : templateItem.settings.keySet()) {
T data = item.createSettings(runner);
item.settings.put(runner, data);
if (data != null) {
Element temp = new Element(DUMMY_ELEMENT_NAME);
T templateSettings = templateItem.settings.get(runner);
if (templateSettings != null) {
try {
((JDOMExternalizable)templateSettings).writeExternal(temp);
((JDOMExternalizable)data).readExternal(temp);
}
catch (WriteExternalException e) {
LOG.error(e);
}
catch (InvalidDataException e) {
LOG.error(e);
}
}
}
}
}
@Override