Merge branch 'JAL-3878_ws-overhaul-3' into mmw/Release_2_12_ws_merge
[jalview.git] / src / jalview / ws / params / simple / Option.java
index 40e3804..44f9f5d 100644 (file)
@@ -25,9 +25,93 @@ import jalview.ws.params.OptionI;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
+import static java.util.Objects.requireNonNull;
+import static java.util.Objects.requireNonNullElse;
 
 public class Option implements OptionI
 {
+  /**
+   * A builder class which avoids multiple telescoping parameters nightmare.
+   * 
+   * @author mmwarowny
+   *
+   */
+  public static class Builder
+  {
+    protected String name = null;
+
+    protected String label = null;
+
+    protected String description = "";
+
+    protected boolean required = false;
+
+    protected String defaultValue = null;
+
+    protected String value = null;
+
+    protected List<String> possibleValues = null;
+
+    protected List<String> displayValues = null;
+
+    protected URL detailsUrl = null;
+
+    public void setName(String name)
+    {
+      this.name = name;
+    }
+
+    public void setLabel(String label)
+    {
+      this.label = label;
+    }
+
+    public void setDescription(String description)
+    {
+      this.description = description;
+    }
+
+    public void setRequired(boolean required)
+    {
+      this.required = required;
+    }
+
+    public void setDefaultValue(String defaultValue)
+    {
+      this.defaultValue = defaultValue;
+    }
+
+    public void setValue(String value)
+    {
+      this.value = value;
+    }
+
+    public void setPossibleValues(List<String> possibleValues)
+    {
+      this.possibleValues = possibleValues;
+    }
+
+    public void setDisplayValues(List<String> displayValues)
+    {
+      this.displayValues = displayValues;
+    }
+
+    public void setDetailsUrl(URL detailsUrl)
+    {
+      this.detailsUrl = detailsUrl;
+    }
+
+    public Option build()
+    {
+      return new Option(this);
+    }
+  }
+
+  public static Builder newBuilder()
+  {
+    return new Builder();
+  }
+
   String name;
 
   String label;
@@ -55,6 +139,30 @@ public class Option implements OptionI
 
   URL fdetails;
 
+  protected Option(Builder builder)
+  {
+    requireNonNull(builder.name);
+    name = builder.name;
+    label = requireNonNullElse(builder.label, name);
+    description = builder.description;
+    required = builder.required;
+    defvalue = builder.defaultValue;
+    value = builder.value;
+    if (builder.possibleValues != null)
+      possibleVals = new ArrayList<>(builder.possibleValues);
+    if (builder.displayValues != null)
+      displayVals = new ArrayList<>(builder.displayValues);
+    else
+      displayVals = possibleVals;
+    if (possibleVals == null && displayVals != null)
+      throw new IllegalArgumentException(
+          "cannot use displayValues if possibleValues is null");
+    if (possibleVals != null && possibleVals.size() != displayVals.size())
+      throw new IllegalArgumentException(
+          "displayValues size does not match possibleValues");
+    fdetails = builder.detailsUrl;
+  }
+
   /**
    * Copy constructor
    * 
@@ -99,8 +207,8 @@ public class Option implements OptionI
    * @param fdetails
    */
   public Option(String name2, String description2, boolean isrequired,
-          String defValue, String val, List<String> possibleVals,
-          List<String> displayNames, URL fdetails)
+      String defValue, String val, List<String> possibleVals,
+      List<String> displayNames, URL fdetails)
   {
     name = name2;
     description = description2;
@@ -130,11 +238,11 @@ public class Option implements OptionI
    * @param fdetails
    */
   public Option(String name2, String description2, boolean isrequired,
-          String defValue, String val, List<String> possibleVals,
-          URL fdetails)
+      String defValue, String val, List<String> possibleVals,
+      URL fdetails)
   {
     this(name2, description2, isrequired, defValue, val, possibleVals, null,
-            fdetails);
+        fdetails);
   }
 
   @Override