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!