package jalview.bin.argparser; import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.stream.Collectors; public enum Arg { HELP("h"), CALCULATION, MENUBAR, STATUS, SHOWOVERVIEW, ANNOTATIONS, COLOUR, FEATURES, GROOVY, GROUPS, HEADLESS, JABAWS, ANNOTATION, ANNOTATION2, DISPLAY, GUI, NEWS, SORTBYTREE, USAGESTATS, OPEN, OPENNEW, PROPS, QUESTIONNAIRE, SETPROP, TREE, VDOC, VSESS, OUTPUT, OUTPUTTYPE, SSANNOTATION, NOTEMPFAC, TEMPFAC, TEMPFAC_LABEL, TEMPFAC_DESC, TEMPFAC_SHADING, TITLE, PAEMATRIX, WRAP, NOSTRUCTURE, STRUCTURE, IMAGE, QUIT, CLOSE, DEBUG("d"), QUIET("q"), ARGFILE, INCREMENT, NPP("n++"), SUBSTITUTIONS, INITSUBSTITUTIONS, NIL, SPLASH, SETARGFILE, UNSETARGFILE; protected static enum Opt { BOOLEAN, STRING, UNARY, MULTI, LINKED, NODUPLICATEVALUES, BOOTSTRAP, GLOB, NOACTION, ALLOWSUBSTITUTIONS, PRIVATE } static { HELP.setOptions(Opt.UNARY); CALCULATION.setOptions(true, Opt.BOOLEAN); // default "true" implies only // expecting "--nocalculation" MENUBAR.setOptions(true, Opt.BOOLEAN); STATUS.setOptions(true, Opt.BOOLEAN); SHOWOVERVIEW.setOptions(Opt.UNARY, Opt.LINKED); ANNOTATIONS.setOptions(Opt.STRING, Opt.LINKED); COLOUR.setOptions(Opt.STRING, Opt.LINKED); FEATURES.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.ALLOWSUBSTITUTIONS); GROOVY.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.ALLOWSUBSTITUTIONS); GROUPS.setOptions(Opt.STRING, Opt.LINKED); HEADLESS.setOptions(Opt.UNARY, Opt.BOOTSTRAP); JABAWS.setOptions(Opt.STRING); ANNOTATION.setOptions(true, Opt.BOOLEAN, Opt.LINKED); ANNOTATION2.setOptions(true, Opt.BOOLEAN, Opt.LINKED); DISPLAY.setOptions(true, Opt.BOOLEAN); GUI.setOptions(true, Opt.BOOLEAN); NEWS.setOptions(true, Opt.BOOLEAN, Opt.BOOTSTRAP); SPLASH.setOptions(true, Opt.BOOLEAN, Opt.BOOTSTRAP); // expects a string value SORTBYTREE.setOptions(true, Opt.BOOLEAN); USAGESTATS.setOptions(true, Opt.BOOLEAN); OPEN.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.GLOB, Opt.ALLOWSUBSTITUTIONS); OPENNEW.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.GLOB, Opt.ALLOWSUBSTITUTIONS); PROPS.setOptions(Opt.STRING, Opt.BOOTSTRAP); QUESTIONNAIRE.setOptions(Opt.BOOLEAN, Opt.BOOTSTRAP); SETPROP.setOptions(Opt.STRING, Opt.MULTI, Opt.BOOTSTRAP); TREE.setOptions(Opt.STRING); VDOC.setOptions(Opt.UNARY); VSESS.setOptions(Opt.UNARY); OUTPUT.setOptions(Opt.STRING, Opt.LINKED, Opt.ALLOWSUBSTITUTIONS); OUTPUTTYPE.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI); SSANNOTATION.setOptions(Opt.BOOLEAN, Opt.LINKED); NOTEMPFAC.setOptions(Opt.UNARY, Opt.LINKED); TEMPFAC.setOptions(Opt.STRING, Opt.LINKED); TEMPFAC_LABEL.setOptions(Opt.STRING, Opt.LINKED); TEMPFAC_DESC.setOptions(Opt.STRING, Opt.LINKED); TEMPFAC_SHADING.setOptions(Opt.BOOLEAN, Opt.LINKED); TITLE.setOptions(Opt.STRING, Opt.LINKED); PAEMATRIX.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.ALLOWSUBSTITUTIONS); NOSTRUCTURE.setOptions(Opt.UNARY, Opt.LINKED); STRUCTURE.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.ALLOWSUBSTITUTIONS); WRAP.setOptions(Opt.BOOLEAN, Opt.LINKED); IMAGE.setOptions(Opt.STRING, Opt.LINKED, Opt.ALLOWSUBSTITUTIONS); QUIT.setOptions(Opt.UNARY); CLOSE.setOptions(Opt.UNARY, Opt.LINKED); DEBUG.setOptions(Opt.BOOLEAN, Opt.BOOTSTRAP); QUIET.setOptions(Opt.UNARY, Opt.MULTI, Opt.BOOTSTRAP); ARGFILE.setOptions(Opt.STRING, Opt.MULTI, Opt.BOOTSTRAP, Opt.GLOB, Opt.ALLOWSUBSTITUTIONS); INCREMENT.setOptions(Opt.UNARY, Opt.MULTI, Opt.NOACTION); NPP.setOptions(Opt.UNARY, Opt.MULTI, Opt.NOACTION); SUBSTITUTIONS.setOptions(Opt.BOOLEAN, Opt.MULTI, Opt.NOACTION); INITSUBSTITUTIONS.setOptions(Opt.BOOLEAN, Opt.BOOTSTRAP, Opt.NOACTION); NIL.setOptions(Opt.UNARY, Opt.LINKED, Opt.MULTI, Opt.NOACTION); SETARGFILE.setOptions(Opt.STRING, Opt.MULTI, Opt.PRIVATE, Opt.NOACTION); UNSETARGFILE.setOptions(Opt.MULTI, Opt.PRIVATE, Opt.NOACTION); // Opt.BOOTSTRAP args are parsed (not linked with no SubVals so using a // simplified parser, see jalview.bin.argparser.BootstrapArgs) // before a full parse of arguments and so can be accessible at an earlier // stage to (e.g.) set debug log level, provide a props file (that might set // log level), run headlessly, read an argfile instead of other args. } private final String[] argNames; private Opt[] argOptions; private boolean defaultBoolValue = false; private Arg() { this(new String[0]); } private Arg(String... names) { int length = (names == null || names.length == 0 || (names.length == 1 && names[0] == null)) ? 1 : names.length + 1; this.argNames = new String[length]; this.argNames[0] = this.getName(); if (length > 1) System.arraycopy(names, 0, this.argNames, 1, names.length); } public String argString() { return new StringBuilder(ArgParser.DOUBLEDASH).append(getName()) .toString(); } public String toLongString() { StringBuilder sb = new StringBuilder(); sb.append(this.getClass().getName()).append('.').append(this.name()); sb.append('('); if (getNames().length > 0) sb.append('"'); sb.append(String.join("\", \"", getNames())); if (getNames().length > 0) sb.append('"'); sb.append(")\n"); sb.append("\nOpt: "); // map List to List for the String.join List optList = Arrays.asList(argOptions).stream() .map(opt -> opt.name()).collect(Collectors.toList()); sb.append(String.join(", ", optList)); sb.append("\n"); return sb.toString(); } public String[] getNames() { return argNames; } public String getName() { return this.name().toLowerCase(Locale.ROOT).replace('_', '-'); } @Override public final String toString() { return getName(); } public boolean hasOption(Opt o) { if (argOptions == null) return false; for (Opt option : argOptions) { if (o == option) return true; } return false; } protected void setOptions(Opt... options) { setOptions(false, options); } protected void setOptions(boolean defaultBoolValue, Opt... options) { this.defaultBoolValue = defaultBoolValue; argOptions = options; } protected boolean getDefaultBoolValue() { return defaultBoolValue; } }