JAL-3830 Look for --headless mode and add -Djava.awt.headless=true to java invocation...
[jalview.git] / src / jalview / bin / Jalview.java
index b29d9d7..1f86926 100755 (executable)
@@ -91,6 +91,7 @@ import jalview.io.FileLoader;
 import jalview.io.HtmlSvgOutput;
 import jalview.io.IdentifyFile;
 import jalview.io.NewickFile;
+import jalview.io.exceptions.ImageOutputException;
 import jalview.io.gff.SequenceOntologyFactory;
 import jalview.schemes.ColourSchemeI;
 import jalview.schemes.ColourSchemeProperty;
@@ -809,6 +810,7 @@ public class Jalview
     // Run Commands from cli
     cmds = new Commands(argparser, headlessArg);
     boolean commandsSuccess = cmds.argsWereParsed();
+
     if (commandsSuccess)
     {
       if (headlessArg)
@@ -821,6 +823,11 @@ public class Jalview
         }
         else
         {
+          // record usage stats if in headless mode
+          if (Cache.getDefault("USAGESTATS", false))
+          {
+            Cache.initGoogleTracker(headlessArg);
+          }
           Jalview.exit("Successfully completed commands in headless mode",
                   0);
         }
@@ -1005,9 +1012,7 @@ public class Jalview
             ex.printStackTrace(System.err);
           }
         }
-        // TODO - load PDB structure(s) to alignment JAL-629
-        // (associate with identical sequence in alignment, or a specified
-        // sequence)
+
         if (groovyscript != null)
         {
           // Execute the groovy script after we've done all the rendering stuff
@@ -1021,100 +1026,109 @@ public class Jalview
         String imageName = "unnamed.png";
         while (aparser.getSize() > 1)
         {
-          String outputFormat = aparser.nextValue();
-          file = aparser.nextValue();
-
-          if (outputFormat.equalsIgnoreCase("png"))
-          {
-            af.createPNG(new File(file));
-            imageName = (new File(file)).getName();
-            System.out.println("Creating PNG image: " + file);
-            continue;
-          }
-          else if (outputFormat.equalsIgnoreCase("svg"))
-          {
-            File imageFile = new File(file);
-            imageName = imageFile.getName();
-            af.createSVG(imageFile);
-            System.out.println("Creating SVG image: " + file);
-            continue;
-          }
-          else if (outputFormat.equalsIgnoreCase("html"))
+          try
           {
-            File imageFile = new File(file);
-            imageName = imageFile.getName();
-            HtmlSvgOutput htmlSVG = new HtmlSvgOutput(af.alignPanel);
-            htmlSVG.exportHTML(file);
+            String outputFormat = aparser.nextValue();
+            file = aparser.nextValue();
 
-            System.out.println("Creating HTML image: " + file);
-            continue;
-          }
-          else if (outputFormat.equalsIgnoreCase("biojsmsa"))
-          {
-            if (file == null)
+            if (outputFormat.equalsIgnoreCase("png"))
             {
-              System.err.println("The output html file must not be null");
-              return;
+              System.out.println("Creating PNG image: " + file);
+              af.createPNG(new File(file));
+              imageName = (new File(file)).getName();
+              continue;
             }
-            try
+            else if (outputFormat.equalsIgnoreCase("svg"))
             {
-              BioJsHTMLOutput.refreshVersionInfo(
-                      BioJsHTMLOutput.BJS_TEMPLATES_LOCAL_DIRECTORY);
-            } catch (URISyntaxException e)
+              System.out.println("Creating SVG image: " + file);
+              File imageFile = new File(file);
+              imageName = imageFile.getName();
+              af.createSVG(imageFile);
+              continue;
+            }
+            else if (outputFormat.equalsIgnoreCase("html"))
             {
-              e.printStackTrace();
+              File imageFile = new File(file);
+              imageName = imageFile.getName();
+              HtmlSvgOutput htmlSVG = new HtmlSvgOutput(af.alignPanel);
+
+              System.out.println("Creating HTML image: " + file);
+              htmlSVG.exportHTML(file);
+              continue;
             }
-            BioJsHTMLOutput bjs = new BioJsHTMLOutput(af.alignPanel);
-            bjs.exportHTML(file);
-            System.out
-                    .println("Creating BioJS MSA Viwer HTML file: " + file);
-            continue;
-          }
-          else if (outputFormat.equalsIgnoreCase("imgMap"))
-          {
-            af.createImageMap(new File(file), imageName);
-            System.out.println("Creating image map: " + file);
-            continue;
-          }
-          else if (outputFormat.equalsIgnoreCase("eps"))
-          {
-            File outputFile = new File(file);
-            System.out.println(
-                    "Creating EPS file: " + outputFile.getAbsolutePath());
-            af.createEPS(outputFile);
-            continue;
-          }
-          FileFormatI outFormat = null;
-          try
-          {
-            outFormat = FileFormats.getInstance().forName(outputFormat);
-          } catch (Exception formatP)
-          {
-            System.out.println("Couldn't parse " + outFormat
-                    + " as a valid Jalview format string.");
-          }
-          if (outFormat != null)
-          {
-            if (!outFormat.isWritable())
+            else if (outputFormat.equalsIgnoreCase("biojsmsa"))
             {
+              if (file == null)
+              {
+                System.err.println("The output html file must not be null");
+                return;
+              }
+              try
+              {
+                BioJsHTMLOutput.refreshVersionInfo(
+                        BioJsHTMLOutput.BJS_TEMPLATES_LOCAL_DIRECTORY);
+              } catch (URISyntaxException e)
+              {
+                e.printStackTrace();
+              }
+              BioJsHTMLOutput bjs = new BioJsHTMLOutput(af.alignPanel);
               System.out.println(
-                      "This version of Jalview does not support alignment export as "
-                              + outputFormat);
+                      "Creating BioJS MSA Viwer HTML file: " + file);
+              bjs.exportHTML(file);
+              continue;
+            }
+            else if (outputFormat.equalsIgnoreCase("imgMap"))
+            {
+              System.out.println("Creating image map: " + file);
+              af.createImageMap(new File(file), imageName);
+              continue;
+            }
+            else if (outputFormat.equalsIgnoreCase("eps"))
+            {
+              File outputFile = new File(file);
+              System.out.println(
+                      "Creating EPS file: " + outputFile.getAbsolutePath());
+              af.createEPS(outputFile);
+              continue;
+            }
+
+            FileFormatI outFormat = null;
+            try
+            {
+              outFormat = FileFormats.getInstance().forName(outputFormat);
+            } catch (Exception formatP)
+            {
+              System.out.println("Couldn't parse " + outFormat
+                      + " as a valid Jalview format string.");
             }
-            else
+            if (outFormat != null)
             {
-              af.saveAlignment(file, outFormat);
-              if (af.isSaveAlignmentSuccessful())
+              if (!outFormat.isWritable())
               {
-                System.out.println("Written alignment in "
-                        + outFormat.getName() + " format to " + file);
+                System.out.println(
+                        "This version of Jalview does not support alignment export as "
+                                + outputFormat);
               }
               else
               {
-                System.out.println("Error writing file " + file + " in "
-                        + outFormat.getName() + " format!!");
+                af.saveAlignment(file, outFormat);
+                if (af.isSaveAlignmentSuccessful())
+                {
+                  System.out.println("Written alignment in "
+                          + outFormat.getName() + " format to " + file);
+                }
+                else
+                {
+                  System.out.println("Error writing file " + file + " in "
+                          + outFormat.getName() + " format!!");
+                }
               }
             }
+          } catch (ImageOutputException ioexc)
+          {
+            System.out.println(
+                    "Unexpected error whilst exporting image to " + file);
+            ioexc.printStackTrace();
           }
 
         }
@@ -1212,93 +1226,102 @@ public class Jalview
 
   private static void setLookAndFeel()
   {
-    // property laf = "crossplatform", "system", "gtk", "metal", "nimbus",
-    // "mac" or "flat"
-    // If not set (or chosen laf fails), use the normal SystemLaF and if on Mac,
-    // try Quaqua/Vaqua.
-    String lafProp = System.getProperty("laf");
-    String lafSetting = Cache.getDefault("PREFERRED_LAF", null);
-    String laf = "none";
-    if (lafProp != null)
-    {
-      laf = lafProp;
-    }
-    else if (lafSetting != null)
-    {
-      laf = lafSetting;
-    }
-    boolean lafSet = false;
-    switch (laf)
+    if (!Platform.isJS())
+    /**
+     * Java only
+     * 
+     * @j2sIgnore
+     */
     {
-    case "crossplatform":
-      lafSet = setCrossPlatformLookAndFeel();
-      if (!lafSet)
-      {
-        Console.error("Could not set requested laf=" + laf);
-      }
-      break;
-    case "system":
-      lafSet = setSystemLookAndFeel();
-      if (!lafSet)
-      {
-        Console.error("Could not set requested laf=" + laf);
-      }
-      break;
-    case "gtk":
-      lafSet = setGtkLookAndFeel();
-      if (!lafSet)
-      {
-        Console.error("Could not set requested laf=" + laf);
-      }
-      break;
-    case "metal":
-      lafSet = setMetalLookAndFeel();
-      if (!lafSet)
-      {
-        Console.error("Could not set requested laf=" + laf);
-      }
-      break;
-    case "nimbus":
-      lafSet = setNimbusLookAndFeel();
-      if (!lafSet)
-      {
-        Console.error("Could not set requested laf=" + laf);
+      // property laf = "crossplatform", "system", "gtk", "metal", "nimbus",
+      // "mac" or "flat"
+      // If not set (or chosen laf fails), use the normal SystemLaF and if on
+      // Mac,
+      // try Quaqua/Vaqua.
+      String lafProp = System.getProperty("laf");
+      String lafSetting = Cache.getDefault("PREFERRED_LAF", null);
+      String laf = "none";
+      if (lafProp != null)
+      {
+        laf = lafProp;
       }
-      break;
-    case "flat":
-      lafSet = setFlatLookAndFeel();
-      if (!lafSet)
+      else if (lafSetting != null)
       {
-        Console.error("Could not set requested laf=" + laf);
+        laf = lafSetting;
       }
-      break;
-    case "mac":
-      lafSet = setMacLookAndFeel();
-      if (!lafSet)
+      boolean lafSet = false;
+      switch (laf)
       {
-        Console.error("Could not set requested laf=" + laf);
+      case "crossplatform":
+        lafSet = setCrossPlatformLookAndFeel();
+        if (!lafSet)
+        {
+          Console.error("Could not set requested laf=" + laf);
+        }
+        break;
+      case "system":
+        lafSet = setSystemLookAndFeel();
+        if (!lafSet)
+        {
+          Console.error("Could not set requested laf=" + laf);
+        }
+        break;
+      case "gtk":
+        lafSet = setGtkLookAndFeel();
+        if (!lafSet)
+        {
+          Console.error("Could not set requested laf=" + laf);
+        }
+        break;
+      case "metal":
+        lafSet = setMetalLookAndFeel();
+        if (!lafSet)
+        {
+          Console.error("Could not set requested laf=" + laf);
+        }
+        break;
+      case "nimbus":
+        lafSet = setNimbusLookAndFeel();
+        if (!lafSet)
+        {
+          Console.error("Could not set requested laf=" + laf);
+        }
+        break;
+      case "flat":
+        lafSet = setFlatLookAndFeel();
+        if (!lafSet)
+        {
+          Console.error("Could not set requested laf=" + laf);
+        }
+        break;
+      case "mac":
+        lafSet = setMacLookAndFeel();
+        if (!lafSet)
+        {
+          Console.error("Could not set requested laf=" + laf);
+        }
+        break;
+      case "none":
+        break;
+      default:
+        Console.error("Requested laf=" + laf + " not implemented");
       }
-      break;
-    case "none":
-      break;
-    default:
-      Console.error("Requested laf=" + laf + " not implemented");
-    }
-    if (!lafSet)
-    {
-      // Flatlaf default for everyone!
-      lafSet = setFlatLookAndFeel();
       if (!lafSet)
       {
-        setSystemLookAndFeel();
-      }
-      if (Platform.isLinux())
-      {
-        setLinuxLookAndFeel();
-      }
-      if (Platform.isMac())
-      {
-        setMacLookAndFeel();
+        // Flatlaf default for everyone!
+        lafSet = setFlatLookAndFeel();
+        if (!lafSet)
+        {
+          setSystemLookAndFeel();
+        }
+        if (Platform.isLinux())
+        {
+          setLinuxLookAndFeel();
+        }
+        if (Platform.isMac())
+        {
+          setMacLookAndFeel();
+        }
       }
     }
   }
@@ -1578,10 +1601,9 @@ public class Jalview
      * start a User Config prompt asking if we can log usage statistics.
      */
     PromptUserConfig prompter = new PromptUserConfig(Desktop.desktop,
-            "USAGESTATS", "Jalview Usage Statistics",
-            "Do you want to help make Jalview better by enabling "
-                    + "the collection of usage statistics with Google Analytics ?"
-                    + "\n\n(you can enable or disable usage tracking in the preferences)",
+            "USAGESTATS",
+            MessageManager.getString("prompt.google_analytics_title"),
+            MessageManager.getString("prompt.google_analytics"),
             new Runnable()
             {
               @Override
@@ -1800,8 +1822,14 @@ public class Jalview
     }
   }
 
-  /*
-   * testoutput for string values
+  /******************************
+   * 
+   * TEST OUTPUT METHODS
+   * 
+   ******************************/
+  /**
+   * method for reporting string values parsed/processed during tests
+   * 
    */
   protected static void testoutput(ArgParser ap, Arg a, String s1,
           String s2)
@@ -1825,6 +1853,10 @@ public class Jalview
     testoutput(true, a, s1, s2);
   }
 
+  /**
+   * method for reporting string values parsed/processed during tests
+   */
+
   protected static void testoutput(BootstrapArgs bsa, Arg a, String s1,
           String s2)
   {
@@ -1849,6 +1881,9 @@ public class Jalview
     testoutput(true, a, s1, s2);
   }
 
+  /**
+   * report value set for string values parsed/processed during tests
+   */
   private static void testoutput(boolean yes, Arg a, String s1, String s2)
   {
     if (yes && ((s1 == null && s2 == null)