Bug 494521 - NPE when New Docker Connection dialog is open on Windows

Prevent returning connection settings when the DOCKER_HOST
environment variable was not found.

On environments where Docker Toolbox was installed, there
might not be any DOCKER_HOST, etc. env variables set, but there
is a 'DOCKER_TOOLBOX_INSTALL_PATH' env var, which means that
the exit code of the script is '0' and from there, the
'createDockerConnectionSettings' is called.
This method noew returns 'null' if the DOCKER_HOST property
is missing.

Change-Id: Ia19b31782fcd714b9c6549b01801129f5295936f
Signed-off-by: Xavier Coulon <xcoulon@redhat.com>
Reviewed-on: https://git.eclipse.org/r/73588
Tested-by: Hudson CI
Reviewed-by: Jeff Johnston <jjohnstn@redhat.com>
diff --git a/containers/org.eclipse.linuxtools.docker.core/src/org/eclipse/linuxtools/internal/docker/core/DefaultDockerConnectionSettingsFinder.java b/containers/org.eclipse.linuxtools.docker.core/src/org/eclipse/linuxtools/internal/docker/core/DefaultDockerConnectionSettingsFinder.java
index ca3be3b..1b33213 100644
--- a/containers/org.eclipse.linuxtools.docker.core/src/org/eclipse/linuxtools/internal/docker/core/DefaultDockerConnectionSettingsFinder.java
+++ b/containers/org.eclipse.linuxtools.docker.core/src/org/eclipse/linuxtools/internal/docker/core/DefaultDockerConnectionSettingsFinder.java
@@ -141,7 +141,9 @@
 		try {
 			final DockerClient client = new DockerClientFactory()
 					.getClient(connectionSettings);
-			return client.info().name();
+			if (client != null) {
+				return client.info().name();
+			}
 		} catch (DockerCertificateException
 				| com.spotify.docker.client.DockerException
 				| InterruptedException e) {
@@ -239,14 +241,27 @@
 		return null;
 	}
 
+	/**
+	 * Creates connection settings from the given {@code docerSettings}, or
+	 * <code>null</code> if the settings did not contain a property with the
+	 * {@code DOCKER_HOST} key.
+	 * 
+	 * @param dockerSettings
+	 *            the connection settings
+	 * @return the {@link IDockerConnectionSettings} or <code>null</code> if the
+	 *         settings are invalid.
+	 */
 	public IDockerConnectionSettings createDockerConnectionSettings(
 			final Properties dockerSettings) {
 		final Object dockerHostEnvVariable = dockerSettings.get(DOCKER_HOST);
 		final Object dockerCertPathEnvVariable = dockerSettings
 				.get(DOCKER_CERT_PATH);
+		// at least 'dockerHostEnvVariable' should be not null
+		if (dockerHostEnvVariable == null) {
+			return null;
+		}
 		return new TCPConnectionSettings(
-				dockerHostEnvVariable != null
-						? dockerHostEnvVariable.toString() : null,
+				dockerHostEnvVariable.toString(),
 				dockerCertPathEnvVariable != null
 						? dockerCertPathEnvVariable.toString() : null);
 	}
@@ -308,11 +323,11 @@
 	 *         *Nix) or <code>null</code> if the current OS is not supported.
 	 */
 	private String getConnectionSettingsDetectionScriptName() {
-		if (Platform.getOS().equals(Platform.OS_LINUX)) {
+		if (SystemUtils.isLinux()) {
 			return "script.sh";//$NON-NLS-1$
-		} else if (Platform.getOS().equals(Platform.OS_MACOSX)) {
+		} else if (SystemUtils.isMac()) {
 			return "script-macosx.sh";//$NON-NLS-1$
-		} else if (Platform.getOS().equals(Platform.OS_WIN32)) {
+		} else if (SystemUtils.isWindows()) {
 			return "script.bat"; //$NON-NLS-1$
 		}
 		return null;
diff --git a/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/utils/SystemUtils.java b/containers/org.eclipse.linuxtools.docker.core/src/org/eclipse/linuxtools/internal/docker/core/SystemUtils.java
similarity index 95%
rename from containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/utils/SystemUtils.java
rename to containers/org.eclipse.linuxtools.docker.core/src/org/eclipse/linuxtools/internal/docker/core/SystemUtils.java
index b0524e1..344da21 100644
--- a/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/utils/SystemUtils.java
+++ b/containers/org.eclipse.linuxtools.docker.core/src/org/eclipse/linuxtools/internal/docker/core/SystemUtils.java
@@ -9,7 +9,7 @@
  *     Red Hat - Initial Contribution
  *******************************************************************************/
 
-package org.eclipse.linuxtools.internal.docker.ui.utils;
+package org.eclipse.linuxtools.internal.docker.core;
 
 import org.eclipse.core.runtime.Platform;
 
diff --git a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/core/DefaultDockerConnectionSettingsFinderSWTBotTest.java b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/core/DefaultDockerConnectionSettingsFinderSWTBotTest.java
index 030cb63..8aea4ae 100644
--- a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/core/DefaultDockerConnectionSettingsFinderSWTBotTest.java
+++ b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/core/DefaultDockerConnectionSettingsFinderSWTBotTest.java
@@ -42,4 +42,17 @@
 		assertThat(((TCPConnectionSettings)connectionSettings).isTlsVerify()).isTrue();
 	}
 
+	@Test
+	public void shouldNotCreateConnectionSettingsWhenMissingHost() {
+		// given
+		final Properties properties = new Properties();
+		properties.setProperty(DefaultDockerConnectionSettingsFinder.DOCKER_CERT_PATH, "/path/to/certs");
+		// actually, the DOCKER_TLS_VERIFY is not used. If DOCKER_CERT_PATH is set, the we assume that DOCKER_TLS_VERIFY is '1'
+		//properties.setProperty(DefaultDockerConnectionSettingsFinder.DOCKER_TLS_VERIFY, "1");
+		// when
+		final IDockerConnectionSettings connectionSettings = new DefaultDockerConnectionSettingsFinder().createDockerConnectionSettings(properties);
+		// then
+		assertThat(connectionSettings).isNull();
+	}
+
 }
diff --git a/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/preferences/PreferenceInitializer.java b/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/preferences/PreferenceInitializer.java
index edef18e..ae6e215 100644
--- a/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/preferences/PreferenceInitializer.java
+++ b/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/preferences/PreferenceInitializer.java
@@ -19,7 +19,7 @@
 import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.linuxtools.docker.ui.Activator;
-import org.eclipse.linuxtools.internal.docker.ui.utils.SystemUtils;
+import org.eclipse.linuxtools.internal.docker.core.SystemUtils;
 
 /**
  * Class used to initialize default preference values.