JAL-4121 Store Arg.Opts in bootstrapArgs. Change Opt.OUTPUT to Opt.OUTPUTFILE for...
authorBen Soares <b.soares@dundee.ac.uk>
Sat, 27 May 2023 18:46:33 +0000 (19:46 +0100)
committerBen Soares <b.soares@dundee.ac.uk>
Sat, 27 May 2023 18:46:33 +0000 (19:46 +0100)
src/jalview/bin/Jalview.java
src/jalview/bin/argparser/Arg.java
src/jalview/bin/argparser/ArgParser.java
src/jalview/bin/argparser/BootstrapArgs.java

index 8fa4ac7..159cf75 100755 (executable)
@@ -532,17 +532,17 @@ public class Jalview
         Jalview.exit(null, 0);
       }
 
-      if (bootstrapArgs.contains(Arg.HEADLESS))
+      // new CLI
+      headlessArg = isHeadless(bootstrapArgs);
+      if (headlessArg)
       {
         System.setProperty("java.awt.headless", "true");
-        // new
-        headlessArg = bootstrapArgs.getBoolean(Arg.HEADLESS);
       }
+      // old CLI
       if (aparser.contains("nodisplay") || aparser.contains("nogui")
               || aparser.contains("headless"))
       {
         System.setProperty("java.awt.headless", "true");
-        // old
         headless = true;
       }
       // anything else!
@@ -1883,4 +1883,26 @@ public class Jalview
     System.out.println("[TESTOUTPUT] arg "
             + (yes ? a.argString() : a.negateArgString()) + " was set");
   }
+
+  private static boolean isHeadless(BootstrapArgs bootstrapArgs)
+  {
+    if (bootstrapArgs == null)
+    {
+      return false;
+    }
+    boolean isHeadless = false;
+    if (bootstrapArgs.contains(Arg.GUI))
+    {
+      isHeadless = !bootstrapArgs.getBoolean(Arg.GUI);
+    }
+    else if (bootstrapArgs.contains(Arg.HEADLESS))
+    {
+      isHeadless = bootstrapArgs.getBoolean(Arg.HEADLESS);
+    }
+    else if (bootstrapArgs.argsHaveOption(Opt.OUTPUTFILE))
+    {
+      isHeadless = true;
+    }
+    return isHeadless;
+  }
 }
index 8bac623..c502eec 100644 (file)
@@ -28,7 +28,11 @@ public enum Arg
                   + ChannelProperties.getProperty("app_name"),
           Opt.UNARY, Opt.BOOTSTRAP),
   HEADLESS(Type.CONFIG,
-          "Run Jalview in headless mode. No GUI interface will be created and Jalview will quit after all arguments have been processed.",
+          "Run Jalview in headless mode. No GUI interface will be created and Jalview will quit after all arguments have been processed. "
+                  + "Headless mode is assumed if an output file is to be generated, this can be overridden with --noheadless or --gui.",
+          Opt.BOOLEAN, Opt.BOOTSTRAP),
+  GUI(Type.CONFIG,
+          "Do not run Jalview in headless mode.  This overrides the assumption of headless mode when an output file is to be generated.",
           Opt.UNARY, Opt.BOOTSTRAP),
   JABAWS(Type.CONFIG, "Set a different URL to connect to a JABAWS server.",
           Opt.STRING, Opt.BOOTSTRAP),
@@ -140,7 +144,7 @@ public enum Arg
           "Output an image of the open alignment window. Format is specified by the subval modifier, a following --type argument or guessed from the file extension. Valid formats/extensions are:\n"
                   + "svg,\n" + "png,\n" + "eps,\n" + "html,\n" + "biojs.",
           Opt.STRING, Opt.LINKED, Opt.ALLOWSUBSTITUTIONS, Opt.ALLOWALL,
-          Opt.REQUIREINPUT, Opt.OUTPUT, Opt.PRIMARY),
+          Opt.REQUIREINPUT, Opt.OUTPUTFILE, Opt.PRIMARY),
   TYPE(Type.IMAGE,
           "Set the image format for the preceding --image. Valid values are:\n"
                   + "svg,\n" + "png,\n" + "eps,\n" + "html,\n" + "biojs.",
@@ -160,7 +164,7 @@ public enum Arg
           Opt.STRING, Opt.LINKED, Opt.ALLOWALL),
   STRUCTUREIMAGE(Type.STRUCTUREIMAGE,
           "Export an image of a 3D structure opened in JMOL", Opt.STRING,
-          Opt.LINKED, Opt.MULTI),
+          Opt.LINKED, Opt.MULTI, Opt.OUTPUTFILE),
   STRUCTUREIMAGETYPE(Type.STRUCTUREIMAGE,
           "Set the structure image format for the preceding --structureimage. Valid values are:\n"
                   + "svg,\n" + "png,\n" + "eps,\n" + "html,\n" + "biojs.",
@@ -188,7 +192,7 @@ public enum Arg
                   + "clustal (aln),\n" + "phylip (phy),\n"
                   + "jalview (jvp, jar).",
           Opt.STRING, Opt.LINKED, Opt.ALLOWSUBSTITUTIONS, Opt.ALLOWALL,
-          Opt.REQUIREINPUT, Opt.OUTPUT, Opt.PRIMARY),
+          Opt.REQUIREINPUT, Opt.OUTPUTFILE, Opt.PRIMARY),
   FORMAT(Type.OUTPUT,
           "Sets the format for the preceding --output file. Valid formats are:\n"
                   + "fasta,\n" + "pfam,\n" + "stockholm,\n" + "pir,\n"
@@ -325,8 +329,9 @@ public enum Arg
     INPUT, // This Arg counts as an input for REQUIREINPUT
     REQUIREINPUT, // This Arg can only be applied via --all if there is an
                   // input (i.e. --open or --append)
-    OUTPUT, // This Arg provides an output filename. With Opt.ALLOWALL *.ext is
-            // shorthand for --all --output={basename}.ext
+    OUTPUTFILE, // This Arg provides an output filename. With Opt.ALLOWALL *.ext
+                // is
+    // shorthand for --all --output={basename}.ext
     STORED, // This Arg resets and creates a new set of "opened" linkedIds
     HELP, // This Arg is a --help type arg
     PRIMARY, // This Arg is the main Arg for its type
@@ -489,6 +494,11 @@ public enum Arg
     return true;
   }
 
+  protected Opt[] getOptions()
+  {
+    return argOptions;
+  }
+
   protected void setOptions(Opt... options)
   {
     this.argOptions = options;
index 0a8b8d3..f08e678 100644 (file)
@@ -453,7 +453,7 @@ public class ArgParser
         {
           if (linkedId == null)
           {
-            if (a.hasOption(Opt.OUTPUT) && a.hasOption(Opt.ALLOWALL)
+            if (a.hasOption(Opt.OUTPUTFILE) && a.hasOption(Opt.ALLOWALL)
                     && val.startsWith(MATCHALLLINKEDIDS))
             {
               // --output=*.ext is shorthand for --all --output {basename}.ext
@@ -464,7 +464,7 @@ public class ArgParser
               val = LINKEDIDDIRNAME + File.separator + LINKEDIDBASENAME
                       + val.substring(MATCHALLLINKEDIDS.length());
             }
-            else if (a.hasOption(Opt.OUTPUT) && a.hasOption(Opt.ALLOWALL)
+            else if (a.hasOption(Opt.OUTPUTFILE) && a.hasOption(Opt.ALLOWALL)
                     && val.startsWith(MATCHOPENEDLINKEDIDS))
             {
               // --output=open*.ext is shorthand for --opened --output
index faa4a43..a6bad24 100644 (file)
@@ -23,6 +23,8 @@ public class BootstrapArgs
 
   private Set<File> argFiles = new HashSet<>();
 
+  private Set<Opt> argsOptions = new HashSet<>();
+
   public static BootstrapArgs getBootstrapArgs(String[] args)
   {
     List<String> argList = new ArrayList<>(Arrays.asList(args));
@@ -111,6 +113,17 @@ public class BootstrapArgs
 
         Arg a = ArgParser.argMap.get(argName);
 
+        if (a != null)
+        {
+          for (Opt opt : a.getOptions())
+          {
+            if (!argsOptions.contains(opt))
+            {
+              argsOptions.add(opt);
+            }
+          }
+        }
+
         if (a == null || !a.hasOption(Opt.BOOTSTRAP))
         {
           // not a valid bootstrap arg
@@ -284,8 +297,17 @@ public class BootstrapArgs
       return false;
     }
     if (bootstrapArgMap.containsKey(a))
+    {
       return Boolean.parseBoolean(get(a));
+    }
     else
+    {
       return a.getDefaultBoolValue();
+    }
+  }
+
+  public boolean argsHaveOption(Opt opt)
+  {
+    return argsOptions.contains(opt);
   }
 }