import java.util.HashMap;
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;
import groovy.lang.Binding;
/**
* Main class for Jalview Application <br>
* <br>
- * start with java -Djava.ext.dirs=$PATH_TO_LIB$ jalview.bin.Jalview
+ * 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
{
- /*
- * singleton instance of this class
+ 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()
+ {
+ 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();
+ /**
+ * @j2s 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()
+ {
+ }
+ });
+ }
}
/**
af.setProgressBar(MessageManager
.getString("status.das_features_being_retrived"), id);
af.featureSettings_actionPerformed(null);
- af.featureSettings.fetchDasFeatures(dasSources, true);
af.setProgressBar(null, id);
synchronized (us)
{
}
- public static Jalview getInstance()
- {
- return instance;
- }
-
/**
* main class for Jalview application
*
*/
public static void main(String[] args)
{
- instance = new Jalview();
- instance.doMain(args);
+ // setLogging(); // BH - for event debugging in JavaScript
+ setInstance(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");
+ }
+
}
/**
*/
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") + " "
+ 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;
+ }
+
+ // 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");
+ }
}
- }
- String defs = aparser.getValue("setprop");
+ }
+ // check for property setting
+ String defs = aparser.getValue(ArgsParser.SETPROP);
while (defs != null)
{
int p = defs.indexOf('=');
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"));
{
error.printStackTrace();
System.out.println("\nEssential logging libraries not found."
- + "\nUse: java -Djava.ext.dirs=$PATH_TO_LIB$ jalview.bin.Jalview");
+ + "\nUse: java -classpath \"$PATH_TO_LIB$/*:$PATH_TO_CLASSES$\" jalview.bin.Jalview");
System.exit(0);
}
System.err.println("Unexpected Look and Feel Exception");
ex.printStackTrace();
}
- if (Platform.isAMac())
+ if (Platform.isAMacAndNotJS())
{
+
+ LookAndFeel lookAndFeel = ch.randelshofer.quaqua.QuaquaManager
+ .getLookAndFeel();
System.setProperty("com.apple.mrj.application.apple.menu.about.name",
"Jalview");
System.setProperty("apple.laf.useScreenMenuBar", "true");
- try
- {
- UIManager.setLookAndFeel(
- ch.randelshofer.quaqua.QuaquaManager.getLookAndFeel());
- } catch (Throwable e)
+ if (lookAndFeel != null)
{
- System.err.println(
- "Failed to set QuaQua look and feel: " + e.toString());
+ try
+ {
+ UIManager.setLookAndFeel(lookAndFeel);
+ } catch (Throwable e)
+ {
+ System.err.println(
+ "Failed to set QuaQua look and feel: " + e.toString());
+ }
}
- if (!ch.randelshofer.quaqua.QuaquaManager.getLookAndFeel()
- .equals(UIManager.getLookAndFeel()))
+ if (lookAndFeel == null
+ || !(lookAndFeel.getClass().isAssignableFrom(
+ UIManager.getLookAndFeel().getClass()))
+ || !UIManager.getLookAndFeel().getClass().toString()
+ .toLowerCase().contains("quaqua"))
{
try
{
System.err.println(
- "Quaqua LaF not available. Using VAqua(4).");
+ "Quaqua LaF not available on this plaform. Using VAqua(4).\nSee https://issues.jalview.org/browse/JAL-2976");
UIManager.setLookAndFeel("org.violetlib.aqua.AquaLookAndFeel");
} catch (Throwable e)
{
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);
- Vector<String> getFeatures = null; // vector of das source nicknames to
- // fetch
- // features from
- // loading is done.
- 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)
}
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);
+ }
}
}
}
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)
{
}
// 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,
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,
"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);
"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())
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())
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())
.println("CMD [-nosortbytree] executed successfully!");
}
}
- data = aparser.getValue("tree", true);
+ data = aparser.getValue(ArgsParser.TREE, true);
if (data != null)
{
try
// TODO - load PDB structure(s) to alignment JAL-629
// (associate with identical sequence in alignment, or a specified
// sequence)
-
- getFeatures = checkDasArguments(aparser);
- if (af != null && getFeatures != null)
- {
- FeatureFetcher ff = startFeatureFetching(getFeatures);
- if (ff != null)
- {
- while (!ff.allFinished() || af.operationInProgress())
- {
- // wait around until fetching is finished.
- try
- {
- Thread.sleep(100);
- } catch (Exception e)
- {
-
- }
- }
- }
- getFeatures = null; // have retrieved features - forget them now.
- }
if (groovyscript != null)
{
// Execute the groovy script after we've done all the rendering stuff
String imageName = "unnamed.png";
while (aparser.getSize() > 1)
{
+ // PNG filename
+ // SVG filename
+ // HTML filename
+ // biojsmsa filename
String outputFormat = aparser.nextValue();
file = aparser.nextValue();
continue;
}
- if (af.saveAlignment(file, format))
+ af.saveAlignment(file, format);
+ if (af.isSaveAlignmentSuccessful())
{
System.out.println("Written alignment in " + format
+ " format to " + file);
// 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",
startUpAlframe = fileLoader.LoadFileWaitTillLoaded(file, protocol,
format);
- getFeatures = checkDasArguments(aparser);
// extract groovy arguments before anything else.
}
- // If the user has specified features to be retrieved,
- // or a groovy script to be executed, do them if they
- // haven't been done already
- // fetch features for the default alignment
- if (getFeatures != null)
- {
- if (startUpAlframe != null)
- {
- startFeatureFetching(getFeatures);
- }
- }
+
// Once all other stuff is done, execute any groovy scripts (in order)
if (groovyscript != null)
{
// (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
/**
* 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)",
}
}
- /**
- * Check commandline for any das server definitions or any fetchfrom switches
- *
- * @return vector of DAS source nicknames to retrieve from
- */
- private static Vector<String> checkDasArguments(ArgsParser aparser)
- {
- Vector<String> source = null;
- String data;
- String locsources = Cache.getProperty(Cache.DAS_LOCAL_SOURCE);
- while ((data = aparser.getValue("dasserver", true)) != null)
- {
- String nickname = null;
- String url = null;
- int pos = data.indexOf('=');
- // determine capabilities
- if (pos > 0)
- {
- nickname = data.substring(0, pos);
- }
- url = data.substring(pos + 1);
- if (url != null && (url.startsWith("http:")
- || url.startsWith("sequence:http:")))
- {
- if (nickname == null)
- {
- nickname = url;
- }
- if (locsources == null)
- {
- locsources = "";
- }
- else
- {
- locsources += "\t";
- }
- locsources = locsources + nickname + "|" + url;
- System.err.println(
- "NOTE! dasserver parameter not yet really supported (got args of "
- + nickname + "|" + url);
- if (source == null)
- {
- source = new Vector<>();
- }
- source.addElement(nickname);
- }
- System.out.println(
- "CMD [-dasserver " + data + "] executed successfully!");
- } // loop until no more server entries are found.
- if (locsources != null && locsources.indexOf('|') > -1)
- {
- Cache.log.debug("Setting local source list in properties file to:\n"
- + locsources);
- Cache.setProperty(Cache.DAS_LOCAL_SOURCE, locsources);
- }
- while ((data = aparser.getValue("fetchfrom", true)) != null)
- {
- System.out.println("adding source '" + data + "'");
- if (source == null)
- {
- source = new Vector<>();
- }
- source.addElement(data);
- }
- return source;
- }
-
- /**
- * start a feature fetcher for every alignment frame
- *
- * @param dasSources
- */
- private FeatureFetcher startFeatureFetching(
- final Vector<String> dasSources)
- {
- FeatureFetcher ff = new FeatureFetcher();
- AlignFrame afs[] = Desktop.getAlignFrames();
- if (afs == null || afs.length == 0)
- {
- return null;
- }
- for (int i = 0; i < afs.length; i++)
- {
- ff.addFetcher(afs[i], dasSources);
- }
- return ff;
- }
-
- 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() }
}
}
- public static AlignFrame getCurrentAlignFrame()
- {
- return Jalview.currentAlignFrame;
- }
-
- public static void setCurrentAlignFrame(AlignFrame currentAlignFrame)
- {
- Jalview.currentAlignFrame = currentAlignFrame;
- }
}