X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=inline;f=src%2Fjalview%2Fbin%2FJalview.java;h=9da666bf4e78b80f45dadefe516fd580b68b97b3;hb=0eb1ca5fbc6e21ae91e8d80a1bfa2b95f2957bd3;hp=cd7d1af2e82009f1f5e52137250b4facab8bc9bf;hpb=1cb8662ae0ce8b7c29fa510809a6e883c769dcdc;p=jalview.git diff --git a/src/jalview/bin/Jalview.java b/src/jalview/bin/Jalview.java index cd7d1af..9da666b 100755 --- a/src/jalview/bin/Jalview.java +++ b/src/jalview/bin/Jalview.java @@ -20,10 +20,17 @@ */ package jalview.bin; +import jalview.analysis.AlignmentSorter; +import jalview.analysis.scoremodels.ScoreModels; +import jalview.api.StructureSelectionManagerProvider; +import jalview.ext.ensembl.EnsemblInfo; import jalview.ext.so.SequenceOntology; +import jalview.fts.service.pdb.PDBFTSRestClient; +import jalview.fts.service.uniprot.UniProtFTSRestClient; import jalview.gui.AlignFrame; import jalview.gui.Desktop; import jalview.gui.PromptUserConfig; +import jalview.httpserver.HttpServer; import jalview.io.AppletFormatAdapter; import jalview.io.BioJsHTMLOutput; import jalview.io.DataSourceType; @@ -35,12 +42,23 @@ import jalview.io.HtmlSvgOutput; import jalview.io.IdentifyFile; import jalview.io.NewickFile; import jalview.io.gff.SequenceOntologyFactory; +import jalview.io.gff.SequenceOntologyI; +import jalview.rest.RestHandler; import jalview.schemes.ColourSchemeI; import jalview.schemes.ColourSchemeProperty; +import jalview.structure.StructureImportSettings; +import jalview.structure.StructureSelectionManager; +import jalview.urls.IdOrgSettings; import jalview.util.MessageManager; import jalview.util.Platform; +import jalview.ws.SequenceFetcher; +import jalview.ws.jws1.Discoverer; import jalview.ws.jws2.Jws2Discoverer; +import jalview.ws.jws2.jabaws2.Jws2InstanceFactory; +import jalview.ws.rest.RestClient; +import jalview.ws.sifts.SiftsSettings; +import java.awt.Color; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; @@ -58,8 +76,12 @@ import java.security.PermissionCollection; import java.security.Permissions; import java.security.Policy; import java.util.HashMap; +import java.util.IdentityHashMap; import java.util.Map; import java.util.Vector; +import java.util.logging.ConsoleHandler; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.swing.LookAndFeel; import javax.swing.UIManager; @@ -84,33 +106,100 @@ import groovy.util.GroovyScriptEngine; */ public class Jalview { - /* - * singleton instance of this class + + public Jalview() + { + setInstance(this); + } + + static + { + Platform.getURLCommandArguments(); + } + + private boolean headless; + + public static boolean isHeadlessMode() + { + return getInstance().headless; + } + + /** + * singleton instance of this class in Java only */ + private static Jalview instance; + public static Jalview getInstance() + { + if (instance == null) + { + instance = new Jalview(); + } + Jalview j; + @SuppressWarnings("unused") + ThreadGroup g = Thread.currentThread().getThreadGroup(); + /** + * @j2sNative j = g._jalviewInstance; + */ + { + j = instance; + } + return j; + } + + private static void setInstance(Jalview j) + { + @SuppressWarnings("unused") + ThreadGroup g = Thread.currentThread().getThreadGroup(); + /** + * @j2sNative g._jalviewInstance = j; + */ + { + instance = j; + } + } + private Desktop desktop; - public static AlignFrame currentAlignFrame; + private AlignFrame currentAlignFrame; + + public static AlignFrame getCurrentAlignFrame() + { + return getInstance().currentAlignFrame; + } + + public static void setCurrentAlignFrame(AlignFrame currentAlignFrame) + { + getInstance().currentAlignFrame = currentAlignFrame; + } static { - // grab all the rights we can the JVM - Policy.setPolicy(new Policy() + if (!Platform.isJS()) + /** + * Java only + * + * @j2sIgnore + */ { - @Override - public PermissionCollection getPermissions(CodeSource codesource) + // grab all the rights we can for the JVM + Policy.setPolicy(new Policy() { - Permissions perms = new Permissions(); - perms.add(new AllPermission()); - return (perms); - } + @Override + public PermissionCollection getPermissions(CodeSource codesource) + { + Permissions perms = new Permissions(); + perms.add(new AllPermission()); + return (perms); + } - @Override - public void refresh() - { - } - }); + @Override + public void refresh() + { + } + }); + } } /** @@ -172,11 +261,6 @@ public class Jalview } - public static Jalview getInstance() - { - return instance; - } - /** * main class for Jalview application * @@ -185,8 +269,49 @@ public class Jalview */ public static void main(String[] args) { - instance = new Jalview(); - instance.doMain(args); + // setLogging(); // BH - for event debugging in JavaScript + new Jalview(); + getInstance().doMain(args); + } + + private static void logClass(String name) + { + // BH - for event debugging in JavaScript + ConsoleHandler consoleHandler = new ConsoleHandler(); + consoleHandler.setLevel(Level.ALL); + Logger logger = Logger.getLogger(name); + logger.setLevel(Level.ALL); + logger.addHandler(consoleHandler); + } + + @SuppressWarnings("unused") + private static void setLogging() + { + + /** + * @j2sIgnore + * + */ + { + System.out.println("not in js"); + } + + // BH - for event debugging in JavaScript (Java mode only) + if (!Platform.isJS()) + /** + * Java only + * + * @j2sIgnore + */ + { + Logger.getLogger("").setLevel(Level.ALL); + logClass("java.awt.EventDispatchThread"); + logClass("java.awt.EventQueue"); + logClass("java.awt.Component"); + logClass("java.awt.focus.Component"); + logClass("java.awt.focus.DefaultKeyboardFocusManager"); + } + } /** @@ -194,7 +319,12 @@ public class Jalview */ void doMain(String[] args) { - System.setSecurityManager(null); + + if (!Platform.isJS()) + { + System.setSecurityManager(null); + } + System.out .println("Java version: " + System.getProperty("java.version")); System.out.println(System.getProperty("os.arch") + " " @@ -202,45 +332,55 @@ public class Jalview + System.getProperty("os.version")); ArgsParser aparser = new ArgsParser(args); - boolean headless = false; - if (aparser.contains("help") || aparser.contains("h")) - { - showUsage(); - System.exit(0); - } - if (aparser.contains("nodisplay") || aparser.contains("nogui") - || aparser.contains("headless")) - { - System.setProperty("java.awt.headless", "true"); - headless = true; - } - String usrPropsFile = aparser.getValue("props"); - Cache.loadProperties(usrPropsFile); // must do this before + String usrPropsFile = aparser.getValue(ArgsParser.PROPS); + Cache.loadProperties(usrPropsFile); if (usrPropsFile != null) { System.out.println( "CMD [-props " + usrPropsFile + "] executed successfully!"); } - // anything else! - - final String jabawsUrl = aparser.getValue("jabaws"); - if (jabawsUrl != null) + if (!Platform.isJS()) + /** + * Java only + * + * @j2sIgnore + */ { - try + if (aparser.contains("help") || aparser.contains("h")) { - Jws2Discoverer.getDiscoverer().setPreferredUrl(jabawsUrl); - System.out.println( - "CMD [-jabaws " + jabawsUrl + "] executed successfully!"); - } catch (MalformedURLException e) + showUsage(); + System.exit(0); + } + if (aparser.contains(ArgsParser.NODISPLAY) + || aparser.contains(ArgsParser.NOGUI) + || aparser.contains(ArgsParser.HEADLESS) + || "true".equals(System.getProperty("java.awt.headless"))) { - System.err.println( - "Invalid jabaws parameter: " + jabawsUrl + " ignored"); + headless = true; } - } - String defs = aparser.getValue("setprop"); + // anything else! + + final String jabawsUrl = aparser.getValue(ArgsParser.JABAWS); + if (jabawsUrl != null) + { + try + { + Jws2Discoverer.getDiscoverer().setPreferredUrl(jabawsUrl); + System.out.println( + "CMD [-jabaws " + jabawsUrl + "] executed successfully!"); + } catch (MalformedURLException e) + { + System.err.println( + "Invalid jabaws parameter: " + jabawsUrl + " ignored"); + } + } + + } + // check for property setting + String defs = aparser.getValue(ArgsParser.SETPROP); while (defs != null) { int p = defs.indexOf('='); @@ -251,16 +391,12 @@ public class Jalview else { System.out.println("Executing setprop argument: " + defs); - // DISABLED FOR SECURITY REASONS - // TODO: add a property to allow properties to be overriden by cli args - // Cache.setProperty(defs.substring(0,p), defs.substring(p+1)); + if (Platform.isJS()) + { + Cache.setProperty(defs.substring(0, p), defs.substring(p + 1)); + } } - defs = aparser.getValue("setprop"); - } - if (System.getProperty("java.awt.headless") != null - && System.getProperty("java.awt.headless").equals("true")) - { - headless = true; + defs = aparser.getValue(ArgsParser.SETPROP); } System.setProperty("http.agent", "Jalview Desktop/" + Cache.getDefault("VERSION", "Unknown")); @@ -285,7 +421,7 @@ public class Jalview System.err.println("Unexpected Look and Feel Exception"); ex.printStackTrace(); } - if (Platform.isAMac()) + if (Platform.isAMacAndNotJS()) { LookAndFeel lookAndFeel = ch.randelshofer.quaqua.QuaquaManager @@ -304,8 +440,9 @@ public class Jalview "Failed to set QuaQua look and feel: " + e.toString()); } } - if (lookAndFeel == null || !(lookAndFeel.getClass() - .isAssignableFrom(UIManager.getLookAndFeel().getClass())) + if (lookAndFeel == null + || !(lookAndFeel.getClass().isAssignableFrom( + UIManager.getLookAndFeel().getClass())) || !UIManager.getLookAndFeel().getClass().toString() .toLowerCase().contains("quaqua")) { @@ -336,75 +473,85 @@ public class Jalview desktop = new Desktop(); desktop.setInBatchMode(true); // indicate we are starting up desktop.setVisible(true); - desktop.startServiceDiscovery(); - if (!aparser.contains("nousagestats")) - { - startUsageStats(desktop); - } - else - { - System.err.println("CMD [-nousagestats] executed successfully!"); - } - if (!aparser.contains("noquestionnaire")) + if (!Platform.isJS()) + /** + * Java only + * + * @j2sIgnore + */ { - String url = aparser.getValue("questionnaire"); - if (url != null) + desktop.startServiceDiscovery(); + if (!aparser.contains(ArgsParser.NOUSAGESTATS)) { - // Start the desktop questionnaire prompter with the specified - // questionnaire - Cache.log.debug("Starting questionnaire url at " + url); - desktop.checkForQuestionnaire(url); - System.out.println( - "CMD questionnaire[-" + url + "] executed successfully!"); + startUsageStats(desktop); } else { - if (Cache.getProperty("NOQUESTIONNAIRES") == null) + System.err.println("CMD [-nousagestats] executed successfully!"); + } + + if (!aparser.contains(ArgsParser.NOQUESTIONNAIRE)) + { + String url = aparser.getValue(ArgsParser.QUESTIONNAIRE); + if (url != null) { // Start the desktop questionnaire prompter with the specified // questionnaire - // String defurl = - // "http://anaplog.compbio.dundee.ac.uk/cgi-bin/questionnaire.pl"; - // // - String defurl = "http://www.jalview.org/cgi-bin/questionnaire.pl"; - Cache.log.debug( - "Starting questionnaire with default url: " + defurl); - desktop.checkForQuestionnaire(defurl); + Cache.log.debug("Starting questionnaire url at " + url); + desktop.checkForQuestionnaire(url); + System.out.println("CMD questionnaire[-" + url + + "] executed successfully!"); + } + else + { + if (Cache.getProperty("NOQUESTIONNAIRES") == null) + { + // Start the desktop questionnaire prompter with the specified + // questionnaire + // String defurl = + // "http://anaplog.compbio.dundee.ac.uk/cgi-bin/questionnaire.pl"; + // // + String defurl = "http://www.jalview.org/cgi-bin/questionnaire.pl"; + Cache.log.debug( + "Starting questionnaire with default url: " + defurl); + desktop.checkForQuestionnaire(defurl); + } } } - } - else - { - System.err.println("CMD [-noquestionnaire] executed successfully!"); - } + else + { + System.err + .println("CMD [-noquestionnaire] executed successfully!"); + } - if (!aparser.contains("nonews")) - { - desktop.checkForNews(); - } + if (!aparser.contains(ArgsParser.NONEWS)) + { + desktop.checkForNews(); + } - BioJsHTMLOutput.updateBioJS(); + BioJsHTMLOutput.updateBioJS(); + } } - String file = null, data = null; + String data = null; FileFormatI format = null; DataSourceType protocol = null; FileLoader fileLoader = new FileLoader(!headless); - String groovyscript = null; // script to execute after all loading is + // script to execute after all loading is // completed one way or another // extract groovy argument and execute if necessary - groovyscript = aparser.getValue("groovy", true); - file = aparser.getValue("open", true); + String groovyscript = aparser.getValue(ArgsParser.GROOVY, true); + String file = aparser.getValue(ArgsParser.OPEN, true); if (file == null && desktop == null) { System.out.println("No files to open!"); System.exit(1); } - String vamsasImport = aparser.getValue("vdoc"); - String vamsasSession = aparser.getValue("vsess"); + String vamsasImport = aparser.getValue(ArgsParser.VDOC); + String vamsasSession = aparser.getValue(ArgsParser.VSESS); if (vamsasImport != null || vamsasSession != null) { if (desktop == null || headless) @@ -501,14 +648,24 @@ public class Jalview } System.out.println("CMD [-open " + file + "] executed successfully!"); - if (!file.startsWith("http://")) + if (!Platform.isJS()) + /** + * ignore in JavaScript -- can't just check file existence - could load + * it? + * + * @j2sIgnore + */ { - if (!(new File(file)).exists()) + if (!file.startsWith("http://") && !file.startsWith("https://")) + // BH 2019 added https check for Java { - System.out.println("Can't find " + file); - if (headless) + if (!(new File(file)).exists()) { - System.exit(1); + System.out.println("Can't find " + file); + if (headless) + { + System.exit(1); + } } } } @@ -532,13 +689,13 @@ public class Jalview else { setCurrentAlignFrame(af); - data = aparser.getValue("colour", true); + data = aparser.getValue(ArgsParser.COLOUR, true); if (data != null) { data.replaceAll("%20", " "); - ColourSchemeI cs = ColourSchemeProperty - .getColourScheme(af.getViewport().getAlignment(), data); + ColourSchemeI cs = ColourSchemeProperty.getColourScheme( + af.getViewport(), af.getViewport().getAlignment(), data); if (cs != null) { @@ -549,7 +706,7 @@ public class Jalview } // Must maintain ability to use the groups flag - data = aparser.getValue("groups", true); + data = aparser.getValue(ArgsParser.GROUPS, true); if (data != null) { af.parseFeaturesFile(data, @@ -558,7 +715,7 @@ public class Jalview System.out.println( "CMD groups[-" + data + "] executed successfully!"); } - data = aparser.getValue("features", true); + data = aparser.getValue(ArgsParser.FEATURES, true); if (data != null) { af.parseFeaturesFile(data, @@ -568,7 +725,7 @@ public class Jalview "CMD [-features " + data + "] executed successfully!"); } - data = aparser.getValue("annotations", true); + data = aparser.getValue(ArgsParser.ANNOTATIONS, true); if (data != null) { af.loadJalviewDataFile(data, null, null, null); @@ -577,7 +734,7 @@ public class Jalview "CMD [-annotations " + data + "] executed successfully!"); } // set or clear the sortbytree flag. - if (aparser.contains("sortbytree")) + if (aparser.contains(ArgsParser.SORTBYTREE)) { af.getViewport().setSortByTree(true); if (af.getViewport().getSortByTree()) @@ -585,7 +742,8 @@ public class Jalview System.out.println("CMD [-sortbytree] executed successfully!"); } } - if (aparser.contains("no-annotation")) + if (aparser.contains(ArgsParser.NOANNOTATION) + || aparser.contains(ArgsParser.NOANNOTATION2)) { af.getViewport().setShowAnnotation(false); if (!af.getViewport().isShowAnnotation()) @@ -593,7 +751,7 @@ public class Jalview System.out.println("CMD no-annotation executed successfully!"); } } - if (aparser.contains("nosortbytree")) + if (aparser.contains(ArgsParser.NOSORTBYTREE)) { af.getViewport().setSortByTree(false); if (!af.getViewport().getSortByTree()) @@ -602,7 +760,7 @@ public class Jalview .println("CMD [-nosortbytree] executed successfully!"); } } - data = aparser.getValue("tree", true); + data = aparser.getValue(ArgsParser.TREE, true); if (data != null) { try @@ -635,6 +793,10 @@ public class Jalview String imageName = "unnamed.png"; while (aparser.getSize() > 1) { + // PNG filename + // SVG filename + // HTML filename + // biojsmsa filename String outputFormat = aparser.nextValue(); file = aparser.nextValue(); @@ -699,7 +861,8 @@ public class Jalview continue; } - if (af.saveAlignment(file, format)) + af.saveAlignment(file, format); + if (af.isSaveAlignmentSuccessful()) { System.out.println("Written alignment in " + format + " format to " + file); @@ -723,8 +886,14 @@ public class Jalview // And the user // //////////////////// - if (!headless && file == null && vamsasImport == null + if (!Platform.isJS() && !headless && file == null + && vamsasImport == null && jalview.bin.Cache.getDefault("SHOW_STARTUP_FILE", true)) + /** + * Java only + * + * @j2sIgnore + */ { file = jalview.bin.Cache.getDefault("STARTUP_FILE", jalview.bin.Cache.getDefault("www.jalview.org", @@ -828,9 +997,6 @@ public class Jalview // (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" - + "-dasserver nickname=URL\tAdd and enable a das server with given nickname\n\t\t\t(alphanumeric or underscores only) for retrieval of features for all alignments.\n" - + "\t\t\tSources that also support the sequence command may be specified by prepending the URL with sequence:\n" - + "\t\t\t e.g. sequence:http://localdas.somewhere.org/das/source)\n" + "-fetchfrom nickname\tQuery nickname for features for the alignments and display them.\n" // + // "-vdoc vamsas-document\tImport vamsas document into new @@ -845,8 +1011,9 @@ public class Jalview /** * start a User Config prompt asking if we can log usage statistics. */ - PromptUserConfig prompter = new PromptUserConfig(Desktop.desktop, - "USAGESTATS", "Jalview 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)", @@ -989,16 +1156,6 @@ public class Jalview } } - 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() } @@ -1022,13 +1179,46 @@ public class Jalview } } - public static AlignFrame getCurrentAlignFrame() - { - return Jalview.currentAlignFrame; - } + // singleton instances + + public Cache cache; + + public AlignmentSorter alignmentSorter; + + public EnsemblInfo ensemblInfo; + + public HttpServer httpServer; + + public IdentityHashMap structureSelections; + + public PDBFTSRestClient pdbFTSRestClient; + + public RestHandler restHandler; + + public ScoreModels scoreModels; + + public SequenceFetcher sequenceFetcher; + + public SequenceOntologyI sequenceOntology; + + public UniProtFTSRestClient uniprotFTSRestClient; + + public StructureSelectionManager nullProvider; + + public Color[] rnaHelices = null; + + public StructureImportSettings structureImportSettings; + + public IdOrgSettings idOrgSettings; + + public SiftsSettings siftsSettings; + + public RestClient restClient; + + public Jws2Discoverer j2s2discoverer; + + public Jws2InstanceFactory jws2InstanceFactory; + + public Discoverer discoverer; - public static void setCurrentAlignFrame(AlignFrame currentAlignFrame) - { - Jalview.currentAlignFrame = currentAlignFrame; - } }