From ddddd1aa8ff4704a3628579df1094dcffaafefbb Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 3 Nov 2014 07:47:07 +0100 Subject: [PATCH] =?UTF-8?q?RunnerAndConfigurationSettingsImpl=20=E2=80=94?= =?UTF-8?q?=20don't=20save=20defaults=20(configurationWrapper)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RunnerAndConfigurationSettingsImpl.java | 312 ++++++++---------- 1 file changed, 142 insertions(+), 170 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.java index 70d54dc72da0..885e12dcf4e9 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.java @@ -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 myRunnerSettings = new THashMap(); - private List myUnloadedRunnerSettings; - // to avoid changed files - private final Set myLoadedRunnerSettings = new THashSet(); + private final RunnerItem myRunnerSettings = new RunnerItem("RunnerSettings") { + @Override + protected RunnerSettings createSettings(@NotNull ProgramRunner runner) { + return runner.createConfigurationData(new InfoProvider(runner)); + } + }; - private final Map myConfigurationPerRunnerSettings = new THashMap(); - private List myUnloadedConfigurationPerRunnerSettings; + private final RunnerItem myConfigurationPerRunnerSettings = new RunnerItem("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 { + private final Map settings = new THashMap(); + + private List unloadedSettings; + // to avoid changed files + private final Set loadedIds = new THashSet(); + + 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 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 runnerSettings = new SmartList(); + 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(); + } + 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 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(); - } - - iterator.remove(); - myUnloadedRunnerSettings.add(runnerElement); - } - } - - if (myUnloadedConfigurationPerRunnerSettings != null) { - myUnloadedConfigurationPerRunnerSettings.clear(); - } - for (Iterator 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(); - } - - 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 runnerComparator, final Element element) - throws WriteExternalException { - final ArrayList configurationPerRunnerSettings = new ArrayList(); - 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 runnerComparator, @NotNull Element element) throws WriteExternalException { - List runnerSettings = new SmartList(); - 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 runners = new THashSet(); - 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 void importFromTemplate(@NotNull RunnerItem templateItem, @NotNull RunnerItem 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