JAL - 3690 AlignCalc rebuilt - FutureTask-based manager
[jalview.git] / src / jalview / ws / jws2 / Jws2ClientFactory.java
1 package jalview.ws.jws2;
2
3 import jalview.api.AlignCalcWorkerI;
4 import jalview.bin.Cache;
5 import jalview.gui.AlignFrame;
6 import jalview.gui.JvSwingUtils;
7 import jalview.util.MessageManager;
8 import jalview.ws.api.ServiceWithParameters;
9 import jalview.ws.jws2.dm.AAConSettings;
10 import jalview.ws.jws2.jabaws2.Jws2Instance;
11 import jalview.ws.params.AutoCalcSetting;
12 import jalview.ws.uimodel.AlignAnalysisUIText;
13
14 import java.awt.event.ActionEvent;
15 import java.awt.event.ActionListener;
16 import java.util.List;
17
18 import javax.swing.JCheckBoxMenuItem;
19 import javax.swing.JMenu;
20 import javax.swing.JMenuItem;
21 import javax.swing.event.MenuEvent;
22 import javax.swing.event.MenuListener;
23
24 public class Jws2ClientFactory
25 {
26   static boolean registerAAConWSInstance(final JMenu wsmenu,
27           final ServiceWithParameters service, final AlignFrame alignFrame)
28   {
29     final AlignAnalysisUIText aaui = service.getAlignAnalysisUI(); // null
30                                                                         // ; //
31     // AlignAnalysisUIText.aaConGUI.get(service.serviceType.toString());
32     if (aaui == null)
33     {
34       // not an instantaneous calculation GUI type service
35       return false;
36     }
37     // create the instaneous calculation GUI bits and update state if existing
38     // GUI elements already present
39
40     JCheckBoxMenuItem _aaConEnabled = null;
41     for (int i = 0; i < wsmenu.getItemCount(); i++)
42     {
43       JMenuItem item = wsmenu.getItem(i);
44       if (item instanceof JCheckBoxMenuItem
45               && item.getText().equals(aaui.getAAconToggle()))
46       {
47         _aaConEnabled = (JCheckBoxMenuItem) item;
48       }
49     }
50     // is there an aaCon worker already present - if so, set it to use the
51     // given service handle
52     {
53       List<AlignCalcWorkerI> aaconClient = alignFrame.getViewport()
54               .getCalcManager()
55               .getWorkersOfClass(aaui.getClient());
56       if (aaconClient != null && aaconClient.size() > 0)
57       {
58         SeqAnnotationServiceCalcWorker worker = (SeqAnnotationServiceCalcWorker) aaconClient
59                 .get(0);
60         if (!worker.service.getHostURL().equals(service.getHostURL()))
61         {
62           // javax.swing.SwingUtilities.invokeLater(new Runnable()
63           {
64             // @Override
65             // public void run()
66             {
67               removeCurrentAAConWorkerFor(aaui, alignFrame);
68               buildCurrentAAConWorkerFor(aaui, alignFrame, service);
69             }
70           } // );
71         }
72       }
73     }
74
75     // is there a service already registered ? there shouldn't be if we are
76     // being called correctly
77     if (_aaConEnabled == null)
78     {
79       final JCheckBoxMenuItem aaConEnabled = new JCheckBoxMenuItem(
80               aaui.getAAconToggle());
81
82       aaConEnabled.setToolTipText(
83               JvSwingUtils.wrapTooltip(true, aaui.getAAconToggleTooltip()));
84       aaConEnabled.addActionListener(new ActionListener()
85       {
86         @Override
87         public void actionPerformed(ActionEvent arg0)
88         {
89
90           List<AlignCalcWorkerI> aaconClient = alignFrame.getViewport()
91                   .getCalcManager()
92                   .getWorkersOfClass(SeqAnnotationServiceCalcWorker.class);
93           if (aaconClient != null)
94           {
95             for (AlignCalcWorkerI worker : aaconClient)
96             {
97               if (((SeqAnnotationServiceCalcWorker) worker).getService()
98                       .getClass().equals(aaui.getClient()))
99               {
100                 removeCurrentAAConWorkerFor(aaui, alignFrame);
101                 return;
102               }
103             }
104           }
105           buildCurrentAAConWorkerFor(aaui, alignFrame);
106         }
107
108       });
109       wsmenu.add(aaConEnabled);
110       final JMenuItem modifyParams = new JMenuItem(
111               aaui.getAAeditSettings());
112       modifyParams.setToolTipText(JvSwingUtils.wrapTooltip(true,
113               aaui.getAAeditSettingsTooltip()));
114       modifyParams.addActionListener(new ActionListener()
115       {
116
117         @Override
118         public void actionPerformed(ActionEvent arg0)
119         {
120           showAAConAnnotationSettingsFor(aaui, alignFrame);
121         }
122       });
123       wsmenu.add(modifyParams);
124       wsmenu.addMenuListener(new MenuListener()
125       {
126
127         @Override
128         public void menuSelected(MenuEvent arg0)
129         {
130           // TODO: refactor to the implementing class.
131           if (alignFrame.getViewport().getAlignment().isNucleotide()
132                   ? aaui.isNa()
133                   : aaui.isPr())
134           {
135             aaConEnabled.setEnabled(true);
136             modifyParams.setEnabled(true);
137           }
138           else
139           {
140             aaConEnabled.setEnabled(false);
141             modifyParams.setEnabled(false);
142             return;
143           }
144           List<AlignCalcWorkerI> aaconClient = alignFrame.getViewport()
145                   .getCalcManager()
146                   .getWorkersOfClass(SeqAnnotationServiceCalcWorker.class);
147
148           boolean serviceEnabled = false;
149           if (aaconClient != null)
150           {
151             // NB code duplicatino again!
152             for (AlignCalcWorkerI _worker : aaconClient)
153             {
154               SeqAnnotationServiceCalcWorker worker = (SeqAnnotationServiceCalcWorker) _worker;
155               // this could be cleaner ?
156               if (worker.hasService()
157                       && aaui.getClient()
158                               .equals(worker.getService().getClass()))
159               {
160                 serviceEnabled = true;
161               }
162             }
163           }
164           aaConEnabled.setSelected(serviceEnabled);
165         }
166
167         @Override
168         public void menuDeselected(MenuEvent arg0)
169         {
170           // TODO Auto-generated method stub
171
172         }
173
174         @Override
175         public void menuCanceled(MenuEvent arg0)
176         {
177           // TODO Auto-generated method stub
178
179         }
180       });
181
182     }
183     return true;
184   }
185
186   private static void showAAConAnnotationSettingsFor(
187           final AlignAnalysisUIText aaui, AlignFrame alignFrame)
188   {
189     /*
190      * preferred settings Whether AACon is automatically recalculated Which
191      * AACon server to use What parameters to use
192      */
193     // could actually do a class search for this too
194     AutoCalcSetting fave = alignFrame.getViewport()
195             .getCalcIdSettingsFor(aaui.getCalcId());
196     if (fave == null)
197     {
198       fave = createDefaultAAConSettings(aaui);
199     }
200     new SequenceAnnotationWSClient(fave, alignFrame, true);
201
202   }
203
204   private static void buildCurrentAAConWorkerFor(
205           final AlignAnalysisUIText aaui, AlignFrame alignFrame)
206   {
207     buildCurrentAAConWorkerFor(aaui, alignFrame, null);
208   }
209
210   private static void buildCurrentAAConWorkerFor(
211           final AlignAnalysisUIText aaui, AlignFrame alignFrame,
212           ServiceWithParameters service)
213   {
214     /*
215      * preferred settings Whether AACon is automatically recalculated Which
216      * AACon server to use What parameters to use
217      */
218     AutoCalcSetting fave = alignFrame.getViewport()
219             .getCalcIdSettingsFor(aaui.getCalcId());
220     if (fave == null)
221     {
222       fave = createDefaultAAConSettings(aaui, service);
223     }
224     else
225     {
226       if (service != null && !fave.getService().getHostURL()
227               .equals(service.getHostURL()))
228       {
229         Cache.log.debug("Changing AACon service to " + service.getHostURL()
230                 + " from " + fave.getService().getHostURL());
231         fave.setService(service);
232       }
233     }
234     new SequenceAnnotationWSClient(fave, alignFrame, false);
235   }
236
237   private static AutoCalcSetting createDefaultAAConSettings(
238           AlignAnalysisUIText aaui)
239   {
240     return createDefaultAAConSettings(aaui, null);
241   }
242
243   private static AutoCalcSetting createDefaultAAConSettings(
244           AlignAnalysisUIText aaui, ServiceWithParameters service)
245   {
246     if (service != null)
247     {
248       // if (!service.getServiceType()
249       // .equals(compbio.ws.client.Services.AAConWS.toString()))
250       // {
251       // Cache.log.warn(
252       // "Ignoring invalid preferred service for AACon calculations (service
253       // type was "
254       // + service.getServiceType() + ")");
255       // service = null;
256       // }
257       // else
258       {
259         // check service is actually in the list of currently avaialable
260         // services
261         if (!PreferredServiceRegistry.getRegistry().contains(service))
262         {
263           // it isn't ..
264           service = null;
265         }
266       }
267     }
268     if (service == null)
269     {
270       // get the default service for AACon
271       service = PreferredServiceRegistry.getRegistry().getPreferredServiceFor(null,
272               aaui.getServiceType());
273     }
274     if (service == null)
275     {
276       // TODO raise dialog box explaining error, and/or open the JABA
277       // preferences menu.
278       throw new Error(
279               MessageManager.getString("error.no_aacon_service_found"));
280     }
281     return service instanceof Jws2Instance
282             ? new AAConSettings(true, service, null, null)
283             : new AutoCalcSetting(service, null, null, true);
284   }
285
286   private static void removeCurrentAAConWorkerFor(AlignAnalysisUIText aaui,
287           AlignFrame alignFrame)
288   {
289     alignFrame.getViewport().getCalcManager()
290             .removeWorkersOfClass(aaui.getClient());
291   }
292 }