X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fbin%2Fargparser%2FArg.java;h=9b5907f7aef227dc260437335eae6c3bec679340;hb=6dafac1b9bcc7265b0fb1641f7474a6c81b24119;hp=8207996514a733a0b1913df92f4141074eb65aa6;hpb=404d5b51a7a7781ad6924df6a7ce63c754370f16;p=jalview.git diff --git a/src/jalview/bin/argparser/Arg.java b/src/jalview/bin/argparser/Arg.java index 8207996..9b5907f 100644 --- a/src/jalview/bin/argparser/Arg.java +++ b/src/jalview/bin/argparser/Arg.java @@ -1,6 +1,8 @@ package jalview.bin.argparser; +import java.util.ArrayList; import java.util.Arrays; +import java.util.EnumSet; import java.util.List; import java.util.Locale; import java.util.stream.Collectors; @@ -8,13 +10,13 @@ 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; + COLOUR, FEATURES, GROOVY, GROUPS, HEADLESS, JABAWS, DISPLAY, GUI, NEWS, + SORTBYTREE, USAGESTATS, APPEND, OPEN, PROPS, QUESTIONNAIRE, SETPROP, TREE, + VDOC, VSESS, OUTPUT, OUTPUTTYPE, SSANNOTATIONS, NOTEMPFAC, TEMPFAC, TITLE, + PAEMATRIX, WRAP, NOSTRUCTURE, STRUCTURE, STRUCTUREVIEWER, IMAGE, QUIT, + CLOSE, DEBUG("d"), QUIET("q"), ARGFILE, NEWFRAME, NPP("n++"), + SUBSTITUTIONS, INITSUBSTITUTIONS, NIL, SPLASH, SETARGFILE, UNSETARGFILE, + WEBSERVICEDISCOVERY; protected static enum Opt { @@ -24,13 +26,13 @@ public enum Arg static { - HELP.setOptions(Opt.UNARY); + HELP.setOptions("Display this help message", Opt.UNARY, Opt.BOOTSTRAP); 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); + ANNOTATIONS.setOptions(Opt.BOOLEAN, Opt.LINKED); COLOUR.setOptions(Opt.STRING, Opt.LINKED); FEATURES.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.ALLOWSUBSTITUTIONS); @@ -39,8 +41,6 @@ public enum Arg 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); @@ -48,9 +48,9 @@ public enum Arg // expects a string value SORTBYTREE.setOptions(true, Opt.BOOLEAN); USAGESTATS.setOptions(true, Opt.BOOLEAN); - OPEN.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.GLOB, + APPEND.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.GLOB, Opt.ALLOWSUBSTITUTIONS); - OPENNEW.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.GLOB, + OPEN.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.GLOB, Opt.ALLOWSUBSTITUTIONS); PROPS.setOptions(Opt.STRING, Opt.BOOTSTRAP); QUESTIONNAIRE.setOptions(Opt.BOOLEAN, Opt.BOOTSTRAP); @@ -63,18 +63,16 @@ public enum Arg OUTPUT.setOptions(Opt.STRING, Opt.LINKED, Opt.ALLOWSUBSTITUTIONS); OUTPUTTYPE.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI); - SSANNOTATION.setOptions(Opt.BOOLEAN, Opt.LINKED); + SSANNOTATIONS.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); + STRUCTUREVIEWER.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI); WRAP.setOptions(Opt.BOOLEAN, Opt.LINKED); IMAGE.setOptions(Opt.STRING, Opt.LINKED, Opt.ALLOWSUBSTITUTIONS); QUIT.setOptions(Opt.UNARY); @@ -83,13 +81,14 @@ public enum Arg 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); + NEWFRAME.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); + WEBSERVICEDISCOVERY.setOptions(Opt.BOOLEAN, Opt.BOOTSTRAP); // 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 @@ -103,6 +102,8 @@ public enum Arg private boolean defaultBoolValue = false; + private String description = null; + private Arg() { this(new String[0]); @@ -119,6 +120,25 @@ public enum Arg System.arraycopy(names, 0, this.argNames, 1, names.length); } + public String argString() + { + return argString(false); + } + + public String negateArgString() + { + return argString(true); + } + + private String argString(boolean negate) + { + StringBuilder sb = new StringBuilder(ArgParser.DOUBLEDASH); + if (negate && hasOption(Opt.BOOLEAN)) + sb.append(ArgParser.NEGATESTRING); + sb.append(getName()); + return sb.toString(); + } + public String toLongString() { StringBuilder sb = new StringBuilder(); @@ -169,17 +189,123 @@ public enum Arg protected void setOptions(Opt... options) { - setOptions(false, options); + setOptions("", false, options); + } + + protected void setOptions(String desc, Opt... options) + { + setOptions(desc, false, options); } protected void setOptions(boolean defaultBoolValue, Opt... options) { + setOptions("", defaultBoolValue, options); + } + + protected void setOptions(String desc, boolean defaultBoolValue, + Opt... options) + { + this.description = desc; this.defaultBoolValue = defaultBoolValue; - argOptions = options; + this.argOptions = options; } protected boolean getDefaultBoolValue() { return defaultBoolValue; } -} + + private void setDescription(String d) + { + description = d; + } + + protected String getDescription() + { + return description; + } + + public static String booleanArgString(Arg a) + { + StringBuilder sb = new StringBuilder(a.argString()); + if (a.hasOption(Opt.BOOLEAN)) + { + sb.append('/'); + sb.append(a.negateArgString()); + } + return sb.toString(); + } + + public static final String usage() + { + StringBuilder sb = new StringBuilder(); + + sb.append("Usage: jalview [args]"); + sb.append(System.lineSeparator()); + + int maxArgLength = 0; + for (Arg a : EnumSet.allOf(Arg.class)) + { + if (a.hasOption(Opt.PRIVATE)) + continue; + StringBuilder argSb = new StringBuilder(); + argSb.append(a.hasOption(Opt.BOOLEAN) ? booleanArgString(a) + : a.argString()); + if (a.hasOption(Opt.STRING)) + argSb.append("=value"); + if (argSb.length() > maxArgLength) + maxArgLength = argSb.length(); + } + + // might want to sort these + for (Arg a : EnumSet.allOf(Arg.class)) + { + if (a.hasOption(Opt.PRIVATE)) + continue; + StringBuilder argSb = new StringBuilder(); + argSb.append(a.hasOption(Opt.BOOLEAN) ? booleanArgString(a) + : a.argString()); + if (a.hasOption(Opt.STRING)) + argSb.append("=value"); + sb.append(String.format("%-" + maxArgLength + "s - %s", + argSb.toString(), a.getDescription())); + + List options = new ArrayList<>(); + + if (a.hasOption(Opt.BOOLEAN)) + { + options.add("default " + (a.getDefaultBoolValue() ? a.argString() + : a.negateArgString())); + } + + if (a.hasOption(Opt.MULTI)) + { + options.add("multiple"); + } + + if (a.hasOption(Opt.LINKED)) + { + options.add("can be linked"); + } + + if (a.hasOption(Opt.GLOB)) + { + options.add("allows file globs"); + } + + if (a.hasOption(Opt.ALLOWSUBSTITUTIONS)) + { + options.add("allows substitutions"); + } + + if (options.size() > 0) + { + sb.append(" ("); + sb.append(String.join("; ", options)); + sb.append(')'); + } + sb.append(System.lineSeparator()); + } + return sb.toString(); + } +} \ No newline at end of file