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