< prev index next >

src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java

Print this page

        

*** 44,53 **** --- 44,54 ---- import java.util.Map; import java.util.Map.Entry; import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.Set; + import java.util.stream.Collectors; import java.util.stream.Stream; import jdk.tools.jlink.internal.plugins.ExcludeJmodSectionPlugin; import jdk.tools.jlink.plugin.Plugin; import jdk.tools.jlink.plugin.Plugin.Category;
*** 99,110 **** final boolean hasArg; final Processing<T> processing; final boolean hidden; final String name; final String shortname; ! public Option(boolean hasArg, Processing<T> processing, boolean hidden, String name, String shortname) { if (!name.startsWith("--")) { throw new RuntimeException("option name missing --, " + name); } if (!shortname.isEmpty() && !shortname.startsWith("-")) { throw new RuntimeException("short name missing -, " + shortname); --- 100,118 ---- final boolean hasArg; final Processing<T> processing; final boolean hidden; final String name; final String shortname; + final boolean terminalOption; ! public Option(boolean hasArg, ! Processing<T> processing, ! boolean hidden, ! String name, ! String shortname, ! boolean isTerminal) ! { if (!name.startsWith("--")) { throw new RuntimeException("option name missing --, " + name); } if (!shortname.isEmpty() && !shortname.startsWith("-")) { throw new RuntimeException("short name missing -, " + shortname);
*** 113,140 **** this.hasArg = hasArg; this.processing = processing; this.hidden = hidden; this.name = name; this.shortname = shortname; } public Option(boolean hasArg, Processing<T> processing, String name, String shortname) { ! this(hasArg, processing, false, name, shortname); } public Option(boolean hasArg, Processing<T> processing, boolean hidden, String name) { ! this(hasArg, processing, hidden, name, ""); } public Option(boolean hasArg, Processing<T> processing, String name) { ! this(hasArg, processing, false, name, ""); } public boolean isHidden() { return hidden; } public boolean matches(String opt) { return opt.equals(name) || opt.equals(shortname) || hasArg && opt.startsWith("--") && opt.startsWith(name + "="); } --- 121,157 ---- this.hasArg = hasArg; this.processing = processing; this.hidden = hidden; this.name = name; this.shortname = shortname; + this.terminalOption = isTerminal; + } + + public Option(boolean hasArg, Processing<T> processing, String name, String shortname, boolean isTerminal) { + this(hasArg, processing, false, name, shortname, isTerminal); } public Option(boolean hasArg, Processing<T> processing, String name, String shortname) { ! this(hasArg, processing, false, name, shortname, false); } public Option(boolean hasArg, Processing<T> processing, boolean hidden, String name) { ! this(hasArg, processing, hidden, name, "", false); } public Option(boolean hasArg, Processing<T> processing, String name) { ! this(hasArg, processing, false, name, "", false); } public boolean isHidden() { return hidden; } + public boolean isTerminal() { + return terminalOption; + } + public boolean matches(String opt) { return opt.equals(name) || opt.equals(shortname) || hasArg && opt.startsWith("--") && opt.startsWith(name + "="); }
*** 177,192 **** } private static class PluginOption extends Option<PluginsHelper> { public PluginOption(boolean hasArg, Processing<PluginsHelper> processing, boolean hidden, String name, String shortname) { ! super(hasArg, processing, hidden, name, shortname); } public PluginOption(boolean hasArg, Processing<PluginsHelper> processing, boolean hidden, String name) { ! super(hasArg, processing, hidden, name, ""); } public String resourcePrefix() { return "plugin.opt."; } --- 194,209 ---- } private static class PluginOption extends Option<PluginsHelper> { public PluginOption(boolean hasArg, Processing<PluginsHelper> processing, boolean hidden, String name, String shortname) { ! super(hasArg, processing, hidden, name, shortname, false); } public PluginOption(boolean hasArg, Processing<PluginsHelper> processing, boolean hidden, String name) { ! super(hasArg, processing, hidden, name, "", false); } public String resourcePrefix() { return "plugin.opt."; }
*** 496,539 **** private String getPluginsPath(String[] args) throws BadArgs { return null; } ! // used by jimage. Return unhandled arguments like "create", "describe". public List<String> handleOptions(T task, String[] args) throws BadArgs { - return handleOptions(task, args, true); - } - - // used by jlink. No unhandled arguments like "create", "describe". - void handleOptionsNoUnhandled(T task, String[] args) throws BadArgs { - handleOptions(task, args, false); - } - - // shared code that handles options for both jlink and jimage. jimage uses arguments like - // "create", "describe" etc. as "task names". Those arguments are unhandled here and returned - // as "unhandled arguments list". jlink does not want such arguments. "collectUnhandled" flag - // tells whether to allow for unhandled arguments or not. - private List<String> handleOptions(T task, String[] args, boolean collectUnhandled) throws BadArgs { // findbugs warning, copy instead of keeping a reference. command = Arrays.copyOf(args, args.length); // Must extract it prior to do any option analysis. // Required to interpret custom plugin options. // Unit tests can call Task multiple time in same JVM. pluginOptions = new PluginsHelper(null); - List<String> rest = collectUnhandled? new ArrayList<>() : null; // process options for (int i = 0; i < args.length; i++) { if (args[i].startsWith("-")) { String name = args[i]; PluginOption pluginOption = null; Option<T> option = getOption(name); if (option == null) { pluginOption = pluginOptions.getOption(name); if (pluginOption == null) { - throw new BadArgs("err.unknown.option", name). showUsage(true); } } Option<?> opt = pluginOption == null ? option : pluginOption; --- 513,546 ---- private String getPluginsPath(String[] args) throws BadArgs { return null; } ! /** ! * Handles all options. This method stops processing the argument ! * at the first non-option argument i.e. not starts with `-`, or ! * at the first terminal option and returns the remaining arguments, ! * if any. ! */ public List<String> handleOptions(T task, String[] args) throws BadArgs { // findbugs warning, copy instead of keeping a reference. command = Arrays.copyOf(args, args.length); // Must extract it prior to do any option analysis. // Required to interpret custom plugin options. // Unit tests can call Task multiple time in same JVM. pluginOptions = new PluginsHelper(null); // process options for (int i = 0; i < args.length; i++) { if (args[i].startsWith("-")) { String name = args[i]; PluginOption pluginOption = null; Option<T> option = getOption(name); if (option == null) { pluginOption = pluginOptions.getOption(name); if (pluginOption == null) { throw new BadArgs("err.unknown.option", name). showUsage(true); } } Option<?> opt = pluginOption == null ? option : pluginOption;
*** 554,577 **** } if (pluginOption != null) { pluginOption.process(pluginOptions, name, param); } else { option.process(task, name, param); } if (opt.ignoreRest()) { i = args.length; } } else { ! if (collectUnhandled) { ! rest.add(args[i]); ! } else { ! throw new BadArgs("err.orphan.argument", args[i]). ! showUsage(true); ! } } } ! return rest; } private Option<T> getOption(String name) { for (Option<T> o : options) { if (o.matches(name)) { --- 561,587 ---- } if (pluginOption != null) { pluginOption.process(pluginOptions, name, param); } else { option.process(task, name, param); + if (option.isTerminal()) { + return ++i < args.length + ? Stream.of(Arrays.copyOfRange(args, i, args.length)) + .collect(Collectors.toList()) + : Collections.emptyList(); + + } } if (opt.ignoreRest()) { i = args.length; } } else { ! return Stream.of(Arrays.copyOfRange(args, i, args.length)) ! .collect(Collectors.toList()); } } ! return Collections.emptyList(); } private Option<T> getOption(String name) { for (Option<T> o : options) { if (o.matches(name)) {
< prev index next >