src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixTool.java
branchJDK-8200758-branch
changeset 58762 0fe62353385b
parent 58696 61c44899b4eb
child 58890 6539ad1d90aa
--- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixTool.java	Wed Oct 23 10:10:34 2019 -0400
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixTool.java	Wed Oct 23 10:37:54 2019 -0400
@@ -26,10 +26,7 @@
 package jdk.jpackage.internal;
 
 import java.io.IOException;
-import java.nio.file.FileSystems;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.PathMatcher;
+import java.nio.file.*;
 import java.text.MessageFormat;
 import java.util.*;
 import java.util.function.Supplier;
@@ -119,16 +116,39 @@
 
     private final static String MINIMAL_VERSION = "3.0";
 
-    private final static Path PROGRAM_FILES = Path.of("C:\\Program Files");
-    private final static Path PROGRAM_FILES_X86 = Path.of("C:\\Program Files (x86)");
+    static Path getSystemDir(String envVar, String knownDir) {
+        return Optional
+                .ofNullable(getEnvVariableAsPath(envVar))
+                .orElseGet(() -> Optional
+                        .ofNullable(getEnvVariableAsPath("SystemDrive"))
+                        .orElseGet(() -> Path.of("C:")).resolve(knownDir));
+    }
+
+    private static Path getEnvVariableAsPath(String envVar) {
+        String path = System.getenv(envVar);
+        if (path != null) {
+            try {
+                return Path.of(path);
+            } catch (InvalidPathException ex) {
+                Log.error(MessageFormat.format(I18N.getString(
+                        "error.invalid-envvar"), envVar));
+                return null;
+            }
+        }
+        return null;
+    }
 
     private static List<Path> findWixInstallDirs() {
         PathMatcher wixInstallDirMatcher = FileSystems.getDefault().getPathMatcher(
                 "glob:WiX Toolset v*");
 
+        Path programFiles = getSystemDir("ProgramFiles", "Program Files");
+        Path programFilesX86 = getSystemDir("ProgramFiles(X86)",
+                "Program Files (x86)");
+
         // Returns list of WiX install directories ordered by WiX version number.
         // Newer versions go first.
-        return Stream.of(PROGRAM_FILES, PROGRAM_FILES_X86).map(path -> {
+        return Stream.of(programFiles, programFilesX86).map(path -> {
             List<Path> result;
             try (var paths = Files.walk(path, 1)) {
                 result = paths.collect(Collectors.toList());