import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
+import java.util.stream.Collectors;
import javax.swing.JDialog;
import javax.swing.JFrame;
+import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import groovy.lang.Binding;
import groovy.util.GroovyScriptEngine;
import jalview.bin.argparser.Arg;
+import jalview.bin.argparser.Arg.Opt;
+import jalview.bin.argparser.Arg.Type;
import jalview.bin.argparser.ArgParser;
import jalview.bin.argparser.BootstrapArgs;
import jalview.ext.so.SequenceOntology;
import jalview.gui.PromptUserConfig;
import jalview.gui.QuitHandler;
import jalview.gui.QuitHandler.QResponse;
+import jalview.gui.StructureViewerBase;
import jalview.io.AppletFormatAdapter;
import jalview.io.BioJsHTMLOutput;
import jalview.io.DataSourceType;
public static AlignFrame currentAlignFrame;
+ public ArgParser argparser = null;
+
+ public BootstrapArgs bootstrapArgs = null;
+
+ private boolean QUIET = false;
+
+ public static boolean quiet()
+ {
+ return Jalview.getInstance() != null && Jalview.getInstance().QUIET;
+ }
+
static
{
if (!Platform.isJS())
*/
void doMain(String[] args)
{
-
if (!Platform.isJS())
{
System.setSecurityManager(null);
}
- // Move any new getdown-launcher-new.jar into place over old
- // getdown-launcher.jar
- String appdirString = System.getProperty("getdownappdir");
- if (appdirString != null && appdirString.length() > 0)
+ if (args == null || args.length == 0 || (args.length == 1
+ && (args[0] == null || args[0].length() == 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();
+ args = new String[] {};
}
// get args needed before proper ArgParser
- BootstrapArgs bootstrapArgs = BootstrapArgs.getBootstrapArgs(args);
+ bootstrapArgs = BootstrapArgs.getBootstrapArgs(args);
if (!Platform.isJS())
{
// are we being --quiet ?
if (bootstrapArgs.contains(Arg.QUIET))
{
+ QUIET = true;
OutputStream devNull = new OutputStream()
{
+
@Override
public void write(int b)
{
System.setErr(new PrintStream(devNull));
}
}
- }
-
- 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);
+ if (bootstrapArgs.contains(Arg.HELP)
+ || bootstrapArgs.contains(Arg.VERSION))
+ {
+ QUIET = true;
+ }
}
- val = System.getProperty("installer_template_version");
- if (val != null)
+
+ // Move any new getdown-launcher-new.jar into place over old
+ // getdown-launcher.jar
+ String appdirString = System.getProperty("getdownappdir");
+ if (appdirString != null && appdirString.length() > 0)
{
- System.out.println("Install4j template version: " + val);
+ 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();
}
- val = System.getProperty("launcher_version");
- if (val != null)
+
+ if (!quiet() || bootstrapArgs.contains(Arg.VERSION))
{
- System.out.println("Launcher version: " + val);
+ System.out.println(
+ "Java version: " + System.getProperty("java.version"));
+ System.out.println("Java home: " + System.getProperty("java.home"));
+ System.out.println("Java arch: " + 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);
+ }
}
if (Platform.isLinux() && LaunchUtils.getJavaVersion() < 11)
.bootstrapProperties(bootstrapArgs.get(Arg.PROPS));
// report Jalview version
- Cache.loadBuildProperties(true);
+ Cache.loadBuildProperties(
+ !quiet() || bootstrapArgs.contains(Arg.VERSION));
+
+ // stop now if only after --version
+ if (bootstrapArgs.contains(Arg.VERSION))
+ {
+ Jalview.exit(null, 0);
+ }
// old ArgsParser
ArgsParser aparser = new ArgsParser(args);
try
{
- String logLevel = bootstrapArgs.contains(Arg.DEBUG) ? "DEBUG" : null;
+ String logLevel = null;
+ if (bootstrapArgs.contains(Arg.TRACE))
+ {
+ logLevel = "TRACE";
+ }
+ else if (bootstrapArgs.contains(Arg.DEBUG))
+ {
+ logLevel = "DEBUG";
+ }
if (logLevel == null && !(bootstrapProperties == null))
{
logLevel = bootstrapProperties.getProperty(Cache.JALVIEWLOGLEVEL);
public void run()
{
Console.debug("Running shutdown hook");
+ QuitHandler.startForceQuit();
+ boolean closeExternal = Cache
+ .getDefault("DEFAULT_CLOSE_EXTERNAL_VIEWERS", false)
+ || Cache.getDefault("ALWAYS_CLOSE_EXTERNAL_VIEWERS", false);
+ StructureViewerBase.setQuitClose(closeExternal);
+ for (JInternalFrame frame : Desktop.desktop.getAllFrames())
+ {
+ if (frame instanceof StructureViewerBase)
+ {
+ ((StructureViewerBase) frame).closeViewer(closeExternal);
+ }
+ }
+
if (QuitHandler.gotQuitResponse() == QResponse.CANCEL_QUIT)
{
// Got to here by a SIGTERM signal.
// Note we will not actually cancel the quit from here -- it's too
- // late -- but we can wait for saving files.
+ // late -- but we can wait for saving files and close external viewers
+ // if configured.
+ // Close viewers/Leave viewers open
Console.debug("Checking for saving files");
QuitHandler.getQuitResponse(false);
}
{
System.out.println(
"CMD [-props " + usrPropsFile + "] executed successfully!");
+ testoutput(bootstrapArgs, Arg.PROPS,
+ "test/jalview/bin/testProps.jvprops", usrPropsFile);
}
- // new ArgParser
- ArgParser argparser;
// --argfile=... -- OVERRIDES ALL NON-BOOTSTRAP ARGS
if (bootstrapArgs.contains(Arg.ARGFILE))
{
argparser = ArgParser.parseArgFiles(
- bootstrapArgs.getList(Arg.ARGFILE),
- bootstrapArgs.getBoolean(Arg.INITSUBSTITUTIONS));
+ bootstrapArgs.getValueList(Arg.ARGFILE),
+ bootstrapArgs.getBoolean(Arg.INITSUBSTITUTIONS),
+ bootstrapArgs);
}
else
{
argparser = new ArgParser(args,
- bootstrapArgs.getBoolean(Arg.INITSUBSTITUTIONS));
+ bootstrapArgs.getBoolean(Arg.INITSUBSTITUTIONS),
+ bootstrapArgs);
}
if (!Platform.isJS())
{
if (bootstrapArgs.contains(Arg.HELP))
{
- System.out.println(Arg.usage());
+ List<Map.Entry<Type, String>> helpArgs = bootstrapArgs
+ .getList(Arg.HELP);
+ System.out.println(Arg.usage(helpArgs.stream().map(e -> e.getKey())
+ .collect(Collectors.toList())));
Jalview.exit(null, 0);
}
if (aparser.contains("help") || aparser.contains("h"))
{
+ /*
+ * Now using new usage statement.
showUsage();
+ */
+ System.out.println(Arg.usage());
Jalview.exit(null, 0);
}
{
System.setProperty("java.awt.headless", "true");
// new
- headlessArg = argparser.getBool(Arg.HEADLESS);
+ headlessArg = bootstrapArgs.getBoolean(Arg.HEADLESS);
}
if (aparser.contains("nodisplay") || aparser.contains("nogui")
|| aparser.contains("headless"))
// allow https handshakes to download intermediate certs if necessary
System.setProperty("com.sun.security.enableAIAcaIssuers", "true");
- final String jabawsUrl = aparser.getValue("jabaws");
+ String jabawsUrl = bootstrapArgs.get(Arg.JABAWS);
+ if (jabawsUrl == null)
+ jabawsUrl = aparser.getValue("jabaws");
if (jabawsUrl != null)
{
try
Jws2Discoverer.getDiscoverer().setPreferredUrl(jabawsUrl);
System.out.println(
"CMD [-jabaws " + jabawsUrl + "] executed successfully!");
+ testoutput(bootstrapArgs, Arg.JABAWS,
+ "http://www.compbio.dundee.ac.uk/jabaws", jabawsUrl);
} catch (MalformedURLException e)
{
System.err.println(
List<String> setprops = new ArrayList<>();
if (bootstrapArgs.contains(Arg.SETPROP))
{
- setprops = bootstrapArgs.getList(Arg.SETPROP);
+ setprops = bootstrapArgs.getValueList(Arg.SETPROP);
}
else
{
}
}
- if (!aparser.contains("nowebservicediscovery"))
+ boolean webservicediscovery = bootstrapArgs
+ .getBoolean(Arg.WEBSERVICEDISCOVERY);
+ if (aparser.contains("nowebservicediscovery"))
+ webservicediscovery = false;
+ if (webservicediscovery)
{
desktop.startServiceDiscovery();
}
- if (!aparser.contains("nousagestats"))
+ else
+ {
+ testoutput(argparser, Arg.WEBSERVICEDISCOVERY);
+ }
+
+ boolean usagestats = bootstrapArgs.getBoolean(Arg.USAGESTATS);
+ if (aparser.contains("nousagestats"))
+ usagestats = false;
+ if (usagestats)
{
startUsageStats(desktop);
+ testoutput(argparser, Arg.USAGESTATS);
}
else
{
- System.err.println("CMD [-nousagestats] executed successfully!");
+ System.out.println("CMD [-nousagestats] executed successfully!");
+ testoutput(argparser, Arg.USAGESTATS);
}
- if (!aparser.contains("noquestionnaire"))
+ boolean questionnaire = bootstrapArgs.getBoolean(Arg.QUESTIONNAIRE);
+ if (aparser.contains("noquestionnaire"))
+ questionnaire = false;
+ if (questionnaire)
{
String url = aparser.getValue("questionnaire");
if (url != null)
}
else
{
- System.err
+ System.out
.println("CMD [-noquestionnaire] executed successfully!");
+ testoutput(argparser, Arg.QUESTIONNAIRE);
}
if ((!aparser.contains("nonews")
{
if (headlessArg)
{
- Jalview.exit("Successfully completed commands in headless mode", 0);
+ if (argparser.getBoolean(Arg.NOQUIT))
+ {
+ Console.warn(
+ "Completed " + Arg.HEADLESS.getName() + " commands, but "
+ + Arg.NOQUIT + " is set so not quitting!");
+ }
+ else
+ {
+ Jalview.exit("Successfully completed commands in headless mode",
+ 0);
+ }
}
Console.info("Successfully completed commands");
}
}
if (!lafSet)
{
- setSystemLookAndFeel();
+ // Flatlaf default for everyone!
+ lafSet = setFlatLookAndFeel();
+ if (!lafSet)
+ {
+ setSystemLookAndFeel();
+ }
if (Platform.isLinux())
{
setLinuxLookAndFeel();
UIManager.put("TabbedPane.smoothScrolling", true);
UIManager.put("TabbedPane.tabWidthMode", "compact");
UIManager.put("TabbedPane.selectedBackground", Color.white);
+ UIManager.put("TabbedPane.background", new Color(236, 236, 236));
+ UIManager.put("TabbedPane.hoverColor", Color.lightGray);
}
Desktop.setLiveDragMode(Cache.getDefault("FLAT_LIVE_DRAG_MODE", true));
return set;
}
+ /*
private static void showUsage()
{
System.out.println(
+ "-jvmmemmax=MAXMEMORY\tOnly available with standalone executable jar or jalview.bin.Launcher. Limit maximum heap size (memory) to MAXMEMORY. MAXMEMORY can be specified in bytes, kilobytes(k), megabytes(m), gigabytes(g) or if you're lucky enough, terabytes(t). This defaults to 32g if total physical memory can be detected, or to 8g if total physical memory cannot be detected. See https://www.jalview.org/help/html/memory.html for more details.\n"
+ "\n~Read documentation in Application or visit https://www.jalview.org for description of Features and Annotations file~\n\n");
}
+ */
private static void startUsageStats(final Desktop desktop)
{
* the Jalview Desktop object passed in to the groovy binding as the
* 'Jalview' object.
*/
- private void executeGroovyScript(String groovyscript, AlignFrame af)
+ protected void executeGroovyScript(String groovyscript, AlignFrame af)
{
/**
* for scripts contained in files
public static void exit(String message, int exitcode)
{
- Console.debug("Using Jalview.exit");
- if (message != null)
- if (exitcode == 0)
- Console.info(message);
- else
- Console.error(message);
+ if (Console.log == null)
+ {
+ // Don't start the logger just to exit!
+ if (message != null)
+ {
+ if (exitcode == 0)
+ {
+ System.out.println(message);
+ }
+ else
+ {
+ System.err.println(message);
+ }
+ }
+ }
+ else
+ {
+ Console.debug("Using Jalview.exit");
+ if (message != null)
+ {
+ if (exitcode == 0)
+ {
+ Console.info(message);
+ }
+ else
+ {
+ Console.error(message);
+ }
+ }
+ }
if (exitcode > -1)
+ {
System.exit(exitcode);
+ }
+ }
+
+ /*
+ * testoutput for string values
+ */
+ protected static void testoutput(ArgParser ap, Arg a, String s1,
+ String s2)
+ {
+ BootstrapArgs bsa = ap.getBootstrapArgs();
+ if (!bsa.getBoolean(Arg.TESTOUTPUT))
+ return;
+ if (!((s1 == null && s2 == null) || (s1 != null && s1.equals(s2))))
+ {
+ Console.debug("testoutput with unmatching values '" + s1 + "' and '"
+ + s2 + "' for arg " + a.argString());
+ return;
+ }
+ boolean isset = a.hasOption(Opt.BOOTSTRAP) ? bsa.contains(a)
+ : ap.isSet(a);
+ if (!isset)
+ {
+ Console.warn("Arg '" + a.getName() + "' not set at all");
+ return;
+ }
+ testoutput(true, a, s1, s2);
+ }
+
+ protected static void testoutput(BootstrapArgs bsa, Arg a, String s1,
+ String s2)
+ {
+ if (!bsa.getBoolean(Arg.TESTOUTPUT))
+ return;
+ if (!((s1 == null && s2 == null) || (s1 != null && s1.equals(s2))))
+ {
+ Console.debug("testoutput with unmatching values '" + s1 + "' and '"
+ + s2 + "' for arg " + a.argString());
+ return;
+ }
+ if (!a.hasOption(Opt.BOOTSTRAP))
+ {
+ Console.error("Non-bootstrap Arg '" + a.getName()
+ + "' given to testoutput(BootstrapArgs bsa, Arg a, String s1, String s2) with only BootstrapArgs");
+ }
+ if (!bsa.contains(a))
+ {
+ Console.warn("Arg '" + a.getName() + "' not set at all");
+ return;
+ }
+ testoutput(true, a, s1, s2);
+ }
+
+ private static void testoutput(boolean yes, Arg a, String s1, String s2)
+ {
+ if (yes && ((s1 == null && s2 == null)
+ || (s1 != null && s1.equals(s2))))
+ {
+ System.out.println("[TESTOUTPUT] arg " + a.argString() + "='" + s1
+ + "' was set");
+ }
+ }
+
+ /*
+ * testoutput for boolean values
+ */
+ protected static void testoutput(ArgParser ap, Arg a)
+ {
+ if (ap == null)
+ return;
+ BootstrapArgs bsa = ap.getBootstrapArgs();
+ if (bsa == null)
+ return;
+ if (!bsa.getBoolean(Arg.TESTOUTPUT))
+ return;
+ boolean val = a.hasOption(Opt.BOOTSTRAP) ? bsa.getBoolean(a)
+ : ap.getBoolean(a);
+ boolean isset = a.hasOption(Opt.BOOTSTRAP) ? bsa.contains(a)
+ : ap.isSet(a);
+ if (!isset)
+ {
+ Console.warn("Arg '" + a.getName() + "' not set at all");
+ return;
+ }
+ testoutput(val, a);
+ }
+
+ protected static void testoutput(BootstrapArgs bsa, Arg a)
+ {
+ if (!bsa.getBoolean(Arg.TESTOUTPUT))
+ return;
+ if (!a.hasOption(Opt.BOOTSTRAP))
+ {
+ Console.warn("Non-bootstrap Arg '" + a.getName()
+ + "' given to testoutput(BootstrapArgs bsa, Arg a) with only BootstrapArgs");
+
+ }
+ if (!bsa.contains(a))
+ {
+ Console.warn("Arg '" + a.getName() + "' not set at all");
+ return;
+ }
+ testoutput(bsa.getBoolean(a), a);
+ }
+
+ private static void testoutput(boolean yes, Arg a)
+ {
+ System.out.println("[TESTOUTPUT] arg "
+ + (yes ? a.argString() : a.negateArgString()) + " was set");
}
}