2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
23 import java.io.BufferedReader;
25 import java.io.FileOutputStream;
26 import java.io.IOException;
27 import java.io.InputStreamReader;
28 import java.io.OutputStreamWriter;
29 import java.io.PrintWriter;
30 import java.net.MalformedURLException;
32 import java.net.URISyntaxException;
34 import java.security.AllPermission;
35 import java.security.CodeSource;
36 import java.security.PermissionCollection;
37 import java.security.Permissions;
38 import java.security.Policy;
39 import java.util.HashMap;
41 import java.util.Vector;
42 import java.util.logging.ConsoleHandler;
43 import java.util.logging.Level;
44 import java.util.logging.Logger;
46 import javax.swing.UIManager;
47 import javax.swing.UIManager.LookAndFeelInfo;
49 import com.threerings.getdown.util.LaunchUtil;
51 import groovy.lang.Binding;
52 import groovy.util.GroovyScriptEngine;
53 import jalview.ext.so.SequenceOntology;
54 import jalview.gui.AlignFrame;
55 import jalview.gui.Desktop;
56 import jalview.gui.PromptUserConfig;
57 import jalview.io.AppletFormatAdapter;
58 import jalview.io.BioJsHTMLOutput;
59 import jalview.io.DataSourceType;
60 import jalview.io.FileFormat;
61 import jalview.io.FileFormatException;
62 import jalview.io.FileFormatI;
63 import jalview.io.FileLoader;
64 import jalview.io.HtmlSvgOutput;
65 import jalview.io.IdentifyFile;
66 import jalview.io.NewickFile;
67 import jalview.io.gff.SequenceOntologyFactory;
68 import jalview.schemes.ColourSchemeI;
69 import jalview.schemes.ColourSchemeProperty;
70 import jalview.util.MessageManager;
71 import jalview.util.Platform;
72 import jalview.ws.jws2.Jws2Discoverer;
75 * Main class for Jalview Application <br>
77 * start with: java -classpath "$PATH_TO_LIB$/*:$PATH_TO_CLASSES$" \
80 * or on Windows: java -classpath "$PATH_TO_LIB$/*;$PATH_TO_CLASSES$" \
81 * jalview.bin.Jalview jalview.bin.Jalview
83 * (ensure -classpath arg is quoted to avoid shell expansion of '*' and do not
84 * embellish '*' to e.g. '*.jar')
93 Platform.getURLCommandArguments();
96 // singleton instance of this class
98 private static Jalview instance;
100 private Desktop desktop;
102 public static AlignFrame currentAlignFrame;
106 if (!Platform.isJS())
113 // grab all the rights we can for the JVM
114 Policy.setPolicy(new Policy()
117 public PermissionCollection getPermissions(CodeSource codesource)
119 Permissions perms = new Permissions();
120 perms.add(new AllPermission());
125 public void refresh()
133 * keep track of feature fetching tasks.
141 * TODO: generalise to track all jalview events to orchestrate batch processing
145 private int queued = 0;
147 private int running = 0;
149 public FeatureFetcher()
154 public void addFetcher(final AlignFrame af,
155 final Vector<String> dasSources)
157 final long id = System.currentTimeMillis();
159 final FeatureFetcher us = this;
160 new Thread(new Runnable()
172 af.setProgressBar(MessageManager
173 .getString("status.das_features_being_retrived"), id);
174 af.featureSettings_actionPerformed(null);
175 af.setProgressBar(null, id);
184 public synchronized boolean allFinished()
186 return queued == 0 && running == 0;
191 public static Jalview getInstance()
197 * main class for Jalview application
200 * open <em>filename</em>
202 public static void main(String[] args)
204 // setLogging(); // BH - for event debugging in JavaScript
205 instance = new Jalview();
206 instance.doMain(args);
209 private static void logClass(String name)
211 // BH - for event debugging in JavaScript
212 ConsoleHandler consoleHandler = new ConsoleHandler();
213 consoleHandler.setLevel(Level.ALL);
214 Logger logger = Logger.getLogger(name);
215 logger.setLevel(Level.ALL);
216 logger.addHandler(consoleHandler);
219 @SuppressWarnings("unused")
220 private static void setLogging()
228 System.out.println("not in js");
231 // BH - for event debugging in JavaScript (Java mode only)
232 if (!Platform.isJS())
239 Logger.getLogger("").setLevel(Level.ALL);
240 logClass("java.awt.EventDispatchThread");
241 logClass("java.awt.EventQueue");
242 logClass("java.awt.Component");
243 logClass("java.awt.focus.Component");
244 logClass("java.awt.focus.DefaultKeyboardFocusManager");
252 void doMain(String[] args)
255 if (!Platform.isJS())
257 System.setSecurityManager(null);
261 .println("Java version: " + System.getProperty("java.version"));
262 System.out.println("Java Home: " + System.getProperty("java.home"));
263 System.out.println(System.getProperty("os.arch") + " "
264 + System.getProperty("os.name") + " "
265 + System.getProperty("os.version"));
266 String val = System.getProperty("sys.install4jVersion");
269 System.out.println("Install4j version: " + val);
271 val = System.getProperty("installer_template_version");
274 System.out.println("Install4j template version: " + val);
276 val = System.getProperty("launcher_version");
279 System.out.println("Launcher version: " + val);
282 // report Jalview version
283 Cache.loadBuildProperties(true);
285 ArgsParser aparser = new ArgsParser(args);
286 boolean headless = false;
288 String usrPropsFile = aparser.getValue("props");
289 Cache.loadProperties(usrPropsFile); // must do this before
290 if (usrPropsFile != null)
293 "CMD [-props " + usrPropsFile + "] executed successfully!");
296 if (!Platform.isJS())
303 if (aparser.contains("help") || aparser.contains("h"))
308 if (aparser.contains("nodisplay") || aparser.contains("nogui")
309 || aparser.contains("headless"))
311 System.setProperty("java.awt.headless", "true");
316 final String jabawsUrl = aparser.getValue("jabaws");
317 if (jabawsUrl != null)
321 Jws2Discoverer.getDiscoverer().setPreferredUrl(jabawsUrl);
323 "CMD [-jabaws " + jabawsUrl + "] executed successfully!");
324 } catch (MalformedURLException e)
327 "Invalid jabaws parameter: " + jabawsUrl + " ignored");
332 String defs = aparser.getValue("setprop");
335 int p = defs.indexOf('=');
338 System.err.println("Ignoring invalid setprop argument : " + defs);
342 System.out.println("Executing setprop argument: " + defs);
345 Cache.setProperty(defs.substring(0, p), defs.substring(p + 1));
348 defs = aparser.getValue("setprop");
350 if (System.getProperty("java.awt.headless") != null
351 && System.getProperty("java.awt.headless").equals("true"))
355 System.setProperty("http.agent",
356 "Jalview Desktop/" + Cache.getDefault("VERSION", "Unknown"));
360 } catch (NoClassDefFoundError error)
362 error.printStackTrace();
363 System.out.println("\nEssential logging libraries not found."
364 + "\nUse: java -classpath \"$PATH_TO_LIB$/*:$PATH_TO_CLASSES$\" jalview.bin.Jalview");
370 // property laf = "crossplatform", "system", "gtk", "metal" or "mac"
371 // If not set (or chosen laf fails), use the normal SystemLaF and if on Mac,
373 String lafProp = System.getProperty("laf");
374 String lafSetting = Cache.getDefault("PREFERRED_LAF", null);
380 else if (lafSetting != null)
384 boolean lafSet = false;
387 case "crossplatform":
388 lafSet = setCrossPlatformLookAndFeel();
391 System.err.println("Could not set requested laf=" + laf);
395 lafSet = setSystemLookAndFeel();
398 System.err.println("Could not set requested laf=" + laf);
402 lafSet = setGtkLookAndFeel();
404 System.err.println("Could not set requested laf=" + laf);
408 lafSet = setMetalLookAndFeel();
410 System.err.println("Could not set requested laf=" + laf);
414 lafSet = setNimbusLookAndFeel();
416 System.err.println("Could not set requested laf=" + laf);
420 lafSet = setQuaquaLookAndFeel();
422 System.err.println("Could not set requested laf=" + laf);
426 lafSet = setVaquaLookAndFeel();
428 System.err.println("Could not set requested laf=" + laf);
432 lafSet = setMacLookAndFeel();
435 System.err.println("Could not set requested laf=" + laf);
441 System.err.println("Requested laf=" + laf + " not implemented");
445 setSystemLookAndFeel();
446 if (Platform.isLinux() && !Platform.isJS())
448 setMetalLookAndFeel();
450 if (Platform.isAMacAndNotJS())
457 * configure 'full' SO model if preferences say to, else use the default (full SO)
458 * - as JS currently doesn't have OBO parsing, it must use 'Lite' version
460 boolean soDefault = !Platform.isJS();
461 if (Cache.getDefault("USE_FULL_SO", soDefault))
463 SequenceOntologyFactory.setInstance(new SequenceOntology());
469 desktop = new Desktop();
470 desktop.setInBatchMode(true); // indicate we are starting up
474 JalviewTaskbar.setTaskbar(this);
475 } catch (Throwable t)
477 System.out.println("Error setting Taskbar: " + t.getMessage());
480 desktop.setVisible(true);
482 if (!Platform.isJS())
489 desktop.startServiceDiscovery();
490 if (!aparser.contains("nousagestats"))
492 startUsageStats(desktop);
496 System.err.println("CMD [-nousagestats] executed successfully!");
499 if (!aparser.contains("noquestionnaire"))
501 String url = aparser.getValue("questionnaire");
504 // Start the desktop questionnaire prompter with the specified
506 Cache.log.debug("Starting questionnaire url at " + url);
507 desktop.checkForQuestionnaire(url);
508 System.out.println("CMD questionnaire[-" + url
509 + "] executed successfully!");
513 if (Cache.getProperty("NOQUESTIONNAIRES") == null)
515 // Start the desktop questionnaire prompter with the specified
518 // "http://anaplog.compbio.dundee.ac.uk/cgi-bin/questionnaire.pl";
520 String defurl = "http://www.jalview.org/cgi-bin/questionnaire.pl";
522 "Starting questionnaire with default url: " + defurl);
523 desktop.checkForQuestionnaire(defurl);
530 .println("CMD [-noquestionnaire] executed successfully!");
533 if (!aparser.contains("nonews"))
535 desktop.checkForNews();
538 BioJsHTMLOutput.updateBioJS();
542 // Move any new getdown-launcher-new.jar into place over old
543 // getdown-launcher.jar
544 String appdirString = System.getProperty("getdownappdir");
545 if (appdirString != null && appdirString.length() > 0)
547 final File appdir = new File(appdirString);
553 LaunchUtil.upgradeGetdown(
554 new File(appdir, "getdown-launcher-old.jar"),
555 new File(appdir, "getdown-launcher.jar"),
556 new File(appdir, "getdown-launcher-new.jar"));
561 String file = null, data = null;
562 FileFormatI format = null;
563 DataSourceType protocol = null;
564 FileLoader fileLoader = new FileLoader(!headless);
566 String groovyscript = null; // script to execute after all loading is
567 // completed one way or another
568 // extract groovy argument and execute if necessary
569 groovyscript = aparser.getValue("groovy", true);
570 file = aparser.getValue("open", true);
572 if (file == null && desktop == null)
574 System.out.println("No files to open!");
578 // Finally, deal with the remaining input data.
583 desktop.setProgressBar(
585 .getString("status.processing_commandline_args"),
586 progress = System.currentTimeMillis());
588 System.out.println("CMD [-open " + file + "] executed successfully!");
590 if (!Platform.isJS())
592 * ignore in JavaScript -- can't just file existence - could load it?
597 if (!file.startsWith("http://") && !file.startsWith("https://"))
598 // BH 2019 added https check for Java
600 if (!(new File(file)).exists())
602 System.out.println("Can't find " + file);
611 protocol = AppletFormatAdapter.checkProtocol(file);
615 format = new IdentifyFile().identify(file, protocol);
616 } catch (FileFormatException e1)
621 AlignFrame af = fileLoader.LoadFileWaitTillLoaded(file, protocol,
625 System.out.println("error");
629 setCurrentAlignFrame(af);
630 data = aparser.getValue("colour", true);
633 data.replaceAll("%20", " ");
635 ColourSchemeI cs = ColourSchemeProperty.getColourScheme(
636 af.getViewport(), af.getViewport().getAlignment(), data);
641 "CMD [-color " + data + "] executed successfully!");
646 // Must maintain ability to use the groups flag
647 data = aparser.getValue("groups", true);
650 af.parseFeaturesFile(data,
651 AppletFormatAdapter.checkProtocol(data));
652 // System.out.println("Added " + data);
654 "CMD groups[-" + data + "] executed successfully!");
656 data = aparser.getValue("features", true);
659 af.parseFeaturesFile(data,
660 AppletFormatAdapter.checkProtocol(data));
661 // System.out.println("Added " + data);
663 "CMD [-features " + data + "] executed successfully!");
666 data = aparser.getValue("annotations", true);
669 af.loadJalviewDataFile(data, null, null, null);
670 // System.out.println("Added " + data);
672 "CMD [-annotations " + data + "] executed successfully!");
674 // set or clear the sortbytree flag.
675 if (aparser.contains("sortbytree"))
677 af.getViewport().setSortByTree(true);
678 if (af.getViewport().getSortByTree())
680 System.out.println("CMD [-sortbytree] executed successfully!");
683 if (aparser.contains("no-annotation"))
685 af.getViewport().setShowAnnotation(false);
686 if (!af.getViewport().isShowAnnotation())
688 System.out.println("CMD no-annotation executed successfully!");
691 if (aparser.contains("nosortbytree"))
693 af.getViewport().setSortByTree(false);
694 if (!af.getViewport().getSortByTree())
697 .println("CMD [-nosortbytree] executed successfully!");
700 data = aparser.getValue("tree", true);
706 "CMD [-tree " + data + "] executed successfully!");
707 NewickFile nf = new NewickFile(data,
708 AppletFormatAdapter.checkProtocol(data));
710 .setCurrentTree(af.showNewickTree(nf, data).getTree());
711 } catch (IOException ex)
713 System.err.println("Couldn't add tree " + data);
714 ex.printStackTrace(System.err);
717 // TODO - load PDB structure(s) to alignment JAL-629
718 // (associate with identical sequence in alignment, or a specified
720 if (groovyscript != null)
722 // Execute the groovy script after we've done all the rendering stuff
723 // and before any images or figures are generated.
724 System.out.println("Executing script " + groovyscript);
725 executeGroovyScript(groovyscript, af);
726 System.out.println("CMD groovy[" + groovyscript
727 + "] executed successfully!");
730 String imageName = "unnamed.png";
731 while (aparser.getSize() > 1)
733 String outputFormat = aparser.nextValue();
734 file = aparser.nextValue();
736 if (outputFormat.equalsIgnoreCase("png"))
738 af.createPNG(new File(file));
739 imageName = (new File(file)).getName();
740 System.out.println("Creating PNG image: " + file);
743 else if (outputFormat.equalsIgnoreCase("svg"))
745 File imageFile = new File(file);
746 imageName = imageFile.getName();
747 af.createSVG(imageFile);
748 System.out.println("Creating SVG image: " + file);
751 else if (outputFormat.equalsIgnoreCase("html"))
753 File imageFile = new File(file);
754 imageName = imageFile.getName();
755 HtmlSvgOutput htmlSVG = new HtmlSvgOutput(af.alignPanel);
756 htmlSVG.exportHTML(file);
758 System.out.println("Creating HTML image: " + file);
761 else if (outputFormat.equalsIgnoreCase("biojsmsa"))
765 System.err.println("The output html file must not be null");
770 BioJsHTMLOutput.refreshVersionInfo(
771 BioJsHTMLOutput.BJS_TEMPLATES_LOCAL_DIRECTORY);
772 } catch (URISyntaxException e)
776 BioJsHTMLOutput bjs = new BioJsHTMLOutput(af.alignPanel);
777 bjs.exportHTML(file);
779 .println("Creating BioJS MSA Viwer HTML file: " + file);
782 else if (outputFormat.equalsIgnoreCase("imgMap"))
784 af.createImageMap(new File(file), imageName);
785 System.out.println("Creating image map: " + file);
788 else if (outputFormat.equalsIgnoreCase("eps"))
790 File outputFile = new File(file);
792 "Creating EPS file: " + outputFile.getAbsolutePath());
793 af.createEPS(outputFile);
797 af.saveAlignment(file, format);
798 if (af.isSaveAlignmentSuccessful())
800 System.out.println("Written alignment in " + format
801 + " format to " + file);
805 System.out.println("Error writing file " + file + " in "
806 + format + " format!!");
811 while (aparser.getSize() > 0)
813 System.out.println("Unknown arg: " + aparser.nextValue());
817 AlignFrame startUpAlframe = null;
818 // We'll only open the default file if the desktop is visible.
820 // ////////////////////
822 if (!Platform.isJS() && !headless && file == null
823 && Cache.getDefault("SHOW_STARTUP_FILE", true))
830 file = Cache.getDefault("STARTUP_FILE",
831 Cache.getDefault("www.jalview.org", "http://www.jalview.org")
832 + "/examples/exampleFile_2_7.jar");
834 "http://www.jalview.org/examples/exampleFile_2_3.jar"))
836 // hardwire upgrade of the startup file
837 file.replace("_2_3.jar", "_2_7.jar");
838 // and remove the stale setting
839 Cache.removeProperty("STARTUP_FILE");
842 protocol = DataSourceType.FILE;
844 if (file.indexOf("http:") > -1)
846 protocol = DataSourceType.URL;
849 if (file.endsWith(".jar"))
851 format = FileFormat.Jalview;
857 format = new IdentifyFile().identify(file, protocol);
858 } catch (FileFormatException e)
864 startUpAlframe = fileLoader.LoadFileWaitTillLoaded(file, protocol,
866 // extract groovy arguments before anything else.
869 // Once all other stuff is done, execute any groovy scripts (in order)
870 if (groovyscript != null)
872 if (Cache.groovyJarsPresent())
874 System.out.println("Executing script " + groovyscript);
875 executeGroovyScript(groovyscript, startUpAlframe);
880 "Sorry. Groovy Support is not available, so ignoring the provided groovy script "
884 // and finally, turn off batch mode indicator - if the desktop still exists
889 desktop.setProgressBar(null, progress);
891 desktop.setInBatchMode(false);
895 private static boolean setCrossPlatformLookAndFeel()
897 return setGenericLookAndFeel(false);
900 private static boolean setSystemLookAndFeel()
902 return setGenericLookAndFeel(true);
905 private static boolean setGenericLookAndFeel(boolean system)
910 UIManager.setLookAndFeel(
911 system ? UIManager.getSystemLookAndFeelClassName()
912 : UIManager.getCrossPlatformLookAndFeelClassName());
914 } catch (Exception ex)
916 System.err.println("Unexpected Look and Feel Exception");
917 ex.printStackTrace();
922 private static boolean setSpecificLookAndFeel(String name,
923 String className, boolean nameStartsWith)
928 for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels())
930 if (info.getName() != null && nameStartsWith
931 ? info.getName().toLowerCase()
932 .startsWith(name.toLowerCase())
933 : info.getName().toLowerCase().equals(name.toLowerCase()))
935 className = info.getClassName();
939 UIManager.setLookAndFeel(className);
941 } catch (Exception ex)
943 System.err.println("Unexpected Look and Feel Exception");
944 ex.printStackTrace();
949 private static boolean setGtkLookAndFeel()
951 return setSpecificLookAndFeel("gtk",
952 "com.sun.java.swing.plaf.gtk.GTKLookAndFeel", true);
955 private static boolean setMetalLookAndFeel()
957 return setSpecificLookAndFeel("metal",
958 "javax.swing.plaf.metal.MetalLookAndFeel", false);
961 private static boolean setNimbusLookAndFeel()
963 return setSpecificLookAndFeel("nimbus",
964 "javax.swing.plaf.nimbus.NimbusLookAndFeel", false);
967 private static boolean setQuaquaLookAndFeel()
969 return setSpecificLookAndFeel("quaqua",
970 ch.randelshofer.quaqua.QuaquaManager.getLookAndFeel().getClass()
975 private static boolean setVaquaLookAndFeel()
977 return setSpecificLookAndFeel("vaqua",
978 "org.violetlib.aqua.AquaLookAndFeel", false);
981 private static boolean setMacLookAndFeel()
984 System.setProperty("com.apple.mrj.application.apple.menu.about.name",
986 System.setProperty("apple.laf.useScreenMenuBar", "true");
987 set = setQuaquaLookAndFeel();
988 if ((!set) || !UIManager.getLookAndFeel().getClass().toString()
989 .toLowerCase().contains("quaqua"))
991 set = setVaquaLookAndFeel();
996 private static void showUsage()
999 "Usage: jalview -open [FILE] [OUTPUT_FORMAT] [OUTPUT_FILE]\n\n"
1000 + "-nodisplay\tRun Jalview without User Interface.\n"
1001 + "-props FILE\tUse the given Jalview properties file instead of users default.\n"
1002 + "-colour COLOURSCHEME\tThe colourscheme to be applied to the alignment\n"
1003 + "-annotations FILE\tAdd precalculated annotations to the alignment.\n"
1004 + "-tree FILE\tLoad the given newick format tree file onto the alignment\n"
1005 + "-features FILE\tUse the given file to mark features on the alignment.\n"
1006 + "-fasta FILE\tCreate alignment file FILE in Fasta format.\n"
1007 + "-clustal FILE\tCreate alignment file FILE in Clustal format.\n"
1008 + "-pfam FILE\tCreate alignment file FILE in PFAM format.\n"
1009 + "-msf FILE\tCreate alignment file FILE in MSF format.\n"
1010 + "-pileup FILE\tCreate alignment file FILE in Pileup format\n"
1011 + "-pir FILE\tCreate alignment file FILE in PIR format.\n"
1012 + "-blc FILE\tCreate alignment file FILE in BLC format.\n"
1013 + "-json FILE\tCreate alignment file FILE in JSON format.\n"
1014 + "-jalview FILE\tCreate alignment file FILE in Jalview format.\n"
1015 + "-png FILE\tCreate PNG image FILE from alignment.\n"
1016 + "-svg FILE\tCreate SVG image FILE from alignment.\n"
1017 + "-html FILE\tCreate HTML file from alignment.\n"
1018 + "-biojsMSA FILE\tCreate BioJS MSA Viewer HTML file from alignment.\n"
1019 + "-imgMap FILE\tCreate HTML file FILE with image map of PNG image.\n"
1020 + "-eps FILE\tCreate EPS file FILE from alignment.\n"
1021 + "-questionnaire URL\tQueries the given URL for information about any Jalview user questionnaires.\n"
1022 + "-noquestionnaire\tTurn off questionnaire check.\n"
1023 + "-nonews\tTurn off check for Jalview news.\n"
1024 + "-nousagestats\tTurn off google analytics tracking for this session.\n"
1025 + "-sortbytree OR -nosortbytree\tEnable or disable sorting of the given alignment by the given tree\n"
1027 // "-setprop PROPERTY=VALUE\tSet the given Jalview property,
1028 // after all other properties files have been read\n\t
1029 // (quote the 'PROPERTY=VALUE' pair to ensure spaces are
1030 // passed in correctly)"
1031 + "-jabaws URL\tSpecify URL for Jabaws services (e.g. for a local installation).\n"
1032 + "-fetchfrom nickname\tQuery nickname for features for the alignments and display them.\n"
1033 + "-groovy FILE\tExecute groovy script in FILE, after all other arguments have been processed (if FILE is the text 'STDIN' then the file will be read from STDIN)\n"
1034 + "-jvmmempc=PERCENT\tOnly available with standalone executable jar or jalview.bin.Launcher. Limit maximum heap size (memory) to PERCENT% of total physical memory detected. This defaults to 90 if total physical memory can be detected. See https://www.jalview.org/help/html/memory.html for more details.\n"
1035 + "-jvmmemmax=MAXMEMORY\tOnly available with standalone executable jar or jalview.bin.Launcher. Limit maximum heap size (memory) to MAXMEMORY. MAXMEMORY can be specified in bytes, kilobytes(k), megabytes(m), gigabytes(g) or if you're lucky enough, terabytes(t). This defaults to 32g if total physical memory can be detected, or to 8g if total physical memory cannot be detected. See https://www.jalview.org/help/html/memory.html for more details.\n"
1036 + "\n~Read documentation in Application or visit http://www.jalview.org for description of Features and Annotations file~\n\n");
1039 private static void startUsageStats(final Desktop desktop)
1042 * start a User Config prompt asking if we can log usage statistics.
1044 PromptUserConfig prompter = new PromptUserConfig(Desktop.desktop,
1045 "USAGESTATS", "Jalview Usage Statistics",
1046 "Do you want to help make Jalview better by enabling "
1047 + "the collection of usage statistics with Google Analytics ?"
1048 + "\n\n(you can enable or disable usage tracking in the preferences)",
1055 "Initialising googletracker for usage stats.");
1056 Cache.initGoogleTracker();
1057 Cache.log.debug("Tracking enabled.");
1064 Cache.log.debug("Not enabling Google Tracking.");
1067 desktop.addDialogThread(prompter);
1071 * Locate the given string as a file and pass it to the groovy interpreter.
1073 * @param groovyscript
1074 * the script to execute
1075 * @param jalviewContext
1076 * the Jalview Desktop object passed in to the groovy binding as the
1079 private void executeGroovyScript(String groovyscript, AlignFrame af)
1082 * for scripts contained in files
1089 if (groovyscript.trim().equals("STDIN"))
1091 // read from stdin into a tempfile and execute it
1094 tfile = File.createTempFile("jalview", "groovy");
1095 PrintWriter outfile = new PrintWriter(
1096 new OutputStreamWriter(new FileOutputStream(tfile)));
1097 BufferedReader br = new BufferedReader(
1098 new InputStreamReader(System.in));
1100 while ((line = br.readLine()) != null)
1102 outfile.write(line + "\n");
1108 } catch (Exception ex)
1110 System.err.println("Failed to read from STDIN into tempfile "
1111 + ((tfile == null) ? "(tempfile wasn't created)"
1112 : tfile.toString()));
1113 ex.printStackTrace();
1118 sfile = tfile.toURI().toURL();
1119 } catch (Exception x)
1122 "Unexpected Malformed URL Exception for temporary file created from STDIN: "
1124 x.printStackTrace();
1132 sfile = new URI(groovyscript).toURL();
1133 } catch (Exception x)
1135 tfile = new File(groovyscript);
1136 if (!tfile.exists())
1138 System.err.println("File '" + groovyscript + "' does not exist.");
1141 if (!tfile.canRead())
1143 System.err.println("File '" + groovyscript + "' cannot be read.");
1146 if (tfile.length() < 1)
1148 System.err.println("File '" + groovyscript + "' is empty.");
1153 sfile = tfile.getAbsoluteFile().toURI().toURL();
1154 } catch (Exception ex)
1156 System.err.println("Failed to create a file URL for "
1157 + tfile.getAbsoluteFile());
1164 Map<String, java.lang.Object> vbinding = new HashMap<>();
1165 vbinding.put("Jalview", this);
1168 vbinding.put("currentAlFrame", af);
1170 Binding gbinding = new Binding(vbinding);
1171 GroovyScriptEngine gse = new GroovyScriptEngine(new URL[] { sfile });
1172 gse.run(sfile.toString(), gbinding);
1173 if ("STDIN".equals(groovyscript))
1175 // delete temp file that we made -
1176 // only if it was successfully executed
1179 } catch (Exception e)
1181 System.err.println("Exception Whilst trying to execute file " + sfile
1182 + " as a groovy script.");
1183 e.printStackTrace(System.err);
1188 public static boolean isHeadlessMode()
1190 String isheadless = System.getProperty("java.awt.headless");
1191 if (isheadless != null && isheadless.equalsIgnoreCase("true"))
1198 public AlignFrame[] getAlignFrames()
1200 return desktop == null ? new AlignFrame[] { getCurrentAlignFrame() }
1201 : Desktop.getAlignFrames();
1206 * Quit method delegates to Desktop.quit - unless running in headless mode
1207 * when it just ends the JVM
1211 if (desktop != null)
1221 public static AlignFrame getCurrentAlignFrame()
1223 return Jalview.currentAlignFrame;
1226 public static void setCurrentAlignFrame(AlignFrame currentAlignFrame)
1228 Jalview.currentAlignFrame = currentAlignFrame;