From 87ec0cca35ca70aae7b0c760cb108a6ac936ce63 Mon Sep 17 00:00:00 2001 From: Vassiliy Kudryashov Date: Mon, 12 Aug 2013 20:48:45 +0400 Subject: [PATCH] IDEA-109465 make run configuration's unique name unique for module based run configurations + Run Configurations API: refactoring --- .../BuildArtifactsBeforeRunTaskProvider.java | 2 +- .../applet/AppletConfigurationProducer.java | 4 +- .../templates/TemplateModuleBuilder.java | 2 +- ...nalSystemRuntimeConfigurationProducer.java | 2 +- .../ui/ExternalSystemRecentTasksList.java | 3 +- .../com/intellij/execution/RunManager.java | 57 ++++ .../RunnerAndConfigurationSettings.java | 2 + .../actions/RunConfigurationProducer.java | 5 +- .../configurations/RunConfiguration.java | 1 + .../junit/RuntimeConfigurationProducer.java | 7 +- .../intellij/execution/ProgramRunnerUtil.java | 10 +- .../com/intellij/execution/RunManagerEx.java | 2 +- .../actions/ChooseRunConfigurationPopup.java | 4 +- .../execution/actions/CreateAction.java | 4 +- .../RunConfigurationsComboBoxAction.java | 31 +-- .../impl/BaseExecuteBeforeRunDialog.java | 2 +- .../impl/ModuleRunConfigurationManager.java | 8 +- .../impl/ProjectRunConfigurationManager.java | 6 +- .../execution/impl/RunConfigurable.java | 43 ++-- .../RunConfigurationBeforeRunProvider.java | 4 +- ...ionRefactoringElementListenerProvider.java | 4 +- .../execution/impl/RunManagerImpl.java | 243 ++++++++++++------ .../RunnerAndConfigurationSettingsImpl.java | 14 + .../impl/SingleConfigurationConfigurable.java | 2 +- ...ctRunConfigurationTypeUsagesCollector.java | 8 +- .../RunConfigurationTypeUsagesCollector.java | 6 +- ...ryRunConfigurationTypeUsagesCollector.java | 6 +- .../src/com/intellij/mock/MockRunManager.java | 33 ++- .../ant/config/impl/AntConfigurationImpl.java | 2 +- .../plugins/groovy/mvc/MvcFramework.java | 2 +- .../GroovyScriptRunConfigurationProducer.java | 4 +- .../junit/AddToTestsPatternAction.java | 3 +- .../execution/MavenConfigurationProducer.java | 3 +- .../TestNGConfigurationProducer.java | 4 +- .../TestNGPatternConfigurationProducer.java | 3 +- .../snapShooter/CreateSnapShotAction.java | 2 +- .../xslt/run/XsltConfigurationProducer.java | 3 +- 37 files changed, 368 insertions(+), 173 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRunTaskProvider.java b/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRunTaskProvider.java index 2154a095007e..e0342ebf23e6 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRunTaskProvider.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRunTaskProvider.java @@ -65,7 +65,7 @@ public class BuildArtifactsBeforeRunTaskProvider extends BeforeRunTaskProvider tasks = runManager.getBeforeRunTasks(configuration, ID); for (BuildArtifactsBeforeRunTask task : tasks) { final String artifactName = artifact.getName(); diff --git a/java/execution/impl/src/com/intellij/execution/applet/AppletConfigurationProducer.java b/java/execution/impl/src/com/intellij/execution/applet/AppletConfigurationProducer.java index 8961236853d9..cdaac5871338 100644 --- a/java/execution/impl/src/com/intellij/execution/applet/AppletConfigurationProducer.java +++ b/java/execution/impl/src/com/intellij/execution/applet/AppletConfigurationProducer.java @@ -38,6 +38,8 @@ import com.intellij.psi.util.PsiClassUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; + public class AppletConfigurationProducer extends JavaRuntimeConfigurationProducerBase { private PsiClass myPsiClass; @@ -106,7 +108,7 @@ public class AppletConfigurationProducer extends JavaRuntimeConfigurationProduce @Override protected RunnerAndConfigurationSettings findExistingByElement(Location location, - @NotNull RunnerAndConfigurationSettings[] existingConfigurations, + @NotNull List existingConfigurations, ConfigurationContext context) { final PsiClass aClass = getAppletClass(location.getPsiElement(), PsiManager.getInstance(location.getProject())); if (aClass != null) { diff --git a/java/idea-ui/src/com/intellij/platform/templates/TemplateModuleBuilder.java b/java/idea-ui/src/com/intellij/platform/templates/TemplateModuleBuilder.java index 6d5aa8c1f980..d5e839bb542a 100644 --- a/java/idea-ui/src/com/intellij/platform/templates/TemplateModuleBuilder.java +++ b/java/idea-ui/src/com/intellij/platform/templates/TemplateModuleBuilder.java @@ -172,7 +172,7 @@ public class TemplateModuleBuilder extends ModuleBuilder { } private void fixModuleName(Module module) { - RunConfiguration[] configurations = RunManager.getInstance(module.getProject()).getAllConfigurations(); + List configurations = RunManager.getInstance(module.getProject()).getAllConfigurationsList(); for (RunConfiguration configuration : configurations) { if (configuration instanceof ModuleBasedConfiguration) { ((ModuleBasedConfiguration)configuration).getConfigurationModule().setModule(module); diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/AbstractExternalSystemRuntimeConfigurationProducer.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/AbstractExternalSystemRuntimeConfigurationProducer.java index 9ee4f7c1ae29..58df2a7bfa7c 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/AbstractExternalSystemRuntimeConfigurationProducer.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/AbstractExternalSystemRuntimeConfigurationProducer.java @@ -70,7 +70,7 @@ public abstract class AbstractExternalSystemRuntimeConfigurationProducer extends @Nullable @Override protected RunnerAndConfigurationSettings findExistingByElement(Location location, - @NotNull RunnerAndConfigurationSettings[] existingConfigurationsSettings, + @NotNull List existingConfigurationsSettings, ConfigurationContext context) { if (!(location instanceof ExternalSystemTaskLocation)) { return null; diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/task/ui/ExternalSystemRecentTasksList.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/task/ui/ExternalSystemRecentTasksList.java index 9dd416f0b72e..53fb1b0c7d95 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/task/ui/ExternalSystemRecentTasksList.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/task/ui/ExternalSystemRecentTasksList.java @@ -41,6 +41,7 @@ import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.util.List; /** * @author Denis Zhdanov @@ -139,7 +140,7 @@ public class ExternalSystemRecentTasksList extends JBList implements Producer configurations = RunManager.getInstance(myProject).getConfigurationsList(myConfigurationType); for (RunConfiguration configuration : configurations) { if (!(configuration instanceof ExternalSystemRunConfiguration)) { continue; diff --git a/platform/lang-api/src/com/intellij/execution/RunManager.java b/platform/lang-api/src/com/intellij/execution/RunManager.java index 31bd2f82d9e4..674d74ab3861 100644 --- a/platform/lang-api/src/com/intellij/execution/RunManager.java +++ b/platform/lang-api/src/com/intellij/execution/RunManager.java @@ -24,6 +24,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -54,8 +55,18 @@ public abstract class RunManager { * @return all configurations of the type, or an empty array if no configurations of the type are defined. */ @NotNull + @Deprecated public abstract RunConfiguration[] getConfigurations(@NotNull ConfigurationType type); + /** + * Returns the list of all configurations of a specified type. + * + * @param type a run configuration type. + * @return all configurations of the type, or an empty array if no configurations of the type are defined. + */ + @NotNull + public abstract List getConfigurationsList(@NotNull ConfigurationType type); + /** * Returns the list of {@link RunnerAndConfigurationSettings} for all configurations of a specified type. * @@ -63,16 +74,43 @@ public abstract class RunManager { * @return settings for all configurations of the type, or an empty array if no configurations of the type are defined. */ @NotNull + @Deprecated public abstract RunnerAndConfigurationSettings[] getConfigurationSettings(@NotNull ConfigurationType type); + /** + * Returns the list of {@link RunnerAndConfigurationSettings} for all configurations of a specified type. + * + * @param type a run configuration type. + * @return settings for all configurations of the type, or an empty array if no configurations of the type are defined. + */ + @NotNull + public abstract List getConfigurationSettingsList(@NotNull ConfigurationType type); + /** * Returns the list of all run configurations. * * @return the list of all run configurations. */ @NotNull + @Deprecated public abstract RunConfiguration[] getAllConfigurations(); + /** + * Returns the list of all run configurations. + * + * @return the list of all run configurations. + */ + @NotNull + public abstract List getAllConfigurationsList(); + + /** + * Returns the list of all run configurations settings. + * + * @return the list of all run configurations settings. + */ + @NotNull + public abstract List getAllSettings(); + /** * Returns the list of all temporary run configurations. * @@ -80,14 +118,25 @@ public abstract class RunManager { * @see com.intellij.execution.RunnerAndConfigurationSettings#isTemporary() */ @NotNull + @Deprecated public abstract RunConfiguration[] getTempConfigurations(); + /** + * Returns the list of all temporary run configurations settings. + * + * @return the list of all temporary run configurations settings. + * @see com.intellij.execution.RunnerAndConfigurationSettings#isTemporary() + */ + @NotNull + public abstract List getTempConfigurationsList(); + /** * Checks if the specified run configuration is temporary and will be deleted when the temporary configurations limit is exceeded. * * @return true if the configuration is temporary, false otherwise. * @see com.intellij.execution.RunnerAndConfigurationSettings#isTemporary() */ + @Deprecated public abstract boolean isTemporary(@NotNull RunConfiguration configuration); /** @@ -95,8 +144,16 @@ public abstract class RunManager { * * @param configuration the temporary run configuration to save. */ + @Deprecated public abstract void makeStable(@NotNull RunConfiguration configuration); + /** + * Saves the specified temporary run settings and makes it a permanent one. + * + * @param settings the temporary settings to save. + */ + public abstract void makeStable(@NotNull RunnerAndConfigurationSettings settings); + /** * Returns the selected item in the run/debug configurations combobox. * diff --git a/platform/lang-api/src/com/intellij/execution/RunnerAndConfigurationSettings.java b/platform/lang-api/src/com/intellij/execution/RunnerAndConfigurationSettings.java index 1950a92749ac..535ea826cc31 100644 --- a/platform/lang-api/src/com/intellij/execution/RunnerAndConfigurationSettings.java +++ b/platform/lang-api/src/com/intellij/execution/RunnerAndConfigurationSettings.java @@ -92,6 +92,8 @@ public interface RunnerAndConfigurationSettings { */ String getName(); + String getUniqueID(); + /** * Returns the runner-managed settings for the specified runner. * diff --git a/platform/lang-api/src/com/intellij/execution/actions/RunConfigurationProducer.java b/platform/lang-api/src/com/intellij/execution/actions/RunConfigurationProducer.java index d677e3dec812..8ab9dcdf88a5 100644 --- a/platform/lang-api/src/com/intellij/execution/actions/RunConfigurationProducer.java +++ b/platform/lang-api/src/com/intellij/execution/actions/RunConfigurationProducer.java @@ -30,6 +30,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.List; /** * Supports creating run configurations from context (by right-clicking a code element in the source editor or the project view). Typically, @@ -143,7 +144,7 @@ public abstract class RunConfigurationProducer { // replace with existing configuration if any final RunManager runManager = RunManager.getInstance(context.getProject()); final ConfigurationType type = fromContext.getConfigurationType(); - final RunnerAndConfigurationSettings[] configurations = runManager.getConfigurationSettings(type); + final List configurations = runManager.getConfigurationSettingsList(type); final RunnerAndConfigurationSettings configuration = findExistingConfiguration(context); if (configuration != null) { fromContext.setConfigurationSettings(configuration); @@ -169,7 +170,7 @@ public abstract class RunConfigurationProducer { @Nullable public RunnerAndConfigurationSettings findExistingConfiguration(ConfigurationContext context) { final RunManager runManager = RunManager.getInstance(context.getProject()); - final RunnerAndConfigurationSettings[] configurations = runManager.getConfigurationSettings(myConfigurationFactory.getType()); + final List configurations = runManager.getConfigurationSettingsList(myConfigurationFactory.getType()); for (RunnerAndConfigurationSettings configurationSettings : configurations) { if (isConfigurationFromContext((T) configurationSettings.getConfiguration(), context)) { return configurationSettings; diff --git a/platform/lang-api/src/com/intellij/execution/configurations/RunConfiguration.java b/platform/lang-api/src/com/intellij/execution/configurations/RunConfiguration.java index 29d64cf908b1..b8d96e4b8bfc 100644 --- a/platform/lang-api/src/com/intellij/execution/configurations/RunConfiguration.java +++ b/platform/lang-api/src/com/intellij/execution/configurations/RunConfiguration.java @@ -110,6 +110,7 @@ public interface RunConfiguration extends RunProfile, JDOMExternalizable, Clonea * * @return the unique ID of the configuration. */ + @Deprecated int getUniqueID(); /** diff --git a/platform/lang-api/src/com/intellij/execution/junit/RuntimeConfigurationProducer.java b/platform/lang-api/src/com/intellij/execution/junit/RuntimeConfigurationProducer.java index b1f54cddf68a..3b68a0706062 100644 --- a/platform/lang-api/src/com/intellij/execution/junit/RuntimeConfigurationProducer.java +++ b/platform/lang-api/src/com/intellij/execution/junit/RuntimeConfigurationProducer.java @@ -34,6 +34,7 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Comparator; +import java.util.List; /** * @deprecated please use {@link com.intellij.execution.actions.RunConfigurationProducer} instead @@ -66,7 +67,7 @@ public abstract class RuntimeConfigurationProducer implements Comparable, Clonea // replace with existing configuration if any final RunManager runManager = RunManager.getInstance(context.getProject()); final ConfigurationType type = result.myConfiguration.getType(); - final RunnerAndConfigurationSettings[] configurations = runManager.getConfigurationSettings(type); + final List configurations = runManager.getConfigurationSettingsList(type); final RunnerAndConfigurationSettings configuration = result.findExistingByElement(_location, configurations, context); if (configuration != null) { result.myConfiguration = configuration; @@ -87,7 +88,7 @@ public abstract class RuntimeConfigurationProducer implements Comparable, Clonea public RunnerAndConfigurationSettings findExistingConfiguration(@NotNull Location location, ConfigurationContext context) { assert isClone; final RunManager runManager = RunManager.getInstance(location.getProject()); - final RunnerAndConfigurationSettings[] configurations = runManager.getConfigurationSettings(getConfigurationType()); + final List configurations = runManager.getConfigurationSettingsList(getConfigurationType()); return findExistingByElement(location, configurations, context); } @@ -108,7 +109,7 @@ public abstract class RuntimeConfigurationProducer implements Comparable, Clonea @Nullable protected RunnerAndConfigurationSettings findExistingByElement(final Location location, - @NotNull final RunnerAndConfigurationSettings[] existingConfigurations, + @NotNull final List existingConfigurations, ConfigurationContext context) { assert isClone; return null; diff --git a/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java b/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java index 6b6329c9d18d..ca5a4990778a 100644 --- a/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java +++ b/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java @@ -113,20 +113,14 @@ public class ProgramRunnerUtil { executeConfiguration(project, configuration, executor, ExecutionTargetManager.getActiveTarget(project), null, true); } - public static Icon getConfigurationIcon(final Project project, final RunnerAndConfigurationSettings settings, final boolean invalid) { - final RunManager runManager = RunManager.getInstance(project); - return getConfigurationIcon(settings, invalid, runManager.isTemporary(settings.getConfiguration())); - } - public static Icon getConfigurationIcon(final RunnerAndConfigurationSettings settings, - final boolean invalid, - boolean isTemporary) { + final boolean invalid) { RunConfiguration configuration = settings.getConfiguration(); ConfigurationFactory factory = settings.getFactory(); Icon icon = factory != null ? factory.getIcon(configuration) : null; if (icon == null) icon = AllIcons.RunConfigurations.Unknown; - final Icon configurationIcon = isTemporary ? IconLoader.getTransparentIcon(icon, 0.3f) : icon; + final Icon configurationIcon = settings.isTemporary() ? IconLoader.getTransparentIcon(icon, 0.3f) : icon; if (invalid) { return LayeredIcon.create(configurationIcon, AllIcons.RunConfigurations.InvalidConfigurationLayer); } diff --git a/platform/lang-impl/src/com/intellij/execution/RunManagerEx.java b/platform/lang-impl/src/com/intellij/execution/RunManagerEx.java index c0d92ee23de6..5f93561d1596 100644 --- a/platform/lang-impl/src/com/intellij/execution/RunManagerEx.java +++ b/platform/lang-impl/src/com/intellij/execution/RunManagerEx.java @@ -33,7 +33,7 @@ public abstract class RunManagerEx extends RunManager { return (RunManagerEx)project.getComponent(RunManager.class); } - public abstract boolean isTemporary(@NotNull RunnerAndConfigurationSettings configuration); + //public abstract boolean isTemporary(@NotNull RunnerAndConfigurationSettings configuration); @Deprecated // use setSelectedConfiguration instead public void setActiveConfiguration(@Nullable RunnerAndConfigurationSettings configuration) { diff --git a/platform/lang-impl/src/com/intellij/execution/actions/ChooseRunConfigurationPopup.java b/platform/lang-impl/src/com/intellij/execution/actions/ChooseRunConfigurationPopup.java index 3b46b66e1482..09b80dfd63b3 100644 --- a/platform/lang-impl/src/com/intellij/execution/actions/ChooseRunConfigurationPopup.java +++ b/platform/lang-impl/src/com/intellij/execution/actions/ChooseRunConfigurationPopup.java @@ -838,13 +838,13 @@ class ChooseRunConfigurationPopup implements ExecutorProvider { } }); - if (RunManager.getInstance(project).isTemporary(settings.getConfiguration()) || dynamic) { + if (settings.isTemporary() || dynamic) { result.add(new ActionWrapper("Save configuration", AllIcons.Actions.Menu_saveall) { @Override public void perform() { final RunManagerEx manager = RunManagerEx.getInstanceEx(project); if (dynamic) manager.setTemporaryConfiguration(settings); - manager.makeStable(settings.getConfiguration()); + manager.makeStable(settings); } }); } diff --git a/platform/lang-impl/src/com/intellij/execution/actions/CreateAction.java b/platform/lang-impl/src/com/intellij/execution/actions/CreateAction.java index ade8e4f1b8be..9809cf888ae5 100644 --- a/platform/lang-impl/src/com/intellij/execution/actions/CreateAction.java +++ b/platform/lang-impl/src/com/intellij/execution/actions/CreateAction.java @@ -48,7 +48,7 @@ public class CreateAction extends BaseRunConfigurationAction { if (configuration == null) return CREATE_AND_EDIT; final RunManager runManager = context.getRunManager(); if (runManager.getSelectedConfiguration() != configuration) return SELECT; - if (runManager.isTemporary(configuration.getConfiguration())) return SAVE; + if (configuration.isTemporary()) return SAVE; return SELECTED_STABLE; } @@ -163,7 +163,7 @@ public class CreateAction extends BaseRunConfigurationAction { @Override public void perform(final ConfigurationContext context) { RunnerAndConfigurationSettings settings = context.findExisting(); - if (settings != null) context.getRunManager().makeStable(settings.getConfiguration()); + if (settings != null) context.getRunManager().makeStable(settings); } @Override diff --git a/platform/lang-impl/src/com/intellij/execution/actions/RunConfigurationsComboBoxAction.java b/platform/lang-impl/src/com/intellij/execution/actions/RunConfigurationsComboBoxAction.java index 64b1e47ca182..67d743db3ec9 100644 --- a/platform/lang-impl/src/com/intellij/execution/actions/RunConfigurationsComboBoxAction.java +++ b/platform/lang-impl/src/com/intellij/execution/actions/RunConfigurationsComboBoxAction.java @@ -18,7 +18,6 @@ package com.intellij.execution.actions; import com.intellij.execution.*; import com.intellij.execution.configurations.ConfigurationType; -import com.intellij.execution.configurations.RunConfiguration; import com.intellij.icons.AllIcons; import com.intellij.ide.DataManager; import com.intellij.openapi.actionSystem.*; @@ -38,6 +37,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -197,7 +197,7 @@ public class RunConfigurationsComboBoxAction extends ComboBoxAction implements D } } - //final RunnerAndConfigurationSettings[] configurations = runManager.getConfigurationSettings(type); + //final RunnerAndConfigurationSettings[] configurations = runManager.getConfigurationSettingsList(type); //ArrayList configurationSettingsList = new ArrayList(); //int i = 0; //for (RunnerAndConfigurationSettings configuration : configurations) { @@ -234,10 +234,10 @@ public class RunConfigurationsComboBoxAction extends ComboBoxAction implements D public void actionPerformed(final AnActionEvent e) { final Project project = e.getData(PlatformDataKeys.PROJECT); if (project != null) { - RunConfiguration configuration = chooseTempConfiguration(project); - if (configuration != null) { + RunnerAndConfigurationSettings settings = chooseTempSettings(project); + if (settings != null) { final RunManager runManager = RunManager.getInstance(project); - runManager.makeStable(configuration); + runManager.makeStable(settings); } } } @@ -250,12 +250,12 @@ public class RunConfigurationsComboBoxAction extends ComboBoxAction implements D disable(presentation); return; } - RunConfiguration configuration = chooseTempConfiguration(project); - if (configuration == null) { + RunnerAndConfigurationSettings settings = chooseTempSettings(project); + if (settings == null) { disable(presentation); } else { - presentation.setText(ExecutionBundle.message("save.temporary.run.configuration.action.name", configuration.getName())); + presentation.setText(ExecutionBundle.message("save.temporary.run.configuration.action.name", settings.getName())); presentation.setDescription(presentation.getText()); presentation.setVisible(true); presentation.setEnabled(true); @@ -268,16 +268,13 @@ public class RunConfigurationsComboBoxAction extends ComboBoxAction implements D } @Nullable - private static RunConfiguration chooseTempConfiguration(@NotNull Project project) { - final RunConfiguration[] tempConfigurations = RunManager.getInstance(project).getTempConfigurations(); - if (tempConfigurations.length > 0) { - RunnerAndConfigurationSettings selectedConfiguration = RunManager.getInstance(project).getSelectedConfiguration(); - if (selectedConfiguration == null || !selectedConfiguration.isTemporary()) { - return tempConfigurations[0]; - } - return selectedConfiguration.getConfiguration(); + private static RunnerAndConfigurationSettings chooseTempSettings(@NotNull Project project) { + RunnerAndConfigurationSettings selectedConfiguration = RunManager.getInstance(project).getSelectedConfiguration(); + if (selectedConfiguration != null && selectedConfiguration.isTemporary()) { + return selectedConfiguration; } - return null; + Iterator iterator = RunManager.getInstance(project).getTempConfigurationsList().iterator(); + return iterator.hasNext() ? iterator.next() : null; } } diff --git a/platform/lang-impl/src/com/intellij/execution/impl/BaseExecuteBeforeRunDialog.java b/platform/lang-impl/src/com/intellij/execution/impl/BaseExecuteBeforeRunDialog.java index c5cec071f411..441e5a0b372a 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/BaseExecuteBeforeRunDialog.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/BaseExecuteBeforeRunDialog.java @@ -151,7 +151,7 @@ public abstract class BaseExecuteBeforeRunDialog extend root.add(typeNode); final Set addedNames = StringSetSpinAllocator.alloc(); try { - RunConfiguration[] configurations = runManager.getConfigurations(type); + List configurations = runManager.getConfigurationsList(type); for (final RunConfiguration configuration : configurations) { final String configurationName = configuration.getName(); if (addedNames.contains(configurationName)) { diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ModuleRunConfigurationManager.java b/platform/lang-impl/src/com/intellij/execution/impl/ModuleRunConfigurationManager.java index de0082f77e98..3fe5aafc1f52 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ModuleRunConfigurationManager.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ModuleRunConfigurationManager.java @@ -159,13 +159,15 @@ public final class ModuleRunConfigurationManager extends ModuleAdapter implement } if (configuration != null) { - existing.add(RunManagerImpl.getUniqueName(configuration.getConfiguration())); + existing.add(configuration.getUniqueID()); } } - for (final RunConfiguration configuration : myManager.getAllConfigurations()) { + for (final RunConfiguration configuration : myManager.getAllConfigurationsList()) { if (!usesMyModule(configuration)) { - existing.add(RunManagerImpl.getUniqueName(configuration)); + RunnerAndConfigurationSettings settings = myManager.getSettings(configuration); + if (settings != null) + existing.add(settings.getUniqueID()); } } myManager.removeNotExistingSharedConfigurations(existing); diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ProjectRunConfigurationManager.java b/platform/lang-impl/src/com/intellij/execution/impl/ProjectRunConfigurationManager.java index 298749b37428..afc5cd8eda39 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ProjectRunConfigurationManager.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ProjectRunConfigurationManager.java @@ -120,15 +120,15 @@ public class ProjectRunConfigurationManager implements ProjectComponent, Persist } if (configuration != null) { - existing.add(RunManagerImpl.getUniqueName(configuration.getConfiguration())); + existing.add(configuration.getUniqueID()); } } myManager.removeNotExistingSharedConfigurations(existing); if (myManager.getSelectedConfiguration() == null) { - final RunConfiguration[] allConfigurations = myManager.getAllConfigurations(); + final List allConfigurations = myManager.getAllConfigurationsList(); for (final RunConfiguration configuration : allConfigurations) { - final RunnerAndConfigurationSettings settings = myManager.getSettings(allConfigurations[0]); + final RunnerAndConfigurationSettings settings = myManager.getSettings(allConfigurations.get(0)); if (!(configuration instanceof UnknownRunConfiguration)) { myManager.setSelectedConfiguration(settings); break; diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java index 0a6ce91e445c..98fc3a8286af 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java @@ -177,26 +177,26 @@ class RunConfigurable extends BaseConfigurable { } else { final RunManagerImpl runManager = getRunManager(); - RunConfiguration configuration = null; + RunnerAndConfigurationSettings configuration = null; String name = null; if (userObject instanceof SingleConfigurationConfigurable) { final SingleConfigurationConfigurable settings = (SingleConfigurationConfigurable)userObject; - RunnerAndConfigurationSettings snapshot; - snapshot = settings.getSettings(); - configuration = settings.getConfiguration(); + RunnerAndConfigurationSettings configurationSettings; + configurationSettings = settings.getSettings(); + configuration = configurationSettings; name = settings.getNameText(); shared = settings.isStoreProjectConfiguration(); - setIcon(ProgramRunnerUtil.getConfigurationIcon(snapshot, !settings.isValid(), runManager.isTemporary(configuration))); + setIcon(ProgramRunnerUtil.getConfigurationIcon(configurationSettings, !settings.isValid())); } else if (userObject instanceof RunnerAndConfigurationSettingsImpl) { RunnerAndConfigurationSettings settings = (RunnerAndConfigurationSettings)userObject; shared = runManager.isConfigurationShared(settings); setIcon(RunManagerEx.getInstanceEx(myProject).getConfigurationIcon(settings)); - configuration = settings.getConfiguration(); + configuration = settings; name = configuration.getName(); } if (configuration != null) { - append(name, runManager.isTemporary(configuration) + append(name, configuration.isTemporary() ? SimpleTextAttributes.GRAY_ATTRIBUTES : SimpleTextAttributes.REGULAR_ATTRIBUTES); } @@ -217,8 +217,8 @@ class RunConfigurable extends BaseConfigurable { final RunManagerEx manager = getRunManager(); final ConfigurationType[] factories = manager.getConfigurationFactories(); for (ConfigurationType type : factories) { - final RunnerAndConfigurationSettings[] configurations = manager.getConfigurationSettings(type); - if (configurations.length > 0) { + final List configurations = manager.getConfigurationSettingsList(type); + if (!configurations.isEmpty()) { final DefaultMutableTreeNode typeNode = new DefaultMutableTreeNode(type); myRoot.add(typeNode); Map folderMapping = new HashMap(); @@ -688,7 +688,7 @@ class RunConfigurable extends BaseConfigurable { if (userObject instanceof SingleConfigurationConfigurable) { final SingleConfigurationConfigurable configurable = (SingleConfigurationConfigurable)userObject; settings = (RunnerAndConfigurationSettings)configurable.getSettings(); - if (manager.isTemporary(settings)) { + if (settings.isTemporary()) { applyConfiguration(typeNode, configurable); } configurationBean = new RunConfigurationBean(configurable); @@ -738,7 +738,7 @@ class RunConfigurable extends BaseConfigurable { // if apply succeeded, update the list of configurations in RunManager Set toDeleteSettings = new THashSet(); - for (RunConfiguration each : manager.getConfigurations(type)) { + for (RunConfiguration each : manager.getConfigurationsList(type)) { ContainerUtil.addIfNotNull(toDeleteSettings, manager.getSettings(each)); } @@ -802,22 +802,23 @@ class RunConfigurable extends BaseConfigurable { public boolean isModified() { if (super.isModified()) return true; final RunManagerImpl runManager = getRunManager(); - final List allConfigurations = Arrays.asList(runManager.getAllConfigurations()); + final List allConfigurations = runManager.getAllConfigurationsList(); final List currentConfigurations = new ArrayList(); for (int i = 0; i < myRoot.getChildCount(); i++) { DefaultMutableTreeNode typeNode = (DefaultMutableTreeNode)myRoot.getChildAt(i); final Object object = typeNode.getUserObject(); if (object instanceof ConfigurationType) { - final RunnerAndConfigurationSettings[] configurationSettings = runManager.getConfigurationSettings((ConfigurationType)object); + final List configurationSettings = runManager.getConfigurationSettingsList( + (ConfigurationType)object); List configurationNodes = new ArrayList(); collectNodesRecursively(typeNode, configurationNodes, CONFIGURATION, TEMPORARY_CONFIGURATION); - if (configurationSettings.length != configurationNodes.size()) return true; + if (configurationSettings.size() != configurationNodes.size()) return true; for (int j = 0; j < configurationNodes.size(); j++) { DefaultMutableTreeNode configurationNode = configurationNodes.get(j); final Object userObject = configurationNode.getUserObject(); if (userObject instanceof SingleConfigurationConfigurable) { SingleConfigurationConfigurable configurable = (SingleConfigurationConfigurable)userObject; - if (!Comparing.strEqual(configurationSettings[j].getConfiguration().getName(), configurable.getConfiguration().getName())) { + if (!Comparing.strEqual(configurationSettings.get(j).getConfiguration().getName(), configurable.getConfiguration().getName())) { return true; } if (configurable.isModified()) return true; @@ -1372,8 +1373,8 @@ class RunConfigurable extends BaseConfigurable { //do nothing } final RunnerAndConfigurationSettings originalConfiguration = configurationConfigurable.getSettings(); - if (getRunManager().isTemporary(originalConfiguration)) { - getRunManager().makeStable(originalConfiguration.getConfiguration()); + if (originalConfiguration.isTemporary()) { + getRunManager().makeStable(originalConfiguration); adjustOrder(); } myTree.repaint(); @@ -1383,7 +1384,13 @@ class RunConfigurable extends BaseConfigurable { public void update(final AnActionEvent e) { final SingleConfigurationConfigurable configuration = getSelectedConfiguration(); final Presentation presentation = e.getPresentation(); - final boolean enabled = configuration != null && getRunManager().isTemporary(configuration.getSettings()); + final boolean enabled; + if (configuration == null) { + enabled = false; + } else { + RunnerAndConfigurationSettings settings = configuration.getSettings(); + enabled = settings != null && settings.isTemporary(); + } presentation.setEnabled(enabled); presentation.setVisible(enabled); } diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurationBeforeRunProvider.java b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurationBeforeRunProvider.java index d386ef1443f7..8b42fc1aea2b 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurationBeforeRunProvider.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurationBeforeRunProvider.java @@ -80,7 +80,7 @@ extends BeforeRunTaskProvider configurations = RunManager.getInstance(element.getProject()).getAllConfigurationsList(); for (RunConfiguration configuration : configurations) { if (configuration instanceof RefactoringListenerProvider) { // todo: perhaps better way to handle listeners? 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 b36aea7a7421..0ed6898a1325 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java @@ -20,13 +20,13 @@ import com.intellij.execution.*; import com.intellij.execution.configurations.*; import com.intellij.ide.util.PropertiesComponent; import com.intellij.openapi.components.ProjectComponent; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.*; import com.intellij.ui.IconDeferrer; import com.intellij.util.EventDispatcher; import com.intellij.util.Function; -import com.intellij.util.NullableFunction; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.WeakHashMap; @@ -40,23 +40,24 @@ import java.util.*; public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, ProjectComponent { + private static final Logger LOG = Logger.getInstance("#com.intellij.execution.impl.RunManagerImpl"); private final Project myProject; private final Map myTypesByName = new LinkedHashMap(); private final Map myTemplateConfigurationsMap = new HashMap(); - private final Map myConfigurations = - new LinkedHashMap(); // template configurations are not included here - private final Map mySharedConfigurations = new TreeMap(); + private final Map myConfigurations = + new LinkedHashMap(); // template configurations are not included here + private final Map mySharedConfigurations = new TreeMap(); private final Map> myConfigurationToBeforeTasksMap = new WeakHashMap>(); // When readExternal not all configuration may be loaded, so we need to remember the selected configuration // so that when it is eventually loaded, we can mark is as a selected. @Nullable private String myLoadedSelectedConfigurationUniqueName = null; - @Nullable private Integer mySelectedConfigurationId = null; + @Nullable private String mySelectedConfigurationId = null; - private Map myIdToIcon = new HashMap(); + private Map myIdToIcon = new HashMap(); @NonNls protected static final String CONFIGURATION = "configuration"; @@ -146,9 +147,9 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, @NotNull final ConfigurationFactory factory) { RunnerAndConfigurationSettings template = getConfigurationTemplate(factory); myConfigurationToBeforeTasksMap.put(runConfiguration, getBeforeRunTasks(template.getConfiguration())); - shareConfiguration(runConfiguration, isConfigurationShared(template)); RunnerAndConfigurationSettingsImpl settings = new RunnerAndConfigurationSettingsImpl(this, runConfiguration, false); settings.importRunnerAndConfigurationSettings((RunnerAndConfigurationSettingsImpl)template); + shareConfiguration(settings, isConfigurationShared(template)); return settings; } @@ -189,30 +190,41 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, */ @Override @NotNull - public RunConfiguration[] getConfigurations(@NotNull final ConfigurationType type) { + public List getConfigurationsList(@NotNull final ConfigurationType type) { - final List array = new ArrayList(); + final List list = new ArrayList(); for (RunnerAndConfigurationSettings myConfiguration : getSortedConfigurations()) { final RunConfiguration configuration = myConfiguration.getConfiguration(); final ConfigurationType configurationType = configuration.getType(); if (type.getId().equals(configurationType.getId())) { - array.add(configuration); + list.add(configuration); } } - return array.toArray(new RunConfiguration[array.size()]); + return Collections.unmodifiableList(list); } @Override @NotNull - public RunConfiguration[] getAllConfigurations() { - RunConfiguration[] result = new RunConfiguration[myConfigurations.size()]; - int i = 0; - for (Iterator iterator = getSortedConfigurations().iterator(); iterator.hasNext(); i++) { + public List getAllConfigurationsList() { + List result = new ArrayList(myConfigurations.size()); + for (Iterator iterator = getSortedConfigurations().iterator(); iterator.hasNext();) { RunnerAndConfigurationSettings settings = iterator.next(); - result[i] = settings.getConfiguration(); + result.add(settings.getConfiguration()); } + return Collections.unmodifiableList(result); + } - return result; + @NotNull + @Override + public RunConfiguration[] getAllConfigurations() { + List list = getAllConfigurationsList(); + return list.toArray(new RunConfiguration[list.size()]); + } + + @NotNull + @Override + public List getAllSettings() { + return Collections.unmodifiableList(new ArrayList(getSortedConfigurations())); } @Nullable @@ -221,6 +233,7 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, for (RunnerAndConfigurationSettings settings : getSortedConfigurations()) { if (settings.getConfiguration() == configuration) return settings; } + LOG.warn("Cannot find settings for RunConfiguration " + configuration.getName()); return null; } @@ -229,7 +242,7 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, */ @Override @NotNull - public RunnerAndConfigurationSettings[] getConfigurationSettings(@NotNull final ConfigurationType type) { + public List getConfigurationSettingsList(@NotNull final ConfigurationType type) { final LinkedHashSet set = new LinkedHashSet(); for (RunnerAndConfigurationSettings configuration : getSortedConfigurations()) { @@ -238,7 +251,25 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, set.add(configuration); } } - return set.toArray(new RunnerAndConfigurationSettings[set.size()]); + return Collections.unmodifiableList(new ArrayList(set)); + } + + @NotNull + @Override + public RunnerAndConfigurationSettings[] getConfigurationSettings(@NotNull ConfigurationType type) { + List list = getConfigurationSettingsList(type); + return list.toArray(new RunnerAndConfigurationSettings[list.size()]); + } + + @NotNull + @Override + public RunConfiguration[] getConfigurations(@NotNull ConfigurationType type) { + RunnerAndConfigurationSettings[] settings = getConfigurationSettings(type); + RunConfiguration[] result = new RunConfiguration[settings.length]; + for (int i = 0; i < settings.length; i++) { + result[i] = settings[i].getConfiguration(); + } + return result; } @NotNull @@ -246,7 +277,7 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, public Map> getStructure(@NotNull ConfigurationType type) { LinkedHashMap> map = new LinkedHashMap>(); List typeList = new ArrayList(); - RunnerAndConfigurationSettings[] settings = getConfigurationSettings(type); + List settings = getConfigurationSettingsList(type); for (RunnerAndConfigurationSettings setting : settings) { String folderName = setting.getFolderName(); if (folderName == null) { @@ -289,8 +320,10 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, List tasks, boolean addEnabledTemplateTasksIfAbsent) { final RunConfiguration configuration = settings.getConfiguration(); - Integer existingId = findConfigurationIdByUniqueName(getUniqueName(configuration)); - Integer newId = configuration.getUniqueID(); + //Integer existingId = findConfigurationIdByUniqueName(getUniqueName(configuration)); + String existingId = findConfigurationIdByUniqueName(settings.getUniqueID()); + //Integer newId = configuration.getUniqueID(); + String newId = settings.getUniqueID(); RunnerAndConfigurationSettings existingSettings = null; if (existingId != null) { @@ -320,7 +353,9 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, @Override public void refreshUsagesList(RunProfile profile) { - if (profile instanceof RunConfiguration && isTemporary((RunConfiguration)profile)) { + if (!(profile instanceof RunConfiguration)) return; + RunnerAndConfigurationSettings settings = getSettings((RunConfiguration)profile); + if (settings != null && settings.isTemporary()) { myRecentlyUsedTemporaries.remove((RunConfiguration)profile); myRecentlyUsedTemporaries.add(0, (RunConfiguration)profile); trimUsagesListToLimit(); @@ -336,9 +371,9 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, void checkRecentsLimit() { trimUsagesListToLimit(); List removed = new ArrayList(); - while (getTempConfigurations().length > getConfig().getRecentsLimit()) { - for (Iterator> it = myConfigurations.entrySet().iterator(); it.hasNext(); ) { - Map.Entry entry = it.next(); + while (getTempConfigurationsList().size() > getConfig().getRecentsLimit()) { + for (Iterator> it = myConfigurations.entrySet().iterator(); it.hasNext(); ) { + Map.Entry entry = it.next(); if (entry.getValue().isTemporary() && !myRecentlyUsedTemporaries.contains(entry.getValue().getConfiguration())) { removed.add(entry.getValue()); it.remove(); @@ -357,15 +392,10 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, myOrder.clear(); for (RunnerAndConfigurationSettings each : myConfigurations.values()) { if (each.getType() instanceof UnknownConfigurationType) continue; - myOrder.add(getUniqueName(each.getConfiguration())); + myOrder.add(each.getUniqueID()); } } - static String getUniqueName(@NotNull RunConfiguration config) { - return config.getType().getDisplayName() + "." + config.getName() + - (config instanceof UnknownRunConfiguration ? config.getUniqueID() : ""); - } - @Override public void removeConfiguration(@Nullable RunnerAndConfigurationSettings settings) { if (settings == null) return; @@ -373,12 +403,12 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, for (Iterator it = getSortedConfigurations().iterator(); it.hasNext(); ) { final RunnerAndConfigurationSettings configuration = it.next(); if (configuration.equals(settings)) { - if (mySelectedConfigurationId != null && mySelectedConfigurationId == settings.getConfiguration().getUniqueID()) { + if (mySelectedConfigurationId != null && mySelectedConfigurationId == settings.getUniqueID()) { setSelectedConfiguration(null); } it.remove(); - mySharedConfigurations.remove(settings.getConfiguration().getUniqueID()); + mySharedConfigurations.remove(settings.getUniqueID()); myConfigurationToBeforeTasksMap.remove(settings.getConfiguration()); myRecentlyUsedTemporaries.remove(settings.getConfiguration()); invalidateConfigurationIcon(configuration); @@ -399,14 +429,14 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, @Override public void setSelectedConfiguration(@Nullable RunnerAndConfigurationSettings settings) { - setSelectedConfigurationId(settings == null ? null : settings.getConfiguration().getUniqueID()); + setSelectedConfigurationId(settings == null ? null : settings.getUniqueID()); if (settings != null) { invalidateConfigurationIcon(settings); } fireRunConfigurationSelected(); } - private void setSelectedConfigurationId(@Nullable Integer id) { + private void setSelectedConfigurationId(@Nullable String id) { mySelectedConfigurationId = id; if (mySelectedConfigurationId != null) myLoadedSelectedConfigurationUniqueName = null; } @@ -419,7 +449,7 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, = new ArrayList>(myConfigurations.size()); final List folderNames = new ArrayList(); for (RunnerAndConfigurationSettings each : myConfigurations.values()) { - order.add(Pair.create(getUniqueName(each.getConfiguration()), each)); + order.add(Pair.create(each.getUniqueID(), each)); String folderName = each.getFolderName(); if (folderName != null && !folderNames.contains(folderName)) { folderNames.add(folderName); @@ -465,7 +495,7 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, for (Pair each : order) { RunnerAndConfigurationSettings setting = each.second; - myConfigurations.put(setting.getConfiguration().getUniqueID(), setting); + myConfigurations.put(setting.getUniqueID(), setting); } myOrdered = true; @@ -511,7 +541,7 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, //temp && stable configurations, !unknown for (RunnerAndConfigurationSettings each : myConfigurations.values()) { if (each.getType() instanceof UnknownConfigurationType) continue; - order.add(getUniqueName(each.getConfiguration())); + order.add(each.getUniqueID()); } order.writeExternal(parentNode); @@ -519,7 +549,11 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, final JDOMExternalizableStringList recentList = new JDOMExternalizableStringList(); for (RunConfiguration each : myRecentlyUsedTemporaries) { if (each.getType() instanceof UnknownConfigurationType) continue; - recentList.add(getUniqueName(each)); + RunnerAndConfigurationSettings settings = getSettings(each); + if (settings == null) { + continue; + } + recentList.add(settings.getUniqueID()); } if (!recentList.isEmpty()) { final Element recent = new Element(RECENT); @@ -542,7 +576,7 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, } RunnerAndConfigurationSettings selected = getSelectedConfiguration(); if (selected != null) { - parentNode.setAttribute(SELECTED_ATTR, getUniqueName(selected.getConfiguration())); + parentNode.setAttribute(SELECTED_ATTR, selected.getUniqueID()); } } @@ -603,7 +637,6 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, } } - @Override public void readExternal(final Element parentNode) throws InvalidDataException { clear(); @@ -636,13 +669,37 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, } myOrder.readExternal(parentNode); + //Begin migration (old ids to UUIDs) + for (int i = 0; i < myOrder.size(); i++) { + String id = myOrder.get(i); + for (RunnerAndConfigurationSettings settings : myConfigurations.values()) { + RunConfiguration configuration = settings.getConfiguration(); + if (configuration != null && id.equals(configuration.getType().getDisplayName() + "." + configuration.getName() + + (configuration instanceof UnknownRunConfiguration ? configuration.getUniqueID() : ""))) { + myOrder.set(i, settings.getUniqueID()); + break; + } + } + } + //End migration myRecentlyUsedTemporaries.clear(); Element recentNode = parentNode.getChild(RECENT); if (recentNode != null) { JDOMExternalizableStringList list = new JDOMExternalizableStringList(); list.readExternal(recentNode); + for (int i = 0; i < list.size(); i++) { + String id = list.get(i); + for (RunnerAndConfigurationSettings settings : myConfigurations.values()) { + RunConfiguration configuration = settings.getConfiguration(); + if (configuration != null && id.equals(configuration.getType().getDisplayName() + "." + configuration.getName() + + (configuration instanceof UnknownRunConfiguration ? configuration.getUniqueID() : ""))) { + list.set(i, settings.getUniqueID()); + break; + } + } + } for (String name : list) { - Integer id = findConfigurationIdByUniqueName(name); + String id = findConfigurationIdByUniqueName(name); if (id != null) { myRecentlyUsedTemporaries.add(myConfigurations.get(id).getConfiguration()); } @@ -666,7 +723,7 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, if (myLoadedSelectedConfigurationUniqueName == null && config != null && Boolean.valueOf(element.getAttributeValue(SELECTED_ATTR)).booleanValue()) { - myLoadedSelectedConfigurationUniqueName = getUniqueName(config.getConfiguration()); + myLoadedSelectedConfigurationUniqueName = config.getUniqueID(); } } @@ -676,11 +733,23 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, } @Nullable - private Integer findConfigurationIdByUniqueName(@Nullable String selectedUniqueName) { + private String findConfigurationIdByUniqueName(@Nullable String selectedUniqueName) { if (selectedUniqueName != null) { for (RunnerAndConfigurationSettings each : myConfigurations.values()) { - if (selectedUniqueName.equals(getUniqueName(each.getConfiguration()))) { - return each.getConfiguration().getUniqueID(); + if (selectedUniqueName.equals(each.getUniqueID())) { + return each.getUniqueID(); + } + //if (selectedUniqueName.equals(getUniqueName(each.getConfiguration()))) { + // return each.getConfiguration().getUniqueID(); + //} + } + //migration code 11.08.2013 + for (RunnerAndConfigurationSettings each : myConfigurations.values()) { + RunConfiguration config = each.getConfiguration(); + String uniqueName = config.getType().getDisplayName() + "." + config.getName() + + (config instanceof UnknownRunConfiguration ? config.getUniqueID() : ""); + if (selectedUniqueName.equals(uniqueName)) { + return each.getUniqueID(); } } } @@ -808,14 +877,14 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, addConfiguration(tempConfiguration, isConfigurationShared(tempConfiguration), getBeforeRunTasks(tempConfiguration.getConfiguration()), false); - setActiveConfiguration(tempConfiguration); + setSelectedConfiguration(tempConfiguration); } Collection getStableConfigurations() { - final Map result = - new LinkedHashMap(myConfigurations); - for (Iterator> it = result.entrySet().iterator(); it.hasNext(); ) { - Map.Entry entry = it.next(); + final Map result = + new LinkedHashMap(myConfigurations); + for (Iterator> it = result.entrySet().iterator(); it.hasNext(); ) { + Map.Entry entry = it.next(); if (entry.getValue().isTemporary()) { it.remove(); } @@ -834,34 +903,43 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, } @Override - public boolean isTemporary(@NotNull RunnerAndConfigurationSettings settings) { - return settings.isTemporary(); + @NotNull + public List getTempConfigurationsList() { + List configurations = + ContainerUtil.filter(myConfigurations.values(), new Condition() { + public boolean value(RunnerAndConfigurationSettings settings) { + return settings.isTemporary(); + } + }); + return Collections.unmodifiableList(configurations); } - @Override @NotNull + @Override public RunConfiguration[] getTempConfigurations() { - List configurations = - ContainerUtil.mapNotNull(myConfigurations.values(), new NullableFunction() { - @Override - public RunConfiguration fun(RunnerAndConfigurationSettings settings) { - return settings.isTemporary() ? settings.getConfiguration() : null; - } - }); - return configurations.toArray(new RunConfiguration[configurations.size()]); + List list = getTempConfigurationsList(); + RunConfiguration[] result = new RunConfiguration[list.size()]; + for (int i = 0; i < list.size(); i++) { + result[i] = list.get(i).getConfiguration(); + } + return result; + } + + public void makeStable(@NotNull RunnerAndConfigurationSettings settings) { + invalidateConfigurationIcon(settings); + settings.setTemporary(false); + myRecentlyUsedTemporaries.remove(settings.getConfiguration()); + if (!myOrder.isEmpty()) { + setOrdered(false); + } + fireRunConfigurationChanged(settings); } @Override public void makeStable(@NotNull RunConfiguration configuration) { RunnerAndConfigurationSettings settings = getSettings(configuration); if (settings != null) { - invalidateConfigurationIcon(settings); - settings.setTemporary(false); - myRecentlyUsedTemporaries.remove(configuration); - if (!myOrder.isEmpty()) { - setOrdered(false); - } - fireRunConfigurationChanged(settings); + makeStable(settings); } } @@ -873,10 +951,10 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, @Override public boolean isConfigurationShared(final RunnerAndConfigurationSettings settings) { - Boolean shared = mySharedConfigurations.get(settings.getConfiguration().getUniqueID()); + Boolean shared = mySharedConfigurations.get(settings.getUniqueID()); if (shared == null) { final RunnerAndConfigurationSettings template = getConfigurationTemplate(settings.getFactory()); - shared = mySharedConfigurations.get(template.getConfiguration().getUniqueID()); + shared = mySharedConfigurations.get(template.getUniqueID()); } return shared != null && shared.booleanValue(); } @@ -912,12 +990,12 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, @Override public void invalidateConfigurationIcon(@NotNull final RunnerAndConfigurationSettings settings) { - myIdToIcon.remove(settings.getConfiguration().getUniqueID()); + myIdToIcon.remove(settings.getUniqueID()); } @Override public Icon getConfigurationIcon(@NotNull final RunnerAndConfigurationSettings settings) { - final int uniqueID = settings.getConfiguration().getUniqueID(); + final String uniqueID = settings.getUniqueID(); Icon icon = myIdToIcon.get(uniqueID); if (icon == null) { icon = IconDeferrer.getInstance().defer(settings.getConfiguration().getIcon(), Pair.create(myProject, settings), @@ -929,10 +1007,10 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, Icon icon; try { settings.checkSettings(); - icon = ProgramRunnerUtil.getConfigurationIcon(myProject, settings, false); + icon = ProgramRunnerUtil.getConfigurationIcon(settings, false); } catch (RuntimeConfigurationException e) { - icon = ProgramRunnerUtil.getConfigurationIcon(myProject, settings, true); + icon = ProgramRunnerUtil.getConfigurationIcon(settings, true); } return icon; @@ -1022,12 +1100,11 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, return result; } - public void shareConfiguration(final RunConfiguration runConfiguration, final boolean shareConfiguration) { - RunnerAndConfigurationSettings settings = getSettings(runConfiguration); + public void shareConfiguration(final RunnerAndConfigurationSettings settings, final boolean shareConfiguration) { boolean shouldFire = settings != null && isConfigurationShared(settings) != shareConfiguration; - if (shareConfiguration && isTemporary(runConfiguration)) makeStable(runConfiguration); - mySharedConfigurations.put(runConfiguration.getUniqueID(), shareConfiguration); + if (shareConfiguration && settings.isTemporary()) makeStable(settings); + mySharedConfigurations.put(settings.getUniqueID(), shareConfiguration); if (shouldFire) fireRunConfigurationChanged(settings); } @@ -1069,10 +1146,10 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, void removeNotExistingSharedConfigurations(final Set existing) { List removed = new ArrayList(); - for (Iterator> it = myConfigurations.entrySet().iterator(); it.hasNext(); ) { - Map.Entry entry = it.next(); + for (Iterator> it = myConfigurations.entrySet().iterator(); it.hasNext(); ) { + Map.Entry entry = it.next(); final RunnerAndConfigurationSettings settings = entry.getValue(); - if (!settings.isTemplate() && isConfigurationShared(settings) && !existing.contains(getUniqueName(settings.getConfiguration()))) { + if (!settings.isTemplate() && isConfigurationShared(settings) && !existing.contains(settings.getUniqueID())) { removed.add(settings); invalidateConfigurationIcon(settings); it.remove(); 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 4aef3a91afec..a67764a78b51 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.java @@ -55,6 +55,8 @@ public class RunnerAndConfigurationSettingsImpl implements JDOMExternalizable, C @NonNls public static final String NAME_ATTR = "name"; @NonNls + public static final String UNIQUE_ID = "id"; + @NonNls protected static final String DUMMY_ELEMENT_NANE = "dummy"; @NonNls private static final String TEMPORARY_ATTRIBUTE = "temporary"; @@ -82,6 +84,7 @@ public class RunnerAndConfigurationSettingsImpl implements JDOMExternalizable, C private boolean myEditBeforeRun; private boolean mySingleton; private String myFolderName; + private String myID = null; public RunnerAndConfigurationSettingsImpl(RunManagerImpl manager) { myManager = manager; @@ -140,6 +143,14 @@ public class RunnerAndConfigurationSettingsImpl implements JDOMExternalizable, C return myConfiguration.getName(); } + @Override + public String getUniqueID() { + if (myID == null) { + myID = UUID.randomUUID().toString(); + } + return myID; + } + @Override public void setEditBeforeRun(boolean b) { myEditBeforeRun = b; @@ -184,6 +195,8 @@ public class RunnerAndConfigurationSettingsImpl implements JDOMExternalizable, C myTemporary = Boolean.valueOf(element.getAttributeValue(TEMPORARY_ATTRIBUTE)).booleanValue() || TEMP_CONFIGURATION.equals(element.getName()); myEditBeforeRun = Boolean.valueOf(element.getAttributeValue(EDIT_BEFORE_RUN)).booleanValue(); myFolderName = element.getAttributeValue(FOLDER_NAME); + assert myID == null: "myId must be null at readExternal() stage"; + myID = element.getAttributeValue(UNIQUE_ID, UUID.randomUUID().toString()); // singleton is not configurable by user for template if (!myIsTemplate) { mySingleton = Boolean.valueOf(element.getAttributeValue(SINGLETON)).booleanValue(); @@ -256,6 +269,7 @@ public class RunnerAndConfigurationSettingsImpl implements JDOMExternalizable, C if (myFolderName != null) { element.setAttribute(FOLDER_NAME, myFolderName); } + element.setAttribute(UNIQUE_ID, getUniqueID()); if (isEditBeforeRun()) element.setAttribute(EDIT_BEFORE_RUN, String.valueOf(true)); if (isSingleton()) element.setAttribute(SINGLETON, String.valueOf(true)); diff --git a/platform/lang-impl/src/com/intellij/execution/impl/SingleConfigurationConfigurable.java b/platform/lang-impl/src/com/intellij/execution/impl/SingleConfigurationConfigurable.java index bf091fced193..1a139da8aed8 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/SingleConfigurationConfigurable.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/SingleConfigurationConfigurable.java @@ -104,7 +104,7 @@ public final class SingleConfigurationConfigurable getConfigurationsList(@NotNull ConfigurationType type) { + return Collections.emptyList(); + } + @NotNull @Override public RunConfiguration[] getAllConfigurations() { return new RunConfiguration[0]; } + @NotNull + @Override + public List getAllConfigurationsList() { + return Collections.emptyList(); + } + @NotNull @Override public RunConfiguration[] getTempConfigurations() { return new RunConfiguration[0]; } + @NotNull + @Override + public List getTempConfigurationsList() { + return Collections.emptyList(); + } + @Override public boolean isTemporary(@NotNull RunConfiguration configuration) { return false; @@ -51,6 +69,10 @@ public class MockRunManager extends RunManagerEx { public void makeStable(@NotNull RunConfiguration configuration) { } + @Override + public void makeStable(@NotNull RunnerAndConfigurationSettings settings) { + } + @Override public RunnerAndConfigurationSettings getSelectedConfiguration() { return null; @@ -80,15 +102,22 @@ public class MockRunManager extends RunManagerEx { return new RunnerAndConfigurationSettings[0]; } + @Override + @NotNull + public List getConfigurationSettingsList(@NotNull ConfigurationType type) { + return Collections.emptyList(); + } + @NotNull @Override public Map> getStructure(@NotNull ConfigurationType type) { return Collections.emptyMap(); } + @NotNull @Override - public boolean isTemporary(@NotNull RunnerAndConfigurationSettings configuration) { - return false; + public List getAllSettings() { + return Collections.emptyList(); } @Override diff --git a/plugins/ant/src/com/intellij/lang/ant/config/impl/AntConfigurationImpl.java b/plugins/ant/src/com/intellij/lang/ant/config/impl/AntConfigurationImpl.java index 8e7ae3a0cff0..1534e16bd7cf 100644 --- a/plugins/ant/src/com/intellij/lang/ant/config/impl/AntConfigurationImpl.java +++ b/plugins/ant/src/com/intellij/lang/ant/config/impl/AntConfigurationImpl.java @@ -830,7 +830,7 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis return; } if (configName != null) { - for (RunConfiguration configuration : runManager.getConfigurations(type)) { + for (RunConfiguration configuration : runManager.getConfigurationsList(type)) { if (configName.equals(configuration.getName())) { final List tasks = runManager.getBeforeRunTasks(configuration, AntBeforeRunTaskProvider.ID); if (!tasks.isEmpty()) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcFramework.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcFramework.java index b9ac58a3a577..75686574f06a 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcFramework.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcFramework.java @@ -324,7 +324,7 @@ public abstract class MvcFramework { protected static void ensureRunConfigurationExists(Module module, ConfigurationType configurationType, String name) { final RunManagerEx runManager = RunManagerEx.getInstanceEx(module.getProject()); - for (final RunConfiguration runConfiguration : runManager.getConfigurations(configurationType)) { + for (final RunConfiguration runConfiguration : runManager.getConfigurationsList(configurationType)) { if (runConfiguration instanceof MvcRunConfiguration && ((MvcRunConfiguration)runConfiguration).getModule() == module) { return; } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunConfigurationProducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunConfigurationProducer.java index 8b0fb9e286a4..b635d1f09572 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunConfigurationProducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunConfigurationProducer.java @@ -35,6 +35,8 @@ import org.jetbrains.plugins.groovy.extensions.GroovyScriptTypeDetector; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GroovyScriptClass; +import java.util.List; + /** * @author ilyas */ @@ -86,7 +88,7 @@ public class GroovyScriptRunConfigurationProducer extends RuntimeConfigurationPr @Override protected RunnerAndConfigurationSettings findExistingByElement(Location location, - @NotNull RunnerAndConfigurationSettings[] existingConfigurations, + @NotNull List existingConfigurations, ConfigurationContext context) { for (RunnerAndConfigurationSettings existingConfiguration : existingConfigurations) { final RunConfiguration configuration = existingConfiguration.getConfiguration(); diff --git a/plugins/junit/src/com/intellij/execution/junit/AddToTestsPatternAction.java b/plugins/junit/src/com/intellij/execution/junit/AddToTestsPatternAction.java index 03bc8450a764..3dad8e9d8302 100644 --- a/plugins/junit/src/com/intellij/execution/junit/AddToTestsPatternAction.java +++ b/plugins/junit/src/com/intellij/execution/junit/AddToTestsPatternAction.java @@ -97,7 +97,8 @@ public class AddToTestsPatternAction extends AnAction { } private static List collectPatternConfigurations(Set foundClasses, Project project) { - final RunConfiguration[] configurations = RunManager.getInstance(project).getConfigurations(JUnitConfigurationType.getInstance()); + final List configurations = RunManager.getInstance(project).getConfigurationsList( + JUnitConfigurationType.getInstance()); final List foundConfigurations = new ArrayList(); for (RunConfiguration configuration : configurations) { final JUnitConfiguration.Data data = ((JUnitConfiguration)configuration).getPersistentData(); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenConfigurationProducer.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenConfigurationProducer.java index 96ee06d6aa66..0bf342fcdcfa 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenConfigurationProducer.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenConfigurationProducer.java @@ -29,7 +29,6 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; -import org.jetbrains.idea.maven.project.MavenGeneralSettings; import org.jetbrains.idea.maven.project.MavenProjectsManager; import java.util.Collection; @@ -58,7 +57,7 @@ public class MavenConfigurationProducer extends RuntimeConfigurationProducer { @Override protected RunnerAndConfigurationSettings findExistingByElement(Location location, - @NotNull RunnerAndConfigurationSettings[] existingConfigurations, + @NotNull List existingConfigurations, ConfigurationContext context) { final MavenRunnerParameters runnerParameters = createBuildParameters(location); diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationProducer.java b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationProducer.java index 79875c2145b3..2baeab69c1b0 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationProducer.java +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationProducer.java @@ -32,6 +32,8 @@ import com.intellij.psi.PsiElement; import com.theoryinpractice.testng.model.TestData; import org.jetbrains.annotations.NotNull; +import java.util.List; + public abstract class TestNGConfigurationProducer extends JavaRuntimeConfigurationProducerBase implements Cloneable { public TestNGConfigurationProducer() { @@ -40,7 +42,7 @@ public abstract class TestNGConfigurationProducer extends JavaRuntimeConfigurati @Override protected RunnerAndConfigurationSettings findExistingByElement(Location location, - @NotNull RunnerAndConfigurationSettings[] existingConfigurations, + @NotNull List existingConfigurations, ConfigurationContext context) { final TestNGConfiguration testNGConfiguration = (TestNGConfiguration)context.getOriginalConfiguration(TestNGConfigurationType.getInstance()); diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGPatternConfigurationProducer.java b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGPatternConfigurationProducer.java index 4a8ebbbe8877..086615719d52 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGPatternConfigurationProducer.java +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGPatternConfigurationProducer.java @@ -40,6 +40,7 @@ import com.theoryinpractice.testng.util.TestNGUtil; import org.jetbrains.annotations.NotNull; import java.util.LinkedHashSet; +import java.util.List; import java.util.Set; public class TestNGPatternConfigurationProducer extends TestNGConfigurationProducer{ @@ -135,7 +136,7 @@ public class TestNGPatternConfigurationProducer extends TestNGConfigurationProdu @Override protected RunnerAndConfigurationSettings findExistingByElement(@NotNull Location location, - @NotNull RunnerAndConfigurationSettings[] existingConfigurations, + @NotNull List existingConfigurations, ConfigurationContext context) { final LinkedHashSet classes = new LinkedHashSet(); collectPatternElements(context, classes); diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/snapShooter/CreateSnapShotAction.java b/plugins/ui-designer/src/com/intellij/uiDesigner/snapShooter/CreateSnapShotAction.java index aec774c713fc..e498ca80211f 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/snapShooter/CreateSnapShotAction.java +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/snapShooter/CreateSnapShotAction.java @@ -115,7 +115,7 @@ public class CreateSnapShotAction extends AnAction { boolean connected = false; ApplicationConfigurationType cfgType = ApplicationConfigurationType.getInstance(); - RunnerAndConfigurationSettings[] racsi = RunManager.getInstance(project).getConfigurationSettings(cfgType); + List racsi = RunManager.getInstance(project).getConfigurationSettingsList(cfgType); for(RunnerAndConfigurationSettings config: racsi) { if (config.getConfiguration() instanceof ApplicationConfiguration) { diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltConfigurationProducer.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltConfigurationProducer.java index ea392f083101..5d45ea057471 100644 --- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltConfigurationProducer.java +++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltConfigurationProducer.java @@ -34,6 +34,7 @@ import org.intellij.lang.xpath.xslt.XsltSupport; import org.jetbrains.annotations.NotNull; import java.io.File; +import java.util.List; public class XsltConfigurationProducer extends RuntimeConfigurationProducer{ private XmlFile myFile; @@ -68,7 +69,7 @@ public class XsltConfigurationProducer extends RuntimeConfigurationProducer{ @Override protected RunnerAndConfigurationSettings findExistingByElement(Location location, - @NotNull RunnerAndConfigurationSettings[] existingConfigurations, + @NotNull List existingConfigurations, ConfigurationContext context) { final XmlFile file = PsiTreeUtil.getParentOfType(location.getPsiElement(), XmlFile.class, false); if (file != null && file.isPhysical() && XsltSupport.isXsltFile(file)) {