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