Merge branch 'mmw/JAL-4199-task-execution-update' into development/Release_2_12_Branch
[jalview.git] / src / jalview / ws2 / actions / hmmer / PhmmerAction.java
1 package jalview.ws2.actions.hmmer;
2
3 import java.util.List;
4 import java.util.Objects;
5
6 import jalview.api.AlignViewportI;
7 import jalview.datamodel.AlignmentI;
8 import jalview.viewmodel.AlignmentViewport;
9 import jalview.ws.params.ArgumentI;
10 import jalview.ws2.actions.BaseAction;
11 import jalview.ws2.actions.PollingTaskExecutor;
12 import jalview.ws2.actions.api.TaskEventListener;
13 import jalview.ws2.actions.api.TaskI;
14 import jalview.ws2.api.Credentials;
15 import jalview.ws2.client.api.AlignmentWebServiceClientI;
16 import jalview.ws2.client.api.WebServiceClientI;
17
18 /**
19  * Implementation of the {@link BaseAction} for the phmmer client. This is NOT
20  * how you should implement it. The action should be more generic and cover
21  * range of similar services.
22  * 
23  * @author mmwarowny
24  *
25  */
26 // FIXME: Not an alignment action (temporary hack)
27 public class PhmmerAction extends BaseAction<AlignmentI>
28 {
29   public static class Builder extends BaseAction.Builder<PhmmerAction>
30   {
31     protected AlignmentWebServiceClientI client;
32
33     private Builder(AlignmentWebServiceClientI client)
34     {
35       super();
36       Objects.requireNonNull(client);
37       this.client = client;
38     }
39
40     public PhmmerAction build()
41     {
42       return new PhmmerAction(this);
43     }
44   }
45
46   public static Builder newBuilder(AlignmentWebServiceClientI client)
47   {
48     return new Builder(client);
49   }
50
51   protected final AlignmentWebServiceClientI client;
52
53   public PhmmerAction(Builder builder)
54   {
55     super(builder);
56     client = builder.client;
57   }
58
59   public TaskI<AlignmentI> perform(AlignmentViewport viewport,
60           List<ArgumentI> args, Credentials credentials,
61           TaskEventListener<AlignmentI> handler)
62   {
63     var task = createTask(viewport, args, credentials);
64     task.addTaskEventListener(handler);
65     var executor = PollingTaskExecutor.fromPool(viewport.getServiceExecutor());
66     var future = executor.submit(task);
67     task.setCancelAction(() -> { future.cancel(true); });
68     return task;
69   }
70   
71   public PhmmerTask createTask(AlignViewportI viewport,
72       List<ArgumentI> args, Credentials credentials) 
73   {
74     return new PhmmerTask(client, args, credentials, viewport.getAlignmentView(true));
75   }
76
77   @Override
78   public boolean isActive(AlignmentViewport viewport)
79   {
80     return false;
81   }
82 }