From 887cf7940d67c140ba409525d59f6dde924ee800 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Thu, 23 Feb 2017 17:47:26 +0100 Subject: [PATCH] WorkspaceRunManager (cherry picked from commit dac0b91a7c98771569e777e32d5e83941de0677b) --- .../application/ApplicationConfiguration.java | 9 +- .../src/SchemeManagerImpl.kt | 2 +- .../com/intellij/execution/RunManager.java | 4 +- .../RunConfigurationExtensionBase.java | 5 +- ...ider.java => ConfigurationInfoProvider.kt} | 14 +- .../ModuleBasedConfiguration.java | 8 +- .../UnknownRunConfiguration.java | 16 +- .../execution/impl/RunManagerImpl.java | 87 ++++---- .../RunnerAndConfigurationSettingsImpl.kt | 207 +++++++++++------- .../execution/impl/WorkspaceRunManager.kt | 64 ++++-- .../SchemeManagerIprProvider.kt | 15 +- .../intellij/openapi/util/io/FileUtil.java | 9 +- .../util/text/UniqueNameGenerator.java | 10 +- .../SnapShooterConfigurationExtension.java | 8 +- 14 files changed, 263 insertions(+), 195 deletions(-) rename platform/lang-api/src/com/intellij/execution/configurations/{ConfigurationInfoProvider.java => ConfigurationInfoProvider.kt} (66%) diff --git a/java/execution/impl/src/com/intellij/execution/application/ApplicationConfiguration.java b/java/execution/impl/src/com/intellij/execution/application/ApplicationConfiguration.java index a9039bc4a830..c855428839e1 100644 --- a/java/execution/impl/src/com/intellij/execution/application/ApplicationConfiguration.java +++ b/java/execution/impl/src/com/intellij/execution/application/ApplicationConfiguration.java @@ -246,12 +246,17 @@ public class ApplicationConfiguration extends ModuleBasedConfiguration envs = getEnvs(); + if (!envs.isEmpty()) { + EnvironmentVariablesComponent.writeExternal(element, envs); + } } public static class JavaApplicationCommandLineState extends BaseJavaApplicationCommandLineState { diff --git a/platform/configuration-store-impl/src/SchemeManagerImpl.kt b/platform/configuration-store-impl/src/SchemeManagerImpl.kt index c1650ebb7db5..923b57a21f93 100644 --- a/platform/configuration-store-impl/src/SchemeManagerImpl.kt +++ b/platform/configuration-store-impl/src/SchemeManagerImpl.kt @@ -625,7 +625,7 @@ class SchemeManagerImpl(val fileSpec: String, } // if another new scheme uses old name of this scheme, we must not delete it (as part of rename operation) - val renamed = externalInfo != null && fileNameWithoutExtension !== currentFileNameWithoutExtension && nameGenerator.isUnique(currentFileNameWithoutExtension) + val renamed = externalInfo != null && fileNameWithoutExtension !== currentFileNameWithoutExtension && currentFileNameWithoutExtension != null && nameGenerator.isUnique(currentFileNameWithoutExtension) if (providerPath == null) { if (useVfs) { var file: VirtualFile? = null diff --git a/platform/lang-api/src/com/intellij/execution/RunManager.java b/platform/lang-api/src/com/intellij/execution/RunManager.java index ad4ee230d1e1..4931cb15e531 100644 --- a/platform/lang-api/src/com/intellij/execution/RunManager.java +++ b/platform/lang-api/src/com/intellij/execution/RunManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 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. @@ -213,7 +213,7 @@ public abstract class RunManager { * @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). */ - public abstract void addConfiguration(final RunnerAndConfigurationSettings settings, final boolean isShared); + public abstract void addConfiguration(@NotNull RunnerAndConfigurationSettings settings, boolean isShared); /** * Marks the specified run configuration as recently used (the temporary run configurations are deleted in LRU order). diff --git a/platform/lang-api/src/com/intellij/execution/configuration/RunConfigurationExtensionBase.java b/platform/lang-api/src/com/intellij/execution/configuration/RunConfigurationExtensionBase.java index 90512bb3f18e..ed5731cc41fc 100644 --- a/platform/lang-api/src/com/intellij/execution/configuration/RunConfigurationExtensionBase.java +++ b/platform/lang-api/src/com/intellij/execution/configuration/RunConfigurationExtensionBase.java @@ -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. @@ -59,8 +59,7 @@ public abstract class RunConfigurationExtensionBase - RunConfiguration getConfiguration(); + val configuration: RunConfiguration - RunnerSettings getRunnerSettings(); + val runnerSettings: RunnerSettings - ConfigurationPerRunnerSettings getConfigurationSettings(); + val configurationSettings: ConfigurationPerRunnerSettings } \ No newline at end of file diff --git a/platform/lang-api/src/com/intellij/execution/configurations/ModuleBasedConfiguration.java b/platform/lang-api/src/com/intellij/execution/configurations/ModuleBasedConfiguration.java index 32af1f4dd8f6..00a87d5ad360 100644 --- a/platform/lang-api/src/com/intellij/execution/configurations/ModuleBasedConfiguration.java +++ b/platform/lang-api/src/com/intellij/execution/configurations/ModuleBasedConfiguration.java @@ -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. @@ -71,8 +71,10 @@ public abstract class ModuleBasedConfiguration getAllModules() { diff --git a/platform/lang-api/src/com/intellij/execution/configurations/UnknownRunConfiguration.java b/platform/lang-api/src/com/intellij/execution/configurations/UnknownRunConfiguration.java index d96071f9ac84..a6484d5ecc80 100644 --- a/platform/lang-api/src/com/intellij/execution/configurations/UnknownRunConfiguration.java +++ b/platform/lang-api/src/com/intellij/execution/configurations/UnknownRunConfiguration.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.intellij.execution.configurations; import com.intellij.execution.ExecutionException; @@ -30,7 +29,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.util.List; import java.util.concurrent.atomic.AtomicInteger; /** @@ -126,22 +124,18 @@ public class UnknownRunConfiguration implements RunConfiguration, WithoutOwnBefo @Override public void readExternal(final Element element) throws InvalidDataException { - myStoredElement = (Element) element.clone(); + myStoredElement = element.clone(); } @Override public void writeExternal(final Element element) throws WriteExternalException { if (myStoredElement != null) { - final List attributeList = myStoredElement.getAttributes(); - for (Object anAttributeList : attributeList) { - final Attribute a = (Attribute) anAttributeList; + for (Attribute a : myStoredElement.getAttributes()) { element.setAttribute(a.getName(), a.getValue()); } - final List list = myStoredElement.getChildren(); - for (Object child : list) { - final Element c = (Element) child; - element.addContent((Element) c.clone()); + for (Element child : myStoredElement.getChildren()) { + element.addContent(child.clone()); } } } @@ -153,7 +147,7 @@ public class UnknownRunConfiguration implements RunConfiguration, WithoutOwnBefo myPanel = new JPanel(); myPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 50, 0)); - myPanel.add(new JLabel("This configuration cannot be edited", JLabel.CENTER)); + myPanel.add(new JLabel("This configuration cannot be edited", SwingConstants.CENTER)); } @Override diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java index 6d105de29810..5117c4f91afa 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java @@ -62,11 +62,11 @@ import java.util.concurrent.ConcurrentSkipListMap; public abstract class RunManagerImpl extends RunManagerEx implements PersistentStateComponent, NamedComponent, Disposable { protected static final Logger LOG = Logger.getInstance(RunManagerImpl.class); - private final Project myProject; + final Project myProject; private final Map myTypesByName = new LinkedHashMap<>(); - private final Map myTemplateConfigurationsMap = new ConcurrentSkipListMap<>(); + protected final Map myTemplateConfigurationsMap = new ConcurrentSkipListMap<>(); private final Map myConfigurations = new LinkedHashMap<>(); // template configurations are not included here private final Map mySharedConfigurations = new ConcurrentHashMap<>(); @@ -116,6 +116,10 @@ public abstract class RunManagerImpl extends RunManagerEx implements PersistentS }); } + public static RunManagerImpl getInstanceImpl(@NotNull Project project) { + return (RunManagerImpl)RunManager.getInstance(project); + } + // separate method needed for tests public final void initializeConfigurationTypes(@NotNull final ConfigurationType[] factories) { Arrays.sort(factories, Comparator.comparing(ConfigurationType::getDisplayName)); @@ -326,15 +330,14 @@ public abstract class RunManagerImpl extends RunManagerEx implements PersistentS if (template.getConfiguration() instanceof UnknownRunConfiguration) { ((UnknownRunConfiguration)template.getConfiguration()).setDoNotStore(true); } + myTemplateConfigurationsMap.put(factory.getType().getId() + "." + factory.getName(), template); } return template; } @Override - public void addConfiguration(RunnerAndConfigurationSettings settings, - boolean shared, - List tasks, boolean addEnabledTemplateTasksIfAbsent) { + public void addConfiguration(RunnerAndConfigurationSettings settings, boolean shared, List tasks, boolean addEnabledTemplateTasksIfAbsent) { String existingId = findExistingConfigurationId(settings); String newId = settings.getUniqueID(); RunnerAndConfigurationSettings existingSettings = null; @@ -365,10 +368,14 @@ public abstract class RunManagerImpl extends RunManagerEx implements PersistentS myDispatcher.getMulticaster().runConfigurationChanged(settings, existingId); } else { - myDispatcher.getMulticaster().runConfigurationAdded(settings); + runConfigurationAdded(settings); } } + protected void runConfigurationAdded(@NotNull RunnerAndConfigurationSettings settings) { + myDispatcher.getMulticaster().runConfigurationAdded(settings); + } + @Override public void refreshUsagesList(RunProfile profile) { if (!(profile instanceof RunConfiguration)) return; @@ -568,35 +575,21 @@ public abstract class RunManagerImpl extends RunManagerEx implements PersistentS @Nullable public Element getState(@NotNull Element parentNode) { - // writes temporary configurations here - writeContext(parentNode); + if (myConfigurations.size() > 1) { + JDOMExternalizableStringList order = null; + for (RunnerAndConfigurationSettings each : myConfigurations.values()) { + if (each.getType() instanceof UnknownConfigurationType) { + continue; + } - for (RunnerAndConfigurationSettings configuration : myTemplateConfigurationsMap.values()) { - if (configuration.getConfiguration() instanceof UnknownRunConfiguration && - ((UnknownRunConfiguration)configuration.getConfiguration()).isDoNotStore()) { - continue; + if (order == null) { + order = new JDOMExternalizableStringList(); + } + order.add(each.getUniqueID()); } - - addConfigurationElement(parentNode, configuration); - } - - for (RunnerAndConfigurationSettings configuration : getStableConfigurations(false)) { - addConfigurationElement(parentNode, configuration); - } - - JDOMExternalizableStringList order = null; - for (RunnerAndConfigurationSettings each : myConfigurations.values()) { - if (each.getType() instanceof UnknownConfigurationType) { - continue; + if (order != null) { + order.writeExternal(parentNode); } - - if (order == null) { - order = new JDOMExternalizableStringList(); - } - order.add(each.getUniqueID()); - } - if (order != null) { - order.writeExternal(parentNode); } final JDOMExternalizableStringList recentList = new JDOMExternalizableStringList(); @@ -624,10 +617,17 @@ public abstract class RunManagerImpl extends RunManagerEx implements PersistentS return parentNode; } - public void writeContext(@NotNull Element parentNode) { + public void writeContext(@NotNull Element element) { + Collection values = new ArrayList<>(myConfigurations.values()); + for (RunnerAndConfigurationSettings configurationSettings : values) { + if (configurationSettings.isTemporary()) { + addConfigurationElement(element, configurationSettings, CONFIGURATION); + } + } + RunnerAndConfigurationSettings selected = getSelectedConfiguration(); if (selected != null) { - parentNode.setAttribute(SELECTED_ATTR, selected.getUniqueID()); + element.setAttribute(SELECTED_ATTR, selected.getUniqueID()); } } @@ -671,7 +671,7 @@ public abstract class RunManagerImpl extends RunManagerEx implements PersistentS } } - Element methodsElement = new Element(METHOD); + Element methodsElement = null; for (int i = 0, size = tasks.size(); i < size; i++) { BeforeRunTask task = tasks.get(i); int j = 0; @@ -690,9 +690,16 @@ public abstract class RunManagerImpl extends RunManagerEx implements PersistentS Element child = new Element(OPTION); child.setAttribute(NAME_ATTR, task.getProviderId().toString()); task.writeExternal(child); + + if (methodsElement == null) { + methodsElement = new Element(METHOD); + } methodsElement.addContent(child); } - configurationElement.addContent(methodsElement); + + if (methodsElement != null) { + configurationElement.addContent(methodsElement); + } } @Override @@ -844,7 +851,7 @@ public abstract class RunManagerImpl extends RunManagerEx implements PersistentS else { addConfiguration(settings, isShared, tasks, true); if (Boolean.parseBoolean(element.getAttributeValue(SELECTED_ATTR))) { - //to support old style + // to support old style setSelectedConfiguration(settings); } } @@ -1237,14 +1244,10 @@ public abstract class RunManagerImpl extends RunManagerEx implements PersistentS } @Override - public void addConfiguration(final RunnerAndConfigurationSettings settings, final boolean isShared) { + public void addConfiguration(@NotNull RunnerAndConfigurationSettings settings, boolean isShared) { addConfiguration(settings, isShared, getTemplateBeforeRunTasks(settings.getConfiguration()), false); } - public static RunManagerImpl getInstanceImpl(final Project project) { - return (RunManagerImpl)RunManager.getInstance(project); - } - void removeNotExistingSharedConfigurations(@NotNull Set existing) { List removed = null; for (Iterator> it = myConfigurations.entrySet().iterator(); it.hasNext(); ) { diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.kt b/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.kt index 27830799ef5d..d0257ffd55ab 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.kt +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.kt @@ -25,6 +25,7 @@ import com.intellij.openapi.components.PathMacroManager import com.intellij.openapi.components.PersistentStateComponent import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.extensions.ExtensionException +import com.intellij.openapi.options.SchemeState import com.intellij.openapi.util.* import com.intellij.openapi.util.text.StringUtil import com.intellij.util.SmartList @@ -39,7 +40,6 @@ private val RUNNER_ID = "RunnerId" private val CONFIGURATION_TYPE_ATTRIBUTE = "type" private val FACTORY_NAME_ATTRIBUTE = "factoryName" private val FOLDER_NAME = "folderName" -internal val TEMPLATE_FLAG_ATTRIBUTE = "default" val NAME_ATTR = "name" val DUMMY_ELEMENT_NAME = "dummy" private val TEMPORARY_ATTRIBUTE = "temporary" @@ -52,26 +52,29 @@ class RunnerAndConfigurationSettingsImpl : Cloneable, RunnerAndConfigurationSett companion object { @JvmField val SINGLETON = "singleton" + + @JvmField + internal val TEMPLATE_FLAG_ATTRIBUTE = "default" } private val manager: RunManagerImpl - private var myConfiguration: RunConfiguration? = null - private var myIsTemplate: Boolean = false + private var configuration: RunConfiguration? = null + private var isTemplate: Boolean = false - private val myRunnerSettings = object : RunnerItem("RunnerSettings") { + private val runnerSettings = object : RunnerItem("RunnerSettings") { override fun createSettings(runner: ProgramRunner<*>) = runner.createConfigurationData(InfoProvider(runner)) } - private val myConfigurationPerRunnerSettings = object : RunnerItem("ConfigurationWrapper") { - override fun createSettings(runner: ProgramRunner<*>) = myConfiguration!!.createRunnerSettings(InfoProvider(runner)) + private val configurationPerRunnerSettings = object : RunnerItem("ConfigurationWrapper") { + override fun createSettings(runner: ProgramRunner<*>) = configuration!!.createRunnerSettings(InfoProvider(runner)) } - private var myTemporary: Boolean = false - private var myEditBeforeRun: Boolean = false - private var myActivateToolWindowBeforeRun = true - private var mySingleton: Boolean = false - private var myWasSingletonSpecifiedExplicitly: Boolean = false - private var myFolderName: String? = null + private var isTemporary: Boolean = false + private var isEditBeforeRun: Boolean = false + private var isActivateToolWindowBeforeRun = true + private var singleton: Boolean = false + private var wasSingletonSpecifiedExplicitly: Boolean = false + private var folderName: String? = null constructor(manager: RunManagerImpl) { this.manager = manager @@ -79,93 +82,99 @@ class RunnerAndConfigurationSettingsImpl : Cloneable, RunnerAndConfigurationSett constructor(manager: RunManagerImpl, configuration: RunConfiguration, isTemplate: Boolean) { this.manager = manager - myConfiguration = configuration - myIsTemplate = isTemplate + this.configuration = configuration + this.isTemplate = isTemplate } - override fun getFactory() = myConfiguration?.factory + override fun getFactory() = configuration?.factory - override fun isTemplate() = myIsTemplate + override fun isTemplate() = isTemplate - override fun isTemporary() = myTemporary + override fun isTemporary() = isTemporary override fun setTemporary(temporary: Boolean) { - myTemporary = temporary + isTemporary = temporary } - override fun getConfiguration(): RunConfiguration = myConfiguration!! + override fun getConfiguration(): RunConfiguration = configuration!! override fun createFactory() = Factory { - val configuration = myConfiguration!! + val configuration = configuration!! RunnerAndConfigurationSettingsImpl(manager, configuration.factory.createConfiguration(ExecutionBundle.message("default.run.configuration.name"), configuration), false) } override fun setName(name: String) { - myConfiguration!!.name = name + configuration!!.name = name } - override fun getName() = myConfiguration!!.name + override fun getName(): String { + val configuration = configuration!! + if (isTemplate) { + return "