src/jdk.jpackage/share/classes/jdk/jpackage/internal/ToolValidator.java
branchJDK-8200758-branch
changeset 58696 61c44899b4eb
parent 58417 67ffaf3a2b75
child 58890 6539ad1d90aa
equal deleted inserted replaced
58695:64adf683bc7b 58696:61c44899b4eb
    23  * questions.
    23  * questions.
    24  */
    24  */
    25 package jdk.jpackage.internal;
    25 package jdk.jpackage.internal;
    26 
    26 
    27 import java.io.IOException;
    27 import java.io.IOException;
       
    28 import java.nio.file.Path;
    28 import java.text.MessageFormat;
    29 import java.text.MessageFormat;
    29 import java.util.ArrayList;
    30 import java.util.ArrayList;
    30 import java.util.List;
    31 import java.util.List;
    31 import java.util.concurrent.atomic.AtomicBoolean;
    32 import java.util.concurrent.atomic.AtomicBoolean;
       
    33 import java.util.function.BiFunction;
    32 import java.util.function.Function;
    34 import java.util.function.Function;
    33 import java.util.stream.Stream;
    35 import java.util.stream.Stream;
    34 
    36 
    35 
    37 
    36 public final class ToolValidator {
    38 public final class ToolValidator {
    37 
    39 
    38     ToolValidator(String name) {
    40     ToolValidator(String tool) {
    39         this.name = name;
    41         this(Path.of(tool));
       
    42     }
       
    43 
       
    44     ToolValidator(Path toolPath) {
       
    45         this.toolPath = toolPath;
    40         args = new ArrayList<>();
    46         args = new ArrayList<>();
    41 
    47 
    42         if (Platform.getPlatform() == Platform.LINUX) {
    48         if (Platform.getPlatform() == Platform.LINUX) {
    43             setCommandLine("--version");
    49             setCommandLine("--version");
    44         }
    50         }
       
    51 
       
    52         setToolNotFoundErrorHandler(null);
       
    53         setToolOldVersionErrorHandler(null);
    45     }
    54     }
    46 
    55 
    47     ToolValidator setCommandLine(String... args) {
    56     ToolValidator setCommandLine(String... args) {
    48         this.args = List.of(args);
    57         this.args = List.of(args);
    49         return this;
    58         return this;
    57     ToolValidator setVersionParser(Function<Stream<String>, String> v) {
    66     ToolValidator setVersionParser(Function<Stream<String>, String> v) {
    58         versionParser = v;
    67         versionParser = v;
    59         return this;
    68         return this;
    60     }
    69     }
    61 
    70 
       
    71     ToolValidator setToolNotFoundErrorHandler(
       
    72             BiFunction<String, IOException, ConfigException> v) {
       
    73         toolNotFoundErrorHandler = v;
       
    74         return this;
       
    75     }
       
    76 
       
    77     ToolValidator setToolOldVersionErrorHandler(BiFunction<String, String, ConfigException> v) {
       
    78         toolOldVersionErrorHandler = v;
       
    79         return this;
       
    80     }
       
    81 
    62     ConfigException validate() {
    82     ConfigException validate() {
    63         List<String> cmdline = new ArrayList<>();
    83         List<String> cmdline = new ArrayList<>();
    64         cmdline.add(name);
    84         cmdline.add(toolPath.toString());
    65         cmdline.addAll(args);
    85         cmdline.addAll(args);
       
    86 
       
    87         String name = toolPath.getFileName().toString();
    66         try {
    88         try {
    67             ProcessBuilder pb = new ProcessBuilder(cmdline);
    89             ProcessBuilder pb = new ProcessBuilder(cmdline);
    68             AtomicBoolean canUseTool = new AtomicBoolean();
    90             AtomicBoolean canUseTool = new AtomicBoolean();
    69             if (minimalVersion == null) {
    91             if (minimalVersion == null) {
    70                 // No version check.
    92                 // No version check.
    71                 canUseTool.setPlain(true);
    93                 canUseTool.setPlain(true);
    72             }
    94             }
    73 
    95 
       
    96             String[] version = new String[1];
    74             Executor.of(pb).setOutputConsumer(lines -> {
    97             Executor.of(pb).setOutputConsumer(lines -> {
    75                 if (versionParser != null && minimalVersion != null) {
    98                 if (versionParser != null && minimalVersion != null) {
    76                     String version = versionParser.apply(lines);
    99                     version[0] = versionParser.apply(lines);
    77                     if (minimalVersion.compareTo(version) < 0) {
   100                     if (minimalVersion.compareTo(version[0]) < 0) {
    78                         canUseTool.setPlain(true);
   101                         canUseTool.setPlain(true);
    79                     }
   102                     }
    80                 }
   103                 }
    81             }).execute();
   104             }).execute();
    82 
   105 
    83             if (!canUseTool.getPlain()) {
   106             if (!canUseTool.getPlain()) {
       
   107                 if (toolOldVersionErrorHandler != null) {
       
   108                     return toolOldVersionErrorHandler.apply(name, version[0]);
       
   109                 }
    84                 return new ConfigException(MessageFormat.format(I18N.getString(
   110                 return new ConfigException(MessageFormat.format(I18N.getString(
    85                         "error.tool-old-version"), name, minimalVersion),
   111                         "error.tool-old-version"), name, minimalVersion),
    86                         MessageFormat.format(I18N.getString(
   112                         MessageFormat.format(I18N.getString(
    87                                 "error.tool-old-version.advice"), name,
   113                                 "error.tool-old-version.advice"), name,
    88                                 minimalVersion));
   114                                 minimalVersion));
    89             }
   115             }
    90         } catch (IOException e) {
   116         } catch (IOException e) {
       
   117             if (toolNotFoundErrorHandler != null) {
       
   118                 return toolNotFoundErrorHandler.apply(name, e);
       
   119             }
    91             return new ConfigException(MessageFormat.format(I18N.getString(
   120             return new ConfigException(MessageFormat.format(I18N.getString(
    92                     "error.tool-not-found"), name, e.getMessage()),
   121                     "error.tool-not-found"), name, e.getMessage()),
    93                     MessageFormat.format(I18N.getString(
   122                     MessageFormat.format(I18N.getString(
    94                             "error.tool-not-found.advice"), name), e);
   123                             "error.tool-not-found.advice"), name), e);
    95         }
   124         }
    96 
   125 
    97         // All good. Tool can be used.
   126         // All good. Tool can be used.
    98         return null;
   127         return null;
    99     }
   128     }
   100 
   129 
   101     private final String name;
   130     private final Path toolPath;
   102     private List<String> args;
   131     private List<String> args;
   103     private String minimalVersion;
   132     private String minimalVersion;
   104     private Function<Stream<String>, String> versionParser;
   133     private Function<Stream<String>, String> versionParser;
       
   134     private BiFunction<String, IOException, ConfigException> toolNotFoundErrorHandler;
       
   135     private BiFunction<String, String, ConfigException> toolOldVersionErrorHandler;
   105 }
   136 }