JAL-629 improvements to argparser toString. Improvements to cli paeFile structure...
[jalview.git] / src / jalview / bin / argparser / Arg.java
1 package jalview.bin.argparser;
2
3 import java.util.Arrays;
4 import java.util.List;
5 import java.util.Locale;
6 import java.util.stream.Collectors;
7
8 public enum Arg
9 {
10   HELP("h"), CALCULATION, MENUBAR, STATUS, SHOWOVERVIEW, ANNOTATIONS,
11   COLOUR, FEATURES, GROOVY, GROUPS, HEADLESS, JABAWS, ANNOTATION,
12   ANNOTATION2, DISPLAY, GUI, NEWS, NOQUESTIONNAIRE, SORTBYTREE, USAGESTATS,
13   OPEN, OPEN2, PROPS, QUESTIONNAIRE, SETPROP, TREE, VDOC, VSESS, OUTPUT,
14   OUTPUTTYPE, SSANNOTATION, NOTEMPFAC, TEMPFAC, TEMPFAC_LABEL, TEMPFAC_DESC,
15   TEMPFAC_SHADING, TITLE, PAEMATRIX, WRAP, NOSTRUCTURE, STRUCTURE, IMAGE,
16   QUIT, CLOSE, DEBUG("d"), QUIET("q"), ARGFILE, INCREMENT, NPP("n++"),
17   SUBSTITUTIONS, NIL;
18
19   protected static enum Opt
20   {
21     BOOLEAN, STRING, UNARY, MULTI, LINKED, NODUPLICATEVALUES, BOOTSTRAP,
22     GLOB, NOACTION, ALLOWSUBSTITUTIONS
23   }
24
25   static
26   {
27     HELP.setOptions(Opt.UNARY);
28     CALCULATION.setOptions(true, Opt.BOOLEAN); // default "true" implies only
29                                                // expecting "--nocalculation"
30     MENUBAR.setOptions(true, Opt.BOOLEAN);
31     STATUS.setOptions(true, Opt.BOOLEAN);
32     SHOWOVERVIEW.setOptions(Opt.UNARY, Opt.LINKED);
33     ANNOTATIONS.setOptions(Opt.STRING, Opt.LINKED);
34     COLOUR.setOptions(Opt.STRING, Opt.LINKED);
35     FEATURES.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI,
36             Opt.ALLOWSUBSTITUTIONS);
37     GROOVY.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI,
38             Opt.ALLOWSUBSTITUTIONS);
39     GROUPS.setOptions(Opt.STRING, Opt.LINKED);
40     HEADLESS.setOptions(Opt.UNARY, Opt.BOOTSTRAP);
41     JABAWS.setOptions(Opt.STRING);
42     ANNOTATION.setOptions(true, Opt.BOOLEAN, Opt.LINKED);
43     ANNOTATION2.setOptions(true, Opt.BOOLEAN, Opt.LINKED);
44     DISPLAY.setOptions(true, Opt.BOOLEAN);
45     GUI.setOptions(true, Opt.BOOLEAN);
46     NEWS.setOptions(true, Opt.BOOLEAN);
47     NOQUESTIONNAIRE.setOptions(Opt.UNARY); // unary as --questionnaire=val
48                                            // expects a string value
49     SORTBYTREE.setOptions(true, Opt.BOOLEAN);
50     USAGESTATS.setOptions(true, Opt.BOOLEAN);
51     OPEN.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.GLOB,
52             Opt.ALLOWSUBSTITUTIONS);
53     OPEN2.setOptions(Opt.STRING, Opt.LINKED, Opt.ALLOWSUBSTITUTIONS);
54     PROPS.setOptions(Opt.STRING, Opt.BOOTSTRAP);
55     QUESTIONNAIRE.setOptions(Opt.STRING);
56     SETPROP.setOptions(Opt.STRING);
57     TREE.setOptions(Opt.STRING);
58
59     VDOC.setOptions(Opt.UNARY);
60     VSESS.setOptions(Opt.UNARY);
61
62     OUTPUT.setOptions(Opt.STRING, Opt.LINKED, Opt.ALLOWSUBSTITUTIONS);
63     OUTPUTTYPE.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI);
64
65     SSANNOTATION.setOptions(Opt.BOOLEAN, Opt.LINKED);
66     NOTEMPFAC.setOptions(Opt.UNARY, Opt.LINKED);
67     TEMPFAC.setOptions(Opt.STRING, Opt.LINKED);
68     TEMPFAC_LABEL.setOptions(Opt.STRING, Opt.LINKED);
69     TEMPFAC_DESC.setOptions(Opt.STRING, Opt.LINKED);
70     TEMPFAC_SHADING.setOptions(Opt.BOOLEAN, Opt.LINKED);
71     TITLE.setOptions(Opt.STRING, Opt.LINKED);
72     PAEMATRIX.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI,
73             Opt.ALLOWSUBSTITUTIONS);
74     NOSTRUCTURE.setOptions(Opt.UNARY, Opt.LINKED);
75     STRUCTURE.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI,
76             Opt.ALLOWSUBSTITUTIONS);
77     WRAP.setOptions(Opt.BOOLEAN, Opt.LINKED);
78     IMAGE.setOptions(Opt.STRING, Opt.LINKED, Opt.ALLOWSUBSTITUTIONS);
79     QUIT.setOptions(Opt.UNARY);
80     CLOSE.setOptions(Opt.UNARY, Opt.LINKED);
81     DEBUG.setOptions(Opt.BOOLEAN, Opt.BOOTSTRAP);
82     QUIET.setOptions(Opt.UNARY, Opt.MULTI, Opt.BOOTSTRAP);
83     ARGFILE.setOptions(Opt.STRING, Opt.MULTI, Opt.BOOTSTRAP, Opt.GLOB,
84             Opt.ALLOWSUBSTITUTIONS);
85     INCREMENT.setOptions(Opt.UNARY, Opt.MULTI, Opt.NOACTION);
86     NPP.setOptions(Opt.UNARY, Opt.MULTI, Opt.NOACTION);
87     SUBSTITUTIONS.setOptions(Opt.BOOLEAN, Opt.MULTI, Opt.NOACTION);
88     NIL.setOptions(Opt.UNARY, Opt.LINKED, Opt.MULTI, Opt.NOACTION);
89     // Opt.BOOTSTRAP args are parsed (not linked with no SubVals so using a
90     // simplified parser, see jalview.bin.argparser.BootstrapArgs)
91     // before a full parse of arguments and so can be accessible at an earlier
92     // stage to (e.g.) set debug log level, provide a props file (that might set
93     // log level), run headlessly, read an argfile instead of other args.
94   }
95
96   private final String[] argNames;
97
98   private Opt[] argOptions;
99
100   private boolean defaultBoolValue = false;
101
102   private Arg()
103   {
104     this(new String[0]);
105   }
106
107   private Arg(String... names)
108   {
109     int length = (names == null || names.length == 0
110             || (names.length == 1 && names[0] == null)) ? 1
111                     : names.length + 1;
112     this.argNames = new String[length];
113     this.argNames[0] = this.getName();
114     if (length > 1)
115       System.arraycopy(names, 0, this.argNames, 1, names.length);
116   }
117
118   public String toLongString()
119   {
120     StringBuilder sb = new StringBuilder();
121     sb.append(this.getClass().getName()).append('.').append(this.name());
122     sb.append('(');
123     if (getNames().length > 0)
124       sb.append('"');
125     sb.append(String.join("\", \"", getNames()));
126     if (getNames().length > 0)
127       sb.append('"');
128     sb.append(")\n");
129     sb.append("\nOpt: ");
130     // map List<Opt> to List<String> for the String.join
131     List<String> optList = Arrays.asList(argOptions).stream()
132             .map(opt -> opt.name()).collect(Collectors.toList());
133     sb.append(String.join(", ", optList));
134     sb.append("\n");
135     return sb.toString();
136   }
137
138   public String[] getNames()
139   {
140     return argNames;
141   }
142
143   public String getName()
144   {
145     return this.name().toLowerCase(Locale.ROOT).replace('_', '-');
146   }
147
148   @Override
149   public final String toString()
150   {
151     return getName();
152   }
153
154   public boolean hasOption(Opt o)
155   {
156     if (argOptions == null)
157       return false;
158     for (Opt option : argOptions)
159     {
160       if (o == option)
161         return true;
162     }
163     return false;
164   }
165
166   protected void setOptions(Opt... options)
167   {
168     setOptions(false, options);
169   }
170
171   protected void setOptions(boolean defaultBoolValue, Opt... options)
172   {
173     this.defaultBoolValue = defaultBoolValue;
174     argOptions = options;
175   }
176
177   protected boolean getDefaultBoolValue()
178   {
179     return defaultBoolValue;
180   }
181 }