mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
RunnerAndConfigurationSettingsImpl — don't save defaults (configurationWrapper)
This commit is contained in:
+142
-170
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user