Bug 577258 - Launch Configuration View "Terminate all"

did only terminate a single random process of each kind.

Change-Id: I150713ae6f7d1a7203155a96d914aaf6d2696919
Signed-off-by: Joerg Kubitz <jkubitz-eclipse@gmx.de>
Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.debug/+/187731
Reviewed-by: Markus Duft <markus.duft@ssi-schaefer.com>
Reviewed-by: Mickael Istria <mistria@redhat.com>
diff --git a/org.eclipse.debug.ui.launchview/src/org/eclipse/debug/ui/launchview/internal/impl/DebugCoreLaunchObject.java b/org.eclipse.debug.ui.launchview/src/org/eclipse/debug/ui/launchview/internal/impl/DebugCoreLaunchObject.java
index de8ebd4..5c02a25 100644
--- a/org.eclipse.debug.ui.launchview/src/org/eclipse/debug/ui/launchview/internal/impl/DebugCoreLaunchObject.java
+++ b/org.eclipse.debug.ui.launchview/src/org/eclipse/debug/ui/launchview/internal/impl/DebugCoreLaunchObject.java
@@ -14,6 +14,8 @@
  *******************************************************************************/
 package org.eclipse.debug.ui.launchview.internal.impl;
 
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 
 import org.eclipse.core.runtime.CoreException;
@@ -74,11 +76,7 @@
 
 	@Override
 	public boolean canTerminate() {
-		ILaunch launch = findLaunch(config.getName());
-		if (launch != null && launch.canTerminate()) {
-			return true;
-		}
-		return false;
+		return !findTerminateableLaunches(config.getName()).isEmpty();
 	}
 
 	@Override
@@ -87,8 +85,8 @@
 		// the processes takes longer than a few seconds.
 		// Instead we start a job that tries to terminate processes. If the job
 		// itself is stopped, we give up like Eclipse does.
-		ILaunch launch = findLaunch(config.getName());
-		if (launch != null && launch.canTerminate()) {
+		Collection<ILaunch> launches = findTerminateableLaunches(config.getName());
+		for (ILaunch launch: launches) {
 			Job terminateJob = new Job(NLS.bind(LaunchViewMessages.DebugCoreLaunchObject_Terminate, config.getName())) {
 
 				@Override
@@ -135,6 +133,19 @@
 		return null;
 	}
 
+	private static Collection<ILaunch> findTerminateableLaunches(String name) {
+		Collection<ILaunch> result = new ArrayList<>();
+		for (ILaunch l : DebugPlugin.getDefault().getLaunchManager().getLaunches()) {
+			if (l.getLaunchConfiguration() == null || l.isTerminated()) {
+				continue;
+			}
+			if (l.getLaunchConfiguration().getName().equals(name) && l.canTerminate()) {
+				result.add(l);
+			}
+		}
+		return result;
+	}
+
 	@Override
 	public void edit() {
 		// This prefers "debug" mode as the Eclipse infrastructure
diff --git a/org.eclipse.debug.ui.launchview/src/org/eclipse/debug/ui/launchview/services/ILaunchObject.java b/org.eclipse.debug.ui.launchview/src/org/eclipse/debug/ui/launchview/services/ILaunchObject.java
index 7dc8153..9bfc2f9 100644
--- a/org.eclipse.debug.ui.launchview/src/org/eclipse/debug/ui/launchview/services/ILaunchObject.java
+++ b/org.eclipse.debug.ui.launchview/src/org/eclipse/debug/ui/launchview/services/ILaunchObject.java
@@ -68,7 +68,7 @@
 	public boolean canTerminate();
 
 	/**
-	 * Terminates any running instance of this {@link ILaunchObject}.
+	 * Terminates all running instances of this {@link ILaunchObject}.
 	 */
 	public void terminate();