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