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;
14 import java.util.ArrayList;
15 import java.util.List;
17 import javax.swing.JMenu;
19 import uk.ac.dundee.compbio.slivkaclient.SlivkaClient;
20 import uk.ac.dundee.compbio.slivkaclient.SlivkaService;
22 public class SlivkaWSDiscoverer implements WSDiscovererI
24 private static final String SLIVKA_HOST_URLS = "SLIVKAHOSTURLS";
26 private static final String COMPBIO_SLIVKA = "https://www.compbio.dundee.ac.uk/slivka/";
28 private static SlivkaWSDiscoverer instance = null;
30 private List<ServiceWithParameters> services = List.of();
32 private SlivkaWSDiscoverer()
36 public static SlivkaWSDiscoverer getInstance()
40 instance = new SlivkaWSDiscoverer();
45 private PropertyChangeSupport changeSupport = new PropertyChangeSupport(
49 public void attachWSMenuEntry(JMenu wsmenu, final AlignFrame alignFrame)
51 JMenu slivkaMenu = new JMenu("Slivka");
52 wsmenu.add(slivkaMenu);
54 JMenu alignmentMenu = new JMenu("Sequence Alignment");
55 slivkaMenu.add(alignmentMenu);
56 JMenu disorderMenu = new JMenu("Protein sequence analysis");
57 slivkaMenu.add(disorderMenu);
58 JMenu conservationMenu = new JMenu("Conservation");
59 slivkaMenu.add(conservationMenu);
60 PreferredServiceRegistry.getRegistry().populateWSMenuEntry(services,
61 changeSupport, slivkaMenu, alignFrame, null);
65 volatile boolean ready = false;
67 volatile Thread discovererThread = null;
69 private class DiscovererThread extends Thread
71 private Thread oldThread;
73 DiscovererThread(Thread oldThread)
76 this.oldThread = oldThread;
82 if (oldThread != null)
84 oldThread.interrupt();
88 } catch (InterruptedException e)
98 ready = !isInterrupted();
102 Thread discoverer = null;
105 public Thread startDiscoverer(PropertyChangeListener changeListener)
107 changeSupport.addPropertyChangeListener(changeListener);
109 (discovererThread = new DiscovererThread(discovererThread)).start();
110 return discovererThread;
113 private void reloadServices()
115 Cache.log.info("Reloading Slivka services");
116 changeSupport.firePropertyChange("services", services, List.of());
117 ArrayList<ServiceWithParameters> instances = new ArrayList<>();
119 for (String url : getServiceUrls())
123 client = new SlivkaClient(url);
126 for (SlivkaService service : client.getServices())
128 SlivkaWSInstance newinstance = null;
129 for (String classifier : service.classifiers)
131 if (classifier.contains("Multiple sequence alignment"))
133 newinstance = new SlivkaMsaServiceInstance(client, service);
135 if (classifier.contains("Protein sequence analysis")
136 && newinstance == null)
138 newinstance = new SlivkaAnnotationServiceInstance(client,
142 .contains("Sequence alignment analysis (conservation)"))
144 newinstance = new SlivkaAnnotationServiceInstance(client,
148 if (newinstance != null)
150 instances.add(newinstance);
153 } catch (IOException e)
159 services = instances;
160 changeSupport.firePropertyChange("services", List.of(), services);
162 Cache.log.info("Slivka services reloading finished");
166 public List<ServiceWithParameters> getServices()
172 public boolean hasServices()
174 return ready == true && services.size() > 0;
178 public boolean isRunning()
180 return discovererThread == null || discovererThread.isAlive()
181 || discovererThread.getState() == Thread.State.NEW;
185 public void setServiceUrls(List<String> wsUrls)
187 if (wsUrls != null && !wsUrls.isEmpty())
189 Cache.setProperty(SLIVKA_HOST_URLS, String.join(",", wsUrls));
193 Cache.removeProperty(SLIVKA_HOST_URLS);
198 public List<String> getServiceUrls()
200 String surls = Cache.getDefault(SLIVKA_HOST_URLS, COMPBIO_SLIVKA);
201 String[] urls = surls.split(",");
202 ArrayList<String> valid = new ArrayList<>(urls.length);
203 for (String url : urls)
209 } catch (MalformedURLException e)
211 Cache.log.warn("Problem whilst trying to make a URL from '"
212 + ((url != null) ? url : "<null>") + "'");
214 "This was probably due to a malformed comma separated list"
215 + " in the " + SLIVKA_HOST_URLS
216 + " entry of $(HOME)/.jalview_properties)");
217 Cache.log.debug("Exception was ", e);
224 public boolean testServiceUrl(URL url)
226 return getServerStatusFor(url.toString()) == STATUS_OK;
230 public int getServerStatusFor(String url)
234 List<?> services = new SlivkaClient(url).getServices();
235 return services.isEmpty() ? STATUS_NO_SERVICES : STATUS_OK;
236 } catch (IOException e)
238 Cache.log.error("Slivka could not retrieve services list", e);
239 return STATUS_INVALID;
244 public String getErrorMessages()
246 // TODO Auto-generated method stub