1 package jalview.bin.argparser;
3 import java.util.Arrays;
4 import java.util.EnumSet;
6 import java.util.Locale;
7 import java.util.stream.Collectors;
11 HELP("h"), CALCULATION, MENUBAR, STATUS, SHOWOVERVIEW, ANNOTATIONS,
12 COLOUR, FEATURES, GROOVY, GROUPS, HEADLESS, JABAWS, ANNOTATION,
13 ANNOTATION2, DISPLAY, GUI, NEWS, SORTBYTREE, USAGESTATS, OPEN, OPENNEW,
14 PROPS, QUESTIONNAIRE, SETPROP, TREE, VDOC, VSESS, OUTPUT, OUTPUTTYPE,
15 SSANNOTATION, NOTEMPFAC, TEMPFAC, TEMPFAC_LABEL, TEMPFAC_DESC,
16 TEMPFAC_SHADING, TITLE, PAEMATRIX, WRAP, NOSTRUCTURE, STRUCTURE, IMAGE,
17 QUIT, CLOSE, DEBUG("d"), QUIET("q"), ARGFILE, INCREMENT, NPP("n++"),
18 SUBSTITUTIONS, INITSUBSTITUTIONS, NIL, SPLASH, SETARGFILE, UNSETARGFILE;
20 protected static enum Opt
22 BOOLEAN, STRING, UNARY, MULTI, LINKED, NODUPLICATEVALUES, BOOTSTRAP,
23 GLOB, NOACTION, ALLOWSUBSTITUTIONS, PRIVATE
28 HELP.setOptions("Display this help message", Opt.UNARY, Opt.BOOTSTRAP);
29 CALCULATION.setOptions(true, Opt.BOOLEAN); // default "true" implies only
30 // expecting "--nocalculation"
31 MENUBAR.setOptions(true, Opt.BOOLEAN);
32 STATUS.setOptions(true, Opt.BOOLEAN);
33 SHOWOVERVIEW.setOptions(Opt.UNARY, Opt.LINKED);
34 ANNOTATIONS.setOptions(Opt.STRING, Opt.LINKED);
35 COLOUR.setOptions(Opt.STRING, Opt.LINKED);
36 FEATURES.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI,
37 Opt.ALLOWSUBSTITUTIONS);
38 GROOVY.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI,
39 Opt.ALLOWSUBSTITUTIONS);
40 GROUPS.setOptions(Opt.STRING, Opt.LINKED);
41 HEADLESS.setOptions(Opt.UNARY, Opt.BOOTSTRAP);
42 JABAWS.setOptions(Opt.STRING);
43 ANNOTATION.setOptions(true, Opt.BOOLEAN, Opt.LINKED);
44 ANNOTATION2.setOptions(true, Opt.BOOLEAN, Opt.LINKED);
45 DISPLAY.setOptions(true, Opt.BOOLEAN);
46 GUI.setOptions(true, Opt.BOOLEAN);
47 NEWS.setOptions(true, Opt.BOOLEAN, Opt.BOOTSTRAP);
48 SPLASH.setOptions(true, Opt.BOOLEAN, Opt.BOOTSTRAP);
49 // expects a string value
50 SORTBYTREE.setOptions(true, Opt.BOOLEAN);
51 USAGESTATS.setOptions(true, Opt.BOOLEAN);
52 OPEN.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.GLOB,
53 Opt.ALLOWSUBSTITUTIONS);
54 OPENNEW.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.GLOB,
55 Opt.ALLOWSUBSTITUTIONS);
56 PROPS.setOptions(Opt.STRING, Opt.BOOTSTRAP);
57 QUESTIONNAIRE.setOptions(Opt.BOOLEAN, Opt.BOOTSTRAP);
58 SETPROP.setOptions(Opt.STRING, Opt.MULTI, Opt.BOOTSTRAP);
59 TREE.setOptions(Opt.STRING);
61 VDOC.setOptions(Opt.UNARY);
62 VSESS.setOptions(Opt.UNARY);
64 OUTPUT.setOptions(Opt.STRING, Opt.LINKED, Opt.ALLOWSUBSTITUTIONS);
65 OUTPUTTYPE.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI);
67 SSANNOTATION.setOptions(Opt.BOOLEAN, Opt.LINKED);
68 NOTEMPFAC.setOptions(Opt.UNARY, Opt.LINKED);
69 TEMPFAC.setOptions(Opt.STRING, Opt.LINKED);
70 TEMPFAC_LABEL.setOptions(Opt.STRING, Opt.LINKED);
71 TEMPFAC_DESC.setOptions(Opt.STRING, Opt.LINKED);
72 TEMPFAC_SHADING.setOptions(Opt.BOOLEAN, Opt.LINKED);
73 TITLE.setOptions(Opt.STRING, Opt.LINKED);
74 PAEMATRIX.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI,
75 Opt.ALLOWSUBSTITUTIONS);
76 NOSTRUCTURE.setOptions(Opt.UNARY, Opt.LINKED);
77 STRUCTURE.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI,
78 Opt.ALLOWSUBSTITUTIONS);
79 WRAP.setOptions(Opt.BOOLEAN, Opt.LINKED);
80 IMAGE.setOptions(Opt.STRING, Opt.LINKED, Opt.ALLOWSUBSTITUTIONS);
81 QUIT.setOptions(Opt.UNARY);
82 CLOSE.setOptions(Opt.UNARY, Opt.LINKED);
83 DEBUG.setOptions(Opt.BOOLEAN, Opt.BOOTSTRAP);
84 QUIET.setOptions(Opt.UNARY, Opt.MULTI, Opt.BOOTSTRAP);
85 ARGFILE.setOptions(Opt.STRING, Opt.MULTI, Opt.BOOTSTRAP, Opt.GLOB,
86 Opt.ALLOWSUBSTITUTIONS);
87 INCREMENT.setOptions(Opt.UNARY, Opt.MULTI, Opt.NOACTION);
88 NPP.setOptions(Opt.UNARY, Opt.MULTI, Opt.NOACTION);
89 SUBSTITUTIONS.setOptions(Opt.BOOLEAN, Opt.MULTI, Opt.NOACTION);
90 INITSUBSTITUTIONS.setOptions(Opt.BOOLEAN, Opt.BOOTSTRAP, Opt.NOACTION);
91 NIL.setOptions(Opt.UNARY, Opt.LINKED, Opt.MULTI, Opt.NOACTION);
92 SETARGFILE.setOptions(Opt.STRING, Opt.MULTI, Opt.PRIVATE, Opt.NOACTION);
93 UNSETARGFILE.setOptions(Opt.MULTI, Opt.PRIVATE, Opt.NOACTION);
94 // Opt.BOOTSTRAP args are parsed (not linked with no SubVals so using a
95 // simplified parser, see jalview.bin.argparser.BootstrapArgs)
96 // before a full parse of arguments and so can be accessible at an earlier
97 // stage to (e.g.) set debug log level, provide a props file (that might set
98 // log level), run headlessly, read an argfile instead of other args.
101 private final String[] argNames;
103 private Opt[] argOptions;
105 private boolean defaultBoolValue = false;
107 private String description = null;
114 private Arg(String... names)
116 int length = (names == null || names.length == 0
117 || (names.length == 1 && names[0] == null)) ? 1
119 this.argNames = new String[length];
120 this.argNames[0] = this.getName();
122 System.arraycopy(names, 0, this.argNames, 1, names.length);
125 public String argString()
127 return argString(false);
130 public String negateArgString()
132 return argString(true);
135 private String argString(boolean negate)
137 StringBuilder sb = new StringBuilder(ArgParser.DOUBLEDASH);
138 if (negate && hasOption(Opt.BOOLEAN))
139 sb.append(ArgParser.NEGATESTRING);
140 sb.append(getName());
141 return sb.toString();
144 public String toLongString()
146 StringBuilder sb = new StringBuilder();
147 sb.append(this.getClass().getName()).append('.').append(this.name());
149 if (getNames().length > 0)
151 sb.append(String.join("\", \"", getNames()));
152 if (getNames().length > 0)
155 sb.append("\nOpt: ");
156 // map List<Opt> to List<String> for the String.join
157 List<String> optList = Arrays.asList(argOptions).stream()
158 .map(opt -> opt.name()).collect(Collectors.toList());
159 sb.append(String.join(", ", optList));
161 return sb.toString();
164 public String[] getNames()
169 public String getName()
171 return this.name().toLowerCase(Locale.ROOT).replace('_', '-');
175 public final String toString()
180 public boolean hasOption(Opt o)
182 if (argOptions == null)
184 for (Opt option : argOptions)
192 protected void setOptions(Opt... options)
194 setOptions("", false, options);
197 protected void setOptions(String desc, Opt... options)
199 setOptions(desc, false, options);
202 protected void setOptions(boolean defaultBoolValue, Opt... options)
204 setOptions("", defaultBoolValue, options);
207 protected void setOptions(String desc, boolean defaultBoolValue,
210 this.description = desc;
211 this.defaultBoolValue = defaultBoolValue;
212 this.argOptions = options;
215 protected boolean getDefaultBoolValue()
217 return defaultBoolValue;
220 private void setDescription(String d)
225 protected String getDescription()
230 public static final String usage()
232 StringBuilder sb = new StringBuilder();
234 sb.append("Usage: jalview [args]");
235 sb.append(System.lineSeparator());
237 int maxArgLength = 0;
238 for (Arg a : EnumSet.allOf(Arg.class))
240 StringBuilder argSb = new StringBuilder();
241 argSb.append(a.hasOption(Opt.BOOLEAN) ? booleanArgString(a)
243 if (a.hasOption(Opt.STRING))
244 argSb.append("=value");
245 if (argSb.length() > maxArgLength)
246 maxArgLength = argSb.length();
249 // might want to order these
250 for (Arg a : EnumSet.allOf(Arg.class))
252 StringBuilder argSb = new StringBuilder();
253 argSb.append(a.hasOption(Opt.BOOLEAN) ? booleanArgString(a)
255 if (a.hasOption(Opt.STRING))
256 argSb.append("=value");
257 sb.append(String.format("%-" + maxArgLength + "s - %s",
258 argSb.toString(), a.getDescription()));
259 if (a.hasOption(Opt.BOOLEAN))
261 sb.append(" (default ");
262 sb.append(a.getDefaultBoolValue() ? a.argString()
263 : a.negateArgString());
266 sb.append(System.lineSeparator());
268 return sb.toString();
271 public static String booleanArgString(Arg a)
273 StringBuilder sb = new StringBuilder(a.argString());
274 if (a.hasOption(Opt.BOOLEAN))
277 sb.append(a.negateArgString());
279 return sb.toString();