JAL-629 Opening files in new windows. not working yet
[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, OPENNEW, 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, SPLASH;
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, Opt.BOOTSTRAP);
47     SPLASH.setOptions(true, Opt.BOOLEAN, Opt.BOOTSTRAP);
48     NOQUESTIONNAIRE.setOptions(Opt.UNARY, Opt.BOOTSTRAP); // unary as
49                                                           // --questionnaire=val
50     // expects a string value
51     SORTBYTREE.setOptions(true, Opt.BOOLEAN);
52     USAGESTATS.setOptions(true, Opt.BOOLEAN);
53     OPEN.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.GLOB,
54             Opt.ALLOWSUBSTITUTIONS);
55     OPENNEW.setOptions(Opt.STRING, Opt.MULTI, Opt.GLOB,
56             Opt.ALLOWSUBSTITUTIONS);
57     PROPS.setOptions(Opt.STRING, Opt.BOOTSTRAP);
58     QUESTIONNAIRE.setOptions(Opt.STRING);
59     SETPROP.setOptions(Opt.STRING);
60     TREE.setOptions(Opt.STRING);
61
62     VDOC.setOptions(Opt.UNARY);
63     VSESS.setOptions(Opt.UNARY);
64
65     OUTPUT.setOptions(Opt.STRING, Opt.LINKED, Opt.ALLOWSUBSTITUTIONS);
66     OUTPUTTYPE.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI);
67
68     SSANNOTATION.setOptions(Opt.BOOLEAN, Opt.LINKED);
69     NOTEMPFAC.setOptions(Opt.UNARY, Opt.LINKED);
70     TEMPFAC.setOptions(Opt.STRING, Opt.LINKED);
71     TEMPFAC_LABEL.setOptions(Opt.STRING, Opt.LINKED);
72     TEMPFAC_DESC.setOptions(Opt.STRING, Opt.LINKED);
73     TEMPFAC_SHADING.setOptions(Opt.BOOLEAN, Opt.LINKED);
74     TITLE.setOptions(Opt.STRING, Opt.LINKED);
75     PAEMATRIX.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI,
76             Opt.ALLOWSUBSTITUTIONS);
77     NOSTRUCTURE.setOptions(Opt.UNARY, Opt.LINKED);
78     STRUCTURE.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI,
79             Opt.ALLOWSUBSTITUTIONS);
80     WRAP.setOptions(Opt.BOOLEAN, Opt.LINKED);
81     IMAGE.setOptions(Opt.STRING, Opt.LINKED, Opt.ALLOWSUBSTITUTIONS);
82     QUIT.setOptions(Opt.UNARY);
83     CLOSE.setOptions(Opt.UNARY, Opt.LINKED);
84     DEBUG.setOptions(Opt.BOOLEAN, Opt.BOOTSTRAP);
85     QUIET.setOptions(Opt.UNARY, Opt.MULTI, Opt.BOOTSTRAP);
86     ARGFILE.setOptions(Opt.STRING, Opt.MULTI, Opt.BOOTSTRAP, Opt.GLOB,
87             Opt.ALLOWSUBSTITUTIONS);
88     INCREMENT.setOptions(Opt.UNARY, Opt.MULTI, Opt.NOACTION);
89     NPP.setOptions(Opt.UNARY, Opt.MULTI, Opt.NOACTION);
90     SUBSTITUTIONS.setOptions(Opt.BOOLEAN, Opt.MULTI, Opt.NOACTION);
91     NIL.setOptions(Opt.UNARY, Opt.LINKED, Opt.MULTI, Opt.NOACTION);
92     // Opt.BOOTSTRAP args are parsed (not linked with no SubVals so using a
93     // simplified parser, see jalview.bin.argparser.BootstrapArgs)
94     // before a full parse of arguments and so can be accessible at an earlier
95     // stage to (e.g.) set debug log level, provide a props file (that might set
96     // log level), run headlessly, read an argfile instead of other args.
97   }
98
99   private final String[] argNames;
100
101   private Opt[] argOptions;
102
103   private boolean defaultBoolValue = false;
104
105   private Arg()
106   {
107     this(new String[0]);
108   }
109
110   private Arg(String... names)
111   {
112     int length = (names == null || names.length == 0
113             || (names.length == 1 && names[0] == null)) ? 1
114                     : names.length + 1;
115     this.argNames = new String[length];
116     this.argNames[0] = this.getName();
117     if (length > 1)
118       System.arraycopy(names, 0, this.argNames, 1, names.length);
119   }
120
121   public String toLongString()
122   {
123     StringBuilder sb = new StringBuilder();
124     sb.append(this.getClass().getName()).append('.').append(this.name());
125     sb.append('(');
126     if (getNames().length > 0)
127       sb.append('"');
128     sb.append(String.join("\", \"", getNames()));
129     if (getNames().length > 0)
130       sb.append('"');
131     sb.append(")\n");
132     sb.append("\nOpt: ");
133     // map List<Opt> to List<String> for the String.join
134     List<String> optList = Arrays.asList(argOptions).stream()
135             .map(opt -> opt.name()).collect(Collectors.toList());
136     sb.append(String.join(", ", optList));
137     sb.append("\n");
138     return sb.toString();
139   }
140
141   public String[] getNames()
142   {
143     return argNames;
144   }
145
146   public String getName()
147   {
148     return this.name().toLowerCase(Locale.ROOT).replace('_', '-');
149   }
150
151   @Override
152   public final String toString()
153   {
154     return getName();
155   }
156
157   public boolean hasOption(Opt o)
158   {
159     if (argOptions == null)
160       return false;
161     for (Opt option : argOptions)
162     {
163       if (o == option)
164         return true;
165     }
166     return false;
167   }
168
169   protected void setOptions(Opt... options)
170   {
171     setOptions(false, options);
172   }
173
174   protected void setOptions(boolean defaultBoolValue, Opt... options)
175   {
176     this.defaultBoolValue = defaultBoolValue;
177     argOptions = options;
178   }
179
180   protected boolean getDefaultBoolValue()
181   {
182     return defaultBoolValue;
183   }
184 }