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 public static BootstrapArgs getBootstrapArgs(List<String> args)
30 return new BootstrapArgs(args);
33 private BootstrapArgs(List<String> args)
38 private void parse(List<String> args, File inArgFile)
42 // avoid looping argFiles
43 if (inArgFile != null)
45 if (argFiles.contains(inArgFile))
48 "Looped argfiles detected: '" + inArgFile.getPath() + "'");
51 argFiles.add(inArgFile);
54 for (int i = 0; i < args.size(); i++)
56 String arg = args.get(i);
57 String argName = null;
59 if (arg.startsWith(ArgParser.DOUBLEDASH))
62 arg = arg.substring(ArgParser.DOUBLEDASH.length());
63 int equalPos = arg.indexOf(ArgParser.EQUALS);
65 && ArgParser.argMap.containsKey(arg.substring(0, equalPos)))
67 argName = arg.substring(0, equalPos);
68 val = arg.substring(equalPos + 1);
70 // check for boolean prepended by "no"
71 else if (arg.startsWith(ArgParser.NEGATESTRING)
72 && ArgParser.argMap.containsKey(
73 arg.substring(ArgParser.NEGATESTRING.length())))
75 argName = arg.substring(ArgParser.NEGATESTRING.length());
78 else if (ArgParser.argMap.containsKey(arg))
84 Arg a = ArgParser.argMap.get(argName);
86 if (a == null || !a.hasOption(Opt.BOOTSTRAP))
88 // not a valid bootstrap arg
92 if (a.hasOption(Opt.STRING))
94 List<String> vals = null;
97 vals = ArgParser.getShellGlobbedFilenameValues(a, args, i + 1);
101 if (a.hasOption(Opt.GLOB))
103 vals = FileUtils.getFilenamesFromGlob(val);
107 vals = new ArrayList<>();
113 if (a == Arg.ARGFILE)
115 for (String filename : vals)
117 File argFile = new File(filename);
118 parse(ArgParser.readArgFile(argFile), argFile);
130 public boolean contains(Arg a)
132 return bootstrapArgMap.containsKey(a);
135 public List<String> getList(Arg a)
137 return bootstrapArgMap.get(a);
140 private List<String> getOrCreateList(Arg a)
142 List<String> l = getList(a);
145 l = new ArrayList<>();
151 private void putList(Arg a, List<String> l)
153 bootstrapArgMap.put(a, l);
157 * Creates a new list if not used before,
158 * adds the value unless the existing list is non-empty
159 * and the arg is not MULTI (so first expressed value is
162 private void add(Arg a, String s)
164 List<String> l = getOrCreateList(a);
165 if (a.hasOption(Opt.MULTI) || l.size() == 0)
171 private void addAll(Arg a, List<String> al)
173 List<String> l = getOrCreateList(a);
174 if (a.hasOption(Opt.MULTI))
178 else if (l.size() == 0 && al.size() > 0)
185 * Retrieves the first value even if MULTI.
186 * A convenience for non-MULTI args.
188 public String get(Arg a)
190 if (!bootstrapArgMap.containsKey(a))
192 List<String> aL = bootstrapArgMap.get(a);
193 return (aL == null || aL.size() == 0) ? null : aL.get(0);
196 public boolean getBoolean(Arg a, boolean d)
198 if (!bootstrapArgMap.containsKey(a))
200 return Boolean.parseBoolean(get(a));
203 public boolean getBoolean(Arg a)
205 if (!(a.hasOption(Opt.BOOLEAN) || a.hasOption(Opt.UNARY)))
209 if (bootstrapArgMap.containsKey(a))
210 return Boolean.parseBoolean(get(a));
212 return a.getDefaultBoolValue();