JAL-3878 Add web service reference to actions.
[jalview.git] / src / jalview / ws2 / api / WebService.java
index 6831541..4a101fd 100644 (file)
@@ -2,16 +2,16 @@ package jalview.ws2.api;
 
 import java.net.URL;
 import java.util.ArrayList;
-import java.util.Collections;
+import java.util.Collection;
 import java.util.List;
 import jalview.ws.params.ParamDatastoreI;
 import jalview.ws2.actions.api.ActionI;
 
 import static java.util.Objects.requireNonNull;
 
-public class WebService<T extends ActionI>
+public class WebService<A extends ActionI<?>>
 {
-  public static class Builder<T extends ActionI>
+  public static class Builder<A extends ActionI<?>>
   {
     private URL url;
 
@@ -27,82 +27,59 @@ public class WebService<T extends ActionI>
 
     private ParamDatastoreI paramDatastore;
 
-    private List<T> actions = new ArrayList<>();
+    private Class<A> actionClass;
 
-    private Class<T> actionClass;
-
-    public Builder<T> url(URL val)
+    public Builder<A> url(URL val)
     {
       url = val;
       return this;
     }
 
-    public Builder<T> clientName(String val)
+    public Builder<A> clientName(String val)
     {
       clientName = val;
       return this;
     }
 
-    public Builder<T> category(String val)
+    public Builder<A> category(String val)
     {
       category = val;
       return this;
     }
 
-    public Builder<T> name(String val)
+    public Builder<A> name(String val)
     {
       name = val;
       return this;
     }
 
-    public Builder<T> description(String val)
+    public Builder<A> description(String val)
     {
       description = val;
       return this;
     }
 
-    public Builder<T> interactive(boolean val)
+    public Builder<A> interactive(boolean val)
     {
       interactive = val;
       return this;
     }
 
-    public Builder<T> paramDatastore(ParamDatastoreI val)
+    public Builder<A> paramDatastore(ParamDatastoreI val)
     {
       paramDatastore = val;
       return this;
     }
 
-    public Builder<T> actions(List<T> val)
-    {
-      actions = val;
-      return this;
-    }
-
-    public Builder<T> action(T val)
-    {
-      actions.add(val);
-      return this;
-    }
-
-    public Builder<T> actionClass(Class<T> val)
+    public Builder<A> actionClass(Class<A> val)
     {
       actionClass = val;
       return this;
     }
 
-    public WebService<T> build()
+    public WebService<A> build()
     {
-      requireNonNull(url);
-      requireNonNull(clientName);
-      requireNonNull(category);
-      requireNonNull(name);
-      requireNonNull(paramDatastore);
-      requireNonNull(actions);
-      if (actions.size() == 0)
-        throw new IllegalArgumentException("Empty actions list");
-      requireNonNull(actionClass);
-      return new WebService<T>(this);
+      return new WebService<A>(this);
     }
   }
 
@@ -120,12 +97,18 @@ public class WebService<T extends ActionI>
 
   private final ParamDatastoreI paramDatastore;
 
-  private final List<T> actions;
+  private final List<A> actions;
 
-  private final Class<T> actionClass;
+  private final Class<A> actionClass;
 
-  WebService(Builder<T> builder)
+  protected WebService(Builder<A> builder)
   {
+    requireNonNull(builder.url);
+    requireNonNull(builder.clientName);
+    requireNonNull(builder.category);
+    requireNonNull(builder.name);
+    requireNonNull(builder.paramDatastore);
+    requireNonNull(builder.actionClass);
     this.url = builder.url;
     this.clientName = builder.clientName;
     this.category = builder.category;
@@ -133,13 +116,23 @@ public class WebService<T extends ActionI>
     this.description = builder.description;
     this.interactive = builder.interactive;
     this.paramDatastore = builder.paramDatastore;
-    this.actions = Collections.unmodifiableList(builder.actions);
+    this.actions = new ArrayList<>();
     this.actionClass = builder.actionClass;
   }
-  
-  public static <T extends ActionI> Builder<T> newBuilder()
+
+  public static <A extends ActionI<?>> Builder<A> newBuilder()
+  {
+    return new Builder<A>();
+  }
+
+  public void addAction(A action)
+  {
+    this.actions.add(action);
+  }
+
+  public void addActions(Collection<? extends A> actions)
   {
-    return new Builder<T>();
+    this.actions.addAll(actions);
   }
 
   public URL getUrl()
@@ -177,12 +170,12 @@ public class WebService<T extends ActionI>
     return paramDatastore;
   }
 
-  public List<T> getActions()
+  public List<A> getActions()
   {
     return actions;
   }
 
-  public Class<T> getActionClass()
+  public Class<A> getActionClass()
   {
     return actionClass;
   }