JAL-4160 JAL-3830 Improve jalview.bin.Launcher for launcher script launch with new...
[jalview.git] / src / jalview / bin / Launcher.java
index fecacbe..c5268fa 100644 (file)
@@ -25,6 +25,10 @@ import java.io.IOException;
 import java.lang.management.ManagementFactory;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Locale;
+
+import jalview.util.ChannelProperties;
+import jalview.util.LaunchUtils;
 
 /**
  * A Launcher class for Jalview. This class is used to launch Jalview from the
@@ -45,7 +49,8 @@ public class Launcher
 {
   private final static String startClass = "jalview.bin.Jalview";
 
-  private final static String dockIconPath = "JalviewLogo_Huge.png";
+  private final static String dockIconPath = ChannelProperties
+          .getProperty("logo.512");
 
   /**
    * main method for jalview.bin.Launcher. This restarts the same JRE's JVM with
@@ -57,6 +62,14 @@ public class Launcher
    */
   public static void main(String[] args)
   {
+    if (!LaunchUtils.checkJavaVersion())
+    {
+      System.err.println("WARNING - The Java version being used (Java "
+              + LaunchUtils.getJavaVersion()
+              + ") may lead to problems. This installation of Jalview should be used with Java "
+              + LaunchUtils.getJavaCompileVersion() + ".");
+    }
+
     final String javaBin = System.getProperty("java.home") + File.separator
             + "bin" + File.separator + "java";
 
@@ -77,9 +90,34 @@ public class Launcher
 
     String jvmmempc = null;
     String jvmmemmax = null;
+    boolean debug = false;
+    boolean help = false;
+    boolean quiet = false;
+    boolean launcherstop = false;
+    boolean launcherprint = false;
     ArrayList<String> arguments = new ArrayList<>();
     for (String arg : args)
     {
+      if (arg.equals("--debug"))
+      {
+        debug = true;
+      }
+      if (arg.equals("--quiet"))
+      {
+        quiet = true;
+      }
+      if (arg.equals("--help") || arg.startsWith("--help-"))
+      {
+        help = true;
+      }
+      if (arg.equals("--launcherprint"))
+      {
+        launcherprint = true;
+      }
+      if (arg.equals("--launcherstop"))
+      {
+        launcherstop = true;
+      }
       // jvmmempc and jvmmemmax args used to set memory and are not passed on to
       // startClass
       if (arg.startsWith(
@@ -95,13 +133,45 @@ public class Launcher
         jvmmemmax = arg.substring(
                 MemorySetting.MAX_HEAPSIZE_PROPERTY_NAME.length() + 2);
       }
+      // --doubledash versions
+      else if (arg.startsWith("--"
+              + MemorySetting.MAX_HEAPSIZE_PERCENT_PROPERTY_NAME + "="))
+      {
+        jvmmempc = arg.substring(
+                MemorySetting.MAX_HEAPSIZE_PERCENT_PROPERTY_NAME.length()
+                        + 3);
+      }
+      else if (arg.startsWith(
+              "--" + MemorySetting.MAX_HEAPSIZE_PROPERTY_NAME + "="))
+      {
+        jvmmemmax = arg.substring(
+                MemorySetting.MAX_HEAPSIZE_PROPERTY_NAME.length() + 3);
+      }
+      // retain arg
       else
       {
         arguments.add(arg);
       }
     }
 
-    // add memory setting if not specified
+    // use saved preferences if no cmdline args
+    boolean useCustomisedSettings = LaunchUtils
+            .getBooleanUserPreference(MemorySetting.CUSTOMISED_SETTINGS);
+    if (useCustomisedSettings)
+    {
+      if (jvmmempc == null)
+      {
+        jvmmempc = LaunchUtils
+                .getUserPreference(MemorySetting.MEMORY_JVMMEMPC);
+      }
+      if (jvmmemmax == null)
+      {
+        jvmmemmax = LaunchUtils
+                .getUserPreference(MemorySetting.MEMORY_JVMMEMMAX);
+      }
+    }
+
+    // add these settings if not already specified
     boolean memSet = false;
     boolean dockIcon = false;
     boolean dockName = false;
@@ -149,15 +219,25 @@ public class Launcher
       {
         // -Xdock:name=... doesn't actually work :(
         // Leaving it in in case it gets fixed
-        command.add("-Xdock:name=" + "Jalview");
+        command.add(
+                "-Xdock:name=" + ChannelProperties.getProperty("app_name"));
+        // this launches WITHOUT an icon in the macOS dock. Could be useful for
+        // getdown?
+        // command.add("-Dapple.awt.UIElement=false");
+        // This also does not work for the dock
+        command.add("-Dcom.apple.mrj.application.apple.menu.about.name="
+                + ChannelProperties.getProperty("app_name"));
       }
     }
 
     String scalePropertyArg = HiDPISetting.getScalePropertyArg();
     if (scalePropertyArg != null)
     {
-      System.out.println("Running " + startClass + " with scale setting "
-              + scalePropertyArg);
+      if (debug && !quiet)
+      {
+        System.out.println("Running " + startClass + " with scale setting "
+                + scalePropertyArg);
+      }
       command.add(scalePropertyArg);
     }
 
@@ -166,13 +246,28 @@ public class Launcher
 
     final ProcessBuilder builder = new ProcessBuilder(command);
 
-    // System.out.println("COMMAND: " + String.join(" ", builder.command()));
-    System.out.println("Running " + startClass + " with "
-            + (memSetting == null ? "no memory setting"
-                    : ("memory setting " + memSetting)));
+    if (!quiet && (Boolean
+            .parseBoolean(System.getProperty("launcherprint", "false"))
+            || (debug && launcherprint)))
+    {
+      System.out.println(
+              "LAUNCHER COMMAND: " + String.join(" ", builder.command()));
+    }
+    if (debug && !quiet)
+    {
+      System.out.println("Running " + startClass + " with "
+              + (memSetting == null ? "no memory setting"
+                      : ("memory setting " + memSetting)));
+    }
 
-    if (Boolean.parseBoolean(System.getProperty("launcherstop")))
+    if (Boolean.parseBoolean(System.getProperty("launcherstop", "false"))
+            || (debug && launcherstop))
     {
+      if (!quiet)
+      {
+        System.out.println(
+                "System property 'launcherstop' is set and not 'false'. Exiting.");
+      }
       System.exit(0);
     }
     try
@@ -182,9 +277,9 @@ public class Launcher
       process.waitFor();
     } catch (IOException e)
     {
-      if (e.getMessage().toLowerCase().contains("memory"))
+      if (e.getMessage().toLowerCase(Locale.ROOT).contains("memory"))
       {
-        System.out.println("Caught a memory exception: " + e.getMessage());
+        System.err.println("Caught a memory exception: " + e.getMessage());
         // Probably the "Cannot allocate memory" error, try without the memory
         // setting
         ArrayList<String> commandNoMem = new ArrayList<>();
@@ -197,7 +292,7 @@ public class Launcher
         }
         final ProcessBuilder builderNoMem = new ProcessBuilder(
                 commandNoMem);
-        System.out.println("Command without memory setting: "
+        System.err.println("Command without memory setting: "
                 + String.join(" ", builderNoMem.command()));
         try
         {
@@ -217,8 +312,6 @@ public class Launcher
     {
       e.printStackTrace();
     }
-    // System.exit(0);
-
   }
 
 }