2a3b4a504c24b1ae5e568019ae292f6254997ec1
[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.uimodel.AlignAnalysisUIText;
12
13 import java.awt.event.ActionEvent;
14 import java.awt.event.ActionListener;
15 import java.util.List;
16
17 import javax.swing.JCheckBoxMenuItem;
18 import javax.swing.JMenu;
19 import javax.swing.JMenuItem;
20 import javax.swing.event.MenuEvent;
21 import javax.swing.event.MenuListener;
22
23 public class Jws2ClientFactory
24 {
25   static boolean registerAAConWSInstance(final JMenu wsmenu,
26           final ServiceWithParameters service, final AlignFrame alignFrame)
27   {
28     Jws2Instance jaba_service = (Jws2Instance) service;
29     final AlignAnalysisUIText aaui = jaba_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               .getRegisteredWorkersOfClass(aaui.getClient());
56       if (aaconClient != null && aaconClient.size() > 0)
57       {
58         AbstractJabaCalcWorker worker = (AbstractJabaCalcWorker) 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, jaba_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           List<AlignCalcWorkerI> aaconClient = alignFrame.getViewport()
90                   .getCalcManager()
91                   .getRegisteredWorkersOfClass(aaui.getClient());
92           if (aaconClient != null && aaconClient.size() > 0)
93           {
94             removeCurrentAAConWorkerFor(aaui, alignFrame);
95           }
96           else
97           {
98             buildCurrentAAConWorkerFor(aaui, alignFrame);
99
100           }
101         }
102
103       });
104       wsmenu.add(aaConEnabled);
105       final JMenuItem modifyParams = new JMenuItem(
106               aaui.getAAeditSettings());
107       modifyParams.setToolTipText(JvSwingUtils.wrapTooltip(true,
108               aaui.getAAeditSettingsTooltip()));
109       modifyParams.addActionListener(new ActionListener()
110       {
111
112         @Override
113         public void actionPerformed(ActionEvent arg0)
114         {
115           showAAConAnnotationSettingsFor(aaui, alignFrame);
116         }
117       });
118       wsmenu.add(modifyParams);
119       wsmenu.addMenuListener(new MenuListener()
120       {
121
122         @Override
123         public void menuSelected(MenuEvent arg0)
124         {
125           // TODO: refactor to the implementing class.
126           if (alignFrame.getViewport().getAlignment().isNucleotide()
127                   ? aaui.isNa()
128                   : aaui.isPr())
129           {
130             aaConEnabled.setEnabled(true);
131             modifyParams.setEnabled(true);
132           }
133           else
134           {
135             aaConEnabled.setEnabled(false);
136             modifyParams.setEnabled(false);
137             return;
138           }
139           List<AlignCalcWorkerI> aaconClient = alignFrame.getViewport()
140                   .getCalcManager().getRegisteredWorkersOfClass(
141                           AbstractJabaCalcWorker.class);
142
143           boolean serviceEnabled = false;
144           if (aaconClient != null)
145           {
146             for (AlignCalcWorkerI _worker : aaconClient)
147             {
148               AbstractJabaCalcWorker worker = (AbstractJabaCalcWorker) _worker;
149               // this could be cleaner ?
150               if (worker.hasService()
151                       && aaui.getClient()
152                               .equals(worker.getService().getClass()))
153               {
154                 serviceEnabled = true;
155               }
156             }
157           }
158           aaConEnabled.setSelected(serviceEnabled);
159         }
160
161         @Override
162         public void menuDeselected(MenuEvent arg0)
163         {
164           // TODO Auto-generated method stub
165
166         }
167
168         @Override
169         public void menuCanceled(MenuEvent arg0)
170         {
171           // TODO Auto-generated method stub
172
173         }
174       });
175
176     }
177     return true;
178   }
179
180   private static void showAAConAnnotationSettingsFor(
181           final AlignAnalysisUIText aaui, AlignFrame alignFrame)
182   {
183     /*
184      * preferred settings Whether AACon is automatically recalculated Which
185      * AACon server to use What parameters to use
186      */
187     // could actually do a class search for this too
188     AAConSettings fave = (AAConSettings) alignFrame.getViewport()
189             .getCalcIdSettingsFor(aaui.getCalcId());
190     if (fave == null)
191     {
192       fave = createDefaultAAConSettings(aaui);
193     }
194     new SequenceAnnotationWSClient(fave, alignFrame, true);
195
196   }
197
198   private static void buildCurrentAAConWorkerFor(
199           final AlignAnalysisUIText aaui, AlignFrame alignFrame)
200   {
201     buildCurrentAAConWorkerFor(aaui, alignFrame, null);
202   }
203
204   private static void buildCurrentAAConWorkerFor(
205           final AlignAnalysisUIText aaui, AlignFrame alignFrame,
206           Jws2Instance service)
207   {
208     /*
209      * preferred settings Whether AACon is automatically recalculated Which
210      * AACon server to use What parameters to use
211      */
212     AAConSettings fave = (AAConSettings) alignFrame.getViewport()
213             .getCalcIdSettingsFor(aaui.getCalcId());
214     if (fave == null)
215     {
216       fave = createDefaultAAConSettings(aaui, service);
217     }
218     else
219     {
220       if (service != null && !fave.getService().getHostURL()
221               .equals(service.getHostURL()))
222       {
223         Cache.log.debug("Changing AACon service to " + service.getHostURL()
224                 + " from " + fave.getService().getHostURL());
225         fave.setService(service);
226       }
227     }
228     new SequenceAnnotationWSClient(fave, alignFrame, false);
229   }
230
231   private static AAConSettings createDefaultAAConSettings(
232           AlignAnalysisUIText aaui)
233   {
234     return createDefaultAAConSettings(aaui, null);
235   }
236
237   private static AAConSettings createDefaultAAConSettings(
238           AlignAnalysisUIText aaui, Jws2Instance service)
239   {
240     if (service != null)
241     {
242       if (!service.getServiceType()
243               .equals(compbio.ws.client.Services.AAConWS.toString()))
244       {
245         Cache.log.warn(
246                 "Ignoring invalid preferred service for AACon calculations (service type was "
247                         + service.getServiceType() + ")");
248         service = null;
249       }
250       else
251       {
252         // check service is actually in the list of currently avaialable
253         // services
254         if (!Jws2Discoverer.getDiscoverer().getServices().contains(service))
255         {
256           // it isn't ..
257           service = null;
258         }
259       }
260     }
261     if (service == null)
262     {
263       // get the default service for AACon
264       service = Jws2Discoverer.getDiscoverer().getPreferredServiceFor(null,
265               aaui.getServiceType());
266     }
267     if (service == null)
268     {
269       // TODO raise dialog box explaining error, and/or open the JABA
270       // preferences menu.
271       throw new Error(
272               MessageManager.getString("error.no_aacon_service_found"));
273     }
274     return new AAConSettings(true, service, null, null);
275   }
276
277   private static void removeCurrentAAConWorkerFor(AlignAnalysisUIText aaui,
278           AlignFrame alignFrame)
279   {
280     alignFrame.getViewport().getCalcManager()
281             .removeRegisteredWorkersOfClass(aaui.getClient());
282   }
283 }