1 package jalview.ws.slivkaws;
3 import jalview.bin.Cache;
4 import jalview.gui.AlignFrame;
5 import jalview.ws.WSDiscovererI;
6 import jalview.ws.api.ServiceWithParameters;
7 import jalview.ws.jws2.PreferredServiceRegistry;
9 import java.beans.PropertyChangeListener;
10 import java.beans.PropertyChangeSupport;
11 import java.io.IOException;
12 import java.net.MalformedURLException;
13 import java.net.URISyntaxException;
15 import java.util.ArrayList;
16 import java.util.List;
18 import javax.swing.JMenu;
20 import uk.ac.dundee.compbio.slivkaclient.SlivkaClient;
21 import uk.ac.dundee.compbio.slivkaclient.SlivkaService;
23 public class SlivkaWSDiscoverer implements WSDiscovererI
25 private static final String SLIVKA_HOST_URLS = "SLIVKAHOSTURLS";
27 private static final String COMPBIO_SLIVKA = "https://www.compbio.dundee.ac.uk/slivka";
29 private static SlivkaWSDiscoverer instance = null;
31 private List<ServiceWithParameters> services = List.of();
33 private SlivkaWSDiscoverer()
37 public static SlivkaWSDiscoverer getInstance()
41 instance = new SlivkaWSDiscoverer();
46 private PropertyChangeSupport changeSupport = new PropertyChangeSupport(
50 public void attachWSMenuEntry(JMenu wsmenu, final AlignFrame alignFrame)
52 JMenu slivkaMenu = new JMenu("Slivka");
53 wsmenu.add(slivkaMenu);
55 JMenu alignmentMenu = new JMenu("Sequence Alignment");
56 slivkaMenu.add(alignmentMenu);
57 JMenu disorderMenu = new JMenu("Protein sequence analysis");
58 slivkaMenu.add(disorderMenu);
59 JMenu conservationMenu = new JMenu("Conservation");
60 slivkaMenu.add(conservationMenu);
61 PreferredServiceRegistry.getRegistry().populateWSMenuEntry(services,
62 changeSupport, slivkaMenu, alignFrame, null);
66 volatile boolean ready = false;
68 volatile Thread discovererThread = null;
70 private class DiscovererThread extends Thread
72 private Thread oldThread;
74 DiscovererThread(Thread oldThread)
77 this.oldThread = oldThread;
83 if (oldThread != null)
85 oldThread.interrupt();
89 } catch (InterruptedException e)
99 ready = !isInterrupted();
103 Thread discoverer = null;
106 public Thread startDiscoverer(PropertyChangeListener changeListener)
108 changeSupport.addPropertyChangeListener(changeListener);
110 (discovererThread = new DiscovererThread(discovererThread)).start();
111 return discovererThread;
114 private void reloadServices()
116 Cache.log.info("Reloading Slivka services");
117 changeSupport.firePropertyChange("services", services, List.of());
118 ArrayList<ServiceWithParameters> instances = new ArrayList<>();
120 for (String url : getServiceUrls())
126 client = new SlivkaClient(url);
127 } catch (URISyntaxException e)
134 for (SlivkaService service : client.getServices())
136 SlivkaWSInstance newinstance = null;
137 for (String classifier : service.classifiers)
139 if (classifier.contains("Multiple sequence alignment"))
141 newinstance = new SlivkaMsaServiceInstance(client, service);
143 if (classifier.contains("Protein sequence analysis")
144 && newinstance == null)
146 newinstance = new SlivkaAnnotationServiceInstance(client,
150 .contains("Sequence alignment analysis (conservation)"))
152 newinstance = new SlivkaAnnotationServiceInstance(client,
156 if (newinstance != null)
158 instances.add(newinstance);
161 } catch (IOException e)
167 services = instances;
168 changeSupport.firePropertyChange("services", List.of(), services);
170 Cache.log.info("Slivka services reloading finished");
174 public List<ServiceWithParameters> getServices()
180 public boolean hasServices()
182 return ready == true && services.size() > 0;
186 public boolean isRunning()
188 return discovererThread == null || discovererThread.isAlive()
189 || discovererThread.getState() == Thread.State.NEW;
193 public void setServiceUrls(List<String> wsUrls)
195 if (wsUrls != null && !wsUrls.isEmpty())
197 Cache.setProperty(SLIVKA_HOST_URLS, String.join(",", wsUrls));
201 Cache.removeProperty(SLIVKA_HOST_URLS);
206 public List<String> getServiceUrls()
208 String surls = Cache.getDefault(SLIVKA_HOST_URLS, COMPBIO_SLIVKA);
209 String[] urls = surls.split(",");
210 ArrayList<String> valid = new ArrayList<>(urls.length);
211 for (String url : urls)
217 } catch (MalformedURLException e)
219 Cache.log.warn("Problem whilst trying to make a URL from '"
220 + ((url != null) ? url : "<null>") + "'");
222 "This was probably due to a malformed comma separated list"
223 + " in the " + SLIVKA_HOST_URLS
224 + " entry of $(HOME)/.jalview_properties)");
225 Cache.log.debug("Exception was ", e);
232 public boolean testServiceUrl(URL url)
234 return getServerStatusFor(url.toString()) == STATUS_OK;
238 public int getServerStatusFor(String url)
242 List<?> services = new SlivkaClient(url).getServices();
243 return services.isEmpty() ? STATUS_NO_SERVICES : STATUS_OK;
244 } catch (IOException | URISyntaxException e)
246 return STATUS_INVALID;
251 public String getErrorMessages()
253 // TODO Auto-generated method stub