JAL-3878 Refactoring SeqAnnotationServiceCalcWorker.
[jalview.git] / src / jalview / ws2 / operations / AnnotationOperation.java
1 package jalview.ws2.operations;
2
3 import java.io.IOException;
4 import java.util.Collections;
5 import java.util.HashMap;
6 import java.util.List;
7 import java.util.concurrent.CancellationException;
8 import java.util.concurrent.CompletionStage;
9
10 import javax.swing.JMenu;
11 import javax.swing.JMenuItem;
12
13 import jalview.api.AlignmentViewPanel;
14 import jalview.bin.Cache;
15 import jalview.datamodel.AlignmentAnnotation;
16 import jalview.gui.AlignFrame;
17 import jalview.gui.AlignViewport;
18 import jalview.gui.WsJobParameters;
19 import jalview.io.AnnotationFile;
20 import jalview.io.FeaturesFile;
21 import jalview.util.MathUtils;
22 import jalview.util.MessageManager;
23 import jalview.workers.AlignCalcManager2;
24 import jalview.ws.params.ArgumentI;
25 import jalview.ws.params.WsParamSetI;
26 import jalview.ws2.MenuEntryProviderI;
27 import jalview.ws2.ResultSupplier;
28 import jalview.ws2.WSJob;
29 import jalview.ws2.WSJobStatus;
30 import jalview.ws2.PollingTaskExecutor;
31 import jalview.ws2.WebServiceI;
32 import jalview.ws2.WebServiceWorkerI;
33 import jalview.ws2.utils.WSJobList;
34
35 import static java.lang.String.format;
36
37 /**
38  * 
39  * @author mmwarowny
40  *
41  */
42 public class AnnotationOperation implements Operation
43 {
44   final WebServiceI service;
45
46   final String typeName;
47
48   final ResultSupplier<List<AlignmentAnnotation>> annotationSupplier;
49
50   final ResultSupplier<FeaturesFile> featuresSupplier;
51
52   public AnnotationOperation(WebServiceI service,
53       ResultSupplier<List<AlignmentAnnotation>> annotSupplier,
54       ResultSupplier<FeaturesFile> featSupplier, String operationName)
55   {
56     this.service = service;
57     this.annotationSupplier = annotSupplier;
58     this.featuresSupplier = featSupplier;
59     this.typeName = operationName;
60   }
61
62   @Override
63   public String getName()
64   {
65     return service.getName();
66   }
67
68   @Override
69   public String getTypeName()
70   {
71     return typeName;
72   }
73
74   @Override
75   public String getHostName()
76   {
77     return service.getHostName();
78   }
79
80   @Override
81   public int getMinSequences()
82   {
83     return 0;
84   }
85
86   @Override
87   public int getMaxSequences()
88   {
89     return Integer.MAX_VALUE;
90   }
91
92   @Override
93   public boolean canSubmitGaps()
94   {
95     return false;
96   }
97
98   @Override
99   public boolean isProteinOperation()
100   {
101     return true;
102   }
103
104   @Override
105   public boolean isNucleotideOperation()
106   {
107     return true;
108   }
109
110   @Override
111   public boolean isInteractive()
112   {
113     return false;
114   }
115
116   @Override
117   public boolean isAlignmentAnalysis()
118   {
119     return false;
120   }
121
122   @Override
123   public boolean getFilterNonStandardSymbols()
124   {
125     return false;
126   }
127
128   @Override
129   public boolean getNeedsAlignedSequences()
130   {
131     return false;
132   }
133
134   @Override
135   public MenuEntryProviderI getMenuBuilder()
136   {
137     return this::buildMenu;
138   }
139
140   protected void buildMenu(JMenu parent, AlignFrame frame)
141   {
142     final var calcName = service.getName();
143     PollingTaskExecutor wsExecutor = frame.getViewport().getWSExecutor();
144     final var calcManager = frame.getViewport().getCalcManager();
145     {
146       var item = new JMenuItem(MessageManager.formatMessage(
147           "label.calcname_with_default_settings", calcName));
148       item.addActionListener((event) -> {
149         AlignViewport viewport = frame.getCurrentView();
150         AlignmentViewPanel alignPanel = frame.alignPanel;
151         var worker = new AnnotationServiceWorker(this, service,
152             Collections.emptyList(), viewport, alignPanel, frame, frame,
153             calcManager);
154         calcManager.startWorker(worker);
155         // TODO create and submit AnnotataionServiceWorker
156       });
157       parent.add(item);
158     }
159     if (service.hasParameters())
160     {
161       var item = new JMenuItem(
162           MessageManager.getString("label.edit_settings_and_run"));
163       item.setToolTipText(MessageManager.getString(
164           "label.view_and_change_parameters_before_running_calculation"));
165       item.addActionListener((event) -> {
166         openEditParamsDialog(service, null, null)
167             .thenAcceptAsync((arguments) -> {
168               if (arguments != null)
169               {
170                 AlignViewport viewport = frame.getCurrentView();
171                 AlignmentViewPanel alignPanel = frame.alignPanel;
172                 var worker = new AnnotationServiceWorker(
173                     AnnotationOperation.this, service, arguments, viewport,
174                     alignPanel, frame, frame, calcManager);
175                 calcManager.startWorker(worker);
176               }
177             });
178       });
179     }
180   }
181
182   private CompletionStage<List<ArgumentI>> openEditParamsDialog(
183       WebServiceI service, WsParamSetI preset, List<ArgumentI> arguments)
184   {
185     WsJobParameters jobParams;
186     if (preset == null && arguments != null && arguments.size() > 0)
187       jobParams = new WsJobParameters(service.getParamStore(), preset,
188           arguments);
189     else
190       jobParams = new WsJobParameters(service.getParamStore(), preset,
191           null);
192     if (preset != null)
193     {
194       jobParams.setName(MessageManager.getString(
195           "label.adjusting_parameters_for_calculation"));
196     }
197     var stage = jobParams.showRunDialog();
198     return stage.thenApply((startJob) -> {
199       if (startJob)
200       {
201         if (jobParams.getPreset() == null)
202           return jobParams.getJobParams();
203         else
204           return jobParams.getPreset().getArguments();
205       }
206       else
207       {
208         return null;
209       }
210     });
211   }
212
213 }