X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fbin%2FJalview.java;h=00a042d6b1f6b11d39decfaf70a831f3009ae4d8;hb=84be38a183e5c51a5759b7a88362198b2687907c;hp=1a67c05f9e52e917ad2541025b06286d0fbf8f7d;hpb=55e2e9b22b133db8b9ff0979b0338a33081fc8fd;p=jalview.git diff --git a/src/jalview/bin/Jalview.java b/src/jalview/bin/Jalview.java index 1a67c05..fea99fb 100755 --- a/src/jalview/bin/Jalview.java +++ b/src/jalview/bin/Jalview.java @@ -1,298 +1,1319 @@ -/* - * Jalview - A Sequence Alignment Editor and Viewer - * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - */ -package jalview.bin; - -import jalview.gui.*; - -import javax.swing.*; - -import java.util.Vector; - - -/** - * Main class for Jalview Application - *
- *
start with java -Djava.ext.dirs=$PATH_TO_LIB$ jalview.bin.Jalview - * - * @author $author$ - * @version $Revision$ - */ -public class Jalview -{ - - /** - * main class for Jalview application - * - * @param args open filename - */ - public static void main(String[] args) - { - System.out.println("Java version: "+System.getProperty("java.version")); - System.out.println(System.getProperty("os.arch")+" " - +System.getProperty("os.name")+" " - +System.getProperty("os.version")); - - - ArgsParser aparser = new ArgsParser(args); - boolean headless = false; - - if( aparser.contains("help") || aparser.contains("h") ) - { - System.out.println("Usage: jalview -open [FILE] [OUTPUT_FORMAT] [OUTPUT_FILE]\n\n" - +"-nodisplay\tRun Jalview without User Interface.\n" - +"-props FILE\tUse the given Jalview properties file instead of users default.\n" - +"-groups FILE\tUse the given file to mark groups on the alignment." - +"\nThe first lines of the groups file lists the GroupName and GroupColours" - +" to be used in the alignment. Use the GROUPNAME label for each of your sequences. " - +"\nGROUPNAMEGROUPCOLOUR\n" - +"TEXTSEQUENCE_IDSEQUENCE_INDEXSTART_RESIDUEEND_RESIDUEGROUPNAME\n" - +"SequenceID is used in preference to SequenceIndex if both are provided.\n" - +"Enter ID_NOT_SPECIFIED for SEQUENCE_ID or -1 for SEQUENCE_INDEX if unknown.\n" - +"COLOUR can be hexadecimal RGB or 'red', 'blue' etc.\n\n" - +"-fasta FILE\tCreate alignment file FILE in Fasta format.\n" - +"-clustal FILE\tCreate alignment file FILE in Clustal format.\n" - +"-pfam FILE\tCreate alignment file FILE in PFAM format.\n" - +"-msf FILE\tCreate alignment file FILE in MSF format.\n" - +"-pileup FILE\tCreate alignment file FILE in Pileup format\n" - +"-pir FILE\tCreate alignment file FILE in PIR format.\n" - +"-blc FILE\tCreate alignment file FILE in BLC format.\n" - +"-jalview FILE\tCreate alignment file FILE in Jalview format.\n" - +"-png FILE\tCreate PNG image FILE from alignment.\n" - +"-imgMap FILE\tCreate HTML file FILE with image map of PNG image.\n" - +"-eps FILE\tCreate EPS file FILE from alignment."); - System.exit(0); - } - - - if (aparser.contains("nodisplay")) - { - System.setProperty("java.awt.headless", "true"); - } - if (System.getProperty("java.awt.headless") != null - && System.getProperty("java.awt.headless").equals("true")) - { - headless = true; - } - - try - { - Cache.initLogger(); - } - catch (java.lang.NoClassDefFoundError error) - { - error.printStackTrace(); - System.out.println( - "\nEssential logging libraries not found." - +"\nUse: java -Djava.ext.dirs=$PATH_TO_LIB$ jalview.bin.Jalview"); - System.exit(0); - } - - Cache.loadProperties(aparser.getValue("props")); - - Desktop desktop = null; - if( !headless ) - { - try - { - UIManager.setLookAndFeel( - UIManager.getSystemLookAndFeelClassName() - // UIManager.getCrossPlatformLookAndFeelClassName() -//"com.sun.java.swing.plaf.gtk.GTKLookAndFeel" -//"javax.swing.plaf.metal.MetalLookAndFeel" -//"com.sun.java.swing.plaf.windows.WindowsLookAndFeel" -//"com.sun.java.swing.plaf.motif.MotifLookAndFeel" - - ); - } - catch (Exception ex) - { - } - - desktop = new Desktop(); - desktop.setVisible(true); - desktop.discoverer.start(); - } - - - String file = null, protocol = null, format = null, groups=null; - jalview.io.FileLoader fileLoader = new jalview.io.FileLoader(); - - file = aparser.getValue("open"); - - if (file == null && desktop==null) - { - System.out.println("No files to open!"); - System.exit(1); - } - - if(file!=null) - { - - if (!file.startsWith("http://")) - { - if (! (new java.io.File(file)).exists()) - { - System.out.println("Can't find " + file); - if(headless) - System.exit(1); - } - } - - protocol = "File"; - - if (file.indexOf("http:") > -1) - { - protocol = "URL"; - } - - if (file.endsWith(".jar")) - format = "Jalview"; - else - format = jalview.io.IdentifyFile.Identify(file, protocol); - - System.out.println("Opening: " + format + " file " + file); - - AlignFrame af = fileLoader.LoadFileWaitTillLoaded(file, protocol, format); - - groups = aparser.getValue("groups"); - if (groups != null) - { - af.parseGroupsFile(groups); - } - - String imageName = "unnamed.png"; - while (aparser.getSize() > 1) - { - format = aparser.nextValue(); - file = aparser.nextValue(); - - if (format.equalsIgnoreCase("png")) - { - af.createPNG(new java.io.File(file)); - imageName = (new java.io.File(file)).getName(); - System.out.println("Creating PNG image: " + file); - continue; - } - else if (format.equalsIgnoreCase("imgMap")) - { - af.createImageMap(new java.io.File(file), imageName); - System.out.println("Creating image map: " + file); - continue; - } - else if (format.equalsIgnoreCase("eps")) - { - System.out.println("Creating EPS file: " + file); - af.createEPS(new java.io.File(file)); - continue; - } - - if (af.saveAlignment(file, format)) - System.out.println("Written alignment in " + format + - " format to " + file); - else - System.out.println("Error writing file " + file + " in " + format + - " format!!"); - - } - - while (aparser.getSize() > 0) - { - System.out.println("Unknown arg: " + aparser.nextValue()); - } - } - - // We'll only open the default file if the desktop is visible. - ////////////////////// - if ( - !headless && - jalview.bin.Cache.getDefault("SHOW_STARTUP_FILE", true)) - { - - file = jalview.bin.Cache.getDefault("STARTUP_FILE", - "http://www.jalview.org/examples/exampleFile.jar"); - protocol = "File"; - - if (file.indexOf("http:") > -1) - { - protocol = "URL"; - } - - if (file.endsWith(".jar")) - { - Jalview2XML.LoadJalviewAlign(file); - } - else - { - format = jalview.io.IdentifyFile.Identify(file, protocol); - desktop.LoadFile(file, protocol, format); - } - } - } -} - - class ArgsParser - { - Vector vargs = null; - public ArgsParser(String [] args) - { - vargs = new Vector(); - for (int i = 0; i < args.length; i++) - { - String arg = args[i].trim(); - if (arg.charAt(0) == '-') - arg = arg.substring(1); - vargs.addElement(arg); - } - } - - public String getValue(String arg) - { - int index = vargs.indexOf(arg); - String ret = null; - if (index != -1) - { - ret = vargs.elementAt(index + 1).toString(); - vargs.removeElementAt(index); - vargs.removeElementAt(index); - } - return ret; - } - - public boolean contains(String arg) - { - if(vargs.contains(arg)) - { - vargs.removeElement(arg); - return true; - } - else - return false; - } - - public String nextValue() - { - return vargs.remove(0).toString(); - } - - public int getSize() - { - return vargs.size(); - } - - } +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ +package jalview.bin; + +import java.awt.GraphicsEnvironment; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.security.AllPermission; +import java.security.CodeSource; +import java.security.PermissionCollection; +import java.security.Permissions; +import java.security.Policy; +import java.util.HashMap; +import java.util.Map; +import java.util.Vector; + +import javax.swing.LookAndFeel; +import javax.swing.UIManager; + +import com.threerings.getdown.util.LaunchUtil; + +import groovy.lang.Binding; +import groovy.util.GroovyScriptEngine; +import jalview.api.AlignCalcWorkerI; +import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI; +import jalview.ext.so.SequenceOntology; +import jalview.gui.AlignFrame; +import jalview.gui.AlignViewport; +import jalview.gui.Desktop; +import jalview.gui.Preferences; +import jalview.gui.PromptUserConfig; +import jalview.io.AppletFormatAdapter; +import jalview.io.BioJsHTMLOutput; +import jalview.io.DataSourceType; +import jalview.io.FileFormat; +import jalview.io.FileFormatException; +import jalview.io.FileFormatI; +import jalview.io.FileFormats; +import jalview.io.FileLoader; +import jalview.io.HtmlSvgOutput; +import jalview.io.IdentifyFile; +import jalview.io.NewickFile; +import jalview.io.gff.SequenceOntologyFactory; +import jalview.schemes.ColourSchemeI; +import jalview.schemes.ColourSchemeProperty; +import jalview.util.MessageManager; +import jalview.util.Platform; +import jalview.ws.jws2.Jws2Discoverer; +//import netscape.javascript.JSObject; + +/** + * Main class for Jalview Application
+ *
+ * start with: java -classpath "$PATH_TO_LIB$/*:$PATH_TO_CLASSES$" \ + * jalview.bin.Jalview + * + * or on Windows: java -classpath "$PATH_TO_LIB$/*;$PATH_TO_CLASSES$" \ + * jalview.bin.Jalview jalview.bin.Jalview + * + * (ensure -classpath arg is quoted to avoid shell expansion of '*' and do not + * embellish '*' to e.g. '*.jar') + * + * @author $author$ + * @version $Revision$ + */ +public class Jalview implements ApplicationSingletonI +{ + + // for testing those nasty messages you cannot ever find. + // static + // { + // System.setOut(new PrintStream(new ByteArrayOutputStream()) + // { + // @Override + // public void println(Object o) + // { + // if (o != null) + // { + // System.err.println(o); + // } + // } + // + // }); + // } + public static Jalview getInstance() + { + System.out.println("Hello, MW!!!!!!!!!!!!"); + return (Jalview) ApplicationSingletonProvider + .getInstance(Jalview.class); + } + + private Jalview() + { + } + + private boolean headless; + + private Desktop desktop; + + public AlignFrame currentAlignFrame; + + public String appletResourcePath; + + public String j2sAppletID; + + private boolean noCalculation, noMenuBar, noStatus; + + private boolean noAnnotation; + + public boolean getStartCalculations() + { + return !noCalculation; + } + + public boolean getAllowMenuBar() + { + return !noMenuBar; + } + + public boolean getShowStatus() + { + return !noStatus; + } + + public boolean getShowAnnotation() + { + return !noAnnotation; + } + + static + { + if (Platform.isJS()) { + Platform.getURLCommandArguments(); + } else /** @j2sIgnore */ + { + // grab all the rights we can for the JVM + Policy.setPolicy(new Policy() + { + @Override + public PermissionCollection getPermissions(CodeSource codesource) + { + Permissions perms = new Permissions(); + perms.add(new AllPermission()); + return (perms); + } + + @Override + public void refresh() + { + } + }); + } + } + + /** + * keep track of feature fetching tasks. + * + * @author JimP + * + */ + class FeatureFetcher + { + /* + * TODO: generalise to track all jalview events to orchestrate batch processing + * events. + */ + + private int queued = 0; + + private int running = 0; + + public FeatureFetcher() + { + + } + + public void addFetcher(final AlignFrame af, + final Vector dasSources) + { + final long id = System.currentTimeMillis(); + queued++; + final FeatureFetcher us = this; + new Thread(new Runnable() + { + + @Override + public void run() + { + synchronized (us) + { + queued--; + running++; + } + + af.setProgressBar(MessageManager + .getString("status.das_features_being_retrived"), id); + af.featureSettings_actionPerformed(null); + af.setProgressBar(null, id); + synchronized (us) + { + running--; + } + } + }).start(); + } + + public synchronized boolean allFinished() + { + return queued == 0 && running == 0; + } + + } + + private final static boolean doPlatformLogging = false; + + /** + * main class for Jalview application + * + * @param args + * open filename + */ + public static void main(String[] args) + { + if (doPlatformLogging) + { + Platform.startJavaLogging(); + } + getInstance().doMain(args); + } + + /** + * @param args + */ + void doMain(String[] args) + { + + boolean isJS = Platform.isJS(); + if (!isJS) + { + System.setSecurityManager(null); + } + + System.out + .println("Java version: " + System.getProperty("java.version")); + System.out.println("Java Home: " + System.getProperty("java.home")); + System.out.println(System.getProperty("os.arch") + " " + + System.getProperty("os.name") + " " + + System.getProperty("os.version")); + String val = System.getProperty("sys.install4jVersion"); + if (val != null) + { + System.out.println("Install4j version: " + val); + } + val = System.getProperty("installer_template_version"); + if (val != null) + { + System.out.println("Install4j template version: " + val); + } + val = System.getProperty("launcher_version"); + if (val != null) + { + System.out.println("Launcher version: " + val); + } + + // report Jalview version + Cache.getInstance().loadBuildProperties(true); + + ArgsParser aparser = new ArgsParser(args); + headless = false; + + String usrPropsFile = aparser.getValue("props"); + + Cache.loadProperties(usrPropsFile); // must do this before + + boolean allowServices = true; + + if (isJS) + { + j2sAppletID = Platform.getAppID(null); + Preferences.setAppletDefaults(); + Cache.loadProperties(usrPropsFile); // again, because we + // might be changing defaults here? + appletResourcePath = (String) aparser.getAppletValue("resourcepath", + null, true); + } + else + /** + * Java only + * + * @j2sIgnore + */ + { + + if (usrPropsFile != null) + { + System.out.println( + "CMD [-props " + usrPropsFile + "] executed successfully!"); + } + if (aparser.contains("help") || aparser.contains("h")) + { + showUsage(); + System.exit(0); + } + // BH note: Only -nodisplay is official; others are deprecated? + if (aparser.contains("nodisplay") || aparser.contains("nogui") + || aparser.contains("headless") + || GraphicsEnvironment.isHeadless()) + { + if (!isJS) { + // BH Definitely not a good idea in JavaScript; + // probably should not be here for Java, either. + System.setProperty("java.awt.headless", "true"); + } + headless = true; + } + if (GraphicsEnvironment.isHeadless()) + { + headless = true; + } + // < 0) + { + final File appdir = new File(appdirString); + new Thread() + { + @Override + public void run() + { + LaunchUtil.upgradeGetdown( + new File(appdir, "getdown-launcher-old.jar"), + new File(appdir, "getdown-launcher.jar"), + new File(appdir, "getdown-launcher-new.jar")); + } + }.start(); + } + + // completed one way or another + // extract groovy argument and execute if necessary + groovyscript = aparser.getValue("groovy", true); + + } + + String file = aparser.getValue("open", true); + + if (!isJS && file == null && desktop == null) + { + System.out.println("No files to open!"); + System.exit(1); + } + + setDisplayParameters(aparser); + + // time to open a file. + + long progress = -1; + DataSourceType protocol = null; + FileLoader fileLoader = new FileLoader(!headless); + FileFormatI format = null; + // Finally, deal with the remaining input data. + AlignFrame af = null; + + JalviewJSApp jsApp = (isJS ? new JalviewJSApp(this, aparser) : null); + + if (file == null) + { + if (isJS) + { + // JalviewJS allows sequence1 sequence2 .... + + } + else if (!headless && Cache.getDefault("SHOW_STARTUP_FILE", true)) + /** + * Java only + * + * @j2sIgnore + */ + { + + // We'll only open the default file if the desktop is visible. + // And the user + // //////////////////// + + file = Cache.getDefault("STARTUP_FILE", + Cache.getDefault("www.jalview.org", + "http://www.jalview.org") + + "/examples/exampleFile_2_7.jar"); + if (file.equals( + "http://www.jalview.org/examples/exampleFile_2_3.jar")) + { + // hardwire upgrade of the startup file + file.replace("_2_3.jar", "_2_7.jar"); + // and remove the stale setting + Cache.removeProperty("STARTUP_FILE"); + } + + protocol = DataSourceType.FILE; + + if (file.indexOf("http:") > -1) + { + protocol = DataSourceType.URL; + } + + if (file.endsWith(".jar")) + { + format = FileFormat.Jalview; + } + else + { + try + { + format = new IdentifyFile().identify(file, protocol); + } catch (FileFormatException e) + { + // TODO what? + } + } + af = fileLoader.LoadFileWaitTillLoaded(file, protocol, format); + } + } + else + { + if (!headless) + { + desktop.setProgressBar( + MessageManager + .getString("status.processing_commandline_args"), + progress = System.currentTimeMillis()); + } + System.out.println("CMD [-open " + file + "] executed successfully!"); + + if (!Platform.isJS()) + /** + * ignore in JavaScript -- can't just file existence - could load it? + * + * @j2sIgnore + */ + { + if (!file.startsWith("http://") && !file.startsWith("https://")) + // BH 2019 added https check for Java + { + if (!(new File(file)).exists()) + { + System.out.println("Can't find " + file); + if (headless) + { + System.exit(1); + } + } + } + } + + String fileFormat = (isJS + ? (String) aparser.getAppletValue("format", null, true) + : null); + protocol = AppletFormatAdapter.checkProtocol(file); + try + { + format = (fileFormat != null + ? FileFormats.getInstance().forName(fileFormat) + : null); + if (format == null) + { + format = new IdentifyFile().identify(file, protocol); + } + } catch (FileFormatException e1) + { + // TODO ? + } + + af = new FileLoader(!headless).LoadFileWaitTillLoaded(file, protocol, + format); + if (af == null) + { + System.out.println("jalview error - AlignFrame was not created"); + } + else + { + + // JalviewLite interface for JavaScript allows second file open + String file2 = aparser.getValue(ArgsParser.OPEN2, true); + if (file2 != null) + { + protocol = AppletFormatAdapter.checkProtocol(file2); + try + { + format = new IdentifyFile().identify(file2, protocol); + } catch (FileFormatException e1) + { + // TODO ? + } + AlignFrame af2 = new FileLoader(!headless) + .LoadFileWaitTillLoaded(file2, protocol, format); + if (af2 == null) + { + System.out.println("error"); + } + else + { + AlignViewport.openLinkedAlignmentAs(af, + af.getViewport().getAlignment(), + af2.getViewport().getAlignment(), "", + AlignViewport.SPLIT_FRAME); + System.out.println( + "CMD [-open2 " + file2 + "] executed successfully!"); + } + } + setCurrentAlignFrame(af); + + setFrameDependentProperties(aparser, af); + + if (isJS) + { + jsApp.initFromParams(af); + } + else + /** + * Java only + * + * @j2sIgnore + */ + { + if (groovyscript != null) + { + // Execute the groovy script after we've done all the rendering + // stuff + // and before any images or figures are generated. + System.out.println("Executing script " + groovyscript); + executeGroovyScript(groovyscript, af); + System.out.println("CMD groovy[" + groovyscript + + "] executed successfully!"); + groovyscript = null; + } + } + if (!isJS || !isStartup) { + createOutputFiles(aparser, format); + } + } + } + // extract groovy arguments before anything else. + // Once all other stuff is done, execute any groovy scripts (in order) + if (!isJS && groovyscript != null) + { + if (Cache.groovyJarsPresent()) + { + System.out.println("Executing script " + groovyscript); + executeGroovyScript(groovyscript, af); + } + else + { + System.err.println( + "Sorry. Groovy Support is not available, so ignoring the provided groovy script " + + groovyscript); + } + } + + // and finally, turn off batch mode indicator - if the desktop still exists + if (desktop != null) + { + if (progress != -1) + { + desktop.setProgressBar(null, progress); + } + desktop.setInBatchMode(false); + } + + if (jsApp != null) { + jsApp.callInitCallback(); + } + } + + /** + * Set general display parameters irrespective of file loading or headlessness. + * + * @param aparser + */ + private void setDisplayParameters(ArgsParser aparser) + { + if (aparser.contains(ArgsParser.NOMENUBAR)) + { + noMenuBar = true; + System.out.println("CMD [nomenu] executed successfully!"); + } + + if (aparser.contains(ArgsParser.NOSTATUS)) + { + noStatus = true; + System.out.println("CMD [nostatus] executed successfully!"); + } + + if (aparser.contains(ArgsParser.NOANNOTATION) + || aparser.contains(ArgsParser.NOANNOTATION2)) + { + noAnnotation = true; + System.out.println("CMD no-annotation executed successfully!"); + } + if (aparser.contains(ArgsParser.NOCALCULATION)) + { + noCalculation = true; + System.out.println("CMD [nocalculation] executed successfully!"); + } + } + + + private void setFrameDependentProperties(ArgsParser aparser, + AlignFrame af) + { + String data = aparser.getValue(ArgsParser.COLOUR, true); + if (data != null) + { + data.replaceAll("%20", " "); + + ColourSchemeI cs = ColourSchemeProperty.getColourScheme( + af.getViewport(), af.getViewport().getAlignment(), data); + + if (cs != null) + { + System.out.println( + "CMD [-color " + data + "] executed successfully!"); + } + af.changeColour(cs); + } + + // Must maintain ability to use the groups flag + data = aparser.getValue(ArgsParser.GROUPS, true); + if (data != null) + { + af.parseFeaturesFile(data, + AppletFormatAdapter.checkProtocol(data)); + // System.out.println("Added " + data); + System.out.println( + "CMD groups[-" + data + "] executed successfully!"); + } + data = aparser.getValue(ArgsParser.FEATURES, true); + if (data != null) + { + af.parseFeaturesFile(data, + AppletFormatAdapter.checkProtocol(data)); + // System.out.println("Added " + data); + System.out.println( + "CMD [-features " + data + "] executed successfully!"); + } + data = aparser.getValue(ArgsParser.ANNOTATIONS, true); + if (data != null) + { + af.loadJalviewDataFile(data, null, null, null); + // System.out.println("Added " + data); + System.out.println( + "CMD [-annotations " + data + "] executed successfully!"); + } + + // JavaScript feature + + if (aparser.contains(ArgsParser.SHOWOVERVIEW)) + { + af.overviewMenuItem_actionPerformed(null); + System.out.println("CMD [showoverview] executed successfully!"); + } + + // set or clear the sortbytree flag. + if (aparser.contains(ArgsParser.SORTBYTREE)) + { + af.getViewport().setSortByTree(true); + if (af.getViewport().getSortByTree()) + { + System.out.println("CMD [-sortbytree] executed successfully!"); + } + } + + boolean doUpdateAnnotation = false; + /** + * we do this earlier in JalviewJS because of a complication with + * SHOWOVERVIEW + * + * For now, just fixing this in JalviewJS. + * + * + * @j2sIgnore + * + */ + { + if (noAnnotation) + { + af.getViewport().setShowAnnotation(false); + if (!af.getViewport().isShowAnnotation()) + { + doUpdateAnnotation = true; + } + } + } + + if (aparser.contains(ArgsParser.NOSORTBYTREE)) + { + af.getViewport().setSortByTree(false); + if (!af.getViewport().getSortByTree()) + { + doUpdateAnnotation = true; + System.out + .println("CMD [-nosortbytree] executed successfully!"); + } + } + if (doUpdateAnnotation) + { // BH 2019.07.24 + af.setMenusForViewport(); + af.alignPanel.updateLayout(); + } + + data = aparser.getValue(ArgsParser.TREE, true); + if (data != null) + { + try + { + NewickFile nf = new NewickFile(data, + AppletFormatAdapter.checkProtocol(data)); + af.getViewport() + .setCurrentTree(af.showNewickTree(nf, data).getTree()); + System.out.println( + "CMD [-tree " + data + "] executed successfully!"); + } catch (IOException ex) + { + System.err.println("Couldn't add tree " + data); + ex.printStackTrace(System.err); + } + } + // TODO - load PDB structure(s) to alignment JAL-629 + // (associate with identical sequence in alignment, or a specified + // sequence) + + } + + /** + * Writes an output file for each format (if any) specified in the + * command-line arguments. Supported formats are currently + *
    + *
  • png
  • + *
  • svg
  • + *
  • html
  • + *
  • biojsmsa
  • + *
  • imgMap
  • + *
  • eps
  • + *
+ * A format parameter should be followed by a parameter specifying the output + * file name. {@code imgMap} parameters should follow those for the + * corresponding alignment image output. + * + * @param aparser + * @param format + */ + private void createOutputFiles(ArgsParser aparser, + FileFormatI format) + { + AlignFrame af = currentAlignFrame; + while (aparser.getSize() >= 2) + { + String outputFormat = aparser.nextValue(); + File imageFile; + String fname; + switch (outputFormat.toLowerCase()) + { + case "png": + imageFile = new File(aparser.nextValue()); + af.createPNG(imageFile); + System.out.println( + "Creating PNG image: " + imageFile.getAbsolutePath()); + continue; + case "svg": + imageFile = new File(aparser.nextValue()); + af.createSVG(imageFile); + System.out.println( + "Creating SVG image: " + imageFile.getAbsolutePath()); + continue; + case "eps": + imageFile = new File(aparser.nextValue()); + System.out.println( + "Creating EPS file: " + imageFile.getAbsolutePath()); + af.createEPS(imageFile); + continue; + case "biojsmsa": + fname = new File(aparser.nextValue()).getAbsolutePath(); + try + { + BioJsHTMLOutput.refreshVersionInfo( + BioJsHTMLOutput.BJS_TEMPLATES_LOCAL_DIRECTORY); + } catch (URISyntaxException e) + { + e.printStackTrace(); + } + BioJsHTMLOutput bjs = new BioJsHTMLOutput(af.alignPanel); + bjs.exportHTML(fname); + System.out.println("Creating BioJS MSA Viwer HTML file: " + fname); + continue; + case "html": + fname = new File(aparser.nextValue()).getAbsolutePath(); + HtmlSvgOutput htmlSVG = new HtmlSvgOutput(af.alignPanel); + htmlSVG.exportHTML(fname); + System.out.println("Creating HTML image: " + fname); + continue; + case "imgmap": + imageFile = new File(aparser.nextValue()); + af.alignPanel.makePNGImageMap(imageFile, "unnamed.png"); + System.out.println( + "Creating image map: " + imageFile.getAbsolutePath()); + continue; + default: + format = FileFormats.getInstance().forName(outputFormat); + if (format == null) + { + System.out.println("Invalid file format: " + outputFormat); + break; + } + fname = new File(aparser.nextValue()).getAbsolutePath(); + af.saveAlignment(fname, format); + if (!af.isSaveAlignmentSuccessful()) + { + System.out.println("Error writing file " + fname + " in " + format + + " format!!"); + break; + } + continue; + } + System.out.println("Unknown arg: " + outputFormat); + break; + } + while (aparser.getSize() > 0) + { + System.out.println("Unknown arg: " + aparser.nextValue()); + } + } + + private static void showUsage() + { + System.out.println( + "Usage: jalview -open [FILE] [OUTPUT_FORMAT] [OUTPUT_FILE]\n\n" + + "-nodisplay\tRun Jalview without User Interface.\n" + + "-props FILE\tUse the given Jalview properties file instead of users default.\n" + + "-colour COLOURSCHEME\tThe colourscheme to be applied to the alignment\n" + + "-annotations FILE\tAdd precalculated annotations to the alignment.\n" + + "-tree FILE\tLoad the given newick format tree file onto the alignment\n" + + "-features FILE\tUse the given file to mark features on the alignment.\n" + + "-fasta FILE\tCreate alignment file FILE in Fasta format.\n" + + "-clustal FILE\tCreate alignment file FILE in Clustal format.\n" + + "-pfam FILE\tCreate alignment file FILE in PFAM format.\n" + + "-msf FILE\tCreate alignment file FILE in MSF format.\n" + + "-pileup FILE\tCreate alignment file FILE in Pileup format\n" + + "-pir FILE\tCreate alignment file FILE in PIR format.\n" + + "-blc FILE\tCreate alignment file FILE in BLC format.\n" + + "-json FILE\tCreate alignment file FILE in JSON format.\n" + + "-jalview FILE\tCreate alignment file FILE in Jalview format.\n" + + "-png FILE\tCreate PNG image FILE from alignment.\n" + + "-svg FILE\tCreate SVG image FILE from alignment.\n" + + "-html FILE\tCreate HTML file from alignment.\n" + + "-biojsMSA FILE\tCreate BioJS MSA Viewer HTML file from alignment.\n" + + "-imgMap FILE\tCreate HTML file FILE with image map of PNG image.\n" + + "-eps FILE\tCreate EPS file FILE from alignment.\n" + + "-questionnaire URL\tQueries the given URL for information about any Jalview user questionnaires.\n" + + "-noquestionnaire\tTurn off questionnaire check.\n" + + "-nonews\tTurn off check for Jalview news.\n" + + "-nousagestats\tTurn off google analytics tracking for this session.\n" + + "-sortbytree OR -nosortbytree\tEnable or disable sorting of the given alignment by the given tree\n" + // + + // "-setprop PROPERTY=VALUE\tSet the given Jalview property, + // after all other properties files have been read\n\t + // (quote the 'PROPERTY=VALUE' pair to ensure spaces are + // passed in correctly)" + + "-jabaws URL\tSpecify URL for Jabaws services (e.g. for a local installation).\n" + + "-fetchfrom nickname\tQuery nickname for features for the alignments and display them.\n" + + "-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" + + "\n~Read documentation in Application or visit http://www.jalview.org for description of Features and Annotations file~\n\n"); + } + + private static void startUsageStats(final Desktop desktop) + { + /** + * start a User Config prompt asking if we can log usage statistics. + */ + PromptUserConfig prompter = new PromptUserConfig(Desktop.getDesktopPane(), + "USAGESTATS", "Jalview Usage Statistics", + "Do you want to help make Jalview better by enabling " + + "the collection of usage statistics with Google Analytics ?" + + "\n\n(you can enable or disable usage tracking in the preferences)", + new Runnable() + { + @Override + public void run() + { + Cache.log.debug( + "Initialising googletracker for usage stats."); + Cache.initGoogleTracker(); + Cache.log.debug("Tracking enabled."); + } + }, new Runnable() + { + @Override + public void run() + { + Cache.log.debug("Not enabling Google Tracking."); + } + }, null, true); + desktop.addDialogThread(prompter); + } + + /** + * Locate the given string as a file and pass it to the groovy interpreter. + * + * @param groovyscript + * the script to execute + * @param jalviewContext + * the Jalview Desktop object passed in to the groovy binding as the + * 'Jalview' object. + */ + private void executeGroovyScript(String groovyscript, AlignFrame af) + { + /** + * for scripts contained in files + */ + File tfile = null; + /** + * script's URI + */ + URL sfile = null; + if (groovyscript.trim().equals("STDIN")) + { + // read from stdin into a tempfile and execute it + try + { + tfile = File.createTempFile("jalview", "groovy"); + PrintWriter outfile = new PrintWriter( + new OutputStreamWriter(new FileOutputStream(tfile))); + BufferedReader br = new BufferedReader( + new InputStreamReader(System.in)); + String line = null; + while ((line = br.readLine()) != null) + { + outfile.write(line + "\n"); + } + br.close(); + outfile.flush(); + outfile.close(); + + } catch (Exception ex) + { + System.err.println("Failed to read from STDIN into tempfile " + + ((tfile == null) ? "(tempfile wasn't created)" + : tfile.toString())); + ex.printStackTrace(); + return; + } + try + { + sfile = tfile.toURI().toURL(); + } catch (Exception x) + { + System.err.println( + "Unexpected Malformed URL Exception for temporary file created from STDIN: " + + tfile.toURI()); + x.printStackTrace(); + return; + } + } + else + { + try + { + sfile = new URI(groovyscript).toURL(); + } catch (Exception x) + { + tfile = new File(groovyscript); + if (!tfile.exists()) + { + System.err.println("File '" + groovyscript + "' does not exist."); + return; + } + if (!tfile.canRead()) + { + System.err.println("File '" + groovyscript + "' cannot be read."); + return; + } + if (tfile.length() < 1) + { + System.err.println("File '" + groovyscript + "' is empty."); + return; + } + try + { + sfile = tfile.getAbsoluteFile().toURI().toURL(); + } catch (Exception ex) + { + System.err.println("Failed to create a file URL for " + + tfile.getAbsoluteFile()); + return; + } + } + } + try + { + Map vbinding = new HashMap<>(); + vbinding.put("Jalview", this); + if (af != null) + { + vbinding.put("currentAlFrame", af); + } + Binding gbinding = new Binding(vbinding); + GroovyScriptEngine gse = new GroovyScriptEngine(new URL[] { sfile }); + gse.run(sfile.toString(), gbinding); + if ("STDIN".equals(groovyscript)) + { + // delete temp file that we made - + // only if it was successfully executed + tfile.delete(); + } + } catch (Exception e) + { + System.err.println("Exception Whilst trying to execute file " + sfile + + " as a groovy script."); + e.printStackTrace(System.err); + + } + } + + public static boolean isHeadlessMode() + { + String isheadless = System.getProperty("java.awt.headless"); + if (isheadless != null && isheadless.equalsIgnoreCase("true")) + { + return true; + } + return false; + } + + public AlignFrame[] getAlignFrames() + { + return desktop == null ? new AlignFrame[] { getCurrentAlignFrame() } + : Desktop.getAlignFrames(); + + } + + /** + * Quit method delegates to Desktop.quit - unless running in headless mode + * when it just ends the JVM + */ + public void quit() + { + if (desktop != null) + { + desktop.quit(); + } + else + { + System.exit(0); + } + } + + public static AlignFrame getCurrentAlignFrame() + { + return Jalview.getInstance().currentAlignFrame; + } + + public static void setCurrentAlignFrame(AlignFrame currentAlignFrame) + { + Jalview.getInstance().currentAlignFrame = currentAlignFrame; + } + + + public void notifyWorker(AlignCalcWorkerI worker, String status) + { + // System.out.println("Jalview worker " + worker.getClass().getSimpleName() + // + " " + status); + } + + + private static boolean isInteractive = true; + + public static boolean isInteractive() + { + return isInteractive; + } + + public static void setInteractive(boolean tf) + { + isInteractive = tf; + } + +}