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