aec3acd2eade9c356ec43b3f72653cc82c18a9e1
[jalview.git] / src / jalview / bin / Launcher.java
1 package jalview.bin;
2
3 import java.io.File;
4 import java.lang.management.ManagementFactory;
5 import java.lang.management.OperatingSystemMXBean;
6 import java.util.ArrayList;
7
8 public class Launcher
9 {
10
11   private final static String startClass = "jalview.bin.Jalview";
12
13   private final static int maxHeapSizePerCent = 95;
14
15   private final static String dockIconPath = "JalviewLogo_Huge.png";
16
17   public static void main(String[] args)
18   {
19     final String javaBin = System.getProperty("java.home") + File.separator
20             + "bin" + File.separator + "java";
21
22     ArrayList<String> command = new ArrayList<>();
23     command.add(javaBin);
24
25     boolean isAMac = System.getProperty("os.name").indexOf("Mac") > -1;
26
27     for (String jvmArg : ManagementFactory.getRuntimeMXBean()
28             .getInputArguments())
29     {
30       command.add(jvmArg);
31     }
32     command.add("-cp");
33     command.add(ManagementFactory.getRuntimeMXBean().getClassPath());
34     ArrayList<String> arguments = new ArrayList<>();
35     for (String arg : args)
36     {
37       arguments.add(arg);
38     }
39
40     // add memory setting if not specified
41     boolean memSet = false;
42     boolean dockIcon = false;
43     ARG: for (int i = 0; i < command.size(); i++)
44     {
45       String arg = command.get(i);
46       if (arg.startsWith("-Xmx"))
47       {
48         memSet = true;
49       }
50       else if (arg.startsWith("-Xdock:icon"))
51       {
52         dockIcon = true;
53       }
54     }
55
56     if (!memSet)
57     {
58       long maxMemLong = -1;
59       long physicalMem = getPhysicalMemory();
60       if (physicalMem > 0)
61       {
62         maxMemLong = physicalMem * maxHeapSizePerCent / 100;
63       }
64       if (maxMemLong > 0)
65       {
66         command.add("-Xmx" + Long.toString(maxMemLong));
67       }
68     }
69
70     if (!dockIcon && isAMac)
71     {
72       command.add("-Xdock:icon=" + dockIconPath);
73       // -Xdock:name=... doesn't actually work :(
74       // Leaving it in in case it gets fixed
75       command.add("-Xdock:name=" + "Jalview");
76     }
77
78     command.add(startClass);
79     command.addAll(arguments);
80
81     final ProcessBuilder builder = new ProcessBuilder(command);
82
83     System.out.println("COMMAND: " + String.join(" ", builder.command()));
84
85     try
86     {
87       builder.inheritIO();
88       Process process = builder.start();
89       process.waitFor();
90     } catch (Exception e)
91     {
92       e.printStackTrace();
93     }
94     // System.exit(0);
95
96   }
97
98   public static long getPhysicalMemory()
99   {
100     final OperatingSystemMXBean o = ManagementFactory
101             .getOperatingSystemMXBean();
102
103     try
104     {
105       if (o instanceof com.sun.management.OperatingSystemMXBean)
106       {
107         final com.sun.management.OperatingSystemMXBean osb = (com.sun.management.OperatingSystemMXBean) o;
108         return osb.getTotalPhysicalMemorySize();
109       }
110     } catch (NoClassDefFoundError e)
111     {
112       // com.sun.management.OperatingSystemMXBean doesn't exist in this JVM
113       System.out.println("No com.sun.management.OperatingSystemMXBean");
114     }
115
116     // We didn't get a com.sun.management.OperatingSystemMXBean.
117     return -1;
118   }
119
120 }