1 package jalview.bin.argparser;
4 import java.util.ArrayList;
5 import java.util.Arrays;
6 import java.util.HashMap;
7 import java.util.HashSet;
12 import jalview.bin.argparser.Arg.Opt;
13 import jalview.util.FileUtils;
15 public class BootstrapArgs
18 private Map<Arg, List<String>> bootstrapArgMap = new HashMap<>();
20 private Set<File> argFiles = new HashSet<>();
22 public static BootstrapArgs getBootstrapArgs(String[] args)
24 List<String> argList = new ArrayList<>(Arrays.asList(args));
25 return new BootstrapArgs(argList);
28 private BootstrapArgs(List<String> args)
33 private void parse(List<String> args, File inArgFile)
37 // avoid looping argFiles
38 if (inArgFile != null)
40 if (argFiles.contains(inArgFile))
43 "Looped argfiles detected: '" + inArgFile.getPath() + "'");
46 argFiles.add(inArgFile);
49 for (int i = 0; i < args.size(); i++)
51 String arg = args.get(i);
52 String argName = null;
54 if (arg.startsWith(ArgParser.DOUBLEDASH))
57 arg = arg.substring(ArgParser.DOUBLEDASH.length());
58 int equalPos = arg.indexOf(ArgParser.EQUALS);
60 && ArgParser.argMap.containsKey(arg.substring(0, equalPos)))
62 argName = arg.substring(0, equalPos);
63 val = arg.substring(equalPos + 1);
65 // check for boolean prepended by "no"
66 else if (arg.startsWith(ArgParser.NEGATESTRING)
67 && ArgParser.argMap.containsKey(
68 arg.substring(ArgParser.NEGATESTRING.length())))
70 argName = arg.substring(ArgParser.NEGATESTRING.length());
73 else if (ArgParser.argMap.containsKey(arg))
79 Arg a = ArgParser.argMap.get(argName);
81 if (a == null || !a.hasOption(Opt.BOOTSTRAP))
83 // not a valid bootstrap arg
87 if (a.hasOption(Opt.STRING))
89 List<String> vals = null;
92 vals = ArgParser.getShellGlobbedFilenameValues(a, args, i + 1);
96 if (a.hasOption(Opt.GLOB))
98 vals = FileUtils.getFilenamesFromGlob(val);
102 vals = new ArrayList<>();
108 if (a == Arg.ARGFILE)
110 for (String filename : vals)
112 File argFile = new File(filename);
113 parse(ArgParser.readArgFile(argFile), argFile);
125 public boolean contains(Arg a)
127 return bootstrapArgMap.containsKey(a);
130 public List<String> getList(Arg a)
132 return bootstrapArgMap.get(a);
135 private List<String> getOrCreateList(Arg a)
137 List<String> l = getList(a);
140 l = new ArrayList<>();
146 private void putList(Arg a, List<String> l)
148 bootstrapArgMap.put(a, l);
152 * Creates a new list if not used before,
153 * adds the value unless the existing list is non-empty
154 * and the arg is not MULTI (so first expressed value is
157 private void add(Arg a, String s)
159 List<String> l = getOrCreateList(a);
160 if (a.hasOption(Opt.MULTI) || l.size() == 0)
166 private void addAll(Arg a, List<String> al)
168 List<String> l = getOrCreateList(a);
169 if (a.hasOption(Opt.MULTI))
173 else if (l.size() == 0 && al.size() > 0)
180 * Retrieves the first value even if MULTI.
181 * A convenience for non-MULTI args.
183 public String get(Arg a)
185 if (!bootstrapArgMap.containsKey(a))
187 List<String> aL = bootstrapArgMap.get(a);
188 return (aL == null || aL.size() == 0) ? null : aL.get(0);
191 public boolean getBoolean(Arg a, boolean d)
193 if (!bootstrapArgMap.containsKey(a))
195 return Boolean.parseBoolean(get(a));
198 public boolean getBoolean(Arg a)
200 if (!(a.hasOption(Opt.BOOLEAN) || a.hasOption(Opt.UNARY)))
204 if (bootstrapArgMap.containsKey(a))
205 return Boolean.parseBoolean(get(a));
207 return a.getDefaultBoolValue();