Bug 416691 - NPE for Launch without launch configuration

Change-Id: I6d7e7272c6e5fa774ca6e1efdf480e8593c65ef6
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/launching/LaunchConfigurationTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/launching/LaunchConfigurationTests.java
index 707ac84..877f03d 100644
--- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/launching/LaunchConfigurationTests.java
+++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/launching/LaunchConfigurationTests.java
@@ -50,6 +50,7 @@
 import org.eclipse.debug.core.ILaunchConfigurationType;
 import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
 import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.core.Launch;
 import org.eclipse.debug.internal.core.LaunchConfiguration;
 import org.eclipse.debug.internal.core.LaunchManager;
 import org.eclipse.debug.tests.TestsPlugin;
@@ -57,6 +58,7 @@
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.PlatformUI;
+import org.osgi.framework.Bundle;
 
 /**
  * Tests for launch configurations
@@ -1517,7 +1519,29 @@
 	}
 
 	/**
+	 * Tests that a launch created without a backing
+	 * {@link ILaunchConfiguration} does not cause {@link NullPointerException}s
+	 *
+	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=416691
+	 * @throws Exception
+	 * @since 3.9.0
+	 */
+	public void testNullLaunchConfigurationInLaunch() throws Exception {
+		Launch l = new Launch(null, ILaunchManager.RUN_MODE, null);
+		LaunchManager lm = (LaunchManager) DebugPlugin.getDefault().getLaunchManager();
+		// find the external tools UI bundle and make sure it is started
+		Bundle b = Platform.getBundle("org.eclipse.ui.externaltools"); //$NON-NLS-1$
+		assertNotNull("Must have found the external tools bundle", b); //$NON-NLS-1$
+		if (b.getState() != Bundle.ACTIVE) {
+			b.start();
+		}
+		// no NPE should be logged
+		lm.addLaunch(l);
+	}
+
+	/**
 	 * Proxy to set resource paths, allowing invalid resource paths to be set
+	 *
 	 * @param resources
 	 * @since 3.9.0
 	 */
diff --git a/org.eclipse.ui.externaltools/External Tools Base/org/eclipse/ui/externaltools/internal/model/ExternalToolsPlugin.java b/org.eclipse.ui.externaltools/External Tools Base/org/eclipse/ui/externaltools/internal/model/ExternalToolsPlugin.java
index 3cafc26..76fb4d7 100644
--- a/org.eclipse.ui.externaltools/External Tools Base/org/eclipse/ui/externaltools/internal/model/ExternalToolsPlugin.java
+++ b/org.eclipse.ui.externaltools/External Tools Base/org/eclipse/ui/externaltools/internal/model/ExternalToolsPlugin.java
@@ -265,18 +265,19 @@
 	@Override
 	public void launchAdded(ILaunch launch) {
 		ILaunchConfiguration launchConfiguration = launch.getLaunchConfiguration();
-		try {
-			ILaunchConfigurationType launchConfigurationType = launchConfiguration.getType();
-			if (launchConfigurationType.getIdentifier().equals(
-							IExternalToolConstants.ID_PROGRAM_LAUNCH_CONFIGURATION_TYPE)) {
-				if (fWindowListener == null) {
-					fWindowListener = new ProgramLaunchWindowListener();
-					PlatformUI.getWorkbench().addWindowListener(fWindowListener);
-					launchManager.removeLaunchListener(this);
+		if (launchConfiguration != null) {
+			try {
+				ILaunchConfigurationType launchConfigurationType = launchConfiguration.getType();
+				if (launchConfigurationType.getIdentifier().equals(IExternalToolConstants.ID_PROGRAM_LAUNCH_CONFIGURATION_TYPE)) {
+					if (fWindowListener == null) {
+						fWindowListener = new ProgramLaunchWindowListener();
+						PlatformUI.getWorkbench().addWindowListener(fWindowListener);
+						launchManager.removeLaunchListener(this);
+					}
 				}
+			} catch (CoreException e) {
+				log(e);
 			}
-		} catch (CoreException e) {
-			log(e);
 		}
 	}