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 jalview.api.AlignFrameI;
24 import jalview.api.AlignViewportI;
25 import jalview.api.JalviewApp;
26 import jalview.api.StructureSelectionManagerProvider;
27 import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
28 import jalview.datamodel.ColumnSelection;
29 import jalview.datamodel.HiddenColumns;
30 import jalview.datamodel.PDBEntry;
31 import jalview.datamodel.SequenceGroup;
32 import jalview.datamodel.SequenceI;
33 import jalview.ext.so.SequenceOntology;
34 import jalview.gui.AlignFrame;
35 import jalview.gui.AlignViewport;
36 import jalview.gui.AlignmentPanel;
37 import jalview.gui.CalculationChooser;
38 import jalview.gui.Desktop;
39 import jalview.gui.Preferences;
40 import jalview.gui.PromptUserConfig;
41 import jalview.gui.StructureViewer;
42 import jalview.io.AppletFormatAdapter;
43 import jalview.io.BioJsHTMLOutput;
44 import jalview.io.DataSourceType;
45 import jalview.io.FileFormat;
46 import jalview.io.FileFormatException;
47 import jalview.io.FileFormatI;
48 import jalview.io.FileFormats;
49 import jalview.io.FileLoader;
50 import jalview.io.HtmlSvgOutput;
51 import jalview.io.IdentifyFile;
52 import jalview.io.NewickFile;
53 import jalview.io.gff.SequenceOntologyFactory;
54 import jalview.javascript.JSFunctionExec;
55 import jalview.javascript.MouseOverStructureListener;
56 import jalview.renderer.seqfeatures.FeatureRenderer;
57 import jalview.schemes.ColourSchemeI;
58 import jalview.schemes.ColourSchemeProperty;
59 import jalview.structure.SelectionSource;
60 import jalview.structure.VamsasSource;
61 import jalview.util.MessageManager;
62 import jalview.util.Platform;
63 import jalview.ws.jws2.Jws2Discoverer;
65 import java.applet.AppletContext;
66 import java.io.BufferedReader;
68 import java.io.FileOutputStream;
69 import java.io.IOException;
70 import java.io.InputStreamReader;
71 import java.io.OutputStreamWriter;
72 import java.io.PrintWriter;
73 import java.net.MalformedURLException;
75 import java.net.URISyntaxException;
77 import java.security.AllPermission;
78 import java.security.CodeSource;
79 import java.security.PermissionCollection;
80 import java.security.Permissions;
81 import java.security.Policy;
82 import java.util.HashMap;
83 import java.util.Hashtable;
85 import java.util.Vector;
86 import java.util.logging.ConsoleHandler;
87 import java.util.logging.Level;
88 import java.util.logging.Logger;
90 import javax.swing.LookAndFeel;
91 import javax.swing.UIManager;
93 import groovy.lang.Binding;
94 import groovy.util.GroovyScriptEngine;
95 import netscape.javascript.JSObject;
98 * Main class for Jalview Application <br>
100 * start with: java -classpath "$PATH_TO_LIB$/*:$PATH_TO_CLASSES$" \
101 * jalview.bin.Jalview
103 * or on Windows: java -classpath "$PATH_TO_LIB$/*;$PATH_TO_CLASSES$" \
104 * jalview.bin.Jalview jalview.bin.Jalview
106 * (ensure -classpath arg is quoted to avoid shell expansion of '*' and do not
107 * embellish '*' to e.g. '*.jar')
110 * @version $Revision$
112 public class Jalview implements ApplicationSingletonI, JalviewJSApi
115 public static Jalview getInstance()
117 return (Jalview) ApplicationSingletonProvider
118 .getInstance(Jalview.class);
127 Platform.getURLCommandArguments();
130 private boolean headless;
132 public static boolean isHeadlessMode()
134 return getInstance().headless;
137 private Desktop desktop;
139 private AlignFrame currentAlignFrame;
141 public boolean isJavaAppletTag;
143 public String appletResourcePath;
145 JalviewAppLoader appLoader;
147 protected JSFunctionExec jsFunctionExec;
149 public static AlignFrame getCurrentAlignFrame()
151 return getInstance().currentAlignFrame;
154 public static void setCurrentAlignFrame(AlignFrame currentAlignFrame)
156 getInstance().currentAlignFrame = currentAlignFrame;
161 if (!Platform.isJS())
168 // grab all the rights we can for the JVM
169 Policy.setPolicy(new Policy()
172 public PermissionCollection getPermissions(CodeSource codesource)
174 Permissions perms = new Permissions();
175 perms.add(new AllPermission());
180 public void refresh()
188 * keep track of feature fetching tasks.
196 * TODO: generalise to track all jalview events to orchestrate batch
200 private int queued = 0;
202 private int running = 0;
204 public FeatureFetcher()
209 public void addFetcher(final AlignFrame af,
210 final Vector<String> dasSources)
212 final long id = System.currentTimeMillis();
214 final FeatureFetcher us = this;
215 new Thread(new Runnable()
227 af.setProgressBar(MessageManager
228 .getString("status.das_features_being_retrived"), id);
229 af.featureSettings_actionPerformed(null);
230 af.setProgressBar(null, id);
239 public synchronized boolean allFinished()
241 return queued == 0 && running == 0;
247 * main class for Jalview application
250 * open <em>filename</em>
252 public static void main(String[] args)
254 // setLogging(); // BH - for event debugging in JavaScript
255 getInstance().doMain(args);
259 * Allow an outside entity to initiate the second half of argument parsing
263 * @return null is good
266 public Object parseArguments(String[] args)
271 ArgsParser aparser = new ArgsParser(args);
272 return parseArguments(aparser, false);
273 } catch (Throwable t)
279 private static void logClass(String name)
281 // BH - for event debugging in JavaScript
282 ConsoleHandler consoleHandler = new ConsoleHandler();
283 consoleHandler.setLevel(Level.ALL);
284 Logger logger = Logger.getLogger(name);
285 logger.setLevel(Level.ALL);
286 logger.addHandler(consoleHandler);
289 @SuppressWarnings("unused")
290 private static void setLogging()
298 System.out.println("not in js");
301 // BH - for event debugging in JavaScript (Java mode only)
302 if (!Platform.isJS())
309 Logger.getLogger("").setLevel(Level.ALL);
310 logClass("java.awt.EventDispatchThread");
311 logClass("java.awt.EventQueue");
312 logClass("java.awt.Component");
313 logClass("java.awt.focus.Component");
314 logClass("java.awt.focus.DefaultKeyboardFocusManager");
322 void doMain(String[] args)
325 boolean isJS = Platform.isJS();
328 System.setSecurityManager(null);
332 .println("Java version: " + System.getProperty("java.version"));
333 System.out.println(System.getProperty("os.arch") + " "
334 + System.getProperty("os.name") + " "
335 + System.getProperty("os.version"));
337 ArgsParser aparser = new ArgsParser(args);
339 String usrPropsFile = aparser.getValue(ArgsParser.PROPS);
340 Cache.loadProperties(usrPropsFile);
343 isJavaAppletTag = aparser.isApplet();
346 Preferences.setAppletDefaults();
347 Cache.loadProperties(usrPropsFile); // again, because we
348 // might be changing defaults here?
351 "<Applet> found: " + aparser.getValue("Info.j2sAppletID"));
352 appletResourcePath = aparser.getValue("Info.resourcePath");
361 if (usrPropsFile != null)
364 "CMD [-props " + usrPropsFile + "] executed successfully!");
367 if (aparser.contains("help") || aparser.contains("h"))
372 if (aparser.contains(ArgsParser.NODISPLAY)
373 || aparser.contains(ArgsParser.NOGUI)
374 || aparser.contains(ArgsParser.HEADLESS)
375 || "true".equals(System.getProperty("java.awt.headless")))
382 final String jabawsUrl = aparser.getValue(ArgsParser.JABAWS);
383 if (jabawsUrl != null)
387 Jws2Discoverer.getInstance().setPreferredUrl(jabawsUrl);
389 "CMD [-jabaws " + jabawsUrl + "] executed successfully!");
390 } catch (MalformedURLException e)
393 "Invalid jabaws parameter: " + jabawsUrl + " ignored");
398 // check for property setting
399 String defs = aparser.getValue(ArgsParser.SETPROP);
402 int p = defs.indexOf('=');
405 System.err.println("Ignoring invalid setprop argument : " + defs);
409 System.out.println("Executing setprop argument: " + defs);
412 Cache.setProperty(defs.substring(0, p), defs.substring(p + 1));
415 defs = aparser.getValue(ArgsParser.SETPROP);
417 System.setProperty("http.agent",
418 "Jalview Desktop/" + Cache.getDefault("VERSION", "Unknown"));
422 } catch (NoClassDefFoundError error)
424 error.printStackTrace();
425 System.out.println("\nEssential logging libraries not found."
426 + "\nUse: java -classpath \"$PATH_TO_LIB$/*:$PATH_TO_CLASSES$\" jalview.bin.Jalview");
434 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
435 } catch (Exception ex)
437 System.err.println("Unexpected Look and Feel Exception");
438 ex.printStackTrace();
440 if (Platform.isAMacAndNotJS())
443 LookAndFeel lookAndFeel = ch.randelshofer.quaqua.QuaquaManager
445 System.setProperty("com.apple.mrj.application.apple.menu.about.name",
447 System.setProperty("apple.laf.useScreenMenuBar", "true");
448 if (lookAndFeel != null)
452 UIManager.setLookAndFeel(lookAndFeel);
453 } catch (Throwable e)
456 "Failed to set QuaQua look and feel: " + e.toString());
459 if (lookAndFeel == null
460 || !(lookAndFeel.getClass().isAssignableFrom(
461 UIManager.getLookAndFeel().getClass()))
462 || !UIManager.getLookAndFeel().getClass().toString()
463 .toLowerCase().contains("quaqua"))
468 "Quaqua LaF not available on this plaform. Using VAqua(4).\nSee https://issues.jalview.org/browse/JAL-2976");
469 UIManager.setLookAndFeel("org.violetlib.aqua.AquaLookAndFeel");
470 } catch (Throwable e)
473 "Failed to reset look and feel: " + e.toString());
479 * configure 'full' SO model if preferences say to,
480 * else use the default (SO Lite)
482 if (Cache.getDefault(Preferences.USE_FULL_SO, false))
484 SequenceOntologyFactory.setSequenceOntology(new SequenceOntology());
489 desktop = Desktop.getInstance();
490 desktop.setInBatchMode(true); // indicate we are starting up
491 desktop.setVisible(true);
500 desktop.startServiceDiscovery();
501 if (!aparser.contains(ArgsParser.NOUSAGESTATS))
503 startUsageStats(desktop);
507 System.err.println("CMD [-nousagestats] executed successfully!");
510 if (!aparser.contains(ArgsParser.NOQUESTIONNAIRE))
512 String url = aparser.getValue(ArgsParser.QUESTIONNAIRE);
515 // Start the desktop questionnaire prompter with the specified
517 Cache.log.debug("Starting questionnaire url at " + url);
518 desktop.checkForQuestionnaire(url);
519 System.out.println("CMD questionnaire[-" + url
520 + "] executed successfully!");
524 if (Cache.getProperty(Preferences.NOQUESTIONNAIRES) == null)
526 // Start the desktop questionnaire prompter with the specified
529 // "http://anaplog.compbio.dundee.ac.uk/cgi-bin/questionnaire.pl";
531 String defurl = "http://www.jalview.org/cgi-bin/questionnaire.pl";
533 "Starting questionnaire with default url: " + defurl);
534 desktop.checkForQuestionnaire(defurl);
541 .println("CMD [-noquestionnaire] executed successfully!");
544 if (!aparser.contains(ArgsParser.NONEWS))
546 desktop.checkForNews();
549 BioJsHTMLOutput.updateBioJS();
553 parseArguments(aparser, true);
556 private Object parseArguments(ArgsParser aparser,
559 boolean isJS = Platform.isJS();
561 Desktop desktop = (headless ? null : Desktop.getInstance());
562 // script to execute after all loading is
563 // completed one way or another
564 // extract groovy argument and execute if necessary
565 String groovyscript = (isJS ? null
566 : aparser.getValue(ArgsParser.GROOVY, true));
567 String file = aparser.getValue(ArgsParser.OPEN, true);
568 // BH this here to allow split frame; not working as of 5/17/2019
569 String file2 = aparser.getValue(ArgsParser.OPEN2, true);
570 String fileFormat = (isJavaAppletTag
571 ? aparser.getAppletValue("format", null)
574 FileFormatI format = null;
575 DataSourceType protocol = null;
577 if (file == null && desktop == null)
579 System.out.println("No files to open!");
582 boolean haveImport = checkStartVamas(aparser);
583 // Finally, deal with the remaining input data.
585 if (file == null && isJavaAppletTag)
587 // Maybe the sequences are added as parameters
588 StringBuffer data = new StringBuffer("PASTE");
590 while ((file = aparser.getAppletValue("sequence" + i, null)) != null)
592 data.append(file.toString() + "\n");
595 if (data.length() > 5)
597 file = data.toString();
605 desktop.setProgressBar(
607 .getString("status.processing_commandline_args"),
608 progress = System.currentTimeMillis());
613 * ignore in JavaScript -- can't just check file existence - could load
619 if (!file.startsWith("http://") && !file.startsWith("https://"))
620 // BH 2019 added https check for Java
622 if (!(new File(file)).exists())
624 System.out.println("Can't find " + file);
633 protocol = AppletFormatAdapter.checkProtocol(file);
637 format = (isJavaAppletTag && fileFormat != null
638 ? FileFormats.getInstance().forName(fileFormat)
642 format = new IdentifyFile().identify(file, protocol);
644 } catch (FileFormatException e1)
649 AlignFrame af = new FileLoader(!headless).loadFileWaitTillLoaded(file,
653 System.out.println("error");
658 .println("CMD [-open " + file + "] executed successfully!");
661 protocol = AppletFormatAdapter.checkProtocol(file2);
664 format = new IdentifyFile().identify(file2, protocol);
665 } catch (FileFormatException e1)
669 AlignFrame af2 = new FileLoader(!headless)
670 .loadFileWaitTillLoaded(file2, protocol, format);
673 System.out.println("error");
677 AlignViewport.openLinkedAlignmentAs(af,
678 af.getViewport().getAlignment(),
679 af2.getViewport().getAlignment(), "",
680 AlignViewport.SPLIT_FRAME);
682 "CMD [-open2 " + file2 + "] executed successfully!");
686 setCurrentAlignFrame(af);
688 // TODO: file2 How to implement file2 for the applet spit screen?
690 String data = aparser.getValue(ArgsParser.COLOUR, true);
693 data.replaceAll("%20", " ");
695 ColourSchemeI cs = ColourSchemeProperty.getColourScheme(
696 af.getViewport(), af.getViewport().getAlignment(), data);
701 "CMD [-color " + data + "] executed successfully!");
706 // Must maintain ability to use the groups flag
707 data = aparser.getValue(ArgsParser.GROUPS, true);
710 af.parseFeaturesFile(data,
711 AppletFormatAdapter.checkProtocol(data));
712 // System.out.println("Added " + data);
714 "CMD groups[-" + data + "] executed successfully!");
716 data = aparser.getValue(ArgsParser.FEATURES, true);
719 af.parseFeaturesFile(data,
720 AppletFormatAdapter.checkProtocol(data));
721 // System.out.println("Added " + data);
723 "CMD [-features " + data + "] executed successfully!");
726 data = aparser.getValue(ArgsParser.ANNOTATIONS, true);
729 af.loadJalviewDataFile(data, null, null, null);
730 // System.out.println("Added " + data);
732 "CMD [-annotations " + data + "] executed successfully!");
734 // set or clear the sortbytree flag.
735 if (aparser.contains(ArgsParser.SORTBYTREE))
737 af.getViewport().setSortByTree(true);
738 if (af.getViewport().getSortByTree())
740 System.out.println("CMD [-sortbytree] executed successfully!");
743 if (aparser.contains(ArgsParser.NOANNOTATION)
744 || aparser.contains(ArgsParser.NOANNOTATION2))
746 af.getViewport().setShowAnnotation(false);
747 if (!af.getViewport().isShowAnnotation())
749 System.out.println("CMD no-annotation executed successfully!");
752 if (aparser.contains(ArgsParser.NOSORTBYTREE))
754 af.getViewport().setSortByTree(false);
755 if (!af.getViewport().getSortByTree())
758 .println("CMD [-nosortbytree] executed successfully!");
761 data = aparser.getValue(ArgsParser.TREE, true);
767 "CMD [-tree " + data + "] executed successfully!");
768 NewickFile nf = new NewickFile(data,
769 AppletFormatAdapter.checkProtocol(data));
771 .setCurrentTree(af.showNewickTree(nf, data).getTree());
772 } catch (IOException ex)
774 System.err.println("Couldn't add tree " + data);
775 ex.printStackTrace(System.err);
778 // TODO - load PDB structure(s) to alignment JAL-629
779 // (associate with identical sequence in alignment, or a specified
783 loadAppletParams(aparser, af);
792 if (groovyscript != null)
794 // Execute the groovy script after we've done all the rendering
796 // and before any images or figures are generated.
797 System.out.println("Executing script " + groovyscript);
798 executeGroovyScript(groovyscript, af);
799 System.out.println("CMD groovy[" + groovyscript
800 + "] executed successfully!");
803 checkOutputFile(aparser, af, format);
804 while (aparser.getSize() > 0)
806 System.out.println("Unknown arg: " + aparser.nextValue());
811 AlignFrame startUpAlframe = null;
812 // We'll only open the default file if the desktop is visible.
814 // ////////////////////
816 if (!isJS && !headless && file == null && !haveImport
817 && jalview.bin.Cache.getDefault("SHOW_STARTUP_FILE", true))
824 file = jalview.bin.Cache.getDefault("STARTUP_FILE",
825 jalview.bin.Cache.getDefault("www.jalview.org",
826 "http://www.jalview.org")
827 + "/examples/exampleFile_2_7.jar");
829 "http://www.jalview.org/examples/exampleFile_2_3.jar"))
831 // hardwire upgrade of the startup file
832 file.replace("_2_3.jar", "_2_7.jar");
833 // and remove the stale setting
834 jalview.bin.Cache.removeProperty("STARTUP_FILE");
837 protocol = DataSourceType.FILE;
839 if (file.indexOf("http:") > -1)
841 protocol = DataSourceType.URL;
844 if (file.endsWith(".jar"))
846 format = FileFormat.Jalview;
852 format = new IdentifyFile().identify(file, protocol);
853 } catch (FileFormatException e)
859 startUpAlframe = new FileLoader(!headless)
860 .loadFileWaitTillLoaded(file, protocol, format);
861 // extract groovy arguments before anything else.
864 // Once all other stuff is done, execute any groovy scripts (in order)
865 if (groovyscript != null)
867 if (Cache.groovyJarsPresent())
869 System.out.println("Executing script " + groovyscript);
870 executeGroovyScript(groovyscript, startUpAlframe);
875 "Sorry. Groovy Support is not available, so ignoring the provided groovy script "
879 // and finally, turn off batch mode indicator - if the desktop still exists
884 desktop.setProgressBar(null, progress);
886 desktop.setInBatchMode(false);
892 private boolean checkStartVamas(ArgsParser aparser)
894 String vamsasImport = aparser.getValue(ArgsParser.VDOC);
895 String vamsasSession = aparser.getValue(ArgsParser.VSESS);
896 if (vamsasImport == null && vamsasSession == null)
900 if (desktop == null || headless)
903 "Headless vamsas sessions not yet supported. Sorry.");
906 boolean haveImport = (vamsasImport != null);
909 // if we have a file, start a new session and import it.
910 boolean inSession = false;
913 DataSourceType viprotocol = AppletFormatAdapter
914 .checkProtocol(vamsasImport);
915 if (viprotocol == DataSourceType.FILE)
917 inSession = desktop.vamsasImport(new File(vamsasImport));
919 else if (viprotocol == DataSourceType.URL)
921 inSession = desktop.vamsasImport(new URL(vamsasImport));
924 } catch (Exception e)
926 System.err.println("Exeption when importing " + vamsasImport
927 + " as a vamsas document.");
932 System.err.println("Failed to import " + vamsasImport
933 + " as a vamsas document.");
937 System.out.println("Imported Successfully into new session "
938 + desktop.getVamsasApplication().getCurrentSession());
941 if (vamsasSession != null)
943 if (vamsasImport != null)
945 // close the newly imported session and import the Jalview specific
946 // remnants into the new session later on.
947 desktop.vamsasStop_actionPerformed(null);
949 // now join the new session
952 if (desktop.joinVamsasSession(vamsasSession))
955 "Successfully joined vamsas session " + vamsasSession);
959 System.err.println("WARNING: Failed to join vamsas session "
962 } catch (Exception e)
965 "ERROR: Failed to join vamsas session " + vamsasSession);
968 if (vamsasImport != null)
970 // the Jalview specific remnants can now be imported into the new
971 // session at the user's leisure.
973 "Skipping Push for import of data into existing vamsas session.");
979 // desktop.getVamsasApplication().push_update();
985 private void checkOutputFile(ArgsParser aparser, AlignFrame af,
988 String imageName = "unnamed.png";
989 while (aparser.getSize() > 1)
995 String outputFormat = aparser.nextValue();
996 String file = aparser.nextValue();
997 if (outputFormat.equalsIgnoreCase("png"))
999 af.createPNG(new File(file));
1000 imageName = (new File(file)).getName();
1001 System.out.println("Creating PNG image: " + file);
1004 else if (outputFormat.equalsIgnoreCase("svg"))
1006 File imageFile = new File(file);
1007 imageName = imageFile.getName();
1008 af.createSVG(imageFile);
1009 System.out.println("Creating SVG image: " + file);
1012 else if (outputFormat.equalsIgnoreCase("html"))
1014 File imageFile = new File(file);
1015 imageName = imageFile.getName();
1016 HtmlSvgOutput htmlSVG = new HtmlSvgOutput(af.alignPanel);
1017 htmlSVG.exportHTML(file);
1019 System.out.println("Creating HTML image: " + file);
1022 else if (outputFormat.equalsIgnoreCase("biojsmsa"))
1026 System.err.println("The output html file must not be null");
1031 BioJsHTMLOutput.refreshVersionInfo(
1032 BioJsHTMLOutput.BJS_TEMPLATES_LOCAL_DIRECTORY);
1033 } catch (URISyntaxException e)
1035 e.printStackTrace();
1037 BioJsHTMLOutput bjs = new BioJsHTMLOutput(af.alignPanel);
1038 bjs.exportHTML(file);
1039 System.out.println("Creating BioJS MSA Viwer HTML file: " + file);
1042 else if (outputFormat.equalsIgnoreCase("imgMap"))
1044 af.createImageMap(new File(file), imageName);
1045 System.out.println("Creating image map: " + file);
1048 else if (outputFormat.equalsIgnoreCase("eps"))
1050 File outputFile = new File(file);
1052 "Creating EPS file: " + outputFile.getAbsolutePath());
1053 af.createEPS(outputFile);
1057 af.saveAlignment(file, format);
1058 if (af.isSaveAlignmentSuccessful())
1061 "Written alignment in " + format + " format to " + file);
1065 System.out.println("Error writing file " + file + " in " + format
1072 private static void showUsage()
1075 "Usage: jalview -open [FILE] [OUTPUT_FORMAT] [OUTPUT_FILE]\n\n"
1076 + "-nodisplay\tRun Jalview without User Interface.\n"
1077 + "-props FILE\tUse the given Jalview properties file instead of users default.\n"
1078 + "-colour COLOURSCHEME\tThe colourscheme to be applied to the alignment\n"
1079 + "-annotations FILE\tAdd precalculated annotations to the alignment.\n"
1080 + "-tree FILE\tLoad the given newick format tree file onto the alignment\n"
1081 + "-features FILE\tUse the given file to mark features on the alignment.\n"
1082 + "-fasta FILE\tCreate alignment file FILE in Fasta format.\n"
1083 + "-clustal FILE\tCreate alignment file FILE in Clustal format.\n"
1084 + "-pfam FILE\tCreate alignment file FILE in PFAM format.\n"
1085 + "-msf FILE\tCreate alignment file FILE in MSF format.\n"
1086 + "-pileup FILE\tCreate alignment file FILE in Pileup format\n"
1087 + "-pir FILE\tCreate alignment file FILE in PIR format.\n"
1088 + "-blc FILE\tCreate alignment file FILE in BLC format.\n"
1089 + "-json FILE\tCreate alignment file FILE in JSON format.\n"
1090 + "-jalview FILE\tCreate alignment file FILE in Jalview format.\n"
1091 + "-png FILE\tCreate PNG image FILE from alignment.\n"
1092 + "-svg FILE\tCreate SVG image FILE from alignment.\n"
1093 + "-html FILE\tCreate HTML file from alignment.\n"
1094 + "-biojsMSA FILE\tCreate BioJS MSA Viewer HTML file from alignment.\n"
1095 + "-imgMap FILE\tCreate HTML file FILE with image map of PNG image.\n"
1096 + "-eps FILE\tCreate EPS file FILE from alignment.\n"
1097 + "-questionnaire URL\tQueries the given URL for information about any Jalview user questionnaires.\n"
1098 + "-noquestionnaire\tTurn off questionnaire check.\n"
1099 + "-nonews\tTurn off check for Jalview news.\n"
1100 + "-nousagestats\tTurn off google analytics tracking for this session.\n"
1101 + "-sortbytree OR -nosortbytree\tEnable or disable sorting of the given alignment by the given tree\n"
1103 // "-setprop PROPERTY=VALUE\tSet the given Jalview property,
1104 // after all other properties files have been read\n\t
1105 // (quote the 'PROPERTY=VALUE' pair to ensure spaces are
1106 // passed in correctly)"
1107 + "-jabaws URL\tSpecify URL for Jabaws services (e.g. for a local installation).\n"
1108 + "-fetchfrom nickname\tQuery nickname for features for the alignments and display them.\n"
1110 // "-vdoc vamsas-document\tImport vamsas document into new
1111 // session or join existing session with same URN\n"
1112 // + "-vses vamsas-session\tJoin session with given URN\n"
1113 + "-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"
1114 + "\n~Read documentation in Application or visit http://www.jalview.org for description of Features and Annotations file~\n\n");
1117 private static void startUsageStats(final Desktop desktop)
1120 * start a User Config prompt asking if we can log usage statistics.
1122 PromptUserConfig prompter = new PromptUserConfig(
1123 Desktop.getDesktopPane(), "USAGESTATS",
1124 "Jalview Usage Statistics",
1125 "Do you want to help make Jalview better by enabling "
1126 + "the collection of usage statistics with Google Analytics ?"
1127 + "\n\n(you can enable or disable usage tracking in the preferences)",
1134 "Initialising googletracker for usage stats.");
1135 Cache.initGoogleTracker();
1136 Cache.log.debug("Tracking enabled.");
1143 Cache.log.debug("Not enabling Google Tracking.");
1146 desktop.addDialogThread(prompter);
1150 * Locate the given string as a file and pass it to the groovy interpreter.
1152 * @param groovyscript
1153 * the script to execute
1154 * @param jalviewContext
1155 * the Jalview Desktop object passed in to the groovy binding as the
1158 private void executeGroovyScript(String groovyscript, AlignFrame af)
1161 * for scripts contained in files
1168 if (groovyscript.trim().equals("STDIN"))
1170 // read from stdin into a tempfile and execute it
1173 tfile = File.createTempFile("jalview", "groovy");
1174 PrintWriter outfile = new PrintWriter(
1175 new OutputStreamWriter(new FileOutputStream(tfile)));
1176 BufferedReader br = new BufferedReader(
1177 new InputStreamReader(System.in));
1179 while ((line = br.readLine()) != null)
1181 outfile.write(line + "\n");
1187 } catch (Exception ex)
1189 System.err.println("Failed to read from STDIN into tempfile "
1190 + ((tfile == null) ? "(tempfile wasn't created)"
1191 : tfile.toString()));
1192 ex.printStackTrace();
1197 sfile = tfile.toURI().toURL();
1198 } catch (Exception x)
1201 "Unexpected Malformed URL Exception for temporary file created from STDIN: "
1203 x.printStackTrace();
1211 sfile = new URI(groovyscript).toURL();
1212 } catch (Exception x)
1214 tfile = new File(groovyscript);
1215 if (!tfile.exists())
1217 System.err.println("File '" + groovyscript + "' does not exist.");
1220 if (!tfile.canRead())
1222 System.err.println("File '" + groovyscript + "' cannot be read.");
1225 if (tfile.length() < 1)
1227 System.err.println("File '" + groovyscript + "' is empty.");
1232 sfile = tfile.getAbsoluteFile().toURI().toURL();
1233 } catch (Exception ex)
1235 System.err.println("Failed to create a file URL for "
1236 + tfile.getAbsoluteFile());
1243 Map<String, Object> vbinding = new HashMap<>();
1244 vbinding.put("Jalview", this);
1247 vbinding.put("currentAlFrame", af);
1249 Binding gbinding = new Binding(vbinding);
1250 GroovyScriptEngine gse = new GroovyScriptEngine(new URL[] { sfile });
1251 gse.run(sfile.toString(), gbinding);
1252 if ("STDIN".equals(groovyscript))
1254 // delete temp file that we made -
1255 // only if it was successfully executed
1258 } catch (Exception e)
1260 System.err.println("Exception Whilst trying to execute file " + sfile
1261 + " as a groovy script.");
1262 e.printStackTrace(System.err);
1267 public AlignFrame[] getAlignFrames()
1269 return desktop == null ? new AlignFrame[] { getCurrentAlignFrame() }
1270 : Desktop.getAlignFrames();
1275 * Quit method delegates to Desktop.quit - unless running in headless mode
1276 * when it just ends the JVM
1280 if (jsFunctionExec != null)
1282 jsFunctionExec.tidyUp();
1283 jsFunctionExec = null;
1286 if (desktop != null)
1297 * Get the SwingJS applet ID and combine that with the frameType
1300 * "alignment", "desktop", etc., or null
1303 public static String getAppID(String frameType)
1305 String id = Cache.getProperty("Info.j2sAppletID");
1310 return id + (frameType == null ? "" : "-" + frameType);
1314 * Handle all JalviewLite applet parameters
1319 private void loadAppletParams(ArgsParser aparser, AlignFrame af)
1321 JalviewApp app = new JalviewApp()
1324 private boolean alignPDBStructures; // From JalviewLite; not implemented
1326 private Hashtable<String, Hashtable<String, String[]>> jsmessages;
1328 private Hashtable<String, int[]> jshashes;
1331 public String getParameter(String name)
1333 return aparser.getAppletValue(name, null);
1337 public boolean getDefaultParameter(String name, boolean def)
1340 return ((stn = getParameter(name)) == null ? def
1341 : "true".equalsIgnoreCase(stn));
1345 * Get the applet-like document base even though this is an application.
1348 public URL getDocumentBase()
1350 return Platform.getDocumentBase();
1354 * Get the applet-like code base even though this is an application.
1357 public URL getCodeBase()
1359 return Platform.getCodeBase();
1363 public AlignViewportI getViewport()
1365 return af.getViewport();
1373 public boolean parseFeaturesFile(String filename,
1374 DataSourceType protocol)
1376 return af.parseFeaturesFile(filename, protocol);
1384 public boolean loadScoreFile(String sScoreFile) throws IOException
1386 af.loadJalviewDataFile(sScoreFile, null, null, null);
1391 * annotations, jpredfile, jnetfile
1395 public void updateForAnnotations()
1397 af.updateForAnnotations();
1401 public void loadTree(NewickFile fin, String treeFile)
1404 // n/a -- already done by standard Jalview command line processing
1408 public void setAlignPdbStructures(boolean defaultParameter)
1410 alignPDBStructures = true;
1414 public void newStructureView(PDBEntry pdb, SequenceI[] seqs,
1415 String[] chains, DataSourceType protocol)
1417 StructureViewer.launchStructureViewer(af.alignPanel, pdb, seqs);
1421 public void setFeatureGroupState(String[] groups, boolean state)
1423 af.setFeatureGroupState(groups, state);
1427 public void alignedStructureView(PDBEntry[] pdb, SequenceI[][] seqs,
1428 String[][] chains, String[] protocols)
1431 "Jalview applet interface alignedStructureView not implemented");
1435 public void newFeatureSettings()
1438 "Jalview applet interface newFeatureSettings not implemented");
1441 private Vector<Runnable> jsExecQueue;
1444 public Vector<Runnable> getJsExecQueue(JSFunctionExec exec)
1446 jsFunctionExec = exec;
1447 return (jsExecQueue == null ? (jsExecQueue = new Vector<>())
1452 public AppletContext getAppletContext()
1454 // TODO Auto-generated method stub
1459 public boolean isJsfallbackEnabled()
1461 // TODO Auto-generated method stub
1466 public JSObject getJSObject()
1468 // TODO Auto-generated method stub
1473 public StructureSelectionManagerProvider getStructureSelectionManagerProvider()
1475 // TODO Auto-generated method stub
1480 public void updateColoursFromMouseOver(Object source,
1481 MouseOverStructureListener mouseOverStructureListener)
1483 // TODO Auto-generated method stub
1488 public Object[] getSelectionForListener(SequenceGroup seqsel,
1489 ColumnSelection colsel, HiddenColumns hidden,
1490 SelectionSource source, Object alignFrame)
1492 // TODO Auto-generated method stub
1497 public String arrayToSeparatorList(String[] array)
1499 return appLoader.arrayToSeparatorList(array);
1503 public Hashtable<String, int[]> getJSHashes()
1505 return (jshashes == null
1506 ? (jshashes = new Hashtable<>())
1511 public Hashtable<String, Hashtable<String, String[]>> getJSMessages()
1513 return (jsmessages == null
1514 ? (jsmessages = new Hashtable<>())
1519 public Object getFrameForSource(VamsasSource source)
1524 if (source instanceof jalview.gui.AlignViewport
1525 && source == (af = getCurrentAlignFrame()).getViewport())
1527 // should be valid if it just generated an event!
1530 // TODO: ensure that if '_af' is specified along with a handler
1531 // function, then only events from that alignFrame are sent to that
1538 public FeatureRenderer getNewFeatureRenderer(AlignViewportI vp)
1540 return new jalview.gui.FeatureRenderer((AlignmentPanel) vp);
1545 appLoader = new JalviewAppLoader(true);
1546 appLoader.load(app);
1551 * @see jalview.bin.JalviewLiteJsApi#getSelectedSequences()
1554 public String getSelectedSequences()
1556 return getSelectedSequencesFrom(getCurrentAlignFrame());
1561 * @see jalview.bin.JalviewLiteJsApi#getSelectedSequences(java.lang.String)
1564 public String getSelectedSequences(String sep)
1566 return getSelectedSequencesFrom(getCurrentAlignFrame(), sep);
1571 * @see jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui
1575 public String getSelectedSequencesFrom(AlignFrameI alf)
1577 return getSelectedSequencesFrom(alf, null);
1582 * @see jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui
1583 * .AlignFrame, java.lang.String)
1586 public String getSelectedSequencesFrom(AlignFrameI alf, String sep)
1588 return appLoader.getSelectedSequencesFrom(alf, sep);
1593 * @see jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui
1594 * .AlignFrame, java.lang.String)
1597 public void highlight(String sequenceId, String position,
1598 String alignedPosition)
1600 highlightIn(getCurrentAlignFrame(), sequenceId, position,
1605 public void highlightIn(AlignFrameI alf,
1606 String sequenceId, String position, String alignedPosition)
1608 appLoader.highlightIn(alf, sequenceId, position,
1613 public void select(String sequenceIds, String columns)
1615 selectIn(getCurrentAlignFrame(), sequenceIds, columns, null);
1619 public void select(String sequenceIds, String columns, String sep)
1621 selectIn(getCurrentAlignFrame(), sequenceIds, columns, sep);
1625 public void selectIn(AlignFrameI alf, String sequenceIds,
1628 selectIn(alf, sequenceIds, columns, null);
1632 public void selectIn(AlignFrameI alf, String sequenceIds,
1633 String columns, String sep)
1635 appLoader.selectIn(alf, sequenceIds, columns, sep);
1639 public String getSelectedSequencesAsAlignment(String format,
1642 return getSelectedSequencesAsAlignmentFrom(getCurrentAlignFrame(),
1647 public String getSelectedSequencesAsAlignmentFrom(
1648 AlignFrameI alf, String format, String sep)
1650 return appLoader.getSelectedSequencesAsAlignmentFrom(alf, format, sep);
1654 public String getAlignmentOrder()
1656 return getAlignmentFrom(getCurrentAlignFrame(), null);
1660 public String getAlignmentOrderFrom(AlignFrameI alf)
1662 return getAlignmentFrom(alf, null);
1666 public String getAlignmentOrderFrom(AlignFrameI alf,
1669 return appLoader.getAlignmentOrderFrom(alf, sep);
1673 public String orderBy(String order, String undoName)
1675 return orderBy(order, undoName, null);
1679 public String orderBy(String order, String undoName, String sep)
1681 return orderAlignmentBy(getCurrentAlignFrame(), order, undoName, sep);
1685 public String orderAlignmentBy(AlignFrameI alf,
1686 String order, String undoName, String sep)
1688 return appLoader.orderAlignmentBy(alf, order, undoName, sep);
1692 public String getAlignment(String format)
1694 return getAlignmentFrom(null, format, null);
1698 public String getAlignmentFrom(AlignFrameI alf,
1701 return getAlignmentFrom(alf, format, null);
1705 public String getAlignment(String format, String suffix)
1707 return getAlignmentFrom(getCurrentAlignFrame(), format, suffix);
1711 public String getAlignmentFrom(AlignFrameI alf,
1712 String format, String suffix)
1714 return appLoader.getAlignmentFrom(alf, format, suffix);
1718 public void loadAnnotation(String annotation)
1720 // TODO Auto-generated method stub
1725 public void loadAnnotationFrom(AlignFrameI alf,
1728 // TODO Auto-generated method stub
1733 public void loadFeatures(String features, boolean autoenabledisplay)
1735 // TODO Auto-generated method stub
1740 public boolean loadFeaturesFrom(AlignFrameI alf,
1741 String features, boolean autoenabledisplay)
1743 // TODO Auto-generated method stub
1748 public String getFeatures(String format)
1750 // TODO Auto-generated method stub
1755 public String getFeaturesFrom(AlignFrameI alf,
1758 // TODO Auto-generated method stub
1763 public String getAnnotation()
1765 // TODO Auto-generated method stub
1770 public String getAnnotationFrom(AlignFrameI alf)
1772 // TODO Auto-generated method stub
1777 public AlignFrameI newView()
1779 // TODO Auto-generated method stub
1784 public AlignFrameI newView(String name)
1786 // TODO Auto-generated method stub
1791 public AlignFrameI newViewFrom(AlignFrameI alf)
1793 // TODO Auto-generated method stub
1798 public AlignFrameI newViewFrom(AlignFrameI alf, String name)
1800 // TODO Auto-generated method stub
1805 public AlignFrameI loadAlignment(String text,
1808 return appLoader.loadAlignment(text, AlignFrame.DEFAULT_WIDTH,
1809 AlignFrame.DEFAULT_HEIGHT, title);
1813 public void setMouseoverListener(String listener)
1815 // TODO Auto-generated method stub
1820 public void setMouseoverListener(AlignFrameI af,
1823 // TODO Auto-generated method stub
1828 public void setSelectionListener(String listener)
1830 // TODO Auto-generated method stub
1835 public void setSelectionListener(AlignFrameI af,
1838 // TODO Auto-generated method stub
1843 public void setStructureListener(String listener, String modelSet)
1845 // TODO Auto-generated method stub
1850 public void removeJavascriptListener(AlignFrameI af,
1853 // TODO Auto-generated method stub
1858 public void mouseOverStructure(String pdbResNum, String chain,
1861 // TODO Auto-generated method stub
1866 public boolean addPdbFile(AlignFrameI alFrame,
1867 String sequenceId, String pdbEntryString, String pdbFile)
1869 return appLoader.addPdbFile(alFrame, sequenceId, pdbEntryString,
1874 public void scrollViewToIn(AlignFrameI alf,
1875 String topRow, String leftHandColumn)
1877 appLoader.scrollViewToIn(alf, topRow, leftHandColumn);
1881 public void scrollViewToRowIn(AlignFrameI alf,
1884 appLoader.scrollViewToRowIn(alf, topRow);
1888 public void scrollViewToColumnIn(AlignFrameI alf,
1889 String leftHandColumn)
1891 appLoader.scrollViewToColumnIn(alf, leftHandColumn);
1895 public String getFeatureGroups()
1897 return getFeatureGroupsOn(getCurrentAlignFrame());
1901 public String getFeatureGroupsOn(AlignFrameI alf)
1903 return appLoader.getFeatureGroupsOn(alf);
1907 public String getFeatureGroupsOfState(boolean visible)
1909 return getFeatureGroupsOfStateOn(getCurrentAlignFrame(), visible);
1913 public String getFeatureGroupsOfStateOn(AlignFrameI alf,
1916 return appLoader.getFeatureGroupsOfStateOn(alf, visible);
1920 public void setFeatureGroupStateOn(AlignFrameI alf,
1921 String groups, boolean state)
1923 setFeatureGroupStateOn(alf, groups, state);
1927 public void setFeatureGroupState(String groups, boolean state)
1929 appLoader.setFeatureGroupStateOn(getCurrentAlignFrame(), groups, state);
1933 public String getSeparator()
1935 return appLoader.getSeparator();
1939 public void setSeparator(String separator)
1941 appLoader.setSeparator(separator);
1945 public String getJsMessage(String messageclass, String viewId)
1947 // see http://www.jalview.org/examples/jalviewLiteJs.html
1952 * Open a new Tree panel on the desktop statically. Params are standard (not
1953 * set by Groovy). No dialog is opened.
1958 * @return null, or the string "label.you_need_at_least_n_sequences" if number
1959 * of sequences selected is inappropriate
1962 public Object openTreePanel(AlignFrame af, String treeType,
1965 return CalculationChooser.openTreePanel(af, treeType, modelName, null);
1969 * public static method for JalviewJS API to open a PCAPanel without
1970 * necessarily using a dialog.
1974 * @return the PCAPanel, or the string "label.you_need_at_least_n_sequences"
1975 * if number of sequences selected is inappropriate
1978 public Object openPcaPanel(AlignFrame af, String modelName)
1980 return CalculationChooser.openPcaPanel(af, modelName, null);