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.LookAndFeel;
47 import javax.swing.UIManager;
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");
372 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
373 } catch (Exception ex)
375 System.err.println("Unexpected Look and Feel Exception");
376 ex.printStackTrace();
378 if (Platform.isAMacAndNotJS())
381 LookAndFeel lookAndFeel = ch.randelshofer.quaqua.QuaquaManager
383 System.setProperty("com.apple.mrj.application.apple.menu.about.name",
385 System.setProperty("apple.laf.useScreenMenuBar", "true");
386 if (lookAndFeel != null)
390 UIManager.setLookAndFeel(lookAndFeel);
391 } catch (Throwable e)
394 "Failed to set QuaQua look and feel: " + e.toString());
397 if (lookAndFeel == null
398 || !(lookAndFeel.getClass().isAssignableFrom(
399 UIManager.getLookAndFeel().getClass()))
400 || !UIManager.getLookAndFeel().getClass().toString()
401 .toLowerCase().contains("quaqua"))
406 "Quaqua LaF not available on this plaform. Using VAqua(4).\nSee https://issues.jalview.org/browse/JAL-2976");
407 UIManager.setLookAndFeel("org.violetlib.aqua.AquaLookAndFeel");
408 } catch (Throwable e)
411 "Failed to reset look and feel: " + e.toString());
417 * configure 'full' SO model if preferences say to, else use the default (full SO)
418 * - as JS currently doesn't have OBO parsing, it must use 'Lite' version
420 boolean soDefault = !Platform.isJS();
421 if (Cache.getDefault("USE_FULL_SO", soDefault))
423 SequenceOntologyFactory.setInstance(new SequenceOntology());
428 desktop = new Desktop();
429 desktop.setInBatchMode(true); // indicate we are starting up
433 JalviewTaskbar.setTaskbar(this);
434 } catch (Throwable t)
436 System.out.println("Error setting Taskbar: " + t.getMessage());
439 desktop.setVisible(true);
441 if (!Platform.isJS())
448 desktop.startServiceDiscovery();
449 if (!aparser.contains("nousagestats"))
451 startUsageStats(desktop);
455 System.err.println("CMD [-nousagestats] executed successfully!");
458 if (!aparser.contains("noquestionnaire"))
460 String url = aparser.getValue("questionnaire");
463 // Start the desktop questionnaire prompter with the specified
465 Cache.log.debug("Starting questionnaire url at " + url);
466 desktop.checkForQuestionnaire(url);
467 System.out.println("CMD questionnaire[-" + url
468 + "] executed successfully!");
472 if (Cache.getProperty("NOQUESTIONNAIRES") == null)
474 // Start the desktop questionnaire prompter with the specified
477 // "http://anaplog.compbio.dundee.ac.uk/cgi-bin/questionnaire.pl";
479 String defurl = "http://www.jalview.org/cgi-bin/questionnaire.pl";
481 "Starting questionnaire with default url: " + defurl);
482 desktop.checkForQuestionnaire(defurl);
489 .println("CMD [-noquestionnaire] executed successfully!");
492 if (!aparser.contains("nonews"))
494 desktop.checkForNews();
497 BioJsHTMLOutput.updateBioJS();
501 // Move any new getdown-launcher-new.jar into place over old
502 // getdown-launcher.jar
503 String appdirString = System.getProperty("getdownappdir");
504 if (appdirString != null && appdirString.length() > 0)
506 final File appdir = new File(appdirString);
512 LaunchUtil.upgradeGetdown(
513 new File(appdir, "getdown-launcher-old.jar"),
514 new File(appdir, "getdown-launcher.jar"),
515 new File(appdir, "getdown-launcher-new.jar"));
520 String file = null, data = null;
521 FileFormatI format = null;
522 DataSourceType protocol = null;
523 FileLoader fileLoader = new FileLoader(!headless);
525 String groovyscript = null; // script to execute after all loading is
526 // completed one way or another
527 // extract groovy argument and execute if necessary
528 groovyscript = aparser.getValue("groovy", true);
529 file = aparser.getValue("open", true);
531 if (file == null && desktop == null)
533 System.out.println("No files to open!");
537 // Finally, deal with the remaining input data.
542 desktop.setProgressBar(
544 .getString("status.processing_commandline_args"),
545 progress = System.currentTimeMillis());
547 System.out.println("CMD [-open " + file + "] executed successfully!");
549 if (!Platform.isJS())
551 * ignore in JavaScript -- can't just file existence - could load it?
556 if (!file.startsWith("http://") && !file.startsWith("https://"))
557 // BH 2019 added https check for Java
559 if (!(new File(file)).exists())
561 System.out.println("Can't find " + file);
570 protocol = AppletFormatAdapter.checkProtocol(file);
574 format = new IdentifyFile().identify(file, protocol);
575 } catch (FileFormatException e1)
580 AlignFrame af = fileLoader.LoadFileWaitTillLoaded(file, protocol,
584 System.out.println("error");
588 setCurrentAlignFrame(af);
589 data = aparser.getValue("colour", true);
592 data.replaceAll("%20", " ");
594 ColourSchemeI cs = ColourSchemeProperty.getColourScheme(
595 af.getViewport(), af.getViewport().getAlignment(), data);
600 "CMD [-color " + data + "] executed successfully!");
605 // Must maintain ability to use the groups flag
606 data = aparser.getValue("groups", true);
609 af.parseFeaturesFile(data,
610 AppletFormatAdapter.checkProtocol(data));
611 // System.out.println("Added " + data);
613 "CMD groups[-" + data + "] executed successfully!");
615 data = aparser.getValue("features", true);
618 af.parseFeaturesFile(data,
619 AppletFormatAdapter.checkProtocol(data));
620 // System.out.println("Added " + data);
622 "CMD [-features " + data + "] executed successfully!");
625 data = aparser.getValue("annotations", true);
628 af.loadJalviewDataFile(data, null, null, null);
629 // System.out.println("Added " + data);
631 "CMD [-annotations " + data + "] executed successfully!");
633 // set or clear the sortbytree flag.
634 if (aparser.contains("sortbytree"))
636 af.getViewport().setSortByTree(true);
637 if (af.getViewport().getSortByTree())
639 System.out.println("CMD [-sortbytree] executed successfully!");
642 if (aparser.contains("no-annotation"))
644 af.getViewport().setShowAnnotation(false);
645 if (!af.getViewport().isShowAnnotation())
647 System.out.println("CMD no-annotation executed successfully!");
650 if (aparser.contains("nosortbytree"))
652 af.getViewport().setSortByTree(false);
653 if (!af.getViewport().getSortByTree())
656 .println("CMD [-nosortbytree] executed successfully!");
659 data = aparser.getValue("tree", true);
665 "CMD [-tree " + data + "] executed successfully!");
666 NewickFile nf = new NewickFile(data,
667 AppletFormatAdapter.checkProtocol(data));
669 .setCurrentTree(af.showNewickTree(nf, data).getTree());
670 } catch (IOException ex)
672 System.err.println("Couldn't add tree " + data);
673 ex.printStackTrace(System.err);
676 // TODO - load PDB structure(s) to alignment JAL-629
677 // (associate with identical sequence in alignment, or a specified
679 if (groovyscript != null)
681 // Execute the groovy script after we've done all the rendering stuff
682 // and before any images or figures are generated.
683 System.out.println("Executing script " + groovyscript);
684 executeGroovyScript(groovyscript, af);
685 System.out.println("CMD groovy[" + groovyscript
686 + "] executed successfully!");
689 String imageName = "unnamed.png";
690 while (aparser.getSize() > 1)
692 String outputFormat = aparser.nextValue();
693 file = aparser.nextValue();
695 if (outputFormat.equalsIgnoreCase("png"))
697 af.createPNG(new File(file));
698 imageName = (new File(file)).getName();
699 System.out.println("Creating PNG image: " + file);
702 else if (outputFormat.equalsIgnoreCase("svg"))
704 File imageFile = new File(file);
705 imageName = imageFile.getName();
706 af.createSVG(imageFile);
707 System.out.println("Creating SVG image: " + file);
710 else if (outputFormat.equalsIgnoreCase("html"))
712 File imageFile = new File(file);
713 imageName = imageFile.getName();
714 HtmlSvgOutput htmlSVG = new HtmlSvgOutput(af.alignPanel);
715 htmlSVG.exportHTML(file);
717 System.out.println("Creating HTML image: " + file);
720 else if (outputFormat.equalsIgnoreCase("biojsmsa"))
724 System.err.println("The output html file must not be null");
729 BioJsHTMLOutput.refreshVersionInfo(
730 BioJsHTMLOutput.BJS_TEMPLATES_LOCAL_DIRECTORY);
731 } catch (URISyntaxException e)
735 BioJsHTMLOutput bjs = new BioJsHTMLOutput(af.alignPanel);
736 bjs.exportHTML(file);
738 .println("Creating BioJS MSA Viwer HTML file: " + file);
741 else if (outputFormat.equalsIgnoreCase("imgMap"))
743 af.createImageMap(new File(file), imageName);
744 System.out.println("Creating image map: " + file);
747 else if (outputFormat.equalsIgnoreCase("eps"))
749 File outputFile = new File(file);
751 "Creating EPS file: " + outputFile.getAbsolutePath());
752 af.createEPS(outputFile);
756 af.saveAlignment(file, format);
757 if (af.isSaveAlignmentSuccessful())
759 System.out.println("Written alignment in " + format
760 + " format to " + file);
764 System.out.println("Error writing file " + file + " in "
765 + format + " format!!");
770 while (aparser.getSize() > 0)
772 System.out.println("Unknown arg: " + aparser.nextValue());
776 AlignFrame startUpAlframe = null;
777 // We'll only open the default file if the desktop is visible.
779 // ////////////////////
781 if (!Platform.isJS() && !headless && file == null
782 && Cache.getDefault("SHOW_STARTUP_FILE", true))
789 file = Cache.getDefault("STARTUP_FILE",
790 Cache.getDefault("www.jalview.org", "http://www.jalview.org")
791 + "/examples/exampleFile_2_7.jar");
793 "http://www.jalview.org/examples/exampleFile_2_3.jar"))
795 // hardwire upgrade of the startup file
796 file.replace("_2_3.jar", "_2_7.jar");
797 // and remove the stale setting
798 Cache.removeProperty("STARTUP_FILE");
801 protocol = DataSourceType.FILE;
803 if (file.indexOf("http:") > -1)
805 protocol = DataSourceType.URL;
808 if (file.endsWith(".jar"))
810 format = FileFormat.Jalview;
816 format = new IdentifyFile().identify(file, protocol);
817 } catch (FileFormatException e)
823 startUpAlframe = fileLoader.LoadFileWaitTillLoaded(file, protocol,
825 // extract groovy arguments before anything else.
828 // Once all other stuff is done, execute any groovy scripts (in order)
829 if (groovyscript != null)
831 if (Cache.groovyJarsPresent())
833 System.out.println("Executing script " + groovyscript);
834 executeGroovyScript(groovyscript, startUpAlframe);
839 "Sorry. Groovy Support is not available, so ignoring the provided groovy script "
843 // and finally, turn off batch mode indicator - if the desktop still exists
848 desktop.setProgressBar(null, progress);
850 desktop.setInBatchMode(false);
854 private static void showUsage()
857 "Usage: jalview -open [FILE] [OUTPUT_FORMAT] [OUTPUT_FILE]\n\n"
858 + "-nodisplay\tRun Jalview without User Interface.\n"
859 + "-props FILE\tUse the given Jalview properties file instead of users default.\n"
860 + "-colour COLOURSCHEME\tThe colourscheme to be applied to the alignment\n"
861 + "-annotations FILE\tAdd precalculated annotations to the alignment.\n"
862 + "-tree FILE\tLoad the given newick format tree file onto the alignment\n"
863 + "-features FILE\tUse the given file to mark features on the alignment.\n"
864 + "-fasta FILE\tCreate alignment file FILE in Fasta format.\n"
865 + "-clustal FILE\tCreate alignment file FILE in Clustal format.\n"
866 + "-pfam FILE\tCreate alignment file FILE in PFAM format.\n"
867 + "-msf FILE\tCreate alignment file FILE in MSF format.\n"
868 + "-pileup FILE\tCreate alignment file FILE in Pileup format\n"
869 + "-pir FILE\tCreate alignment file FILE in PIR format.\n"
870 + "-blc FILE\tCreate alignment file FILE in BLC format.\n"
871 + "-json FILE\tCreate alignment file FILE in JSON format.\n"
872 + "-jalview FILE\tCreate alignment file FILE in Jalview format.\n"
873 + "-png FILE\tCreate PNG image FILE from alignment.\n"
874 + "-svg FILE\tCreate SVG image FILE from alignment.\n"
875 + "-html FILE\tCreate HTML file from alignment.\n"
876 + "-biojsMSA FILE\tCreate BioJS MSA Viewer HTML file from alignment.\n"
877 + "-imgMap FILE\tCreate HTML file FILE with image map of PNG image.\n"
878 + "-eps FILE\tCreate EPS file FILE from alignment.\n"
879 + "-questionnaire URL\tQueries the given URL for information about any Jalview user questionnaires.\n"
880 + "-noquestionnaire\tTurn off questionnaire check.\n"
881 + "-nonews\tTurn off check for Jalview news.\n"
882 + "-nousagestats\tTurn off google analytics tracking for this session.\n"
883 + "-sortbytree OR -nosortbytree\tEnable or disable sorting of the given alignment by the given tree\n"
885 // "-setprop PROPERTY=VALUE\tSet the given Jalview property,
886 // after all other properties files have been read\n\t
887 // (quote the 'PROPERTY=VALUE' pair to ensure spaces are
888 // passed in correctly)"
889 + "-jabaws URL\tSpecify URL for Jabaws services (e.g. for a local installation).\n"
890 + "-fetchfrom nickname\tQuery nickname for features for the alignments and display them.\n"
891 + "-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"
892 + "-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"
893 + "-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"
894 + "\n~Read documentation in Application or visit http://www.jalview.org for description of Features and Annotations file~\n\n");
897 private static void startUsageStats(final Desktop desktop)
900 * start a User Config prompt asking if we can log usage statistics.
902 PromptUserConfig prompter = new PromptUserConfig(Desktop.desktop,
903 "USAGESTATS", "Jalview Usage Statistics",
904 "Do you want to help make Jalview better by enabling "
905 + "the collection of usage statistics with Google Analytics ?"
906 + "\n\n(you can enable or disable usage tracking in the preferences)",
913 "Initialising googletracker for usage stats.");
914 Cache.initGoogleTracker();
915 Cache.log.debug("Tracking enabled.");
922 Cache.log.debug("Not enabling Google Tracking.");
925 desktop.addDialogThread(prompter);
929 * Locate the given string as a file and pass it to the groovy interpreter.
931 * @param groovyscript
932 * the script to execute
933 * @param jalviewContext
934 * the Jalview Desktop object passed in to the groovy binding as the
937 private void executeGroovyScript(String groovyscript, AlignFrame af)
940 * for scripts contained in files
947 if (groovyscript.trim().equals("STDIN"))
949 // read from stdin into a tempfile and execute it
952 tfile = File.createTempFile("jalview", "groovy");
953 PrintWriter outfile = new PrintWriter(
954 new OutputStreamWriter(new FileOutputStream(tfile)));
955 BufferedReader br = new BufferedReader(
956 new InputStreamReader(System.in));
958 while ((line = br.readLine()) != null)
960 outfile.write(line + "\n");
966 } catch (Exception ex)
968 System.err.println("Failed to read from STDIN into tempfile "
969 + ((tfile == null) ? "(tempfile wasn't created)"
970 : tfile.toString()));
971 ex.printStackTrace();
976 sfile = tfile.toURI().toURL();
977 } catch (Exception x)
980 "Unexpected Malformed URL Exception for temporary file created from STDIN: "
990 sfile = new URI(groovyscript).toURL();
991 } catch (Exception x)
993 tfile = new File(groovyscript);
996 System.err.println("File '" + groovyscript + "' does not exist.");
999 if (!tfile.canRead())
1001 System.err.println("File '" + groovyscript + "' cannot be read.");
1004 if (tfile.length() < 1)
1006 System.err.println("File '" + groovyscript + "' is empty.");
1011 sfile = tfile.getAbsoluteFile().toURI().toURL();
1012 } catch (Exception ex)
1014 System.err.println("Failed to create a file URL for "
1015 + tfile.getAbsoluteFile());
1022 Map<String, java.lang.Object> vbinding = new HashMap<>();
1023 vbinding.put("Jalview", this);
1026 vbinding.put("currentAlFrame", af);
1028 Binding gbinding = new Binding(vbinding);
1029 GroovyScriptEngine gse = new GroovyScriptEngine(new URL[] { sfile });
1030 gse.run(sfile.toString(), gbinding);
1031 if ("STDIN".equals(groovyscript))
1033 // delete temp file that we made -
1034 // only if it was successfully executed
1037 } catch (Exception e)
1039 System.err.println("Exception Whilst trying to execute file " + sfile
1040 + " as a groovy script.");
1041 e.printStackTrace(System.err);
1046 public static boolean isHeadlessMode()
1048 String isheadless = System.getProperty("java.awt.headless");
1049 if (isheadless != null && isheadless.equalsIgnoreCase("true"))
1056 public AlignFrame[] getAlignFrames()
1058 return desktop == null ? new AlignFrame[] { getCurrentAlignFrame() }
1059 : Desktop.getAlignFrames();
1064 * Quit method delegates to Desktop.quit - unless running in headless mode
1065 * when it just ends the JVM
1069 if (desktop != null)
1079 public static AlignFrame getCurrentAlignFrame()
1081 return Jalview.currentAlignFrame;
1084 public static void setCurrentAlignFrame(AlignFrame currentAlignFrame)
1086 Jalview.currentAlignFrame = currentAlignFrame;