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) { init(args); } private void init(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)) { int equalPos = arg.indexOf('='); if (equalPos > -1) { argName = arg.substring(ArgParser.DOUBLEDASH.length(), equalPos); val = arg.substring(equalPos + 1); } else { argName = arg.substring(ArgParser.DOUBLEDASH.length()); 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)) 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); } }