JAL-629 Fixed appending URLs
[jalview.git] / src / jalview / bin / argparser / BootstrapArgs.java
index bcb86f9..4829ef8 100644 (file)
@@ -1,10 +1,13 @@
 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;
@@ -14,6 +17,8 @@ public class BootstrapArgs
   // 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));
@@ -22,13 +27,25 @@ public class BootstrapArgs
 
   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);
@@ -36,15 +53,26 @@ public class BootstrapArgs
       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";
         }
 
@@ -58,17 +86,32 @@ public class BootstrapArgs
 
         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
@@ -127,6 +170,10 @@ public class BootstrapArgs
     {
       l.addAll(al);
     }
+    else if (l.size() == 0 && al.size() > 0)
+    {
+      l.add(al.get(0));
+    }
   }
 
   /*
@@ -140,4 +187,23 @@ public class BootstrapArgs
     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();
+  }
 }