ensute that RC level is set correctly on load

(cherry picked from commit a4d3f0947eba37fab477464e20d48dbb1588406d)
This commit is contained in:
Vladimir Krivosheev
2017-04-10 18:19:57 +02:00
parent 6dd215520f
commit 2d38816d15
12 changed files with 137 additions and 149 deletions
@@ -155,13 +155,18 @@ abstract class RunManager {
*/
abstract fun getConfigurationTemplate(factory: ConfigurationFactory): RunnerAndConfigurationSettings
/**
* Adds the specified run configuration to the list of run configurations.
*/
abstract fun addConfiguration(settings: RunnerAndConfigurationSettings)
/**
* Adds the specified run configuration to the list of run configurations stored in the project.
* @param settings the run configuration settings.
* @param isShared true if the configuration is marked as shared (stored in the versioned part of the project files), false if it's local
* * (stored in the workspace file).
*/
abstract fun addConfiguration(settings: RunnerAndConfigurationSettings, isShared: Boolean)
abstract fun addConfiguration(settings: RunnerAndConfigurationSettings, isShawred: Boolean)
/**
* Marks the specified run configuration as recently used (the temporary run configurations are deleted in LRU order).
@@ -41,10 +41,9 @@ public interface RunnerAndConfigurationSettings {
/**
* Returns the factory used to create the run configuration.
*
* @return the factory, or null if the settings object was loaded from disk and no plugin corresponding to the stored type of the run
* configuration is loaded.
* @return the factory
*/
@Nullable
@NotNull
ConfigurationFactory getFactory();
/**
@@ -209,4 +208,6 @@ public interface RunnerAndConfigurationSettings {
* @return the folder name, or null if the configuration is displayed on the top level.
*/
@Nullable String getFolderName();
}
@@ -17,6 +17,7 @@ package com.intellij.execution;
import com.intellij.execution.configurations.ConfigurationType;
import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.execution.impl.RunnerAndConfigurationSettingsImpl;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import org.jetbrains.annotations.NotNull;
@@ -34,10 +35,10 @@ public abstract class RunManagerEx extends RunManager {
}
/**
* @deprecated use {@link #setSelectedConfiguration(RunnerAndConfigurationSettings)} instead
* @deprecated Use {@link #setSelectedConfiguration(RunnerAndConfigurationSettings)} instead
*/
@Deprecated
public void setActiveConfiguration(@Nullable RunnerAndConfigurationSettings configuration) {
public final void setActiveConfiguration(@Nullable RunnerAndConfigurationSettings configuration) {
setSelectedConfiguration(configuration);
}
@@ -46,18 +47,26 @@ public abstract class RunManagerEx extends RunManager {
@NotNull
public abstract RunManagerConfig getConfig();
public void addConfiguration(@NotNull RunnerAndConfigurationSettings settings) {
addConfiguration(settings, settings.isShared(), null, false);
}
public void addConfiguration(@NotNull RunnerAndConfigurationSettings settings, boolean isShared) {
addConfiguration(settings, isShared, null, false);
if (isShared) {
((RunnerAndConfigurationSettingsImpl)settings).setLevel(RunnerAndConfigurationSettingsImpl.Level.PROJECT);
}
addConfiguration(settings);
}
public abstract void addConfiguration(RunnerAndConfigurationSettings settings,
boolean isShared,
List<BeforeRunTask> tasks,
boolean addTemplateTasksIfAbsent);
@Deprecated
public final void addConfiguration(RunnerAndConfigurationSettings settings, boolean isShared, List<BeforeRunTask> tasks, boolean addTemplateTasksIfAbsent) {
if (isShared) {
((RunnerAndConfigurationSettingsImpl)settings).setLevel(RunnerAndConfigurationSettingsImpl.Level.PROJECT);
}
addConfiguration(settings, tasks, addTemplateTasksIfAbsent);
}
@Deprecated
public void addConfiguration(@NotNull RunnerAndConfigurationSettings settings, @NotNull List<BeforeRunTask> tasks, boolean addTemplateTasksIfAbsent) {
setBeforeRunTasks(settings.getConfiguration(), tasks, addTemplateTasksIfAbsent);
addConfiguration(settings);
}
@SuppressWarnings("MethodMayBeStatic")
@Deprecated
@@ -19,7 +19,6 @@ package com.intellij.execution.actions;
import com.intellij.execution.ExecutionBundle;
import com.intellij.execution.RunManager;
import com.intellij.execution.RunnerAndConfigurationSettings;
import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.execution.impl.RunDialog;
import com.intellij.execution.impl.RunManagerImpl;
import com.intellij.openapi.actionSystem.Presentation;
@@ -122,14 +121,9 @@ public class CreateAction extends BaseRunConfigurationAction {
@Override
public void perform(final ConfigurationContext context) {
final RunManagerImpl runManager = (RunManagerImpl)context.getRunManager();
final RunnerAndConfigurationSettings configuration = context.getConfiguration();
final RunnerAndConfigurationSettings template = runManager.getConfigurationTemplate(configuration.getFactory());
final RunConfiguration templateConfiguration = template.getConfiguration();
runManager.addConfiguration(configuration,
template.isShared(),
runManager.getBeforeRunTasks(templateConfiguration),
false);
RunManagerImpl runManager = (RunManagerImpl)context.getRunManager();
RunnerAndConfigurationSettings configuration = context.getConfiguration();
runManager.addConfiguration(configuration, runManager.getConfigurationTemplate(configuration.getFactory()).isShared());
runManager.setSelectedConfiguration(configuration);
}
}
@@ -146,9 +140,7 @@ public class CreateAction extends BaseRunConfigurationAction {
final RunnerAndConfigurationSettings configuration = context.getConfiguration();
if (RunDialog.editConfiguration(context.getProject(), configuration, ExecutionBundle.message("create.run.configuration.for.item.dialog.title", configuration.getName()))) {
final RunManagerImpl runManager = (RunManagerImpl)context.getRunManager();
runManager.addConfiguration(configuration,
configuration.isShared(),
runManager.getBeforeRunTasks(configuration.getConfiguration()), false);
runManager.addConfiguration(configuration);
runManager.setSelectedConfiguration(configuration);
}
}
@@ -38,15 +38,14 @@ abstract class BaseRCSettingsConfigurable extends SettingsEditorConfigurable<Run
RunnerAndConfigurationSettings snapshot = getEditor().getSnapshot();
final RunManagerImpl runManager = RunManagerImpl.getInstanceImpl(original.getConfiguration().getProject());
if (runManager.findExistingConfigurationId(original) == null) return true;
if (!super.isModified()) return false;
if (!original.isTemplate() && runManager.findExistingConfigurationId(original) == null) {
String existingConfigurationId = runManager.findExistingConfigurationId(original);
if (existingConfigurationId == null) {
return true;
}
if (isSnapshotSpecificallyModified(runManager, original, snapshot)) {
return true;
if (!super.isModified()) {
return false;
}
if (!runManager.getBeforeRunTasks(original.getConfiguration()).equals(runManager.getBeforeRunTasks(snapshot.getConfiguration()))) {
if (isSnapshotSpecificallyModified(runManager, original, snapshot) || !runManager.getBeforeRunTasks(original.getConfiguration()).equals(runManager.getBeforeRunTasks(snapshot.getConfiguration()))) {
return true;
}
if (original instanceof JDOMExternalizable && snapshot instanceof JDOMExternalizable) {
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2016 JetBrains s.r.o.
* Copyright 2000-2017 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.
@@ -109,9 +109,7 @@ public final class ModuleRunConfigurationManager implements PersistentStateCompo
public void writeExternal(@NotNull final Element element) throws WriteExternalException {
LOG.debug("writeExternal(" + myModule + ")");
for (final RunnerAndConfigurationSettings settings : getModuleRunConfigurationSettings()) {
myManager.addConfigurationElement(element, settings);
}
myManager.writeConfigurations(element, getModuleRunConfigurationSettings());
if (myUnloadedElements != null) {
for (final Element unloadedElement : myUnloadedElements) {
element.addContent(unloadedElement.clone());
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2016 JetBrains s.r.o.
* Copyright 2000-2017 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.
@@ -45,9 +45,7 @@ public class ProjectRunConfigurationManager implements PersistentStateComponent<
@Override
public Element getState() {
Element state = new Element("state");
for (RunnerAndConfigurationSettings configuration : myManager.getStableConfigurations(true)) {
myManager.addConfigurationElement(state, configuration);
}
myManager.writeConfigurations(state, myManager.getSharedConfigurations());
if (!ContainerUtil.isEmpty(myUnloadedElements)) {
for (Element unloadedElement : myUnloadedElements) {
state.addContent(unloadedElement.clone());
@@ -17,7 +17,10 @@
package com.intellij.execution.impl
import com.intellij.ProjectTopics
import com.intellij.configurationStore.*
import com.intellij.configurationStore.LazySchemeProcessor
import com.intellij.configurationStore.SchemeDataHolder
import com.intellij.configurationStore.SchemeManagerIprProvider
import com.intellij.configurationStore.save
import com.intellij.execution.*
import com.intellij.execution.configurations.*
import com.intellij.execution.runners.ExecutionEnvironment
@@ -30,7 +33,6 @@ import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.extensions.Extensions
import com.intellij.openapi.options.Scheme
import com.intellij.openapi.options.SchemeManagerFactory
import com.intellij.openapi.options.SchemeState
import com.intellij.openapi.project.IndexNotReadyException
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ModuleRootEvent
@@ -130,8 +132,8 @@ class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persistent
LOG.error(e)
}
val factory = settings.factory ?: return UnknownRunConfigurationScheme(name)
doLoadConfiguration(element, false, settings, factory)
//val factory = settings.factory ?: return UnknownRunConfigurationScheme(name)
doLoadConfiguration(element, settings)
return settings
}
@@ -268,50 +270,40 @@ class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persistent
}
}
override fun addConfiguration(settings: RunnerAndConfigurationSettings, shared: Boolean, tasks: List<BeforeRunTask<*>>?, addEnabledTemplateTasksIfAbsent: Boolean) {
val existingId = findExistingConfigurationId(settings)
override fun addConfiguration(settings: RunnerAndConfigurationSettings) {
val newId = settings.uniqueID
var existingSettings: RunnerAndConfigurationSettings? = null
var existingId: String? = null
lock.write {
existingId = findExistingConfigurationId(settings)
existingId?.let {
existingSettings = idToSettings.remove(it)
}
if (existingId != null) {
existingSettings = idToSettings.remove(existingId)
if (selectedConfigurationId != null && selectedConfigurationId == existingId) {
setSelectedConfigurationId(newId)
}
idToSettings.put(newId, settings)
if (existingId == null) {
refreshUsagesList(settings.configuration)
}
if (!settings.isShared && existingSettings !== settings) {
schemeManager.addScheme(settings as RunConfigurationScheme)
}
}
if (selectedConfigurationId != null && selectedConfigurationId == existingId) {
setSelectedConfigurationId(newId)
}
idToSettings.put(newId, settings)
val configuration = settings.configuration
if (existingId == null) {
refreshUsagesList(configuration)
}
checkRecentsLimit()
if (shared) {
settings.isTemporary = false
}
if (tasks != null) {
setBeforeRunTasks(configuration, tasks, addEnabledTemplateTasksIfAbsent)
}
if (existingSettings === settings) {
myDispatcher.multicaster.runConfigurationChanged(settings, existingId)
}
else {
runConfigurationAdded(settings, shared)
myDispatcher.multicaster.runConfigurationAdded(settings)
}
}
private fun runConfigurationAdded(settings: RunnerAndConfigurationSettings, shared: Boolean) {
if (!shared) {
schemeManager.addScheme(settings as RunConfigurationScheme)
}
myDispatcher.multicaster.runConfigurationAdded(settings)
}
override fun refreshUsagesList(profile: RunProfile) {
if (profile !is RunConfiguration) return
val settings = getSettings(profile)
@@ -331,14 +323,16 @@ class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persistent
fun checkRecentsLimit() {
trimUsagesListToLimit()
val removed = SmartList<RunnerAndConfigurationSettings>()
while (tempConfigurationsList.size > config.recentsLimit) {
val it = idToSettings.values.iterator()
while (it.hasNext()) {
val configuration = it.next()
if (configuration.isTemporary && !recentlyUsedTemporaries.contains(configuration.configuration)) {
removed.add(configuration)
it.remove()
break
lock.write {
while (tempConfigurationsList.size > config.recentsLimit) {
val it = idToSettings.values.iterator()
while (it.hasNext()) {
val settings = it.next()
if (settings.isTemporary && !recentlyUsedTemporaries.contains(settings.configuration)) {
removed.add(settings)
it.remove()
break
}
}
}
}
@@ -508,32 +502,21 @@ class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persistent
}
fun writeContext(element: Element) {
val values = ArrayList(idToSettings.values)
for (configurationSettings in values) {
if (configurationSettings.isTemporary) {
addConfigurationElement(element, configurationSettings)
}
}
writeConfigurations(element, lock.read { idToSettings.values.filterSmart { it.isTemporary } })
selectedConfiguration?.let {
element.setAttribute(SELECTED_ATTR, it.uniqueID)
}
}
fun addConfigurationElement(parentNode: Element, settings: RunnerAndConfigurationSettings) {
val configurationElement = Element(CONFIGURATION)
parentNode.addContent(configurationElement)
(settings as RunnerAndConfigurationSettingsImpl).writeExternal(configurationElement)
writeBeforeRunTasks(settings.configuration, settings.isTemplate, configurationElement)
fun writeConfigurations(parentNode: Element, settings: Collection<RunnerAndConfigurationSettings>) {
settings.forEach { parentNode.addContent((it as RunnerAndConfigurationSettingsImpl).writeScheme()) }
}
internal fun writeBeforeRunTasks(configuration: RunConfiguration, isTemplate: Boolean, configurationElement: Element) {
if (configuration is UnknownRunConfiguration) {
return
}
val tasks = if (isTemplate) configuration.beforeRunTasks else getEffectiveBeforeRunTasks(configuration, ownIsOnlyEnabled = false, isDisableTemplateTasks = true)
if (tasks.isEmpty()) {
internal fun writeBeforeRunTasks(settings: RunnerAndConfigurationSettings, configurationElement: Element) {
val configuration = settings.configuration
val tasks = if (settings.isTemplate) configuration.beforeRunTasks else getEffectiveBeforeRunTasks(configuration, ownIsOnlyEnabled = false, isDisableTemplateTasks = true)
if (tasks.isEmpty() && settings.isNewSerializationAllowed) {
return
}
@@ -624,8 +607,8 @@ class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persistent
fireRunConfigurationSelected()
}
fun findExistingConfigurationId(settings: RunnerAndConfigurationSettings?): String? {
if (settings != null) {
fun findExistingConfigurationId(settings: RunnerAndConfigurationSettings): String? {
lock.read {
for ((key, value) in idToSettings) {
if (value === settings) {
return key
@@ -681,21 +664,25 @@ class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persistent
settings.readExternal(element, isShared)
}
val factory = settings.factory ?: return null
doLoadConfiguration(element, isShared, settings, factory)
if (isShared) {
settings.level = RunnerAndConfigurationSettingsImpl.Level.PROJECT
}
doLoadConfiguration(element, settings)
return settings
}
private fun doLoadConfiguration(element: Element, isShared: Boolean, settings: RunnerAndConfigurationSettingsImpl, factory: ConfigurationFactory) {
private fun doLoadConfiguration(element: Element, settings: RunnerAndConfigurationSettingsImpl) {
val tasks = element.getChild(METHOD)?.let { readStepsBeforeRun(it, settings) } ?: emptyList()
settings.configuration.beforeRunTasks = tasks
if (settings.isTemplate) {
val factory = settings.factory
lock.write {
templateIdToConfiguration.put("${factory.type.id}.${factory.name}", settings)
}
}
else {
addConfiguration(settings, isShared, null, false)
addConfiguration(settings)
if (element.getAttributeValue(SELECTED_ATTR).toBoolean()) {
// to support old style
selectedConfiguration = settings
@@ -754,17 +741,19 @@ class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persistent
}
}
fun getStableConfigurations(shared: Boolean): Collection<RunnerAndConfigurationSettings> {
var result: MutableList<RunnerAndConfigurationSettings>? = null
for (configuration in idToSettings.values) {
if (!configuration.isTemporary && configuration.isShared == shared) {
if (result == null) {
result = SmartList<RunnerAndConfigurationSettings>()
fun getSharedConfigurations(): List<RunnerAndConfigurationSettings> {
lock.read {
var result: MutableList<RunnerAndConfigurationSettings>? = null
for (configuration in idToSettings.values) {
if (configuration.isShared) {
if (result == null) {
result = ArrayList<RunnerAndConfigurationSettings>()
}
result.add(configuration)
}
result.add(configuration)
}
return result ?: emptyList()
}
return ContainerUtil.notNullize(result)
}
internal val configurationSettings: Collection<RunnerAndConfigurationSettings>
@@ -1012,16 +1001,18 @@ class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persistent
fun removeNotExistingSharedConfigurations(existing: Set<String>) {
var removed: MutableList<RunnerAndConfigurationSettings>? = null
val it = idToSettings.entries.iterator()
while (it.hasNext()) {
val entry = it.next()
val settings = entry.value
if (!settings.isTemplate && settings.isShared && !existing.contains(settings.uniqueID)) {
if (removed == null) {
removed = SmartList<RunnerAndConfigurationSettings>()
lock.write {
val it = idToSettings.entries.iterator()
while (it.hasNext()) {
val entry = it.next()
val settings = entry.value
if (!settings.isTemplate && settings.isShared && !existing.contains(settings.uniqueID)) {
if (removed == null) {
removed = SmartList<RunnerAndConfigurationSettings>()
}
removed!!.add(settings)
it.remove()
}
removed.add(settings)
it.remove()
}
}
fireRunConfigurationsRemoved(removed)
@@ -1042,9 +1033,7 @@ class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persistent
private fun fireRunConfigurationsRemoved(removed: List<RunnerAndConfigurationSettings>?) {
if (removed != null && !removed.isEmpty()) {
recentlyUsedTemporaries.removeAll(removed.map { it.configuration })
for (settings in removed) {
myDispatcher.multicaster.runConfigurationRemoved(settings)
}
removed.forEach { myDispatcher.multicaster.runConfigurationRemoved(it) }
}
}
@@ -1106,10 +1095,10 @@ class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persistent
internal interface RunConfigurationScheme : Scheme
private class UnknownRunConfigurationScheme(private val name: String) : RunConfigurationScheme, SerializableScheme {
override fun getSchemeState() = SchemeState.UNCHANGED
override fun writeScheme() = throw AssertionError("Must be not called")
override fun getName() = name
}
//private class UnknownRunConfigurationScheme(private val name: String) : RunConfigurationScheme, SerializableScheme {
// override fun getSchemeState() = SchemeState.UNCHANGED
//
// override fun writeScheme() = throw AssertionError("Must be not called")
//
// override fun getName() = name
//}
@@ -67,13 +67,13 @@ class RunnerAndConfigurationSettingsImpl @JvmOverloads constructor(private val m
override fun createSettings(runner: ProgramRunner<*>) = configuration!!.createRunnerSettings(InfoProvider(runner))
}
internal var level = Level.WORKSPACE
var level = Level.WORKSPACE
private var isEditBeforeRun = false
private var isActivateToolWindowBeforeRun = true
private var wasSingletonSpecifiedExplicitly = false
private var folderName: String? = null
override fun getFactory() = configuration?.factory
override fun getFactory(): ConfigurationFactory = configuration?.factory ?: UnknownConfigurationType.FACTORY
override fun isTemplate() = isTemplate
@@ -197,8 +197,8 @@ class RunnerAndConfigurationSettingsImpl @JvmOverloads constructor(private val m
}
fun writeExternal(element: Element) {
val configuration = configuration
val factory = configuration!!.factory
val configuration = getConfiguration()
val factory = configuration.factory
if (configuration !is UnknownRunConfiguration) {
if (isTemplate) {
element.setAttribute(TEMPLATE_FLAG_ATTRIBUTE, "true")
@@ -249,7 +249,7 @@ class RunnerAndConfigurationSettingsImpl @JvmOverloads constructor(private val m
writeExternal(element)
configuration?.let {
manager.writeBeforeRunTasks(it, isTemplate, element)
manager.writeBeforeRunTasks(this, element)
}
return element
@@ -473,3 +473,7 @@ class RunnerAndConfigurationSettingsImpl @JvmOverloads constructor(private val m
}
}
}
// always write method element for shared settings for now due to preserve backward compatibility
val RunnerAndConfigurationSettings.isNewSerializationAllowed: Boolean
get() = !isShared
@@ -125,7 +125,7 @@ public final class SingleConfigurationConfigurable<Config extends RunConfigurati
settings.setSingleton(mySingleton);
settings.setFolderName(myFolderName);
super.apply();
runManager.addConfiguration(settings, myStoreProjectConfiguration, runManager.getBeforeRunTasks(settings.getConfiguration()), false);
runManager.addConfiguration(settings, myStoreProjectConfiguration);
}
@Override
@@ -29,8 +29,6 @@ import javax.swing.Icon
class MockRunManager : RunManagerEx() {
override fun getConfigurationsList(type: ConfigurationType) = emptyList<RunConfiguration>()
fun isTemporary(configuration: RunConfiguration) = false
override fun makeStable(configuration: RunConfiguration) {}
override fun makeStable(settings: RunnerAndConfigurationSettings) {}
@@ -77,10 +75,7 @@ class MockRunManager : RunManagerEx() {
throw UnsupportedOperationException()
}
override fun addConfiguration(settings: RunnerAndConfigurationSettings,
isShared: Boolean,
tasks: List<BeforeRunTask<*>>,
addTemplateTasksIfAbsent: Boolean) {
override fun addConfiguration(settings: RunnerAndConfigurationSettings) {
}
override fun getBeforeRunTasks(configuration: RunConfiguration): List<BeforeRunTask<*>> {
@@ -637,9 +637,7 @@ public class AntExplorer extends SimpleToolWindowPanel implements DataProvider,
configuration.acceptSettings(target);
if (RunDialog.editConfiguration(e.getProject(), settings, ExecutionBundle
.message("create.run.configuration.for.item.dialog.title", configuration.getName()))) {
runManager.addConfiguration(settings,
settings.isShared(),
runManager.getBeforeRunTasks(settings.getConfiguration()), false);
runManager.addConfiguration(settings);
runManager.setSelectedConfiguration(settings);
}
}