X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fbin%2Fargparser%2FArgParser.java;h=38cb2d47b3be3e2842a90a8f92db679d4855024c;hb=79456f40b33e73e2fb5420a3287ae80854281ef6;hp=42868ae5903f247791d82564a4eadb8dfcfe5699;hpb=c373422471a5a5e4c38db580fbc4a7519dedc35b;p=jalview.git diff --git a/src/jalview/bin/argparser/ArgParser.java b/src/jalview/bin/argparser/ArgParser.java index 42868ae..38cb2d4 100644 --- a/src/jalview/bin/argparser/ArgParser.java +++ b/src/jalview/bin/argparser/ArgParser.java @@ -118,6 +118,8 @@ public class ArgParser private int argIndex = 0; + private BootstrapArgs bootstrapArgs = null; + static { argMap = new HashMap<>(); @@ -147,10 +149,11 @@ public class ArgParser public ArgParser(String[] args) { - this(args, false); + this(args, false, null); } - public ArgParser(String[] args, boolean initsubstitutions) + public ArgParser(String[] args, boolean initsubstitutions, + BootstrapArgs bsa) { // Make a mutable new ArrayList so that shell globbing parser works. // (When shell file globbing is used, there are a sequence of non-Arg @@ -158,16 +161,17 @@ public class ArgParser // consumed by the --append/--argfile/etc Arg which is most easily done by // removing these filenames from the list one at a time. This can't be done // with an ArrayList made with only Arrays.asList(String[] args). ) - this(new ArrayList<>(Arrays.asList(args)), initsubstitutions); + this(new ArrayList<>(Arrays.asList(args)), initsubstitutions, false, + bsa); } public ArgParser(List args, boolean initsubstitutions) { - this(args, initsubstitutions, false); + this(args, initsubstitutions, false, null); } public ArgParser(List args, boolean initsubstitutions, - boolean allowPrivate) + boolean allowPrivate, BootstrapArgs bsa) { // do nothing if there are no "--" args and (some "-" args || >0 arg is // "open") @@ -191,6 +195,10 @@ public class ArgParser parse(new ArrayList(), false, false); return; } + if (bsa != null) + this.bootstrapArgs = bsa; + else + this.bootstrapArgs = BootstrapArgs.getBootstrapArgs(args); parse(args, initsubstitutions, allowPrivate); } @@ -422,10 +430,7 @@ public class ArgParser if (a.hasOption(Opt.NOACTION)) continue; - if (!linkedArgs.containsKey(linkedId)) - linkedArgs.put(linkedId, new ArgValuesMap()); - - ArgValuesMap avm = linkedArgs.get(linkedId); + ArgValuesMap avm = getOrCreateLinkedArgValuesMap(linkedId); // not dealing with both NODUPLICATEVALUES and GLOB if (a.hasOption(Opt.NODUPLICATEVALUES) && avm.hasValue(a, val)) @@ -535,8 +540,7 @@ public class ArgParser .toString(); } } - if (!linkedArgs.containsKey(defaultLinkedId)) - linkedArgs.put(defaultLinkedId, new ArgValuesMap()); + getOrCreateLinkedArgValuesMap(defaultLinkedId); return defaultLinkedId; } @@ -620,9 +624,24 @@ public class ArgParser return vals; } + public BootstrapArgs getBootstrapArgs() + { + return bootstrapArgs; + } + public boolean isSet(Arg a) { - return a.hasOption(Opt.LINKED) ? isSet("", a) : isSet(null, a); + return a.hasOption(Opt.LINKED) ? isSetAtAll(a) : isSet(null, a); + } + + public boolean isSetAtAll(Arg a) + { + for (String linkedId : linkedOrder) + { + if (isSet(linkedId, a)) + return true; + } + return false; } public boolean isSet(String linkedId, Arg a) @@ -631,7 +650,7 @@ public class ArgParser return avm == null ? false : avm.containsArg(a); } - public boolean getBool(Arg a) + public boolean getBoolean(Arg a) { if (!a.hasOption(Opt.BOOLEAN) && !a.hasOption(Opt.UNARY)) { @@ -698,7 +717,7 @@ public class ArgParser } public static ArgParser parseArgFiles(List argFilenameGlobs, - boolean initsubstitutions) + boolean initsubstitutions, BootstrapArgs bsa) { List argFiles = new ArrayList<>(); @@ -708,11 +727,11 @@ public class ArgParser argFiles.addAll(FileUtils.getFilesFromGlob(pattern)); } - return parseArgFileList(argFiles, initsubstitutions); + return parseArgFileList(argFiles, initsubstitutions, bsa); } public static ArgParser parseArgFileList(List argFiles, - boolean initsubstitutions) + boolean initsubstitutions, BootstrapArgs bsa) { List argsList = new ArrayList<>(); for (File argFile : argFiles) @@ -740,7 +759,7 @@ public class ArgParser } // Third param "true" uses Opt.PRIVATE args --setargile=argfile and // --unsetargfile - return new ArgParser(argsList, initsubstitutions, true); + return new ArgParser(argsList, initsubstitutions, true, bsa); } protected static List readArgFile(File argFile) @@ -794,22 +813,38 @@ public class ArgParser Position pos, ArgValue av, SubVals sv, String key, String pref, String def) { + return getFromSubValArgOrPrefWithSubstitutions(null, avm, a, pos, av, + sv, key, pref, def); + } + + public static String getFromSubValArgOrPrefWithSubstitutions(ArgParser ap, + ArgValuesMap avm, Arg a, Position pos, ArgValue av, SubVals sv, + String key, String pref, String def) + { if (key == null) key = a.getName(); + String value = null; if (sv != null && sv.has(key) && sv.get(key) != null) - return sv.get(key); - if (avm != null && avm.containsArg(a)) + { + value = ap == null ? sv.get(key) + : sv.getWithSubstitutions(ap, avm.getLinkedId(), key); + } + else if (avm != null && avm.containsArg(a)) { if (pos == Position.FIRST && avm.getValue(a) != null) - return avm.getValue(a); + value = avm.getValue(a); else if (pos == Position.BEFORE && avm.getClosestPreviousArgValueOfArg(av, a) != null) - return avm.getClosestPreviousArgValueOfArg(av, a).getValue(); + value = avm.getClosestPreviousArgValueOfArg(av, a).getValue(); else if (pos == Position.AFTER && avm.getClosestNextArgValueOfArg(av, a) != null) - return avm.getClosestNextArgValueOfArg(av, a).getValue(); + value = avm.getClosestNextArgValueOfArg(av, a).getValue(); } - return pref != null ? Cache.getDefault(pref, def) : def; + else + { + value = pref != null ? Cache.getDefault(pref, def) : def; + } + return value; } public static boolean getBoolFromSubValOrArg(ArgValuesMap avm, Arg a, @@ -821,12 +856,59 @@ public class ArgParser public static boolean getFromSubValArgOrPref(ArgValuesMap avm, Arg a, SubVals sv, String key, String pref, boolean def) { + if ((key == null && a == null) || (sv == null && a == null)) + return false; + + boolean usingArgKey = false; if (key == null) + { key = a.getName(); - if (sv != null && sv.has(key) && sv.get(key) != null) - return sv.get(key).toLowerCase(Locale.ROOT).equals("true"); + usingArgKey = true; + } + + String nokey = ArgParser.NEGATESTRING + key; + + // look for key or nokey in subvals first (if using Arg check options) + if (sv != null) + { + // check for true boolean + if (sv.has(key) && sv.get(key) != null) + { + if (usingArgKey) + { + if (!(a.hasOption(Opt.BOOLEAN) || a.hasOption(Opt.UNARY))) + { + Console.debug( + "Looking for boolean in subval from non-boolean/non-unary Arg " + + a.getName()); + return false; + } + } + return sv.get(key).toLowerCase(Locale.ROOT).equals("true"); + } + + // check for negative boolean (subval "no..." will be "true") + if (sv.has(nokey) && sv.get(nokey) != null) + { + if (usingArgKey) + { + if (!(a.hasOption(Opt.BOOLEAN))) + { + Console.debug( + "Looking for negative boolean in subval from non-boolean Arg " + + a.getName()); + return false; + } + } + return !sv.get(nokey).toLowerCase(Locale.ROOT).equals("true"); + } + } + + // check argvalues if (avm != null && avm.containsArg(a)) return avm.getBoolean(a); + + // return preference or default return pref != null ? Cache.getDefault(pref, def) : def; } @@ -971,4 +1053,14 @@ public class ArgParser } } + private ArgValuesMap getOrCreateLinkedArgValuesMap(String linkedId) + { + if (linkedArgs.containsKey(linkedId) + && linkedArgs.get(linkedId) != null) + return linkedArgs.get(linkedId); + + linkedArgs.put(linkedId, new ArgValuesMap(linkedId)); + return linkedArgs.get(linkedId); + } + } \ No newline at end of file