X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fbin%2Fargparser%2FBootstrapArgs.java;h=ec62bcdf3a50902878de66633d4e8af56052aa96;hb=fd814da2180509657dbc6a644cf3e812e8e00c92;hp=1c54355e3fbd271172bef47647ff19beb2d42478;hpb=92c48abf7079358345432e020b72d025fc14f75d;p=jalview.git diff --git a/src/jalview/bin/argparser/BootstrapArgs.java b/src/jalview/bin/argparser/BootstrapArgs.java index 1c54355..ec62bcd 100644 --- a/src/jalview/bin/argparser/BootstrapArgs.java +++ b/src/jalview/bin/argparser/BootstrapArgs.java @@ -4,9 +4,11 @@ import java.io.File; import java.util.AbstractMap; import java.util.ArrayList; import java.util.Arrays; +import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; @@ -22,6 +24,12 @@ public class BootstrapArgs private Set argFiles = new HashSet<>(); + private Set argsOptions = new HashSet<>(); + + private Set argsTypes = new HashSet<>(); + + private boolean outputToStdout = false; + public static BootstrapArgs getBootstrapArgs(String[] args) { List argList = new ArrayList<>(Arrays.asList(args)); @@ -47,7 +55,7 @@ public class BootstrapArgs { if (argFiles.contains(inArgFile)) { - System.err.println( + jalview.bin.Console.errPrintln( "Looped argfiles detected: '" + inArgFile.getPath() + "'"); return; } @@ -64,51 +72,104 @@ public class BootstrapArgs String val = null; Type type = null; // remove "--" - arg = arg.substring(ArgParser.DOUBLEDASH.length()); + argName = arg.substring(ArgParser.DOUBLEDASH.length()); // look for equals e.g. --arg=value - int equalPos = arg.indexOf(ArgParser.EQUALS); - if (equalPos > -1 - && ArgParser.argMap.containsKey(arg.substring(0, equalPos))) + int equalPos = argName.indexOf(ArgParser.EQUALS); + if (equalPos > -1) { - argName = arg.substring(0, equalPos); - val = arg.substring(equalPos + 1); + val = argName.substring(equalPos + 1); + argName = argName.substring(0, equalPos); } + // check for boolean prepended by "no" - else if (arg.startsWith(ArgParser.NEGATESTRING) + if (argName.startsWith(ArgParser.NEGATESTRING) && ArgParser.argMap.containsKey( - arg.substring(ArgParser.NEGATESTRING.length()))) + argName.substring(ArgParser.NEGATESTRING.length()))) { - argName = arg.substring(ArgParser.NEGATESTRING.length()); val = "false"; + argName = argName.substring(ArgParser.NEGATESTRING.length()); } - else if (ArgParser.argMap.containsKey(arg)) + + // look for type modification e.g. --help-opening + int dashPos = argName.indexOf(ArgParser.SINGLEDASH); + if (dashPos > -1) { - argName = arg; - val = "true"; + String potentialArgName = argName.substring(0, dashPos); + Arg potentialArg = ArgParser.argMap.get(potentialArgName); + if (potentialArg != null && potentialArg.hasOption(Opt.HASTYPE)) + { + String typeName = argName.substring(dashPos + 1); + try + { + type = Type.valueOf(typeName.toUpperCase(Locale.ROOT)); + } catch (IllegalArgumentException e) + { + type = Type.INVALID; + } + argName = argName.substring(0, dashPos); + } } - else + + // after all other args, look for Opt.PREFIX args if still not found + if (!ArgParser.argMap.containsKey(argName)) { - // look for type modification e.g. --help-opening - int dashPos = arg.indexOf(ArgParser.SINGLEDASH); - if (dashPos > -1) + for (Arg potentialArg : EnumSet.allOf(Arg.class)) { - String potentialArgName = arg.substring(0, dashPos); - Arg potentialArg = ArgParser.argMap.get(potentialArgName); - if (potentialArg != null && potentialArg.hasOption(Opt.HASTYPE)) + if (potentialArg.hasOption(Opt.PREFIXKEV) && argName != null + && argName.startsWith(potentialArg.getName()) + && val != null) { - argName = arg.substring(0, dashPos); - String typeName = arg.substring(dashPos + 1); - type = Type.valueOf(typeName); + val = argName.substring(potentialArg.getName().length()) + + ArgParser.EQUALS + val; + argName = argName.substring(0, + potentialArg.getName().length()); + break; } } } Arg a = ArgParser.argMap.get(argName); + if (a != null) + { + for (Opt opt : a.getOptions()) + { + if (!argsOptions.contains(opt)) + { + argsOptions.add(opt); + } + } + Type t = a.getType(); + if (!argsTypes.contains(t)) + { + argsTypes.add(t); + } + } + if (a == null || !a.hasOption(Opt.BOOTSTRAP)) { - // not a valid bootstrap arg + // not a bootstrap arg + + // make a check for an output going to stdout + if (a != null && a.hasOption(Opt.OUTPUTFILE) + && a.hasOption(Opt.STDOUT)) + { + if (val == null && i + 1 < args.size()) + { + val = args.get(i + 1); + } + if (val.startsWith("[") && val.indexOf(']') > 0) + { + val = val.substring(val.indexOf(']') + 1); + } + + if (ArgParser.STDOUTFILENAME.equals(val)) + { + this.outputToStdout = true; + } + } + continue; } @@ -144,6 +205,11 @@ public class BootstrapArgs } else { + if (val == null) + { + val = "true"; + } + add(a, type, val); } } @@ -257,7 +323,7 @@ public class BootstrapArgs * Retrieves the first value even if MULTI. * A convenience for non-MULTI args. */ - public String get(Arg a) + public String getValue(Arg a) { if (!bootstrapArgMap.containsKey(a)) return null; @@ -269,7 +335,7 @@ public class BootstrapArgs { if (!bootstrapArgMap.containsKey(a)) return d; - return Boolean.parseBoolean(get(a)); + return Boolean.parseBoolean(getValue(a)); } public boolean getBoolean(Arg a) @@ -279,8 +345,59 @@ public class BootstrapArgs return false; } if (bootstrapArgMap.containsKey(a)) - return Boolean.parseBoolean(get(a)); + { + return Boolean.parseBoolean(getValue(a)); + } else + { return a.getDefaultBoolValue(); + } + } + + public boolean argsHaveOption(Opt opt) + { + return argsOptions.contains(opt); + } + + public boolean argsHaveType(Type type) + { + return argsTypes.contains(type); + } + + public boolean isHeadless() + { + boolean isHeadless = false; + if (this.argsHaveType(Type.HELP)) + { + // --help, --help-all, ... specified => headless + isHeadless = true; + } + else if (this.contains(Arg.VERSION)) + { + // --version specified => headless + isHeadless = true; + } + else if (this.contains(Arg.GUI)) + { + // --gui specified => forced NOT headless + isHeadless = !this.getBoolean(Arg.GUI); + } + else if (this.contains(Arg.HEADLESS)) + { + // --headless has been specified on the command line => headless + isHeadless = this.getBoolean(Arg.HEADLESS); + } + else if (this.argsHaveOption(Opt.OUTPUTFILE)) + { + // --output file.fa, --image pic.png, --structureimage struct.png => + // assume headless unless above has been already specified + isHeadless = true; + } + return isHeadless; + } + + public boolean outputToStdout() + { + return this.outputToStdout; } }