diff options
author | Torbjörn Svensson | 2020-01-31 20:51:09 +0000 |
---|---|---|
committer | Sarika Sinha | 2020-11-20 10:09:05 +0000 |
commit | 79dc434a6073a2650bc8c82335dbd8849d6bb625 (patch) | |
tree | b2e3e14f96afb013e8a49e487764d29efefffc8f | |
parent | 1e760d286525d9efe492edf362ef64d8b4be684b (diff) | |
download | eclipse.platform.debug-79dc434a6073a2650bc8c82335dbd8849d6bb625.tar.gz eclipse.platform.debug-79dc434a6073a2650bc8c82335dbd8849d6bb625.tar.xz eclipse.platform.debug-79dc434a6073a2650bc8c82335dbd8849d6bb625.zip |
Bug 559758 - Only present unique launch configurationsY20201120-1200I20201120-1800
Try to identify unique launch configurations based on kind and name and
return the unique set of configurations.
To avoid comparing every launch configuration with all others, map the
name of the configuration to the configuration itself and then as a
second step if there are duplicated names, do a another pass and verify
that there are only one configuration with the same attribute set (both
keys and values are compared) in the resulting list of configurations.
Change-Id: Id72d2842b096332fa73b3cc23e1c94531f6df28e
Signed-off-by: Torbjörn Svensson <azoff@svenskalinuxforeningen.se>
-rw-r--r-- | org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTreeContentProvider.java | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTreeContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTreeContentProvider.java index 524c34202..ae4c31c4a 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTreeContentProvider.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTreeContentProvider.java @@ -18,7 +18,12 @@ package org.eclipse.debug.internal.ui.launchConfigurations; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; @@ -93,6 +98,8 @@ public class LaunchConfigurationTreeContentProvider implements ITreeContentProvi configs.add(launchConfig); } } + configs = filterUniqueLaunchConfigurations(configs); + ILaunchConfiguration[] prototypes = getLaunchManager().getLaunchConfigurations(type, ILaunchConfiguration.PROTOTYPE); Collections.addAll(configs, prototypes); return configs.toArray(new ILaunchConfiguration[0]); @@ -223,4 +230,56 @@ public class LaunchConfigurationTreeContentProvider implements ITreeContentProvi private Shell getShell() { return fShell; } + + /** + * Returns unique launch configurations from the input list Launch + * configurations are unique if the following criteria are fulfilled: + * <ol> + * <li>The name is unique within the list</li> + * <li>The set of attributes (key and value) for the launch configuration is + * unique within the list</li> + * </ol> + * + * @param launchConfigurations The list of launch configurations to filter + * @return List of unique launch configurations based on criteria above + * @throws CoreException If unable to fetch attributes for launch configuration + */ + private List<ILaunchConfiguration> filterUniqueLaunchConfigurations(List<ILaunchConfiguration> launchConfigurations) throws CoreException { + List<ILaunchConfiguration> configs = new ArrayList<>(); + + // Create map between name and list of launch configurations with same + // name + Map<String, List<ILaunchConfiguration>> configNameMap = new HashMap<>(); + + for (ILaunchConfiguration launchConfig : launchConfigurations) { + String name = launchConfig.getName(); + if (!configNameMap.containsKey(name)) { + configNameMap.put(name, new ArrayList<>()); + } + configNameMap.get(name).add(launchConfig); + } + + // Identify unique configurations + for (Entry<String, List<ILaunchConfiguration>> entry : configNameMap.entrySet()) { + List<ILaunchConfiguration> configsWithSameName = entry.getValue(); + if (configsWithSameName.size() == 1) { + // Only one configuration, add it + configs.add(configsWithSameName.get(0)); + } else if (configsWithSameName.size() > 1) { + // More than one configuration detected with same name, + // verify that they are unique + Set<Map<String, Object>> seenConfigContent = new HashSet<>(); + for (ILaunchConfiguration config : configsWithSameName) { + Map<String, Object> content = config.getAttributes(); + if (!seenConfigContent.contains(content)) { + // Only add the first one with the same content + seenConfigContent.add(content); + configs.add(config); + } + } + } + } + + return configs; + } } |