src/jdk.jpackage/share/classes/jdk/jpackage/internal/ToolValidator.java
branchJDK-8200758-branch
changeset 58696 61c44899b4eb
parent 58417 67ffaf3a2b75
child 58890 6539ad1d90aa
--- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ToolValidator.java	Fri Oct 18 11:00:57 2019 -0400
+++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ToolValidator.java	Fri Oct 18 14:14:37 2019 -0400
@@ -25,23 +25,32 @@
 package jdk.jpackage.internal;
 
 import java.io.IOException;
+import java.nio.file.Path;
 import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.BiFunction;
 import java.util.function.Function;
 import java.util.stream.Stream;
 
 
 public final class ToolValidator {
 
-    ToolValidator(String name) {
-        this.name = name;
+    ToolValidator(String tool) {
+        this(Path.of(tool));
+    }
+
+    ToolValidator(Path toolPath) {
+        this.toolPath = toolPath;
         args = new ArrayList<>();
 
         if (Platform.getPlatform() == Platform.LINUX) {
             setCommandLine("--version");
         }
+
+        setToolNotFoundErrorHandler(null);
+        setToolOldVersionErrorHandler(null);
     }
 
     ToolValidator setCommandLine(String... args) {
@@ -59,10 +68,23 @@
         return this;
     }
 
+    ToolValidator setToolNotFoundErrorHandler(
+            BiFunction<String, IOException, ConfigException> v) {
+        toolNotFoundErrorHandler = v;
+        return this;
+    }
+
+    ToolValidator setToolOldVersionErrorHandler(BiFunction<String, String, ConfigException> v) {
+        toolOldVersionErrorHandler = v;
+        return this;
+    }
+
     ConfigException validate() {
         List<String> cmdline = new ArrayList<>();
-        cmdline.add(name);
+        cmdline.add(toolPath.toString());
         cmdline.addAll(args);
+
+        String name = toolPath.getFileName().toString();
         try {
             ProcessBuilder pb = new ProcessBuilder(cmdline);
             AtomicBoolean canUseTool = new AtomicBoolean();
@@ -71,16 +93,20 @@
                 canUseTool.setPlain(true);
             }
 
+            String[] version = new String[1];
             Executor.of(pb).setOutputConsumer(lines -> {
                 if (versionParser != null && minimalVersion != null) {
-                    String version = versionParser.apply(lines);
-                    if (minimalVersion.compareTo(version) < 0) {
+                    version[0] = versionParser.apply(lines);
+                    if (minimalVersion.compareTo(version[0]) < 0) {
                         canUseTool.setPlain(true);
                     }
                 }
             }).execute();
 
             if (!canUseTool.getPlain()) {
+                if (toolOldVersionErrorHandler != null) {
+                    return toolOldVersionErrorHandler.apply(name, version[0]);
+                }
                 return new ConfigException(MessageFormat.format(I18N.getString(
                         "error.tool-old-version"), name, minimalVersion),
                         MessageFormat.format(I18N.getString(
@@ -88,6 +114,9 @@
                                 minimalVersion));
             }
         } catch (IOException e) {
+            if (toolNotFoundErrorHandler != null) {
+                return toolNotFoundErrorHandler.apply(name, e);
+            }
             return new ConfigException(MessageFormat.format(I18N.getString(
                     "error.tool-not-found"), name, e.getMessage()),
                     MessageFormat.format(I18N.getString(
@@ -98,8 +127,10 @@
         return null;
     }
 
-    private final String name;
+    private final Path toolPath;
     private List<String> args;
     private String minimalVersion;
     private Function<Stream<String>, String> versionParser;
+    private BiFunction<String, IOException, ConfigException> toolNotFoundErrorHandler;
+    private BiFunction<String, String, ConfigException> toolOldVersionErrorHandler;
 }