1 package jalview.ws2.operations;
3 import java.io.IOException;
4 import java.util.Collections;
5 import java.util.HashMap;
7 import java.util.concurrent.CancellationException;
8 import java.util.concurrent.CompletionStage;
10 import javax.swing.JMenu;
11 import javax.swing.JMenuItem;
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;
35 import static java.lang.String.format;
42 public class AnnotationOperation implements Operation
44 final WebServiceI service;
46 final String typeName;
48 final ResultSupplier<List<AlignmentAnnotation>> annotationSupplier;
50 final ResultSupplier<FeaturesFile> featuresSupplier;
52 public AnnotationOperation(WebServiceI service,
53 ResultSupplier<List<AlignmentAnnotation>> annotSupplier,
54 ResultSupplier<FeaturesFile> featSupplier, String operationName)
56 this.service = service;
57 this.annotationSupplier = annotSupplier;
58 this.featuresSupplier = featSupplier;
59 this.typeName = operationName;
63 public String getName()
65 return service.getName();
69 public String getTypeName()
75 public String getHostName()
77 return service.getHostName();
81 public int getMinSequences()
87 public int getMaxSequences()
89 return Integer.MAX_VALUE;
93 public boolean canSubmitGaps()
99 public boolean isProteinOperation()
105 public boolean isNucleotideOperation()
111 public boolean isInteractive()
117 public boolean isAlignmentAnalysis()
123 public boolean getFilterNonStandardSymbols()
129 public boolean getNeedsAlignedSequences()
135 public MenuEntryProviderI getMenuBuilder()
137 return this::buildMenu;
140 protected void buildMenu(JMenu parent, AlignFrame frame)
142 final var calcName = service.getName();
143 PollingTaskExecutor wsExecutor = frame.getViewport().getWSExecutor();
144 final var calcManager = frame.getViewport().getCalcManager();
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,
154 calcManager.startWorker(worker);
155 // TODO create and submit AnnotataionServiceWorker
159 if (service.hasParameters())
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)
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);
182 private CompletionStage<List<ArgumentI>> openEditParamsDialog(
183 WebServiceI service, WsParamSetI preset, List<ArgumentI> arguments)
185 WsJobParameters jobParams;
186 if (preset == null && arguments != null && arguments.size() > 0)
187 jobParams = new WsJobParameters(service.getParamStore(), preset,
190 jobParams = new WsJobParameters(service.getParamStore(), preset,
194 jobParams.setName(MessageManager.getString(
195 "label.adjusting_parameters_for_calculation"));
197 var stage = jobParams.showRunDialog();
198 return stage.thenApply((startJob) -> {
201 if (jobParams.getPreset() == null)
202 return jobParams.getJobParams();
204 return jobParams.getPreset().getArguments();