package jalview.bin.argparser;
+import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import jalview.bin.argparser.Arg.Opt;
import jalview.util.FileUtils;
// only need one
private Map<Arg, List<String>> bootstrapArgMap = new HashMap<>();
+ private Set<File> argFiles = new HashSet<>();
+
public static BootstrapArgs getBootstrapArgs(String[] args)
{
List<String> argList = new ArrayList<>(Arrays.asList(args));
private BootstrapArgs(List<String> args)
{
- init(args);
+ parse(args, null);
}
- private void init(List<String> args)
+ private void parse(List<String> args, File inArgFile)
{
if (args == null)
return;
+ // avoid looping argFiles
+ if (inArgFile != null)
+ {
+ if (argFiles.contains(inArgFile))
+ {
+ System.err.println(
+ "Looped argfiles detected: '" + inArgFile.getPath() + "'");
+ return;
+ }
+ argFiles.add(inArgFile);
+ }
+
for (int i = 0; i < args.size(); i++)
{
String arg = args.get(i);
String val = null;
if (arg.startsWith(ArgParser.DOUBLEDASH))
{
- int equalPos = arg.indexOf('=');
- if (equalPos > -1)
+ // 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(ArgParser.DOUBLEDASH.length(), equalPos);
+ argName = arg.substring(0, equalPos);
val = arg.substring(equalPos + 1);
}
- else
+ // 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.substring(ArgParser.DOUBLEDASH.length());
+ argName = arg;
val = "true";
}
if (a.hasOption(Opt.STRING))
{
+ List<String> vals = null;
if (equalPos == -1)
{
- addAll(a, ArgParser.getShellGlobbedFilenameValues(a, args,
- i + 1));
+ vals = ArgParser.getShellGlobbedFilenameValues(a, args, i + 1);
}
else
{
if (a.hasOption(Opt.GLOB))
- addAll(a, FileUtils.getFilenamesFromGlob(val));
+ {
+ vals = FileUtils.getFilenamesFromGlob(val);
+ }
else
- add(a, val);
+ {
+ vals = new ArrayList<>();
+ vals.add(val);
+ }
+ }
+ addAll(a, vals);
+
+ if (a == Arg.ARGFILE)
+ {
+ for (String filename : vals)
+ {
+ File argFile = new File(filename);
+ parse(ArgParser.readArgFile(argFile), argFile);
+ }
}
}
else
{
l.addAll(al);
}
+ else if (l.size() == 0 && al.size() > 0)
+ {
+ l.add(al.get(0));
+ }
}
/*
List<String> 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();
+ }
}