JAL-629 Fixed appending URLs
[jalview.git] / src / jalview / bin / argparser / Arg.java
index 4c2465c..9b5907f 100644 (file)
@@ -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,29 +10,29 @@ 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, NOQUESTIONNAIRE, 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, NIL, SPLASH;
+  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
   {
     BOOLEAN, STRING, UNARY, MULTI, LINKED, NODUPLICATEVALUES, BOOTSTRAP,
-    GLOB, NOACTION, ALLOWSUBSTITUTIONS
+    GLOB, NOACTION, ALLOWSUBSTITUTIONS, PRIVATE
   }
 
   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,24 +41,20 @@ 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);
     SPLASH.setOptions(true, Opt.BOOLEAN, Opt.BOOTSTRAP);
-    NOQUESTIONNAIRE.setOptions(Opt.UNARY, Opt.BOOTSTRAP); // unary as
-                                                          // --questionnaire=val
     // 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.MULTI, Opt.GLOB,
+    OPEN.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.GLOB,
             Opt.ALLOWSUBSTITUTIONS);
     PROPS.setOptions(Opt.STRING, Opt.BOOTSTRAP);
-    QUESTIONNAIRE.setOptions(Opt.STRING);
-    SETPROP.setOptions(Opt.STRING);
+    QUESTIONNAIRE.setOptions(Opt.BOOLEAN, Opt.BOOTSTRAP);
+    SETPROP.setOptions(Opt.STRING, Opt.MULTI, Opt.BOOTSTRAP);
     TREE.setOptions(Opt.STRING);
 
     VDOC.setOptions(Opt.UNARY);
@@ -65,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);
@@ -85,10 +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
@@ -102,6 +102,8 @@ public enum Arg
 
   private boolean defaultBoolValue = false;
 
+  private String description = null;
+
   private Arg()
   {
     this(new String[0]);
@@ -118,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();
@@ -168,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<String> 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