package jalview.bin.argparser; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import jalview.bin.argparser.Arg.Opt; import jalview.util.FileUtils; public class BootstrapArgs { // only need one private Map> bootstrapArgMap = new HashMap<>(); public static BootstrapArgs getBootstrapArgs(String[] args) { List argList = new ArrayList<>(Arrays.asList(args)); return new BootstrapArgs(argList); } private BootstrapArgs(List args) { parse(args); } private void parse(List args) { if (args == null) return; for (int i = 0; i < args.size(); i++) { String arg = args.get(i); String argName = null; String val = null; if (arg.startsWith(ArgParser.DOUBLEDASH)) { // remove "--" arg = arg.substring(ArgParser.DOUBLEDASH.length()); int equalPos = arg.indexOf(ArgParser.EQUALS); if (equalPos > -1 && ArgParser.argMap.containsKey(arg.substring(0, equalPos))) { argName = arg.substring(0, equalPos); val = arg.substring(equalPos + 1); } // check for boolean prepended by "no" else if (arg.startsWith(ArgParser.NEGATESTRING) && ArgParser.argMap.containsKey( arg.substring(ArgParser.NEGATESTRING.length()))) { argName = arg.substring(ArgParser.NEGATESTRING.length()); val = "false"; } else if (ArgParser.argMap.containsKey(arg)) { argName = arg; val = "true"; } Arg a = ArgParser.argMap.get(argName); if (a == null || !a.hasOption(Opt.BOOTSTRAP)) { // not a valid bootstrap arg continue; } if (a.hasOption(Opt.STRING)) { if (equalPos == -1) { addAll(a, ArgParser.getShellGlobbedFilenameValues(a, args, i + 1)); } else { if (a.hasOption(Opt.GLOB)) { System.out.println("##### VAL='" + val + "'"); addAll(a, FileUtils.getFilenamesFromGlob(val)); } else { add(a, val); } } } else { add(a, val); } } } } public boolean contains(Arg a) { return bootstrapArgMap.containsKey(a); } public List getList(Arg a) { return bootstrapArgMap.get(a); } private List getOrCreateList(Arg a) { List l = getList(a); if (l == null) { l = new ArrayList<>(); putList(a, l); } return l; } private void putList(Arg a, List l) { bootstrapArgMap.put(a, l); } /* * Creates a new list if not used before, * adds the value unless the existing list is non-empty * and the arg is not MULTI (so first expressed value is * retained). */ private void add(Arg a, String s) { List l = getOrCreateList(a); if (a.hasOption(Opt.MULTI) || l.size() == 0) { l.add(s); } } private void addAll(Arg a, List al) { List l = getOrCreateList(a); if (a.hasOption(Opt.MULTI)) { l.addAll(al); } } /* * Retrieves the first value even if MULTI. * A convenience for non-MULTI args. */ public String get(Arg a) { if (!bootstrapArgMap.containsKey(a)) return null; List aL = bootstrapArgMap.get(a); return (aL == null || aL.size() == 0) ? null : aL.get(0); } public boolean getBoolean(Arg a, boolean d) { if (!bootstrapArgMap.containsKey(a)) return d; return Boolean.parseBoolean(get(a)); } public boolean getBoolean(Arg a) { if (!(a.hasOption(Opt.BOOLEAN) || a.hasOption(Opt.UNARY))) { return false; } if (bootstrapArgMap.containsKey(a)) return Boolean.parseBoolean(get(a)); else return a.getDefaultBoolValue(); } }