X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fbin%2Fargparser%2FArg.java;fp=src%2Fjalview%2Fbin%2Fargparser%2FArg.java;h=36f7794e1d77b4f861ad64879eacdff6ef75a879;hb=e83ce5d8ef826fc0b509a51f154abdf734501077;hp=2f259786a0216cc55fcfaebbd60df788cd25e83b;hpb=786475501a15799d7c4058dbf74e4bf896d03736;p=jalview.git
diff --git a/src/jalview/bin/argparser/Arg.java b/src/jalview/bin/argparser/Arg.java
index 2f25978..36f7794 100644
--- a/src/jalview/bin/argparser/Arg.java
+++ b/src/jalview/bin/argparser/Arg.java
@@ -1,3 +1,23 @@
+/*
+ * 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.argparser;
import java.util.ArrayList;
@@ -5,9 +25,11 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.EnumSet;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
+import java.util.Set;
import java.util.stream.Collectors;
import jalview.bin.argparser.Arg.Opt;
@@ -19,7 +41,7 @@ public enum Arg
// Initialising arguments (BOOTSTRAP)
HELP(Type.HELP, "h", "Display basic help", Opt.UNARY, Opt.BOOTSTRAP,
- Opt.HASTYPE, Opt.MULTI),
+ Opt.HASTYPE, Opt.MULTIVALUE),
/*
* Other --help-type Args will be added by the static block.
*/
@@ -29,8 +51,8 @@ public enum Arg
Opt.UNARY, Opt.BOOTSTRAP),
HEADLESS(Type.CONFIG,
"Run Jalview in headless mode. No GUI interface will be created and Jalview will quit after all arguments have been processed. "
- + "Headless mode is assumed if an output file is to be generated, this can be overridden with --noheadless or --gui.",
- Opt.BOOLEAN, Opt.BOOTSTRAP),
+ + "Headless mode is assumed if an output file is to be generated, this can be overridden with --gui.",
+ Opt.UNARY, Opt.BOOTSTRAP),
GUI(Type.CONFIG,
"Do not run Jalview in headless mode. This overrides the assumption of headless mode when an output file is to be generated.",
Opt.UNARY, Opt.BOOTSTRAP),
@@ -44,6 +66,8 @@ public enum Arg
QUESTIONNAIRE(Type.CONFIG,
"Show (or don't show) the questionnaire if one is available.",
true, Opt.BOOLEAN, Opt.BOOTSTRAP),
+ JAVACONSOLE(Type.CONFIG, "Show (or don't show) the Java Console.", false,
+ Opt.BOOLEAN, Opt.BOOTSTRAP),
NOUSAGESTATS(Type.CONFIG, "Don't send initial launch usage stats.",
Opt.UNARY, Opt.BOOTSTRAP),
NOSTARTUPFILE(Type.CONFIG, "Don't show the default startup file.",
@@ -62,27 +86,28 @@ public enum Arg
Opt.BOOTSTRAP, Opt.SECRET),
QUIET(Type.CONFIG, "q",
"Stop all output to STDOUT (after the Java Virtual Machine has started). Use ââquiet a second time to stop all output to STDERR.",
- Opt.UNARY, Opt.MULTI, Opt.BOOTSTRAP),
+ Opt.UNARY, Opt.MULTIVALUE, Opt.BOOTSTRAP),
INITSUBSTITUTIONS(Type.CONFIG,
"Set ââsubstitutions to be initially enabled (or initially disabled).",
true, Opt.BOOLEAN, Opt.BOOTSTRAP, Opt.NOACTION, Opt.SECRET),
P(Type.CONFIG, "Set a Jalview preference value for this session.",
Opt.PREFIXKEV, Opt.PRESERVECASE, Opt.STRING, Opt.BOOTSTRAP,
- Opt.MULTI, Opt.NOACTION, Opt.SECRET), // keep this secret for now.
+ Opt.MULTIVALUE, Opt.NOACTION, Opt.SECRET), // keep this secret for
+ // now.
// Opening an alignment
OPEN(Type.OPENING,
"Opens one or more alignment files or URLs in new alignment windows.",
- Opt.STRING, Opt.LINKED, Opt.INCREMENTDEFAULTCOUNTER, Opt.MULTI,
- Opt.GLOB, Opt.ALLOWSUBSTITUTIONS, Opt.INPUT, Opt.STORED,
- Opt.PRIMARY),
+ Opt.STRING, Opt.LINKED, Opt.INCREMENTDEFAULTCOUNTER,
+ Opt.MULTIVALUE, Opt.GLOB, Opt.ALLOWSUBSTITUTIONS, Opt.INPUT,
+ Opt.STORED, Opt.PRIMARY),
APPEND(Type.OPENING,
"Appends one or more alignment files or URLs to the open alignment window (or opens a new alignment if none already open).",
- Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.GLOB,
+ Opt.STRING, Opt.LINKED, Opt.MULTIVALUE, Opt.GLOB,
Opt.ALLOWSUBSTITUTIONS, Opt.INPUT, Opt.PRIMARY),
TITLE(Type.OPENING,
"Specifies the title for the open alignment window as string.",
- Opt.STRING, Opt.LINKED),
+ Opt.STRING, Opt.LINKED, Opt.ALLOWMULTIID),
COLOUR(Type.OPENING, "color", // being a bit soft on the Americans!
"Applies the colour scheme to the open alignment window. Valid values include:\n"
+ "clustal,\n" + "blosum62,\n" + "pc-identity,\n"
@@ -93,104 +118,104 @@ public enum Arg
+ "turn-propensity,\n" + "buried-index,\n"
+ "nucleotide,\n" + "nucleotide-ambiguity,\n"
+ "purine-pyrimidine,\n" + "rna-helices,\n"
- + "t-coffee-scores,\n" + "sequence-id.\n"
- +"\n"
+ + "t-coffee-scores,\n" + "sequence-id.\n" + "\n"
+ "Names of user defined colourschemes will also work,\n"
- +"and jalview colourscheme specifications like\n"
- +"--colour=\"D,E=red; K,R,H=0022FF; C,c=yellow\"",
- Opt.STRING, Opt.LINKED, Opt.ALLOWALL),
+ + "and jalview colourscheme specifications like\n"
+ + "--colour=\"D,E=red; K,R,H=0022FF; C,c=yellow\"",
+ Opt.STRING, Opt.LINKED, Opt.ALLOWMULTIID),
FEATURES(Type.OPENING, "Add a feature file or URL to the open alignment.",
- Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.ALLOWSUBSTITUTIONS),
+ Opt.STRING, Opt.LINKED, Opt.MULTIVALUE, Opt.ALLOWSUBSTITUTIONS,
+ Opt.ALLOWMULTIID),
TREE(Type.OPENING, "Add a tree file or URL to the open alignment.",
- Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.ALLOWSUBSTITUTIONS),
+ Opt.STRING, Opt.LINKED, Opt.MULTIVALUE, Opt.ALLOWSUBSTITUTIONS,
+ Opt.ALLOWMULTIID),
SORTBYTREE(Type.OPENING,
"Enforces sorting (or not sorting) the open alignment in the order of an attached phylogenetic tree.",
- true, Opt.LINKED, Opt.BOOLEAN, Opt.ALLOWALL),
+ true, Opt.LINKED, Opt.BOOLEAN, Opt.ALLOWMULTIID),
ANNOTATIONS(Type.OPENING,
"Add an annotations file or URL to the open alignment.",
- Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.ALLOWSUBSTITUTIONS),
+ Opt.STRING, Opt.LINKED, Opt.MULTIVALUE, Opt.ALLOWSUBSTITUTIONS,
+ Opt.ALLOWMULTIID),
SHOWANNOTATIONS(Type.OPENING,
"Enforces showing (or not showing) alignment annotations.",
- Opt.BOOLEAN, Opt.LINKED, Opt.ALLOWALL),
+ Opt.BOOLEAN, Opt.LINKED, Opt.ALLOWMULTIID, Opt.ALLOWMULTIID),
WRAP(Type.OPENING,
"Enforces wrapped (or not wrapped) alignment formatting.",
- Opt.BOOLEAN, Opt.LINKED, Opt.ALLOWALL),
+ Opt.BOOLEAN, Opt.LINKED, Opt.ALLOWMULTIID, Opt.ALLOWMULTIID),
NOSTRUCTURE(Type.OPENING,
"Do not open or process any 3D structure in the ââopen or ââappend files.",
- Opt.UNARY, Opt.LINKED, Opt.ALLOWALL),
+ Opt.UNARY, Opt.LINKED, Opt.ALLOWMULTIID, Opt.ALLOWMULTIID),
// Adding a 3D structure
STRUCTURE(Type.STRUCTURE,
"Load a structure file or URL associated with a sequence in the open alignment.\n"
+ "The sequence to be associated with can be specified with a following --seqid argument, or the subval modifier seqid=ID can be used. A subval INDEX can also be used to specify the INDEX-th sequence in the open alignment.",
- Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.ALLOWSUBSTITUTIONS,
- Opt.PRIMARY),
+ Opt.STRING, Opt.LINKED, Opt.MULTIVALUE, Opt.ALLOWSUBSTITUTIONS,
+ Opt.PRIMARY, Opt.ALLOWMULTIID),
SEQID(Type.STRUCTURE,
"Specify the sequence name for the preceding --structure to be associated with.",
- Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.ALLOWSUBSTITUTIONS),
+ Opt.STRING, Opt.LINKED, Opt.MULTIVALUE, Opt.ALLOWSUBSTITUTIONS,
+ Opt.ALLOWMULTIID),
PAEMATRIX(Type.STRUCTURE,
"Add a PAE json matrix file to the preceding --structure.",
- Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.ALLOWSUBSTITUTIONS),
+ Opt.STRING, Opt.LINKED, Opt.MULTIVALUE, Opt.ALLOWSUBSTITUTIONS,
+ Opt.ALLOWMULTIID),
TEMPFAC(Type.STRUCTURE,
"Set the type of temperature factor. Possible values are:\n"
+ "default,\n" + "plddt.",
- Opt.STRING, Opt.LINKED),
+ Opt.STRING, Opt.LINKED, Opt.MULTIVALUE, Opt.ALLOWMULTIID),
STRUCTUREVIEWER(Type.STRUCTURE,
"Set the structure viewer to use to open the 3D structure file specified in previous --structure to name. Possible values of name are:\n"
+ "none,\n" + "jmol,\n" + "chimera,\n" + "chimerax,\n"
+ "pymol.",
- Opt.STRING, Opt.LINKED, Opt.MULTI),
+ Opt.STRING, Opt.LINKED, Opt.MULTIVALUE, Opt.ALLOWMULTIID),
NOTEMPFAC(Type.STRUCTURE,
"Do not show the temperature factor annotation for the preceding --structure.",
- Opt.UNARY, Opt.LINKED, Opt.ALLOWALL, Opt.SECRET), // keep this secret
- // until it works!
+ Opt.UNARY, Opt.LINKED, Opt.ALLOWMULTIID, Opt.SECRET), // keep this
+ // secret until
+ // it works!
SHOWSSANNOTATIONS(Type.STRUCTURE, null, Opt.BOOLEAN, Opt.LINKED,
- Opt.ALLOWALL),
+ Opt.ALLOWMULTIID),
// Outputting files
IMAGE(Type.IMAGE,
"Output an image of the open alignment window. Format is specified by the subval modifier, a following --type argument or guessed from the file extension. Valid formats/extensions are:\n"
+ "svg,\n" + "png,\n" + "eps,\n" + "html,\n" + "biojs.",
- Opt.STRING, Opt.LINKED, Opt.ALLOWSUBSTITUTIONS, Opt.ALLOWALL,
- Opt.REQUIREINPUT, Opt.OUTPUTFILE, Opt.PRIMARY),
+ Opt.STRING, Opt.LINKED, Opt.ALLOWSUBSTITUTIONS, Opt.MULTIVALUE,
+ Opt.ALLOWMULTIID, Opt.REQUIREINPUT, Opt.OUTPUTFILE, Opt.PRIMARY),
+ STRUCTUREIMAGE(new Type[]
+ { Type.IMAGE, Type.STRUCTUREIMAGE },
+ "Export an image of a 3D structure opened in JMOL", Opt.STRING,
+ Opt.LINKED, Opt.MULTIVALUE, Opt.OUTPUTFILE, Opt.ALLOWMULTIID,
+ Opt.PRIMARY),
TYPE(Type.IMAGE,
- "Set the image format for the preceding --image. Valid values are:\n"
- + "svg,\n" + "png,\n" + "eps,\n" + "html,\n" + "biojs.",
- Opt.STRING, Opt.LINKED, Opt.ALLOWALL),
+ "Set the image format for the preceding " + Arg.IMAGE.argString()
+ + " or " + Arg.STRUCTUREIMAGE.argString()
+ + ". Valid values are:\n" + "svg,\n" + "png,\n" + "eps,\n"
+ + "html,\n" + "biojs.",
+ Opt.STRING, Opt.LINKED, Opt.MULTIVALUE, Opt.ALLOWMULTIID),
TEXTRENDERER(Type.IMAGE,
"Sets whether text in a vector image format (SVG, HTML, EPS) should be rendered as text or vector line-art. Possible values are:\n"
+ "text,\n" + "lineart.",
- Opt.STRING, Opt.LINKED, Opt.ALLOWALL),
+ Opt.STRING, Opt.LINKED, Opt.MULTIVALUE, Opt.ALLOWMULTIID),
SCALE(Type.IMAGE,
"Sets a scaling for bitmap image format (PNG). Should be given as a floating point number. If used in conjunction with --width and --height then the smallest scaling will be used (scale, width and height provide bounds for the image).",
- Opt.STRING, Opt.LINKED, Opt.ALLOWALL),
+ Opt.STRING, Opt.LINKED, Opt.MULTIVALUE, Opt.ALLOWMULTIID),
WIDTH(Type.IMAGE,
"Sets a width for bitmap image format (PNG) with the height maintaining the aspect ratio. Should be given as a positive integer. If used in conjunction with --scale and --height then the smallest scaling will be used (scale, width and height provide bounds for the image).",
- Opt.STRING, Opt.LINKED, Opt.ALLOWALL),
+ Opt.STRING, Opt.LINKED, Opt.MULTIVALUE, Opt.ALLOWMULTIID),
HEIGHT(Type.IMAGE,
"Sets a height for bitmap image format (PNG) with the width maintaining the aspect ratio. Should be given as a positive integer. If used in conjunction with --scale and --width then the smallest scaling will be used (scale, width and height provide bounds for the image).",
- Opt.STRING, Opt.LINKED, Opt.ALLOWALL),
- STRUCTUREIMAGE(Type.STRUCTUREIMAGE,
- "Export an image of a 3D structure opened in JMOL", Opt.STRING,
- Opt.LINKED, Opt.MULTI, Opt.OUTPUTFILE),
- STRUCTUREIMAGETYPE(Type.STRUCTUREIMAGE,
- "Set the structure image format for the preceding --structureimage. Valid values are:\n"
- + "svg,\n" + "png,\n" + "eps,\n" + "html,\n" + "biojs.",
- Opt.STRING, Opt.LINKED, Opt.ALLOWALL),
- STRUCTUREIMAGETEXTRENDERER(Type.STRUCTUREIMAGE,
- "Sets whether text in a vector structure image format (SVG, EPS) should be rendered as text or vector line-art. Possible values are:\n"
- + "text,\n" + "lineart.",
- Opt.STRING, Opt.LINKED, Opt.ALLOWALL),
- STRUCTUREIMAGESCALE(Type.STRUCTUREIMAGE,
- "Sets a scaling for bitmap structure image format (PNG). Should be given as a floating point number. If used in conjunction with --structureimagewidth and --structureimageheight then the smallest scaling will be used (structureimagescale, structureimagewidth and structureimageheight provide bounds for the structure image).",
- Opt.STRING, Opt.LINKED, Opt.ALLOWALL),
- STRUCTUREIMAGEWIDTH(Type.STRUCTUREIMAGE,
- "Sets a width for bitmap structure image format (PNG) with the height maintaining the aspect ratio. Should be given as a positive integer. If used in conjunction with --structureimagescale and --structureimageheight then the smallest scaling will be used (structureimagescale, structureimagewidth and structureimageheight provide bounds for the structure image).",
- Opt.STRING, Opt.LINKED, Opt.ALLOWALL),
- STRUCTUREIMAGEHEIGHT(Type.STRUCTUREIMAGE,
- "Sets a height for bitmap structure image format (PNG) with the width maintaining the aspect ratio. Should be given as a positive integer. If used in conjunction with --structureimagescale and --structureimagewidth then the smallest scaling will be used (structureimagescale, structureimagewidth and structureimageheight provide bounds for the structure image).",
- Opt.STRING, Opt.LINKED, Opt.ALLOWALL),
-
+ Opt.STRING, Opt.LINKED, Opt.MULTIVALUE, Opt.ALLOWMULTIID),
+ IMAGECOLOUR(Type.IMAGE, "imagecolor", // being a bit soft on the Americans!
+ "Applies the colour scheme to the open alignment window for this image, otherwise the value of "
+ + Arg.COLOUR.argString()
+ + " (or none) will apply. Valid values are the same as "
+ + Arg.COLOUR.argString() + ".",
+ Opt.STRING, Opt.LINKED, Opt.MULTIVALUE, Opt.ALLOWMULTIID),
+ BGCOLOUR(Type.IMAGE, "bgcolor", // being a bit soft on the Americans!
+ "Applies a background colour to the structure image. Valid values are named colours known to Java or RRGGBB 6 digit hex-string.",
+ Opt.STRING, Opt.LINKED, Opt.MULTIVALUE, Opt.ALLOWMULTIID),
OUTPUT(Type.OUTPUT,
"Export the open alignment to file filename. The format name is specified by the subval modifier format=name, a following --format name argument or guessed from the file extension. Valid format names (and file extensions) are:\n"
+ "fasta (fa, fasta, mfa, fastq),\n" + "pfam (pfam),\n"
@@ -199,32 +224,36 @@ public enum Arg
+ "pileup (pileup),\n" + "msf (msf),\n"
+ "clustal (aln),\n" + "phylip (phy),\n"
+ "jalview (jvp, jar).",
- Opt.STRING, Opt.LINKED, Opt.ALLOWSUBSTITUTIONS, Opt.ALLOWALL,
- Opt.REQUIREINPUT, Opt.OUTPUTFILE, Opt.PRIMARY),
+ Opt.STRING, Opt.LINKED, Opt.ALLOWSUBSTITUTIONS, Opt.ALLOWMULTIID,
+ Opt.REQUIREINPUT, Opt.OUTPUTFILE, Opt.STDOUT, Opt.PRIMARY),
FORMAT(Type.OUTPUT,
"Sets the format for the preceding --output file. Valid formats are:\n"
+ "fasta,\n" + "pfam,\n" + "stockholm,\n" + "pir,\n"
+ "blc,\n" + "amsa,\n" + "json,\n" + "pileup,\n"
+ "msf,\n" + "clustal,\n" + "phylip,\n" + "jalview.",
- Opt.STRING, Opt.LINKED, Opt.ALLOWALL),
+ Opt.STRING, Opt.LINKED, Opt.ALLOWMULTIID),
GROOVY(Type.PROCESS,
"Process a groovy script in the file for the open alignment.",
- Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.ALLOWSUBSTITUTIONS,
- Opt.ALLOWALL),
+ Opt.STRING, Opt.LINKED, Opt.MULTIVALUE, Opt.ALLOWSUBSTITUTIONS,
+ Opt.ALLOWMULTIID),
BACKUPS(Type.OUTPUT,
"Enable (or disable) writing backup files when saving an ââoutput file. This applies to the current open alignment. To apply to all ââoutput and ââimage files, use after ââall.",
- true, Opt.BOOLEAN, Opt.LINKED, Opt.ALLOWALL),
+ true, Opt.BOOLEAN, Opt.LINKED, Opt.ALLOWMULTIID),
OVERWRITE(Type.OUTPUT,
"Enable (or disable) overwriting of output files without backups enabled. This applies to the current open alignment. To apply to all ââoutput and ââimage files, use after ââall.",
- Opt.BOOLEAN, Opt.LINKED, Opt.ALLOWALL),
+ Opt.BOOLEAN, Opt.LINKED, Opt.ALLOWMULTIID),
CLOSE(Type.OPENING,
"Close the current open alignment window. This occurs after other output arguments. This applies to the current open alignment. To apply to all ââoutput and ââimage files, use after ââall.",
- Opt.UNARY, Opt.LINKED, Opt.ALLOWALL),
+ Opt.UNARY, Opt.LINKED, Opt.ALLOWMULTIID),
+ MKDIRS(Type.OUTPUT,
+ "Automatically create directories when outputting a file to a new directory.",
+ Opt.UNARY, Opt.LINKED, Opt.ALLOWMULTIID),
// controlling flow of arguments
NEW(Type.FLOW,
"Move on to a new alignment window. This will ensure --append will start a new alignment window and other linked arguments will apply to the new alignment window.",
- Opt.UNARY, Opt.MULTI, Opt.NOACTION, Opt.INCREMENTDEFAULTCOUNTER),
+ Opt.UNARY, Opt.MULTIVALUE, Opt.NOACTION,
+ Opt.INCREMENTDEFAULTCOUNTER),
SUBSTITUTIONS(Type.FLOW,
"The following argument values allow (or don't allow) subsituting filename parts. This is initially true. Valid substitutions are:\n"
+ "{basename} - the filename-without-extension of the currently --opened file (or first --appended file),\n"
@@ -234,22 +263,22 @@ public enum Arg
+ "{n} - the value of the index counter (starting at 0).\n"
+ "{++n} - increase and substitute the value of the index counter,\n"
+ "{} - the value of the current alignment window default index.",
- true, Opt.BOOLEAN, Opt.MULTI, Opt.NOACTION),
+ true, Opt.BOOLEAN, Opt.MULTIVALUE, Opt.NOACTION),
ARGFILE(Type.FLOW,
"Open one or more files filename and read, line-by-line, as arguments to Jalview.\n"
+ "Values in an argfile should be given with an equals sign (\"=\") separator with no spaces.\n"
+ "Note that if you use one or more --argfile arguments then all other non-initialising arguments will be ignored.",
- Opt.STRING, Opt.MULTI, Opt.BOOTSTRAP, Opt.GLOB,
+ Opt.STRING, Opt.MULTIVALUE, Opt.BOOTSTRAP, Opt.GLOB,
Opt.ALLOWSUBSTITUTIONS),
NPP(Type.FLOW, "n++",
"Increase the index counter used in argument value substitutions.",
- Opt.UNARY, Opt.MULTI, Opt.NOACTION),
+ Opt.UNARY, Opt.MULTIVALUE, Opt.NOACTION),
ALL(Type.FLOW,
"Apply the following output arguments to all sets of linked arguments.",
- Opt.BOOLEAN, Opt.MULTI, Opt.NOACTION),
+ Opt.BOOLEAN, Opt.MULTIVALUE, Opt.NOACTION),
OPENED(Type.FLOW,
"Apply the following output arguments to all of the last --open'ed set of linked arguments.",
- Opt.BOOLEAN, Opt.MULTI, Opt.NOACTION),
+ Opt.BOOLEAN, Opt.MULTIVALUE, Opt.NOACTION),
QUIT(Type.FLOW,
"After all files have been opened, appended and output, quit Jalview. In ââheadless mode this already happens.",
Opt.UNARY),
@@ -258,30 +287,31 @@ public enum Arg
Opt.UNARY, Opt.SECRET),
ALLSTRUCTURES(Type.FLOW,
"Apply the following 3D structure formatting arguments to all structures within the open alignment.",
- Opt.BOOLEAN, Opt.MULTI, Opt.NOACTION),
+ Opt.BOOLEAN, Opt.MULTIVALUE, Opt.NOACTION),
// secret options
TESTOUTPUT(Type.CONFIG,
"Allow specific stdout information. For testing purposes only.",
Opt.UNARY, Opt.BOOTSTRAP, Opt.SECRET), // do not show this to the user
SETPROP(Type.CONFIG, "Set an individual Java System property.",
- Opt.STRING, Opt.MULTI, Opt.BOOTSTRAP, Opt.SECRET), // not in use yet
+ Opt.STRING, Opt.MULTIVALUE, Opt.BOOTSTRAP, Opt.SECRET), // not in use
+ // yet
NIL(Type.FLOW,
"This argument does nothing on its own, but can be used with linkedIds.",
- Opt.UNARY, Opt.LINKED, Opt.MULTI, Opt.NOACTION, Opt.SECRET),
+ Opt.UNARY, Opt.LINKED, Opt.MULTIVALUE, Opt.NOACTION, Opt.SECRET),
// private options (inserted during arg processing)
SETARGFILE(Type.FLOW,
"Sets the current value of the argfilename. Inserted before argfilecontents.",
- Opt.UNARY, Opt.LINKED, Opt.STRING, Opt.MULTI, Opt.PRIVATE,
+ Opt.UNARY, Opt.LINKED, Opt.STRING, Opt.MULTIVALUE, Opt.PRIVATE,
Opt.NOACTION),
UNSETARGFILE(Type.FLOW,
"Unsets the current value of the argfilename. Inserted after argfile contents.",
- Opt.UNARY, Opt.LINKED, Opt.MULTI, Opt.PRIVATE, Opt.NOACTION),
+ Opt.UNARY, Opt.LINKED, Opt.MULTIVALUE, Opt.PRIVATE, Opt.NOACTION),
// these last two have no purpose in the normal Jalview application but are
// used by jalview.bin.Launcher to set memory settings. They are not used by
- // argparser but are here for Usage statement reasons.
+ // argparser but are here for Usage statement and parsing reasons.
JVMMEMPC(Type.CONFIG,
"Limit maximum heap size (memory) to PERCENT% of total physical memory detected. This defaults to 90 if total physical memory can be detected.\n"
+ "The equals sign (\"=\") separator must be used with no spaces.",
@@ -316,7 +346,7 @@ public enum Arg
* A MULTI Arg can be specified multiple times.
* Multiple values are stored in the ArgValuesMap (along with their positional index) for each linkedId.
*/
- MULTI("can be specified multiple times"),
+ MULTIVALUE("can be specified multiple times"),
/*
* A Linked Arg can be linked to others through a --arg[linkedId] or --arg[linkedId]=value.
* If no linkedId is specified then the current default linkedId will be used.
@@ -363,7 +393,7 @@ public enum Arg
/*
* An ALLOWALL Arg can use the '*' linkedId to apply to all known linkedIds
*/
- ALLOWALL("can be used with " + ArgParser.DOUBLEDASH + "all"),
+ ALLOWMULTIID("can be used with " + ArgParser.DOUBLEDASH + "all"),
/*
* If an Arg has the INCREMENTDEFAULTCOUNTER option and the default linkedId is used,
* the defaultLinkedIdCounter is incremented *first*.
@@ -384,6 +414,11 @@ public enum Arg
*/
OUTPUTFILE("output file --headless will be assumed unless --gui used"),
/*
+ * A STDOUT Arg can take an output filename that can be '-' to mean print to STDOUT.
+ */
+ STDOUT("allows the output filename '" + ArgParser.STDOUTFILENAME
+ + "' to mean output to STDOUT"),
+ /*
* A STORED Arg resets and creates a new set of "opened" linkedIds
*/
STORED(null),
@@ -480,29 +515,53 @@ public enum Arg
private String description;
- private Type type;
+ private Type[] types;
private Arg(Type type, String description, Opt... options)
{
+ this(new Type[] { type }, description, options);
+ }
+
+ private Arg(Type[] type, String description, Opt... options)
+ {
this(type, null, description, false, options);
}
private Arg(Type type, String description, boolean defaultBoolean,
Opt... options)
{
+ this(new Type[] { type }, description, defaultBoolean, options);
+ }
+
+ private Arg(Type[] type, String description, boolean defaultBoolean,
+ Opt... options)
+ {
this(type, null, description, defaultBoolean, options);
}
private Arg(Type type, String alternativeName, String description,
Opt... options)
{
+ this(new Type[] { type }, alternativeName, description, options);
+ }
+
+ private Arg(Type[] type, String alternativeName, String description,
+ Opt... options)
+ {
this(type, alternativeName, description, false, options);
}
private Arg(Type type, String alternativeName, String description,
boolean defaultBoolean, Opt... options)
{
- this.type = type;
+ this(new Type[] { type }, alternativeName, description, defaultBoolean,
+ options);
+ }
+
+ private Arg(Type[] type, String alternativeName, String description,
+ boolean defaultBoolean, Opt... options)
+ {
+ this.types = type;
this.description = description;
this.defaultBoolValue = defaultBoolean;
this.setOptions(options);
@@ -543,7 +602,11 @@ public enum Arg
if (getNames().length > 0)
sb.append('"');
sb.append(")\n");
- sb.append("\nType: " + type.name());
+ for (Type type : getTypes())
+ {
+ String typeName = type.name();
+ sb.append("\nType: " + typeName);
+ }
sb.append("\nOpt: ");
// map List to List for the String.join
List optList = Arrays.asList(argOptions).stream()
@@ -608,9 +671,37 @@ public enum Arg
return defaultBoolValue;
}
- public Type getType()
+ public Type getFirstType()
+ {
+ return this.getTypes()[0];
+ }
+
+ public Type[] getTypes()
+ {
+ return this.types;
+ }
+
+ public boolean sharesType(Arg a)
+ {
+ return this.hasType(a.getTypes());
+ }
+
+ public boolean hasType(Type... types)
+ {
+ Set typesSet = new HashSet<>(Arrays.asList(types));
+ return this.hasType(typesSet);
+ }
+
+ public boolean hasType(Set typesSet)
{
- return this.type;
+ for (Type type : getTypes())
+ {
+ if (typesSet.contains(type))
+ {
+ return true;
+ }
+ }
+ return false;
}
protected String getDescription()
@@ -637,9 +728,17 @@ public enum Arg
public static final void appendUsageGeneral(StringBuilder sb,
int maxArgLength)
{
+ Set firstTypes = new HashSet<>();
+ for (Arg a : EnumSet.allOf(Arg.class))
+ {
+ if (!firstTypes.contains(a.getFirstType()))
+ {
+ firstTypes.add(a.getFirstType());
+ }
+ }
for (Type t : EnumSet.allOf(Type.class))
{
- if (t.description() != null)
+ if (t.description() != null && firstTypes.contains(t))
{
StringBuilder argSb = new StringBuilder();
argSb.append(Arg.HELP.argString()).append(ArgParser.SINGLEDASH)
@@ -674,20 +773,6 @@ public enum Arg
{
List args = argsSortedForDisplay(types);
- /*
- * just use a set maxArgLength of DESCRIPTIONINDENT
-
- int maxArgLength = 0;
- for (Arg a : args)
- {
- if (a.hasOption(Opt.PRIVATE) || a.hasOption(Opt.SECRET))
- continue;
-
- String argS = argDisplayString(a);
- if (argS.length() > maxArgLength)
- maxArgLength = argS.length();
- }
- */
int maxArgLength = DESCRIPTIONINDENT;
// always show --help
@@ -711,10 +796,10 @@ public enum Arg
continue;
}
- if (a.getType() != typeSection)
+ if (a.getFirstType() != typeSection)
{
- typeSection = a.getType();
- String typeDescription = a.getType().description();
+ typeSection = a.getFirstType();
+ String typeDescription = a.getFirstType().description();
if (typeDescription != null && typeDescription.length() > 0)
{
// typeDescription = typeDescription.substring(0,
@@ -905,7 +990,7 @@ public enum Arg
{
Opt[] opts = options == null ? new Opt[] {} : options;
return EnumSet.allOf(Arg.class).stream().filter(a -> {
- if (a.getType() != type)
+ if (!a.hasType(type))
return false;
for (Opt o : opts)
{
@@ -960,7 +1045,7 @@ class ArgDisplayComparator implements Comparator
if (b == null)
return -1;
// first compare types (in enum order)
- int i = a.getType().compareTo(b.getType());
+ int i = a.getFirstType().compareTo(b.getFirstType());
if (i != 0)
return i;
// do Opt.LAST next (oddly). Reversed args important!