import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
+import java.io.OutputStream;
import java.io.OutputStreamWriter;
+import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URI;
import java.security.PermissionCollection;
import java.security.Permissions;
import java.security.Policy;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.Properties;
import java.util.Vector;
import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
//import edu.stanford.ejalbert.launching.IBrowserLaunching;
import groovy.lang.Binding;
import groovy.util.GroovyScriptEngine;
+import jalview.bin.argparser.Arg;
+import jalview.bin.argparser.ArgParser;
+import jalview.bin.argparser.BootstrapArgs;
import jalview.ext.so.SequenceOntology;
import jalview.gui.AlignFrame;
import jalview.gui.Desktop;
private Desktop desktop;
+ protected Commands cmds;
+
public static AlignFrame currentAlignFrame;
static
*/
void doMain(String[] args)
{
-
if (!Platform.isJS())
{
System.setSecurityManager(null);
+ }
+
+ if (args == null)
+ args = new String[] {};
- Runtime.getRuntime().addShutdownHook(new Thread()
+ // 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)
+ {
+ final File appdir = new File(appdirString);
+ new Thread()
{
+ @Override
public void run()
{
- Console.debug("Running shutdown hook");
- 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.
- Console.debug("Checking for saving files");
- QuitHandler.getQuitResponse(false);
- }
- else
+ LaunchUtil.upgradeGetdown(
+ new File(appdir, "getdown-launcher-old.jar"),
+ new File(appdir, "getdown-launcher.jar"),
+ new File(appdir, "getdown-launcher-new.jar"));
+ }
+ }.start();
+ }
+
+ // get args needed before proper ArgParser
+ BootstrapArgs bootstrapArgs = BootstrapArgs.getBootstrapArgs(args);
+
+ if (!Platform.isJS())
+ {
+ // are we being --quiet ?
+ if (bootstrapArgs.contains(Arg.QUIET))
+ {
+ OutputStream devNull = new OutputStream()
+ {
+ @Override
+ public void write(int b)
{
- Console.debug("Nothing more to do");
+ // DO NOTHING
}
- Console.debug("Exiting, bye!");
- // shutdownHook cannot be cancelled, JVM will now halt
+ };
+ System.setOut(new PrintStream(devNull));
+ // redirecting stderr not working
+ if (bootstrapArgs.getList(Arg.QUIET).size() > 1)
+ {
+ System.setErr(new PrintStream(devNull));
}
- });
+ }
}
System.out
System.out.println("Launcher version: " + val);
}
+ if (Platform.isLinux() && LaunchUtils.getJavaVersion() < 11)
+ {
+ System.setProperty("flatlaf.uiScale", "1");
+ }
+
+ // get bootstrap properties (mainly for the logger level)
+ Properties bootstrapProperties = Cache
+ .bootstrapProperties(bootstrapArgs.get(Arg.PROPS));
+
// report Jalview version
Cache.loadBuildProperties(true);
+ // old ArgsParser
ArgsParser aparser = new ArgsParser(args);
+ // old
boolean headless = false;
+ // new
+ boolean headlessArg = false;
+
+ try
+ {
+ String logLevel = bootstrapArgs.contains(Arg.DEBUG) ? "DEBUG" : null;
+ if (logLevel == null && !(bootstrapProperties == null))
+ {
+ logLevel = bootstrapProperties.getProperty(Cache.JALVIEWLOGLEVEL);
+ }
+ Console.initLogger(logLevel);
+ } catch (NoClassDefFoundError error)
+ {
+ error.printStackTrace();
+ String message = "\nEssential logging libraries not found."
+ + "\nUse: java -classpath \"$PATH_TO_LIB$/*:$PATH_TO_CLASSES$\" jalview.bin.Jalview";
+ Jalview.exit(message, 0);
+ }
- String usrPropsFile = aparser.getValue("props");
- Cache.loadProperties(usrPropsFile); // must do this
- // before
+ // register SIGTERM listener
+ Runtime.getRuntime().addShutdownHook(new Thread()
+ {
+ public void run()
+ {
+ Console.debug("Running shutdown hook");
+ 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.
+ Console.debug("Checking for saving files");
+ QuitHandler.getQuitResponse(false);
+ }
+ else
+ {
+ Console.debug("Nothing more to do");
+ }
+ Console.debug("Exiting, bye!");
+ // shutdownHook cannot be cancelled, JVM will now halt
+ }
+ });
+
+ String usrPropsFile = bootstrapArgs.contains(Arg.PROPS)
+ ? bootstrapArgs.get(Arg.PROPS)
+ : aparser.getValue("props");
+ // if usrPropsFile == null, loadProperties will use the Channel
+ // preferences.file
+ Cache.loadProperties(usrPropsFile);
if (usrPropsFile != null)
{
System.out.println(
"CMD [-props " + usrPropsFile + "] executed successfully!");
}
+ // 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));
+ }
+ else
+ {
+ argparser = new ArgParser(args,
+ bootstrapArgs.getBoolean(Arg.INITSUBSTITUTIONS));
+ }
+
if (!Platform.isJS())
/**
* Java only
* @j2sIgnore
*/
{
+ if (bootstrapArgs.contains(Arg.HELP))
+ {
+ System.out.println(Arg.usage());
+ Jalview.exit(null, 0);
+ }
if (aparser.contains("help") || aparser.contains("h"))
{
showUsage();
- System.exit(0);
+ Jalview.exit(null, 0);
+ }
+
+ if (bootstrapArgs.contains(Arg.HEADLESS))
+ {
+ System.setProperty("java.awt.headless", "true");
+ // new
+ headlessArg = argparser.getBool(Arg.HEADLESS);
}
if (aparser.contains("nodisplay") || aparser.contains("nogui")
|| aparser.contains("headless"))
{
System.setProperty("java.awt.headless", "true");
+ // old
headless = true;
}
// anything else!
}
}
- String defs = aparser.getValue("setprop");
- while (defs != null)
+ List<String> setprops = new ArrayList<>();
+ if (bootstrapArgs.contains(Arg.SETPROP))
{
- int p = defs.indexOf('=');
+ setprops = bootstrapArgs.getList(Arg.SETPROP);
+ }
+ else
+ {
+ String sp = aparser.getValue("setprop");
+ while (sp != null)
+ {
+ setprops.add(sp);
+ sp = aparser.getValue("setprop");
+ }
+ }
+ for (String setprop : setprops)
+ {
+ int p = setprop.indexOf('=');
if (p == -1)
{
- System.err.println("Ignoring invalid setprop argument : " + defs);
+ System.err
+ .println("Ignoring invalid setprop argument : " + setprop);
}
else
{
- System.out.println("Executing setprop argument: " + defs);
+ System.out.println("Executing setprop argument: " + setprop);
if (Platform.isJS())
{
- Cache.setProperty(defs.substring(0, p), defs.substring(p + 1));
+ Cache.setProperty(setprop.substring(0, p),
+ setprop.substring(p + 1));
}
// 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));
+ // Cache.setProperty(setprop.substring(0,p), setprop.substring(p+1));
}
- defs = aparser.getValue("setprop");
}
if (System.getProperty("java.awt.headless") != null
&& System.getProperty("java.awt.headless").equals("true"))
NoClassDefFoundError error)
{
error.printStackTrace();
- System.out.println("\nEssential logging libraries not found."
- + "\nUse: java -classpath \"$PATH_TO_LIB$/*:$PATH_TO_CLASSES$\" jalview.bin.Jalview");
- System.exit(0);
+ String message = "\nEssential logging libraries not found."
+ + "\nUse: java -classpath \"$PATH_TO_LIB$/*:$PATH_TO_CLASSES$\" jalview.bin.Jalview";
+ Jalview.exit(message, 0);
}
-
desktop = null;
- setLookAndFeel();
+ if (!(headless || headlessArg))
+ setLookAndFeel();
/*
* configure 'full' SO model if preferences say to, else use the default (full SO)
SequenceOntologyFactory.setInstance(new SequenceOntology());
}
- if (!headless)
+ if (!(headless || headlessArg))
{
- Desktop.nosplash = aparser.contains("nosplash");
+ Desktop.nosplash = "false".equals(bootstrapArgs.get(Arg.SPLASH))
+ || aparser.contains("nosplash")
+ || Cache.getDefault("SPLASH", "true").equals("false");
desktop = new Desktop();
desktop.setInBatchMode(true); // indicate we are starting up
.println("CMD [-noquestionnaire] executed successfully!");
}
- if (!aparser.contains("nonews")
- || Cache.getProperty("NONEWS") == null)
+ if ((!aparser.contains("nonews")
+ && Cache.getProperty("NONEWS") == null
+ && !"false".equals(bootstrapArgs.get(Arg.NEWS)))
+ || "true".equals(bootstrapArgs.get(Arg.NEWS)))
{
desktop.checkForNews();
}
if (!aparser.contains("nohtmltemplates")
- || Cache.getProperty("NOHTMLTEMPLATES") == null)
+ && Cache.getProperty("NOHTMLTEMPLATES") == null)
{
BioJsHTMLOutput.updateBioJS();
}
}
}
+ // Run Commands from cli
+ cmds = new Commands(argparser, headlessArg);
+ boolean commandsSuccess = cmds.argsWereParsed();
+ if (commandsSuccess)
+ {
+ if (headlessArg)
+ {
+ Jalview.exit("Successfully completed commands in headless mode", 0);
+ }
+ Console.info("Successfully completed commands");
+ }
+ else
+ {
+ if (headlessArg)
+ {
+ Jalview.exit("Error when running Commands in headless mode", 1);
+ }
+ Console.warn("Error when running commands");
+ }
// Check if JVM and compile version might cause problems and log if it
// might.
+ LaunchUtils.getJavaCompileVersion() + ".");
}
- // 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)
- {
- 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();
- }
-
String file = null, data = null;
FileFormatI format = null;
groovyscript = aparser.getValue("groovy", true);
file = aparser.getValue("open", true);
- if (file == null && desktop == null)
+ if (file == null && desktop == null && !commandsSuccess)
{
- System.out.println("No files to open!");
- System.exit(1);
+ Jalview.exit("No files to open!", 1);
}
long progress = -1;
{
if (!(new File(file)).exists())
{
- System.out.println("Can't find " + file);
if (headless)
{
- System.exit(1);
+ Jalview.exit(
+ "Can't find file '" + file + "' in headless mode", 1);
}
+ Console.warn("Can't find file'" + file + "'");
}
}
}
if (cs != null)
{
System.out.println(
- "CMD [-color " + data + "] executed successfully!");
+ "CMD [-colour " + data + "] executed successfully!");
}
af.changeColour(cs);
}
// ////////////////////
if (!Platform.isJS() && !headless && file == null
- && Cache.getDefault("SHOW_STARTUP_FILE", true))
+ && Cache.getDefault("SHOW_STARTUP_FILE", true)
+ && !cmds.commandArgsProvided())
+ // don't open the startup file if command line args have been processed
+ // (&& !Commands.commandArgsProvided())
/**
* Java only
*
public void quit()
{
// System.exit will run the shutdownHook first
- System.exit(0);
+ Jalview.exit("Quitting now. Bye!", 0);
}
public static AlignFrame getCurrentAlignFrame()
{
Jalview.currentAlignFrame = currentAlignFrame;
}
+
+ protected Commands getCommands()
+ {
+ return cmds;
+ }
+
+ 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 (exitcode > -1)
+ System.exit(exitcode);
+ }
}